1. 程式人生 > >如何使用純CSS3實現一個沙漏動畫

如何使用純CSS3實現一個沙漏動畫

要實現一個沙漏動畫,我們首先需要實現一個漏斗的幾何形狀。

漏斗圖形

我們接著把漏斗拆分成3個簡單圖形:一個三角形,一個倒置三角形和中間的管道(垂直線)。

那麼問題就簡化為實現三角形和直線。

要實現三角形很簡單,有模式可套用。

即使用零寬高的元素,設定1條邊帶顏色,相交的2條邊為透明。這主要利用了顏色渲染區域在邊界交接處按對角線平分的規則。

#bottom {
    border-right: 20px solid transparent;
    border-bottom: 20px solid #f57323;
    border-left: 20px solid transparent;
    height: 0px;
    width: 1px;
}

注意上面的width屬性不是0而是1px,這是因為我們實際上需要的是帶一點點禿頂的三角形(梯形),所以我們把width設定成1px。

同樣我們可以實現一個倒置的三角形:

#top {
    border-top: 20px solid #f57323;
    border-right: 20px solid transparent;
    border-left: 20px solid transparent;
    height: 0px;
    width: 1px;
}
接著我們同樣利用帶一條邊的元素來建立一根垂直線:
#line {
    border-left: 1px solid #f57323;
    height: 0px;
    width: 0px;
    position: absolute;
    top: 20px;
    left: 20px;
}
這樣一個靜態的漏斗就建立好了,如下所示:
新增動畫
現在我們來給漏斗新增動畫,漏斗的整個過程可以分解為3個動畫:頂部變小、底部變大以及一個倒置(重來)。

前兩者可以使用transform: scale方法,後者使用transform: rotate方法。另外我們給兩個三角形設定變換原點為底邊中心點處。

#top,#bottom{
  transform-origin: 50% 100%; //設定變換原點為底邊中心點處
}
#bottom{
  transform: scale(0); //設定底三角形初始為0
}
@keyframes top {
    100% {
        transform: scale(0); //頂三角形從1到0
    }
}
@keyframes bottom {
    100% {
        transform: scale(1); //底三角形從0到1
    }
}
@keyframes loader { //整個倒轉
    99% {
        transform: rotate(0deg);
    }
    100% {
        transform: rotate(180deg);
    }
}
線上例項

你可以線上自己試試看