前端每日實戰:131# 視頻演示如何用純 CSS 創作一把剪刀

圖片描述

效果預覽

按下右側的“點擊預覽”按鈕可以在當前頁面預覽,點擊鏈接可以全屏預覽。

https://codepen.io/comehope/pen/GXyGpZ

可交互視頻

此視頻是可以交互的,你可以隨時暫停視頻,編輯視頻中的代碼。

請用 chrome, safari, edge 打開觀看。

https://scrimba.com/p/pEgDAM/cwkQWtz

源代碼下載

每日前端實戰系列的全部源代碼請從 github 下載:

https://github.com/comehope/front-end-daily-challenges

代碼解讀

定義 dom,容器中包含 2 個 .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;
}

用僞元素在刀的底部畫一個三角形,使刀與刀柄連接得更牢固:

.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() 函數畫出剪刀的另一半:

.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%;
}

增加動畫鼠標懸停時的動畫效果:

.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));
    }
}

最後,別忘了刪掉輔助線。

大功告成!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章