怎么使用CSS和D3实现一个舞动的画面
小编给大家分享一下怎么使用CSS和D3实现一个舞动的画面,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
代码解读
定义dom,容器中包含1个.square子容器,子容器中包含4个<span>,每个<span>代表一个对角扇形:
<figureclass="container">
<divclass="square">
<span></span>
<span></span>
<span></span>
<span></span>
</div>
</figure>
居中显示:
body{
margin:0;
height:100vh;
display:flex;
align-items:center;
justify-content:center;
background-color:#222;
}
设置容器的尺寸单位,1em等于8px:
.container{
font-size:8px;
}
子容器中的4个<span>不设宽高,只设边框,其中第1个和第4个<span>只取左右边框,第2个和第3个<span>只取上下边框:
.squarespan{
display:block;
border:2.5emsolidtransparent;
color:#ddd;
}
.squarespan:nth-child(1),
.squarespan:nth-child(4){
border-left-color:currentColor;
border-right-color:currentColor;
}
.squarespan:nth-child(2),
.squarespan:nth-child(3){
border-top-color:currentColor;
border-bottom-color:currentColor;
}
把边框改为圆弧:
.squarespan{
border-radius:50%;
}
在子容器中用grid布局把4个<span>设置为2*2的网格:
.square{
display:grid;
grid-template-columns:repeat(2,1fr);
grid-gap:0.2em;
padding:0.1em;
}
旋转4个<span>,使它们围合成一个正方形,看起来像一个花朵,算式的结果是45度,写成这样是为了和接下来的动画的算式的形式保持一致:
.squarespan{
transform:rotate(calc(45deg+90deg*0));
}
增加让<span>旋转的动画,整个动画过程旋转4次,每次旋转90度,4次旋转之后即返回原位:
.squarespan{
animation:rotation2sease-in-outinfinite;
}
@keyframesrotation{
0%{transform:rotate(calc(45deg+90deg*0));}
25%{transform:rotate(calc(45deg+90deg*1));}
50%{transform:rotate(calc(45deg+90deg*2));}
75%{transform:rotate(calc(45deg+90deg*3));}
100%{transform:rotate(calc(45deg+90deg*4));}
}
使其中2个<span>朝相反的方向运动:
.squarespan:nth-child(2),
.squarespan:nth-child(3){
animation-direction:reverse;
}
至此,一个.square子容器的动画已经完成,接下来制作4个.square的动画。
在dom中再增加3组.square子容器:
<figureclass="container">
<divclass="square">
<span></span>
<span></span>
<span></span>
<span></span>
</div>
<divclass="square">
<span></span>
<span></span>
<span></span>
<span></span>
</div>
<divclass="square">
<span></span>
<span></span>
<span></span>
<span></span>
</div>
<divclass="square">
<span></span>
<span></span>
<span></span>
<span></span>
</div>
</figure>
用grid布局把4个.square布局成网格状,变量--columns是网格的边长,即每边有2个.square子容器:
.container{
display:grid;
--columns:2;
grid-template-columns:repeat(var(--columns),1fr);
}
现在看起来好像是有几个黑色的小方块在不停地移动,当dom元素越多时,动画效果看起来就越壮观,就像集体舞一样,人越多越有气势。接下来用d3批量增加dom的元素。
引入d3库:
<scriptclass="lazy" data-src="https://d3js.org/d3.v5.min.js"></script>
声明一个COLUMNS常量,表示网格的边长:
constCOLUMNS=2;
删除掉html文件中的.square子元素,改为用d3动态创建:
d3.select('.container')
.selectAll('p')
.data(d3.range(COLUMNS*COLUMNS))
.enter()
.append('p')
.attr('class','square');
继续用连缀语法增加<span>子元素:
d3.select('.container')
.selectAll('p')
.data(d3.range(COLUMNS*COLUMNS))
.enter()
.append('p')
.attr('class','square')
.selectAll('span')
.data(d3.range(4))
.enter()
.append('span');
删除掉css文件中的--columns变量声明,改为用d3动态声明:
d3.select('.container')
.style('--columns',COLUMNS)
最后,把边长改为4,即让16个.square一起动画:
constCOLUMNS=4;
以上是“怎么使用CSS和D3实现一个舞动的画面”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341