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

网站建设4年前发布
34 0 0

20230306151624f3f2331821a07ede4805761d275d39d9f6c39f752,收到一个很有意思的提问,如何实现类似如下的背景效果图:,2023030714124791e1f0c49fa61a02d93272089f705e9f14e4a3913,嗯?核心主体是由多个六边形网格叠加形成。,那么我们该如何实现它呢?使用纯 CSS 能够实现吗?,当然可以,下面我们就将尝试如何使用 CSS 去实现这样一个背景效果。,首先,看到这样一个图形,如果想要使用一个标签完成整个背景,最先想到的肯定是使用背景 background 实现,不过可惜的是,尽管 CSS 中的 background 非常之强大,但是没有特别好的方式让它足以批量生成重复的六边形背景。,因此,在这个需求中,我们可能不得不退而求其次,一个六边形实现使用一个标签完成。,那么,就拿 1 个 DIV 来说,我们有多少实现六边形的方式呢?这里简单介绍 2 种方式:,首先,使用 border 实现六边形。这里的核心在于上下两个三角形叠加中间一个矩形。这里,利用元素的两个伪元素实现上下两个三角形,从而让这个元素看起来像一个六边形。,思路比较简单,直接上代码:,上面的代码会创建一个宽度为 200 像素,高度为 100 像素的六边形,其中由两个三角形和一个矩形组成。使用伪元素的优点是可以很方便地控制六边形的大小、颜色等样式。,20230306151751437282f301c9bc6e62c101515de97d0bf0e448970,当然,上述的代码不是一个正六边形,这是因为正六边形中,元素的高是元素的宽的 1.1547 倍。,并且,上述的方式也稍微复杂了点,因此,在今天,我们更推荐使用 clip-path 的方式去实现一个六边形:,这样,基于 clip-path,也能快速得到一个六边形图形:,202303061516261913e8c02e319e6c1ad3499abc4cfc06dce8d7649,CodePen Demo -- Two ways to achieve a hexagon,好了,有了上一步的铺垫之后,接下来我们要做的,就是绘制多个六边形,组成背景。,但是我们仔细观察一下由多个六边形组成的背景,会发现每双数行的的六边形,需要向右侧有一个明显的缩进,宽度大概为单个六边形的宽度的一半:,2023030615180337d2a3f053f459766cd87992954b256bd5bf4c372,这里其实是一个非常棘手的问题。首先,我们会想到这样一种解决方案:,基于这个策略,我们的代码,大概会是这样:,可以看到,我们给偶数行,都添加了一个 margin-left。,但是这个代码,会有几个问题:,什么意思呢?也就是效果可能在屏幕非常宽的情况下,失效。,看看,正常情况,我们设置了每行 20 个六边形,下图是正常的。,2023030615162797b1cc28616edb24c70264895696b693bd67ad551,但是如果我们的屏幕特别宽,那么,可能会得到这样一种效果:,2023030615162877320da46bffae00edc15999e5b53530e9d41b705,因此,这种方式存在非常大的弊端,我们希望能有一整布局方式,能够满足我们如下两个诉求:,仔细思考一下,CSS 中有能够实现类似布局的方法么?,有的!在 CSS 中,有一个神奇的元素能够让元素以非直线形式排布。它就是 shape-outside!,shape-outside 是 CSS 中的一个属性,用于控制元素的浮动方式。它允许你定义一个元素浮动时周围元素的形状。例如,你可以使用 shape-outside 属性来定义一个元素浮动时周围元素的形状为圆形、六边形等。,它和 clip-path 的语法非常类似,很容易触类旁通。看看实例,更易理解:,假设我们有下面这样的结构存在:,定义如下 CSS:,注意,上面 .shape-outside 使用了浮动,并且定义了 shape-outside: circle(80px at 80px 80px) ,表示在元素的 (80px, 80px) 坐标处,生成一个 80px 半径的圆。,如此,将会产生一种图文混排的效果:,20230306151628429425e22c20460ee2c453e4b5d14f62fe31f2238,CodePen Demo -- 图文混排 shape-outside,总得来说,shape-outside 有两个核心特点:,202303061517535600b9d7115fc7d7502073cc343af9d1d62a6c353,划重点,划重点,划重点。,所以,shape-outside 的本质其实是生成几何图形,并且裁剪掉其几何图形之外周围的区域,让内容能排列在这些被裁剪区域之内。,所以,了解了这个本质之后,我们再将他运用在上面的六边形布局之中。,为了方便理解,我们首先使用文字代替上面的六边形,假设我们有这样一段文本内容:,非常平平无奇的一段代码,效果如下:,2023030701444827d297d0816e2b8ba0d9239f5c4d87f05f5b29907,现在,我们想利用 shape-outside,让文本内容的偶数行,向内缩进 24px,怎么实现呢?非常简单:,这样,我们就实现了文字隔行缩进 24px 的效果:,20230306151753856524892add2584e90860a57e179ca727cf6c697,一定有小伙伴会很好奇,为什么呢?核心在于我们利用元素的伪元素实现了一个 shape-outside 图形,如果我们把这个图形用 background 绘制出来,其实它长这样:,效果如下:,2023030701484724023d65348600a13ea754b170d306d6fdc506353,因为文本的行高是 36px,这样我们以 72 为一段,每 36px 绘制一段透明,另外 36px 绘制一段宽为 24px 的内容,这样,结合 shape-outside 的特性,我们就实现了隔行将内容向里面挤 24px 的效果!,非常的 Amazing 的技巧!完整的代码你可以戳这里:,CodePen Demo -- Shape-outside achieves even line indentation。,基于这个技巧,我们就可以实现上述我们想要的效果了。我们回到正题,重新实现一个充满六边形的背景:,借助 shape-outside,我们就实现了隔行让我们的六边形向内缩进的诉求!效果如下:,2023030701445076380732438fa2d97a4860f6c565bfdb32bc93874,当然,有一些优化点:,做完这两点优化之后,效果如下:,20230307014847b264297940e86ff5ddf7996524f448da093cca767,可以做到任意屏幕宽度下的六边形完美平铺布局:,20230307014452612267133d822bd73a8695687e93056985334c992,完整的代码你可以戳这里:CodePen Demo -- Hexagon Layout。,有了上述的铺垫后,要实现文章一开头的效果就不难了。,是的,我们要实现这样一个效果:,20230306151755e81e8648519b72460b0416a5bc68dcfddf788b912,如何让它们动态的实现颜色变换呢?是给每一个六边形一个单独的颜色,然后进行动画吗?不,借助混合模式,我们可以非常快速的实现不同的颜色值。,首先,我们将上述效果,改成白底黑色六边形色块:,2023030701445263973c79393853d7acc722fbb989bfe709fcd0111,然后,利用父容器剩余的一个伪元素,我们叠加一层渐变层上去:,这样,我们就叠加了一层渐变色彩层在原本的六边形背景之上:,20230306151633b492daf991bbb0ab5ee924b3abf8f88f09849a926,接着,只需要一个混合模式 mix-blend-mode: darken,就能实现六边形色块与上层渐变颜色的融合效果:,效果如下:,2023030615163447d8bad880ad5116b246561b31161b1f2a9367737,好, 我们再给上层的渐变色块,添加一个 filter: hue-rotate() 动画,实现色彩的渐变动画:,这样,我们就完美的实现了我们想要的效果:,20230307014849286eef9182e670fdade0554bf72a5b52ac8c30861,完整的代码,你可以戳这里:CodePen Demo -- Hexagon Gradient Layout。,当然,有了这个基础图形之后,其实我们可以基于这个图形,去做非常多有意思的效果。,下面我是尝试的一些效果示意,譬如,我们可以将颜色放置在六边形背景的下方,制作这样一种效果:,20230306151635645038811a4df78a9fc41086ee2e6ef707a1f1185,CodePen Demo -- Hexagon Gradient Layout。,配合 mask 的蒙版效果及鼠标定位,我们还能实现这样一种有趣的交互效果:,202303061517550160719308e3e6d66c469818eacfef165afd0f376,CodePen Demo -- Hexagon Gradient & MASK Layout。,当然,3D 效果也不在话下:,20230307014454775c2e262f8babc56c510623957c501c1ba677319,CodePen Demo -- 3D Hexagon Gradient Layout,好了,本文到此结束,希望本文对你有所帮助 :),[1]CodePen Demo -- Two ways to achieve a hexagon: https://codepen.io/pen?template=YzvPXaQ​。,[2]奇妙的 CSS shapes: https://github.com/chokcoco/iCSS/issues/18​。,[3]CodePen Demo -- 图文混排 shape-outside: https://codepen.io/Chokcoco/pen/owxedZ​。,[4]CodePen Demo -- Shape-outside achieves even line indentation: https://codepen.io/Chokcoco/pen/bGKzLxP​。,[5]CodePen Demo -- Hexagon Layout: https://codepen.io/Chokcoco/pen/QWxYmyy​。,[6]CodePen Demo -- Hexagon Gradient Layout: https://codepen.io/Chokcoco/pen/qBKgpVE?editors=1100​。,[7]CodePen Demo -- Hexagon Gradient Layout: https://codepen.io/Chokcoco/pen/yLEZqjo​。,[8]CodePen Demo -- Hexagon Gradient & MASK Layout: https://codepen.io/Chokcoco/pen/ExRrpep​。,[9]CodePen Demo -- 3D Hexagon Gradient Layout: https://codepen.io/Chokcoco/pen/MWXLqyX​。,[10]Github -- iCSS: https://github.com/chokcoco/iCSS​。

© 版权声明

相关文章