当前位置: 首页 > 科技观察

【不规则布局】有趣的六边形动画

时间:2023-03-14 19:22:44 科技观察

收到一个有趣的问题,如何实现类似下面的背景渲染:咦?核心体由多个六边形网格叠加而成。那么我们如何实现呢?这可以用纯CSS实现吗?当然,下面我们将尝试如何使用CSS来实现这样的背景效果。如何画六边形?首先,看到这样的图形,如果要用一个标签来完成整个背景,你首先想到的就是使用background背景,可惜的是,CSS中的背景虽然很强大,但是没有特别好的方法是批量生成重复的六边形背景就足够了。因此,在这个要求中,我们可能不得不满足于次优的选择,即使用标签的六边形实现。那么,只取1个DIV,我们有多少种方法可以实现一个六边形呢?这里有两种方式简单介绍一下:使用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:25px">//...填充六边形

//...填充六边形
//...填充六边形
你可以看到我们在偶数行中添加了margin-left。但是这段代码有几个问题:我们的页面宽度不一定是固定的,那么每行多少个次六边形元素合适呢?设置太多必然造成浪费,设置少则不能满足需求。多了一层嵌套,代码逻辑就更复杂了。这意味着什么?也就是说,当屏幕很宽时,效果可能会失败。你看,一般情况下,我们每行设置20个六边形,下图是正常的。但是如果我们的屏幕很宽,那么我们可能会得到这样的效果:所以,这种方法有很大的弊端。我们希望有一个整体的布局方式可以满足我们以下两个需求:所有六边形的代码都写在一个父容器下。在这种灵活的布局中,第二行最左边的元素可以实现固定缩进。仔细想想,有没有办法在CSS中实现类似的布局呢?使用shape-outside实现交错错位布局!在CSS中,有一个神奇的元素可以让元素以非线性方式排列。它是外在的!如果你对shape-outside不是很了解,也可以先看看我的文章——奇妙的CSSshapesshape-outside是CSS中的一个属性,用来控制元素浮动的方式。它允许您定义元素浮动时周围元素的形状。比如你可以使用shape-outside属性来定义一个元素漂浮时周围元素的形状,比如圆形,六边形等。它和clip-path的语法很相似,很容易搞定比喻。看例子,更容易理解:假设我们有如下结构:xxxxxxxxxxx,文字说明,xxxxxxxxxCSS定义如下:.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,#00072px);在:左边;背景:重复线性渐变(透明0,透明36px,#f0036px,#f0072px);}}效果如下:因为文字的行高是36px,所以我们用72作为一段,每36px画一段透明,另外36px画一段宽度为24px的内容。这样,结合shape-outside的特点,我们就实现了每隔一行向内挤压24px的效果!非常惊人的技能!完整代码可以点击这里:CodePenDemo--Shape-outside实现连线缩进基于这个技巧,我们可以达到上面我们想要的效果。言归正传,重新实现一个满是六边形的背景:
  • //...verymanyli