当前位置: 首页 > Web前端 > JavaScript

不规则图形背景布局高阶技巧——炫酷的六边形网格背景图

时间:2023-03-27 10:56:45 JavaScript

今天收到一个很有意思的问题,如何实现类似下面这样的背景效果图:咦?核心体由多个六边形网格叠加而成。那么我们如何实现呢?这可以用纯CSS实现吗?当然,下面我们将尝试如何使用CSS来实现这样的背景效果。如何画六边形?首先,看到这样的图形,如果要用一个标签来完成整个背景,你首先想到的就是使用background背景,可惜的是,CSS中的背景虽然很强大,但是没有特别好的方法是批量生成重复的六边形背景就足够了。因此,在这个要求中,我们可能不得不满足于次优的选择,即使用标签的六边形实现。那么,只取1个DIV,我们有多少种方法可以实现一个六边形呢?这里有两种方式:使用border实现六边形使用clip-path实现六边形使用border或者clip-path实现六边形首先,使用border实现六边形。这里的核心是上下三角形叠加了一个中间的矩形。这里用元素的两个伪元素来实现上下三角形,让元素看起来像一个六边形。思路比较简单,直接添加代码即可:.hexagon{position:relative;宽度:200px;高度:100px;背景色:红色;}.hexagon:before,.hexagon:after{content:"";位置:绝对;宽度:0;高度:0;左边框:100px实心透明;border-right:100pxsolidtransparent;}.hexagon:before{bottom:100%;border-bottom:50pxsolidred;}.hexagon:after{top:100%;border-top:50pxsolidred;}上面的代码创建了一个宽度为200像素、高度为100像素的六边形,由两个三角形和一个矩形组成。使用伪元素的好处是可以很方便地控制六边形的大小、颜色等样式。当然,上面的代码并不是正六边形,因为在正六边形中,元素的高度是元素宽度的1.1547倍。而且上面的方法比较复杂,所以今天推荐使用clip-path的方法来实现一个六边形:.clippath{--w:100px;宽度:var(--w);高度:计算(var(--w)*1.1547);剪辑路径:多边形(0%25%、0%75%、50%100%、100%75%、100%25%、50%0%);背景:深粉色;margin:auto;}这样,基于clip-path,就可以快速得到一个六边形图形:CodePenDemo--实现一个六边形的两种方法绘制多个六边形背景。一步一步的铺垫之后,接下来我们要做的就是绘制多个六边形来组成背景。但是如果我们仔细观察由多个六边形组成的背景,我们会发现每个双数六边形都需要向右有一个明显的缩进,宽度大约是单个六边形宽度的一半:这是实际上是一个非常棘手的问题。首先我们会想到这样一个解决方案:每一行为一组,设置一个父div容器,填充六边形元素,设置元素不换行,偶数行设置固定的margin-left。基于这个策略,我们的代码,大概是这样的://...填充六边形

//...填充六边形
//...填充六边形
//...填充六边形
可以看到我们在偶数行中添加了margin-left。但是这段代码有几个问题:我们的页面宽度不一定是固定的,那么每行多少个次六边形元素合适呢?如果设置过多,难免造成浪费。如果设置太少,将无法满足需要。代码逻辑比较复杂是什么意思?也就是说,当屏幕很宽时,效果可能会失败。你看,一般情况下,我们每行设置20个六边形,下图是正常的,但是如果我们的屏幕很宽的话,可能会得到这样的效果:所以这个方法有很大的弊端,我们希望有一个整体的布局方式可以满足我们下面两个需求:所有的六边形代码写在父容器下灵活布局,第二行最左边的元素可以实现固定缩进。仔细想想,有没有办法在CSS中实现类似的布局呢?使用shape-outside实现交错错位布局!在CSS中,有一个神奇的元素可以让元素以非线性方式排列。它是外在的!如果你对shape-outside不是很了解,也可以先看看我的这篇文章——奇妙的CSSshapesshape-outside是CSS中的一个属性,用来控制元素的浮动方式。它允许您定义元素浮动时周围元素的形状。比如你可以使用shape-outside属性来定义一个元素漂浮时周围元素的形状,比如圆形,六边形等。它和clip-path的语法很相似,很容易搞定比喻。看例子,更容易理解:假设我们有如下结构:xxxxxxxxxxx,文字说明,xxxxxxxxx定义了如下CSS:.shape-outside{width:160px;高度:160px;形状外:圆形(80px80px80px);float:left;}注意上面的.shape-outside使用了Floating定义,定义了shape-outside:circle(80pxat80px80px),意思是在(的坐标处生成一个半径为80px的圆80px,80px)的元素。这样就会出现图文混合的效果:CodePenDemo--图文混合shape-outside总的来说,shape-outside有两个核心特点:shape-outside属性只有在元素定义了float属性,不为none时才会生效。可以实现根据图形的轮廓在文字周围排列外型的本质。专注,专注,专注。所以shape-outside的本质其实就是生成几何图形,把几何图形外面的周边区域裁剪掉,这样就可以在这些裁剪出来的区域里安排内容。因此,理解了这个本质之后,我们将其应用到上面的六边形布局中。为了方便理解,我们先用文字来代替上面的六边形,假设我们有这么一段文字内容:

Loremipsumdolorsitametconse...

p{line-height:36px;font-size:24px;}一段很普通的代码,效果如下:现在,我们想用shape-outside将文本内容的偶数行缩进24px,如何实现呢?很简单:p{position:relative;行高:36px;字体大小:24px;&::之前{内容:“”;高度:100%;宽度:24px;形状外部:重复线性渐变(透明0,透明36px,#00036px,#00072px);向左飘浮;}}这样,我们就实现了文本隔行缩进24px的效果:有的朋友会好奇,为什么呢?核心是我们利用元素的伪元素来实现一个形外图形。如果我们用背景绘制这个图形,它实际上是这样的:p{position:relative;行高:36px;字体大小:24px;&::before{内容:“”;高度:100%;宽度:24px;形状外部:重复线性渐变(透明0,透明36px,#00036px,#00072像素);向左飘浮;背景:重复线性渐变(透明0,透明36px,#f0036px,#f0072px);}}效果如下:因为文字的行高是36px,所以我们用72作为一个段落,每36px画一段透明,另外36px画一段宽度为24px的内容。这样,结合shape-outside的特点,我们就实现了每隔一行向内挤压24px的效果!非常惊人的技能!完整代码可以点击这里:CodePenDemo--Shape-outside实现连线缩进基于这个技巧,我们可以实现上面我们想要的效果言归正传,重新实现一个满是六边形的背景:
  • //...verymanyli