温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么用CSS和D3实现小鱼游动的交互动画

发布时间:2022-02-24 14:59:29 来源:亿速云 阅读:228 作者:小新 栏目:web开发

小编给大家分享一下怎么用CSS和D3实现小鱼游动的交互动画,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

  代码解读

  定义dom,容器中包含的子元素分别代表鱼的身体、眼睛、背鳍和尾巴:

  <divclass="fish">

  <spanclass="body"></span>

  <spanclass="eye"></span>

  <spanclass="fin"></span>

  <spanclass="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)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));

  }

  增加让鱼游动的动画效果,不是循环执行,而是只执行一次:

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

  }

  }

  接下来设置一些变量,以便创建不同样子的鱼:

  鱼的大小的变量--size,数值越大尺寸越大:

  .fish{

  --size:5;

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

  }

  鱼的颜色变量--color,表示色相环的角度:

  .fish{

  --color:0;

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

  }

  鱼从右侧游到左侧的时长,时长越短游得越快:

  .fish{

  --duration:3;

  animation:

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

  shake0.3slinearinfinite;

  }

  鱼出现的高度,数据越大越靠近页面下部:

  .fish{

  --top:100;

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

  }

  接下来用d3来批量处理dom元素和css变量。

  引入d3库:

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

  删除掉html中的.fish元素和css文件中的变量声明代码。创建一个函数,用于生成一条鱼。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');

  }

  绑定鼠标单击事件,当按下鼠标时就生成一条鱼:

  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实现小鱼游动的交互动画”有了一定的了解,如果想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI