中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

CSS和D3制作小魚游動的交互動畫效果

發布時間:2020-05-13 13:54:35 來源:億速云 閱讀:360 作者:Leah 欄目:web開發

本篇文章主要探討如何用CSS和D3制作小魚游動的交互動畫效果。有一定的參考價值,有需要的朋友可以參考一下,跟隨小編一起來看解決方法吧。

效果預覽

CSS和D3制作小魚游動的交互動畫效果

源代碼下載

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

代碼解讀

定義 dom,容器中包含的子元素分別代表魚的身體、眼睛、背鰭和尾巴:

<div class="fish">
    <span class="body"></span>
    <span class="eye"></span>
    <span class="fin"></span>
    <span class="tail"></span>
</div>

設置頁面樣式為全屏且沒有滾動條:

body {
    margin: 0;
    width: 100vw;
    height: 100vh;
    background-color: #222;
    overflow: hidden;
}

定義魚的容器尺寸,--r 是一個基本尺寸單位,后續所有尺寸都是基于它計算的:

.fish {
    position: absolute;
    --r: 15vw;
    width: calc(var(--r) + var(--r) / 3);
    height: calc(var(--r) * 2);
    left: 50%;
    top: 100px;
}

畫出魚的身體,同時把魚的顏色聲明到父類中,因為下面還會用到這個顏色:

.fish {
    color: hsl(0, 50%, 50%);
}

.fish .body {
    position: absolute;
    border: var(--r) solid transparent;
    border-right-color: currentColor;
    border-left-style: none;
}

畫出魚的眼睛:

.fish .eye {
    position: absolute;
    --r1: calc(var(--r) / 4);
    width: var(--r1);
    height: var(--r1);
    background-color: #111;
    border-radius: 50%;
    top: 35%;
    left: 30%;
}

畫出魚的背鰭:

.fish .fin {
    position: absolute;
    --r2: calc(var(--r) / 2);
    border-bottom: var(--r2) solid;
    border-left: var(--r2) solid transparent;
    filter: brightness(2.5);
    left: calc(var(--r) - var(--r2));
}

畫出魚的尾巴:

.fish .tail {
    position: absolute;
    --r3: calc(var(--r) / 3);
    border: var(--r3) solid transparent;
    border-right-color: currentColor;
    border-left-style: none;
    right: 0;
    top: calc(var(--r) - var(--r3));
}

增加讓魚游動的動畫效果,不是循環執行,而是只執行一次:

.fish {
    right: calc(var(--r) * -1);
    animation: run 3s linear forwards;
}

@keyframes run {
    to {
        right: 100%;
    }
}

再增加魚游動時搖擺的動畫效果:

.fish {
    animation: 
        run 3s linear forwards,
        shake 0.3s linear infinite;
}

@keyframes shake {
    50% {
        transform: rotateY(-30deg);
    }

    100% {
        transform: rotateY(30deg);
    }
}

接下來設置一些變量,以便創建不同樣子的魚:

魚的大小的變量 --size,數值越大尺寸越大:

.fish {
    --size: 5;
    --r: calc(var(--size) * 1vw);
}

魚的顏色變量 --color,表示色相環的角度:

.fish {
    --color: 0;
    color: hsl(var(--color), 50%, 50%);
}

魚從右側游到左側的時長,時長越短游得越快:

.fish {
    --duration: 3;
    animation: 
        run calc(var(--duration) * 1s) linear forwards,
        shake 0.3s linear infinite;
}

魚出現的高度,數據越大越靠近頁面下部:

.fish {
    --top: 100;
    top: calc(var(--top) * 1px);
}

接下來用 d3 來批量處理 dom 元素和 css 變量。
引入 d3 庫:

<script src="https://d3js.org/d3.v5.min.js"></script>

刪除掉 html 中的 .fish 元素和 css 文件中的變量聲明代碼。創建一個函數,用于生成一條魚。css 變量的值均為隨機生成,--size 的取值范圍是 5 ~ 8,--color 的取值范圍是 -60 ~ 15,--duration 的取值范圍是 3 ~ 6,--top 的取值范圍是 100 ~ 300:

function buildFish() {
    let fish = d3.select('body')
        .append('p')
        .attr('class', 'fish')
        .style('--size', d3.randomUniform(5, 8)())
        .style('--color', d3.randomUniform(-60, 15)())
        .style('--duration', d3.randomUniform(3, 6)())
        .style('--top', d3.randomUniform(100, 300)());
    
    fish.append('span').attr('class', 'body');
    fish.append('span').attr('class', 'eye');
    fish.append('span').attr('class', 'fin');
    fish.append('span').attr('class', 'tail');
}

綁定鼠標單擊事件,當按下鼠標時就生成一條魚:

function buildFish(e) {
    //略....
    .style('--top', e.clientY);
}

window.addEventListener('click', buildFish);

并且讓魚的嘴部和點擊的位置在一條水平線上:

.fish {
    top: calc(var(--top) * 1px - var(--r));
}

最后,在頁面載入時自動生成 3 條魚,以免頁面載入后一片空白:

function buildFish(e) {
    //略....
    .style('--top', e ? e.clientY : d3.randomUniform(100, 300)());
}

d3.range(3).forEach(buildFish);

看完上述內容,你們掌握CSS和D3制作小魚游動的交互動畫效果的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

桂林市| 柏乡县| 吕梁市| 抚州市| 白水县| 呈贡县| 潼南县| 德保县| 郯城县| 泰顺县| 布尔津县| 双柏县| 大新县| 乌兰察布市| 英吉沙县| 措美县| 开鲁县| 罗甸县| 鄂尔多斯市| 和硕县| 鄂伦春自治旗| 台北市| 通辽市| 会昌县| 定陶县| 简阳市| 广安市| 班玛县| 华宁县| 彝良县| 安顺市| 咸丰县| 汨罗市| 保德县| 西乌| 威信县| 会昌县| 汽车| 八宿县| 无棣县| 嘉峪关市|