端午佳节已过,思考再三,决定把发在公众号上的文章搬过来!正文如下:
吃着香喷喷的粽子,灵感一来,突然决定用纯前端写一个可爱的粽子出来。
说干就干,开整!
首先,我们先创建一个 div\color{red}divdiv 元素:
<div class="zongzi"></div>
我在这里特意有道查了一下粽子的英语,原来国外把粽子叫做“传统的中国米饭布丁”,英文是 TraditionalChineserice−pudding\color{red}Traditional Chinese rice-puddingTraditionalChineserice−pudding。这也太复杂了,于是问了曾经教英语的外教老师,他说现在也是直接说中文拼音 zongzi\color{red}zongzizongzi ,于是就用 zongzi\color{red}zongzizongzi 作为粽子身体的 class\color{red}classclass 值。
给这个元素设置宽度和高度,以及背景图:
.zongzi { width: 650px; height: 600px; background: #ffedc8; }
为了显示方便,使用定位将其放到屏幕中间:
.zongzi { position: fixed; top: 0; right: 0; bottom: 0; left: 0; width: 650px; height: 600px; background: #ffedc8; margin: auto; }
这样,我们在页面正中间写了一个糯米色的盒子:
粽子是三角形的,而且还是圆角三角形的。需要使用 clip-path 属性将其裁剪为一个圆角三角形:
clip-path: path("M100.1,586.4c-36,0-68.2-18.6-86.2-49.8c-18-31.2-18-68.3,0-99.5L237.3,50.2c18-31.2,50.2-49.8,86.2-49.8c36,0,68.2,18.6,86.2,49.8l223.4,386.9c18,31.2,18,68.3,0,99.5c-18,31.2-50.2,49.8-86.2,49.8H100.1z");
path\color{red}pathpath 的值拿走不谢,想知道如何写出来的,我会在未来陆续推出 SVG\color{red}SVGSVG 教程,届时大家就知道了。
至此,咱们已经写出一个粽子的身体了。
由于粽叶也是沿着粽子的轮廓而成,我们将其放到 zongzi\color{red}zongzizongzi 的 div\color{red}divdiv 中,这样就不需要写更多的 clip−path\color{red}clip-pathclip−path 了。
<div class="zongzi"> <div class="leaf-right"></div> <div class="leaf-left"></div> </div>
先控制粽叶的大小、颜色和边框:
.leaf-left, .leaf-right { position: absolute; right: 0; bottom: 0; left: 0; width: 650px; height: 300px; background: linear-gradient( #87d15d 19%, #49912c 20%, #87d15d 21%, #87d15d 39%, #49912c 40%, #87d15d 41%, #87d15d 59%, #49912c 60%, #87d15d 61% ); margin: auto; border-top: 5px solid #49912c; }
这里,粽叶的颜色,采用了线性渐变的方式,让其显示绿色粽叶上有深绿色线条,效果更甚。
我相信细心的你已经发现了,我写了 leaf−right\color{red}leaf-rightleaf−right 和 leaf−left\color{red}leaf-leftleaf−left 两片粽叶,现在却重叠在一起了。于是我们将其分开:
.leaf-left { transform: rotate(30deg) translate(0, 100px); } .leaf-right { transform: rotate(-30deg) translate(0, 100px); }
通过两个对称角度的旋转,得到粽叶包裹的效果:
至此,一个粽子就写出来了。
咱们给粽子一个生命,就加上一张笑脸吧。
先添加两只眼睛:
<div class="zongzi"> <div class="eye-left"></div> <div class="eye-right"></div> <div class="leaf-right"></div> <div class="leaf-left"></div> </div>
控制眼睛的位置、大小:
.eye-left, .eye-right { position: absolute; top: 100px; width: 50px; height: 100px; background: #333; } .eye-left { left: 250px; } .eye-right { right: 250px; }
通过分别控制左眼和右眼的位置之后,得到一双眼睛:
妈呀,这是啥呀,吓死我了( ̄▽ ̄)"…
首先,让眼睛变成圆形,添加 border−radius\color{red}border-radiusborder−radius 属性:
.eye-left, .eye-right { position: absolute; top: 100px; width: 50px; height: 100px; background: #333; border-radius: 50%; } .eye-left { left: 250px; } .eye-right { right: 250px; }
得到如下结果:
然后,我们再如法炮制,使用每一只眼睛的伪元素给眼睛添加眼珠子:
.eye-left::before, .eye-right::before { position: absolute; top: 0; right: 0; bottom: 0; display: block; width: 15px; height: 30px; background: #fff; margin: auto; border-radius: 50%; content: ""; }
使用伪元素可以减少HTML的结构:
至此,两只眼睛都写出来了。
咱们再写一个 div\color{red}divdiv 来做嘴巴:
<div class="zongzi"> <div class="eye-left"></div> <div class="eye-right"></div> <div class="mouth"></div> <div class="leaf-right"></div> <div class="leaf-left"></div> </div>
和眼睛一样,通过CSS控制嘴巴的位置、大小、边框、形状等:
.mouth { position: absolute; top: 200px; right: 0; left: 0; width: 100px; height: 100px; margin: auto; border-bottom: 5px solid #333; border-radius: 50%; }
这样,就得到了一个可爱的粽子:
至此,咱们的可爱的粽子就写出来了。O(∩_∩)O
这里,附上完整的源代码,拿走不用谢:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>可爱的粽子</title> <style type="text/css"> .zongzi { position: fixed; top: 0; right: 0; bottom: 0; left: 0; width: 650px; height: 600px; background: #ffedc8; margin: auto; clip-path: path( "M100.1,586.4c-36,0-68.2-18.6-86.2-49.8c-18-31.2-18-68.3,0-99.5L237.3,50.2c18-31.2,50.2-49.8,86.2-49.8c36,0,68.2,18.6,86.2,49.8l223.4,386.9c18,31.2,18,68.3,0,99.5c-18,31.2-50.2,49.8-86.2,49.8H100.1z" ); } .eye-left, .eye-right { position: absolute; top: 100px; width: 50px; height: 100px; background: #333; border-radius: 50%; } .eye-left { left: 250px; } .eye-right { right: 250px; } .eye-left::before, .eye-right::before { position: absolute; top: 0; right: 0; bottom: 0; display: block; width: 15px; height: 30px; background: #fff; margin: auto; border-radius: 50%; content: ""; } .mouth { position: absolute; top: 200px; right: 0; left: 0; width: 100px; height: 100px; margin: auto; border-bottom: 5px solid #333; border-radius: 50%; } .leaf-left, .leaf-right { position: absolute; right: 0; bottom: 0; left: 0; width: 650px; height: 300px; background: linear-gradient( #87d15d 19%, #49912c 20%, #87d15d 21%, #87d15d 39%, #49912c 40%, #87d15d 41%, #87d15d 59%, #49912c 60%, #87d15d 61% ); margin: auto; border-top: 5px solid #49912c; } .leaf-left { transform: rotate(30deg) translate(0, 100px); } .leaf-right { transform: rotate(-30deg) translate(0, 100px); } </style> </head> <body> <div class="zongzi"> <div class="eye-left"></div> <div class="eye-right"></div> <div class="mouth"></div> <div class="leaf-right"></div> <div class="leaf-left"></div> </div> </body> </html>
那么,聪明的你是否可以在此基础上添加小手和脚丫子呢?并做成动画呢?我拭目以待…