产生具有CSS3重复六边形图案产生具有CSS3重复六边形图案(Generate repeating

2019-05-13 11:46发布

所以,我需要做一个重复的六边形图案,使用CSS。 如果需要的图像,我可以去那里,但我更喜欢,如果可以只使用CSS。

这里是什么,我想创建一个想法:

基本上,我只是需要一种方法来创建六边形,然后在它们上面覆盖文本/图片。 我没有太多的代码,但因为我真的不知道从哪里开始。 问题是,我可以只使用<div> S IN六边形的形状像示于( http://css-tricks.com/examples/ShapesOfCSS/ ),但随后它们将不被连接。 我可以用一个重复的六边形图案,后来我就不能指定我需要在特定形状的文字或图像的确切位置。 感谢提前任何帮助。

Answer 1:

(尽管安娜的回答就在几个月后我的,大概用矿为基础,以“自认为”,但事实上,她能想出了使用单一的方法div是值得提倡的,所以也检查出她的回答 -但要注意的十六进制的内容较为有限。)

这是一个了不起的问题。 谢谢你问它。 伟大的事情是事实,即:

这小提琴证明你能行!

采用原装小提琴 (修改后编辑以上小提琴链接) -它利用imgur.com图像,这并没有看上去处于装载非常可靠,所以新的小提琴是使用photobucket.com( 让我知道如果有持续性图像加载问题 )。 我已经把原来的链接,因为解释下面的代码与去(也有在几个不同background-sizeposition到新的小提琴)。

这个想法来找我读你的问题后,几乎立即,但花了一些时间来实现。 我本来试图得到一个单一的“六角”与一个单一的div ,只是伪元素,但作为最好的,我可以告诉,没有办法只有旋转background-image (我需要),所以我不得不添加一些额外div元素得到十六进制的左/右侧,这样我就可以再使用伪元素为手段, background-image旋转。

我在IE9,FF和Chrome测试。 理论上任何浏览器支持CSS3 transform它应该工作。

第一主更新(补充说明)

我有一段时间了,现在发布一些代码的解释,所以这里有云:

首先,六边形由30/60度的关系和三角函数定义,所以这些将是所涉及的主要角度。 其次,我们开始与“行”的六角格驻留在HTML被定义为(多余的。 div元素有助于建立十六进制):

<div class="hexrow">
    <div>
        <span>First Hex Text</span>
        <div></div>
        <div></div>
    </div>
    <div>
        <span>Second Hex Text</span>
        <div></div>
        <div></div>
    </div>
    <div>
        <span>Third Hex Text</span>
        <div></div>
        <div></div>
    </div>
</div>

我们将使用inline-block为六边形display ,但我们不希望他们不小心换到下一行,破坏电网,使white-space: nowrap解决了这个问题。 该margin在此行是要取决于你多大的空间需要十六进制的之间,并可能需要进行一些试验,以得到你想要的。

.hexrow {
    white-space: nowrap;
    /*right/left margin set at (( width of child div x sin(30) ) / 2) 
    makes a fairly tight fit; 
    a 3px bottom seems to match*/
    margin: 0 25px 3px;
}

使用的直接子.hexrow这只是div元素,我们形成了六角形的基础。 的width将驱动十六进制的顶部的水平,该height是从数,因为所有的侧面上的正六边形等长的。 此外,保证金将取决于间距,但是这是在各六角形的“重叠”将要发生,使电网的样子出现。 该background-image被定义一次,就在这里。 留在其上的移位是容纳至少为十六进制的左侧的加宽度。 假设你要居中文本,该text-align处理水平,但(当然) line-height相匹配的height会以允许垂直居中。

.hexrow > div {
    width: 100px;
    height: 173.2px; /* ( width x cos(30) ) x 2 */
    /* For margin:
    right/left = ( width x sin(30) ) makes no overlap
    right/left = (( width x sin(30) ) / 2) leaves a narrow separation
    */
    margin: 0 25px;
    position: relative;
    background-image: url(http://i.imgur.com/w5tV4.jpg);
    background-position: -50px 0; /* -left position -1 x width x sin(30) */
    background-repeat: no-repeat;
    color: #ffffff;
    text-align: center;
    line-height: 173.2px; /*equals height*/
    display: inline-block;
}

每个奇数六角我们将在相关向下移动到“行”和各偶数级移位了。 移位计算(宽×COS(30)/ 2)也相同(高度/ 4)。

.hexrow > div:nth-child(odd) {
    top: 43.3px; /* ( width x cos(30) / 2 ) */
}

.hexrow > div:nth-child(even) {
    top: -44.8px; /* -1 x( ( width x cos(30) / 2) + (hexrow bottom margin / 2)) */
}

我们使用的是2个div元素创建十六进制的“翅膀”。 它们的大小相同,主要六角矩形,然后旋转,推“下”主要六角。 Background-image是继承,使图像是一样的(当然),因为在“两翼”的形象将是主矩形“排队”来表示。 伪元素被用来生成图像,因为他们需要“再旋转”回到水平(因为我们旋转父div他们创造的“翅膀”)。

:before第一将翻译其背景负量等于十六进制的主要部分加上主十六进制的原始背景移位的宽度。 的:before的第二个将改变翻译的原点,将主移位宽度在x轴,和在y轴高度的一半。

.hexrow > div > div:first-of-type {
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    z-index: -1;
    overflow: hidden;
    background-image: inherit;

    -ms-transform:rotate(60deg); /* IE 9 */
    -moz-transform:rotate(60deg); /* Firefox */
    -webkit-transform:rotate(60deg); /* Safari and Chrome */
    -o-transform:rotate(60deg); /* Opera */
    transform:rotate(60deg);
}

.hexrow > div > div:first-of-type:before {
    content: '';
    position: absolute;
    width: 200px; /* width of main + margin sizing */
    height: 100%;
    background-image: inherit;
    background-position: top left;
    background-repeat: no-repeat;
    bottom: 0;
    left: 0;
    z-index: 1;

    -ms-transform:rotate(-60deg) translate(-150px, 0); /* IE 9 */
    -moz-transform:rotate(-60deg) translate(-150px, 0); /* Firefox */
    -webkit-transform:rotate(-60deg) translate(-150px, 0); /* Safari and Chrome */
    -o-transform:rotate(-60deg) translate(-150px, 0); /* Opera */
    transform:rotate(-60deg) translate(-150px, 0);

    -ms-transform-origin: 0 0; /* IE 9 */
    -webkit-transform-origin: 0 0; /* Safari and Chrome */
    -moz-transform-origin: 0 0; /* Firefox */
    -o-transform-origin: 0 0; /* Opera */
    transform-origin: 0 0;
}

.hexrow > div > div:last-of-type {
    content: '';
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    z-index: -2;
    overflow: hidden;
    background-image: inherit;

    -ms-transform:rotate(-60deg); /* IE 9 */
    -moz-transform:rotate(-60deg); /* Firefox */
    -webkit-transform:rotate(-60deg); /* Safari and Chrome */
    -o-transform:rotate(-60deg); /* Opera */
    transform:rotate(-60deg);
}

.hexrow > div > div:last-of-type:before {
    content: '';
    position: absolute;
    width: 200px; /* starting width + margin sizing */
    height: 100%;
    background-image: inherit;
    background-position: top left;
    background-repeat: no-repeat;
    bottom: 0;
    left: 0;
    z-index: 1;

    /*translate properties are initial width (100px) and half height (173.2 / 2 = 86.6) */
    -ms-transform:rotate(60deg) translate(100px, 86.6px); /* IE 9 */
    -moz-transform:rotate(60deg) translate(100px, 86.6px); /* Firefox */
    -webkit-transform:rotate(60deg) translate(100px, 86.6px); /* Safari and Chrome */
    -o-transform:rotate(60deg) translate(100px, 86.6px); /* Opera */
    transform:rotate(60deg) translate(100px, 86.6px);

    -ms-transform-origin: 100% 0; /* IE 9 */
    -webkit-transform-origin: 100% 0; /* Safari and Chrome */
    -moz-transform-origin: 100% 0; /* Firefox */
    -o-transform-origin: 100% 0; /* Opera */
    transform-origin: 100% 0;
}

这个span容纳文本。 该line-height是复位,使文本正常的线,但是在vertical-align: middle因为作品line-height是父较大。 该white-space复位,所以它允许重新包装。 左/右页边距可以设置为负值,使文字进入十六进制的“翅膀”。

.hexrow > div > span {
    display: inline-block;
    margin: 0 -30px;
    line-height: 1.1;
    vertical-align: middle;
    white-space: normal;
}

你可以在那些行的个别目标行和细胞改变的图像,或span文本设置,或不透明,或容纳更大的图像(将它转换到你想要的地方),等了下面第二行做什么。

.hexrow:nth-child(2) > div:nth-child(1) {
    background-image: url(http://i.imgur.com/7Un8Y.jpg);
}

.hexrow:nth-child(2) > div:nth-child(1) > span {
    /*change some other settings*/
    margin: 0 -20px;
    color: black;
    font-size: .8em;
    font-weight: bold;
}

.hexrow:nth-child(2) > div:nth-child(2) {
    background-image: url(http://i.imgur.com/jeSPg.jpg);
}

.hexrow:nth-child(2) > div:nth-child(3) {
    background-image: url(http://i.imgur.com/Jwmxm.jpg);
    /*you can shift a large background image, but it can get complicated
    best to keep the image as the total width (200px) and height (174px)
    that the hex would be.
    */
    background-position: -150px -120px;
    opacity: .3;
    color: black;
}

.hexrow:nth-child(2) > div:nth-child(3) > div:before {
    /*you can shift a large background image, but it can get complicated
    best to keep the image as the total width (200px) and height (174px)
    that the hex would be.
    */
    background-position: -100px -120px; /* the left shift is always less in the pseudo elements by the amount of the base shift */
}

.hexrow:nth-child(2) > div:nth-child(4) {
    background-image: url(http://i.imgur.com/90EkV.jpg);
    background-position: -350px -120px;
}

.hexrow:nth-child(2) > div:nth-child(4) > div:before {
    background-position: -300px -120px;
}


Answer 2:

实际上,它可以以每六边形和伪元素只有一个元素的背景图像和文字来完成。

演示

基本的HTML结构:

<div class='row'>
    <div class='hexagon'></div>
</div>
<div class='row'>
    <div class='hexagon content ribbon' data-content='This is a test!!! 
    9/10'></div><!--
    --><div class='hexagon content longtext' data-content='Some longer text here.
       Bla bla bla bla bla bla bla bla bla bla blaaaah...'></div>
</div>

你可以有更多的可能行,你只需要有n奇数行六边形和n+/-1的偶数行六边形。

相关CSS:

* { box-sizing: border-box; margin: 0; padding: 0; }
.row { margin: -18.5% 0; text-align: center; }
.row:first-child { margin-top: 7%; }
.hexagon {
    position: relative;
    display: inline-block;
    overflow: hidden;
    margin: 0 8.5%;
    padding: 16%;
    transform: rotate(30deg) skewY(30deg) scaleX(.866); /* .866 = sqrt(3)/2 */
}
.hexagon:before, .content:after {
    display: block;
    position: absolute;
    /* 86.6% = (sqrt(3)/2)*100% = .866*100% */
    top: 6.7%; right: 0; bottom: 6.7%; left: 0; /* 6.7% = (100% -86.6%)/2 */
    transform: scaleX(1.155) /* 1.155 = 2/sqrt(3) */ 
               skewY(-30deg) rotate(-30deg);
    background-color: rgba(30,144,255,.56);
    background-size: cover;
    content: '';
}
.content:after { content: attr(data-content); }
/* add background images to :before pseudo-elements */
.row:nth-child(n) .hexagon:nth-child(m):before {
    background-image: 
        url(background-image-mxn.jpg); 
}


Answer 3:

我将提供如何创建一个六边形一个简单的演示。

 .hex { width: 40px; height: 70px; margin: 20px; overflow: hidden; } .hex:before { content: ""; transform: rotate(45deg); background: #f00; width: 50px; height: 50px; display: inline-block; margin: 10px -5px 10px -5px; } 
 <div class="hex"> </div> 



Answer 4:

下面是另一种方法使用COMPASS / SCSS,其允许容易地设定六边形的大小和布局:

http://codepen.io/interdruper/pen/GrBEk



Answer 5:

如果你能实现DIV形状招,后来干脆给每个div的一个position:relative (你将不得不开始所有逐一在第一位置,其中,通过设置还topleft



Answer 6:

你可以只用CSS创建一个完全响应六边形网格。 我们的想法是创建一个父形状作为面膜使用CSS2.1溢出:隐藏这是几乎所有的浏览器,甚至是Internet Explorer 6的兼容。

这是一个令人惊讶的简单的技术,可用于创建各种形状的网格响应,它只是需要思考解决问题的框外。

我对如何在这里做这个技术的广泛一步一步的指导: https://www.codesmite.com/article/how-to-create-pure-css-hexagonal-grids

这是到目前为止,我已经找到了最好的方法,不需要JavaScript和既流畅性和响应。

我还使用了技术,包括六边形内的图像,你可以试玩和下载这里免费HTML模板: https://www.codesmite.com/freebie/hexa-free-responsive-portfolio-template



Answer 7:

据我所知,没有纯CSS在做的方式。 最好的办法是使用面膜裁剪为背景如下解释: http://www.cssbakery.com/2009/06/background-image.html (这只会如果你的页面的背景是纯色工作,或者你能适应和定位你的面具,以匹配页面背景。

然后,你可以使用csstextwrap以适应文本: http://www.csstextwrap.com/examples.php

有一堆关于如此相似的问题。 例如, 任何方式在格填充文本三角形?



文章来源: Generate repeating hexagonal pattern with CSS3