|
導讀網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立... 網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立在超文本基礎之上的。超級文本標記語言之所以稱為超文本標記語言,是因為文本中包含了所謂“超級鏈接”點。 本篇文章給大家帶來的內容是關于如何使用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;
}定義魚的容器尺寸, .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);
}
}接下來設置一些變量,以便創建不同樣子的魚: 魚的大小的變量 .fish {
--size: 5;
--r: calc(var(--size) * 1vw);
}魚的顏色變量 .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 變量。 <script src="https://d3js.org/d3.v5.min.js"></script> 刪除掉 html 中的 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實現小魚游動的交互動畫(附代碼)的詳細內容,更多請關注php中文網其它相關文章! 網站建設是一個廣義的術語,涵蓋了許多不同的技能和學科中所使用的生產和維護的網站。 |
溫馨提示:喜歡本站的話,請收藏一下本站!