如何用純 CSS 創(chuàng)作一把剪刀
問(wèn):如何用純 CSS 創(chuàng)作一把剪刀

動(dòng)態(tài)效果預(yù)覽
復(fù)制跳轉(zhuǎn)下方連接可以去查看動(dòng)態(tài)效果
https://codepen.io/comehope/pen/GXyGpZ
源代碼下載
https://github.com/comehope/front-end-daily-challenges
代碼解讀
定義 dom,容器中包含 2 個(gè) .half 元素,各表示剪刀的半邊,它的子元素 handle 表示刀柄,blade 表示刀,最后的 .joint 表示連接左右兩部分鉚釘:
<figure class="scissors">
<div class="half">
<span class="handle"></span>
<span class="blade"></span>
</div>
<div class="half">
<span class="blade"></span>
<span class="handle"></span>
</div>
<div class="joint"></div>
</figure>
居中顯示:
body {
margin: 0;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
定義容器尺寸,其中 outline 是輔助線:
.scissors {
width: 21em;
height: 7em;
outline: 1px dashed;
}
定義半邊剪刀的尺寸,其中 outline 是輔助線:
.scissors {
position: relative;
}
.half {
position: absolute;
width: inherit;
height: 4em;
outline: 1px dashed red;
}
畫出刀柄:
.handle {
position: absolute;
box-sizing: border-box;
width: 8em;
height: inherit;
border: 1em solid #333;
border-radius: 2em;
}

畫出刀,用圓角屬性畫出了頂部的刀尖:
.blade {
position: absolute;
width: 15em;
height: 1em;
background-color: silver;
top: 3em;
left: 6em;
border-radius: 0 0 1em 0;
z-index: -1;
}

用偽元素在刀的底部畫一個(gè)三角形,使刀與刀柄連接得更牢固:
.blade::before {
content: '';
position: absolute;
border-style: solid;
border-width: 0 1.8em 1em 1.8em;
border-color: transparent transparent silver transparent;
top: -1em;
left: 0.2em;
}

使半邊刀傾斜:
.half {
transform-origin: 45% bottom;
transform: rotate(15deg);
}
利用 scale() 函數(shù)畫出剪刀的另一半:
.half {
transform-origin: 45% bottom;
transform: rotate(calc(15deg * var(--direction))) scaleY(var(--direction));
}
.half:nth-child(1) {
--direction: 1;
top: 0;
}
.half:nth-child(2) {
--direction: -1;
top: -1em;
}

畫出連接左右半邊的鉚釘:
.joint {
position: absolute;
width: 0.7em;
height: 0.7em;
background-color: #333;
border-radius: 50%;
top: calc(50% - 0.7em / 2);
left: 45%;
}

增加動(dòng)畫鼠標(biāo)懸停時(shí)的動(dòng)畫效果:
.scissors:hover .half {
animation: cut 2s ease-out;
}
@keyframes cut {
20%, 60% {
transform: rotate(calc(30deg * var(--direction))) scaleY(var(--direction));
}
40%, 80% {
transform: rotate(calc(5deg * var(--direction))) scaleY(var(--direction));
}
}

最后,別忘了刪掉輔助線。
原文出處:https://segmentfault.com/a/1190000016331561
CSS真是神秘~
針對(duì)這個(gè)題目,你的解決方案又是什么呢?
不妨在下面的留言給出,學(xué)習(xí)共勉下~
碼字不易,走過(guò)路過(guò)可否點(diǎn)個(gè) 在看,點(diǎn)個(gè)贊??先謝謝了!
ε=ε=ε=┏(゜ロ゜;)┛
最后
?有疑問(wèn)的同學(xué) 歡迎 評(píng)論區(qū)討論,也歡迎大家加入我的前端技術(shù)交流群 來(lái)討論。搜索《前端陽(yáng)光》公眾號(hào),回復(fù)加群吧!
評(píng)論
圖片
表情
