溫馨提示×

溫馨提示×

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

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

怎么用CSS和D3實現(xiàn)小魚游動的交互動畫

發(fā)布時間:2022-02-24 14:59:29 來源:億速云 閱讀:225 作者:小新 欄目:web開發(fā)

小編給大家分享一下怎么用CSS和D3實現(xiàn)小魚游動的交互動畫,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

  代碼解讀

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

  <divclass="fish">

  <spanclass="body"></span>

  <spanclass="eye"></span>

  <spanclass="fin"></span>

  <spanclass="tail"></span>

  </div>

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

  body{

  margin:0;

  width:100vw;

  height:100vh;

  background-color:#222;

  overflow:hidden;

  }

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

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

  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)solidtransparent;

  filter:brightness(2.5);

  left:calc(var(--r)-var(--r2));

  }

  畫出魚的尾巴:

  .fish.tail{

  position:absolute;

  --r3:calc(var(--r)/3);

  border:var(--r3)solidtransparent;

  border-right-color:currentColor;

  border-left-style:none;

  right:0;

  top:calc(var(--r)-var(--r3));

  }

  增加讓魚游動的動畫效果,不是循環(huán)執(zhí)行,而是只執(zhí)行一次:

  .fish{

  right:calc(var(--r)*-1);

  animation:run3slinearforwards;

  }

  @keyframesrun{

  to{

  right:100%;

  }

  }

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

  .fish{

  animation:

  run3slinearforwards,

  shake0.3slinearinfinite;

  }

  @keyframesshake{

  50%{

  transform:rotateY(-30deg);

  }

  100%{

  transform:rotateY(30deg);

  }

  }

  接下來設(shè)置一些變量,以便創(chuàng)建不同樣子的魚:

  魚的大小的變量--size,數(shù)值越大尺寸越大:

  .fish{

  --size:5;

  --r:calc(var(--size)*1vw);

  }

  魚的顏色變量--color,表示色相環(huán)的角度:

  .fish{

  --color:0;

  color:hsl(var(--color),50%,50%);

  }

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

  .fish{

  --duration:3;

  animation:

  runcalc(var(--duration)*1s)linearforwards,

  shake0.3slinearinfinite;

  }

  魚出現(xiàn)的高度,數(shù)據(jù)越大越靠近頁面下部:

  .fish{

  --top:100;

  top:calc(var(--top)*1px);

  }

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

  引入d3庫:

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

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

  functionbuildFish(){

  letfish=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');

  }

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

  functionbuildFish(e){

  //略....

  .style('--top',e.clientY);

  }

  window.addEventListener('click',buildFish);

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

  .fish{

  top:calc(var(--top)*1px-var(--r));

  }

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

  functionbuildFish(e){

  //略....

  .style('--top',e?e.clientY:d3.randomUniform(100,300)());

  }

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


看完了這篇文章,相信你對“怎么用CSS和D3實現(xiàn)小魚游動的交互動畫”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI