(十三)巧用CSS3之中国结

480 阅读3分钟

「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战

中国结艺是中国特有的民间手工编结艺术,它以其独特的东方神韵、丰富多彩的变化,充分体现了中国人民的智慧和深厚的文化底蕴。中国结对于我们来说是有特殊意义的,一种情结,一种精神。在春节来临之际,送给大家一个福字中国结。

福字中国结

中国结一般由结体流苏两部分组成,接下来我们要准备一下简单的dom结构,如下:

<div class="blessing">
    <span></span>
    <div class="ear"></div>
</div>

结体

23CFC55F-F826-4197-A100-5F19704A3E8E.png 结体也是由很多部分组成,在代码实现部分我分为挂耳、内敛、福字、结身,代码实现如下:

结身

结身为正方形,里面也处理了一些福字的样式。

.blessing {
    --w: 10rem;
    width: var(--w);
    height: var(--w);
    box-sizing: border-box;
    color: #e63924;
    border: calc(var(--w) * 0.02) solid currentColor;
    position: relative;
    text-align: center;
    line-height: calc(var(--w) * 0.96);
    font-size: calc(var(--w) * 0.75);
    font-family: cursive;
    font-weight: bold;
    transform: rotate(-45deg);
}

挂耳

挂耳部分有挂耳,也有挂耳横线部分。

/* 挂耳横 */
.blessing::after {
    content: '';
    width: 25%;
    height: calc(var(--w) * 0.04);
    background-color: currentColor;
    border-radius: calc(var(--w) * 0.02);
    position: absolute;
    right: -28%;
    top: -2%;
    transform: translate(-50%, -50%) rotate(45deg);
}
/* 挂耳 */
.ear {
    width: calc(var(--w) * 0.15);
    height: calc(var(--w) * 0.15);
    background-color: currentColor;
    border-radius: 50%;
    position: absolute;
    top: 0;
    left: 0;
    --move: calc(var(--w) * -0.15);
    transform: translate(var(--move), var(--move));
    --bmove: calc(var(--w) * 1.11);
    box-shadow: calc(var(--w) * 1.13) calc(var(--w) * -0.01), 0 var(--bmove),
            var(--bmove) var(--bmove);
}
.ear::before {
    content: '';
    width: 40%;
    height: 40%;
    color: #fff;
    background-color: currentColor;
    position: absolute;
    top: 30%;
    left: 30%;
    box-shadow: calc(var(--w) * 1.13) calc(var(--w) * -0.01), 0 var(--bmove),
            var(--bmove) var(--bmove);
}

内敛 内敛其实是结身内部的四个边角的装饰。

.ear::after {
    content: '';
    width: 50%;
    height: 50%;
    position: absolute;
    right: 0;
    bottom: 0;
    --m: calc(var(--w) * 0.075);
    --scale: calc(var(--w) * 0.075 * -0.2);
    --iw: calc(var(--w) * 0.96);
    color: #f4b4af;
    box-shadow: var(--m) var(--m) 0 var(--scale) #fff,
            var(--m) var(--m) 0 currentColor,
            calc(var(--m) * 2) var(--m) 0 var(--scale) #fff,
            calc(var(--m) * 2) var(--m) 0 currentColor,
            var(--m) calc(var(--m) * 2) 0 var(--scale) #fff,
            var(--m) calc(var(--m) * 2) 0 currentColor,
            var(--iw) var(--m) 0 var(--scale) #fff,
            var(--iw) var(--m) 0 currentColor,
            calc(var(--iw) - var(--m)) var(--m) 0 var(--scale) #fff,
            calc(var(--iw) - var(--m)) var(--m) 0 currentColor,
            var(--iw) calc(var(--m) * 2) 0 var(--scale) #fff,
            var(--iw) calc(var(--m) * 2) 0 currentColor,
            var(--m) calc(var(--iw) - var(--m)) 0 var(--scale) #fff,
            var(--m) calc(var(--iw) - var(--m)) 0 currentColor,
            calc(var(--m) * 2) var(--iw) 0 var(--scale) #fff,
            calc(var(--m) * 2) var(--iw) 0 currentColor,
            var(--m) var(--iw) 0 var(--scale) #fff,
            var(--m) var(--iw) 0 currentColor,
            var(--iw) calc(var(--iw) - var(--m)) 0 var(--scale) #fff,
            var(--iw) calc(var(--iw) - var(--m)) 0 currentColor,
            var(--iw) var(--iw) 0 var(--scale) #fff,
            var(--iw) var(--iw) 0 currentColor,
            calc(var(--iw) - var(--m)) var(--iw) 0 var(--scale) #fff,
            calc(var(--iw) - var(--m)) var(--iw) 0 currentColor;
}

福字 47808304.jpg 福字只是简单的用文字表示,如果不在乎增加dom元素,可以考虑用css画出来。

div span {
    display: inline-block;
    transform: rotate(45deg);
}

流苏

2CD7FAC2-49D4-412e-A596-DC4D3F36D176.png 流苏的实现方式很简单,给个横线,然后跑配合阴影在多增加几道横线就形成了流苏。

.blessing::before {
    content: '';
    width: 80%;
    height: calc(var(--w) * 0.01);
    background-color: currentColor;
    box-shadow: 0 calc(var(--w) * 0.02), 0 calc(var(--w) * -0.02);
    position: absolute;
    bottom: -40%;
    left: -39%;
    transform: translate(-50%, -50%) rotate(-45deg);
}

总结

整体的实现都是比较简单的,只是考虑的情况比较多,另外内敛的实现用到了很多阴影。对于阴影,我们可以重复的使用它,可以节省很多元素节点,但是我们要注意:阴影的图层是先设置的在最上层。