html5鱼游动动画,前端每日实战:121# 视频演示如何用 CSS 和 D3 创作一个小鱼游动的交互动画...

bVbf6nx?w=400&h=302

效果预览

按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。

可交互视频

此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。

请用 chrome, safari, edge 打开观看。

源代码下载

每日前端实战系列的全部源代码请从 github 下载:

代码解读

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

设置页面样式为全屏且没有滚动条:

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 库:

删除掉 html 中的 .fish 元素和 css 文件中的变量声明代码。创建一个函数,用于生成一条鱼。css 变量的值均为随机生成,--size 的取值范围是 5 ~ 8,--color 的取值范围是 -60 ~ 15,--duration 的取值范围是 3 ~ 6,--top 的取值范围是 100 ~ 300:

function buildFish() {

let fish = d3.select('body')

.append('div')

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

大功告成!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值