CSS练习:使用CSS绘制各种图案
前言
在公司里上班主要还是写后端,但是有时候想实现自己的想法时,前端的能力常常成为我得瓶颈,特别是样式这块,所以买了套课程来练习CSS技巧
使用clip-path + polygon 来绘制各种图案
之前绘制突然,过于依赖切图或者svg,今天学到了一个新的技巧—clip-path的用法,clip-path可以用来绘制各种各样有意思的图案,而且纯css的实现可以减少对ui的依赖
如下图,这是我练习绘制的一些图案
index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>使用CSS绘制各种图案</title>
<style>
.container {
/*display: flex;*/
/*justify-content: start;*/
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 20px;
}
.polygon {
width: 200px;
height: 200px;
background-color: #1c94ad;
}
.polygon-1 {
--s: 20%;
clip-path: polygon(
var(--s) 0,
calc(100% - var(--s)) 0,
100% 100%,
0 100%
);
}
.polygon-2 {
--s: 20%;
clip-path: polygon(
0 0,
calc(100% - var(--s)) 0,
100% 50%,
calc(100% - var(--s)) 100%,
0 100%,
var(--s) 50%
);
}
.polygon-3 {
--p: 100% 0, 23% 46%, 46% 44%, 15% 69%, 38% 67%, 0 100%, 76% 57%, 53% 58%, 88% 33%, 60% 37%, 100% 0;
clip-path: polygon(var(--p));
}
.polygon-3-invert {
--p: 100% 0, 23% 46%, 46% 44%, 15% 69%, 38% 67%, 0 100%, 76% 57%, 53% 58%, 88% 33%, 60% 37%, 100% 0;
clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%, 0 0, var(--p));
}
.polygon-4 {
--shape: 10% 25%, 35% 25%, 35% 0%, 65% 0%, 65% 25%, 90% 25%, 90% 50%, 65% 50%, 65% 100%, 35% 100%, 35% 50%, 10% 50%, 10% 25%;
clip-path: polygon(var(--shape));
}
.polygon-4-invert {
--shape: 10% 25%, 35% 25%, 35% 0%, 65% 0%, 65% 25%, 90% 25%, 90% 50%, 65% 50%, 65% 100%, 35% 100%, 35% 50%, 10% 50%, 10% 25%;
clip-path: polygon(evenodd, 0 0, 100% 0, 100% 100%, 0 100%, 0 0, var(--shape));
}
.polygon-5 {
/* 内部点 */
--shape-inner: 100% 50%, 78.98% 57.76%, 93.3% 75%, 71.21% 71.21%, 75% 93.3%, 57.76% 78.98%, 50% 100%, 42.24% 78.98%, 25% 93.3%, 28.79% 71.21%, 6.7% 75%, 21.02% 57.76%, 0% 50%, 21.02% 42.24%, 6.7% 25%, 28.79% 28.79%, 25% 6.7%, 42.24% 21.02%, 50% 0%, 57.76% 21.02%, 75% 6.7%, 71.21% 28.79%, 93.3% 25%, 78.98% 42.24%, 100% 50%;
clip-path: polygon(var(--shape-inner));
}
.polygon-5-invert {
--s: -20px; /* 控制空间 */
/* 内部点 */
--shape-inner: 100% 50%, 78.98% 57.76%, 93.3% 75%, 71.21% 71.21%, 75% 93.3%, 57.76% 78.98%, 50% 100%, 42.24% 78.98%, 25% 93.3%, 28.79% 71.21%, 6.7% 75%, 21.02% 57.76%, 0% 50%, 21.02% 42.24%, 6.7% 25%, 28.79% 28.79%, 25% 6.7%, 42.24% 21.02%, 50% 0%, 57.76% 21.02%, 75% 6.7%, 71.21% 28.79%, 93.3% 25%, 78.98% 42.24%, 100% 50%;
/* 外部点 */
--shape-outer: var(--s) var(--s), calc(100% - var(--s)) var(--s), calc(100% - var(--s)) calc(100% - var(--s)), var(--s) calc(100% - var(--s)), var(--s) var(--s);
/*padding: calc(-1 * var(--s)); !* 添加填充 *!*/
box-sizing: content-box; /* 重置 box-sizing */
/* 反转形状 */
clip-path: polygon(evenodd, var(--shape-outer), var(--shape-inner)) content-box; /* 在开头添加 evenodd,结尾添加 content-box */
}
.polygon-6 {
clip-path: polygon(
0% 25%,
0% 75%,
50% 100%,
100% 75%,
100% 25%,
50% 0%
);
}
.polygon-7 {
clip-path: polygon(
50% 0,
calc(50% * (1 + sin(.4turn))) calc(50% * (1 - cos(.4turn))),
calc(50% * (1 - sin(.2turn))) calc(50% * (1 - cos(.2turn))),
calc(50% * (1 + sin(.2turn))) calc(50% * (1 - cos(.2turn))),
calc(50% * (1 - sin(.4turn))) calc(50% * (1 - cos(.4turn)))
);
}
</style>
</head>
<body>
<div class="container">
<div class="polygon polygon-1"></div>
<div class="polygon polygon-2"></div>
<div class="polygon polygon-3"></div>
<div class="polygon polygon-3-invert"></div>
<div class="polygon polygon-4"></div>
<div class="polygon polygon-4-invert"></div>
<div class="polygon polygon-5"></div>
<div class="polygon polygon-5-invert"></div>
<div class="polygon polygon-6"></div>
<div class="polygon polygon-7"></div>
</div>
</body>
</html>