博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何用 CSS 和 D3 创作一个无尽的六边形空间
阅读量:5948 次
发布时间:2019-06-19

本文共 2825 字,大约阅读时间需要 9 分钟。

效果预览

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

可交互视频

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

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

源代码下载

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

代码解读

定义 dom,容器中包含 1 个内含 5 个 <span><div>

<div class="container">    <div class="hexagons">        <span></span>        <span></span>        <span></span>        <span></span>        <span></span>    </div></div>

居中显示:

body {    margin: 0;    height: 100vh;    display: flex;    align-items: center;    justify-content: center;    background: radial-gradient(circle at center, gold, black);}

定义圆形的外层容器的尺寸:

.container {    width: 20em;    height: 20em;    font-size: 20px;    border-radius: 50%;}

在六边形容器中画出 1 个矩形:

.hexagons {    width: inherit;    height: inherit;    display: flex;    align-items: center;    justify-content: center;}.hexagons span {    position: absolute;    width: calc(20em / 1.732);    height: inherit;    background-color: currentColor;}

用伪元素再创建 2 个相同大小的矩形,一起组成一个六边形:

.hexagons span:before,.hexagons span:after {    content: '';    position: absolute;    width: inherit;    height: inherit;    background-color: currentColor;}.hexagons span:before {    transform: rotate(60deg);}.hexagons span:after {    transform: rotate(-60deg);}

让六边形的颜色交错呈现:

.hexagons span:nth-child(odd) {    color: gold;}.hexagons span:nth-child(even) {    color: #222;}

设置变量,让六边形逐渐缩小,小六边形重叠在大六边形的上面:

.hexagons span {    transform: scale(var(--scale)) ;}.hexagons span:nth-child(1) {    --scale: 1;}.hexagons span:nth-child(2) {    --scale: calc(1 * 0.9);}.hexagons span:nth-child(3) {    --scale: calc(1 * 0.9 * 0.9);}.hexagons span:nth-child(4) {    --scale: calc(1 * 0.9 * 0.9 * 0.9);}.hexagons span:nth-child(5) {    --scale: calc(1 * 0.9 * 0.9 * 0.9 * 0.9);}

再设置变量,让六边形依次倾斜不同的角度:

.hexagons span {    transform: scale(var(--scale)) rotate(calc(var(--n) * 6deg));}.hexagons span:nth-child(1) {    --n: 1;}.hexagons span:nth-child(2) {    --n: 2;}.hexagons span:nth-child(3) {    --n: 3;}.hexagons span:nth-child(4) {    --n: 4;}.hexagons span:nth-child(5) {    --n: 5;}

定义动画效果:

.hexagons {    animation: twist 0.5s linear infinite;}@keyframes twist {    from {        transform: rotate(0deg) scale(1);    }    to {        transform: rotate(calc(6deg * -2)) scale(1.25);    }}

隐藏容器外的内容:

.container {    overflow: hidden;}

接下来用 d3 来批量创建六边形。

引入 d3 库:

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

用 d3 创建六边形的 dom 元素:

const COUNT = 5;d3.select('.hexagons')    .selectAll('span')    .data(d3.range(COUNT))    .enter()    .append('span');

用 d3 为六边形的 --n 和 --scale 变量赋值:

d3.select('.hexagons')    .selectAll('span')    .data(d3.range(COUNT))    .enter()    .append('span')    .style('--scale', (d) => Math.pow(0.9, d))    .style('--n', (d) => d + 1);

删除掉 html 文件中的六边形 dom 元素,和 css 文件中声明的变量。

最后,把六边形的数量改为 100 个:

const COUNT = 100;

大功告成!

原文地址:https://segmentfault.com/a/1190000015770017

转载地址:http://twdxx.baihongyu.com/

你可能感兴趣的文章
正则表达式匹配数字
查看>>
前端模块化
查看>>
QIBO CMS SQL Injection Via Variable Uninitialization In \member\special.php
查看>>
二维数组---模拟斗地主
查看>>
【转】(DT系列六)devicetree中数据和 struct device有什么关系
查看>>
【前端性能】必须要掌握的原生JS实现JQuery
查看>>
mysql系统变量
查看>>
svn cleanup failed–previous operation has not finished; run cleanup if it was interrupted
查看>>
JavaScript 编码规范(中文/Airbnb公司版)
查看>>
DNX/ASP.NET 5的xUnit入门向导
查看>>
正则表达式—匹配连续重复的字符
查看>>
如何在一个月内改善你的生活
查看>>
beyond compare比较工具设置
查看>>
Java中的事务
查看>>
Spring Ajax一个简单样例
查看>>
传递给数据库 'master' 中的日志扫描操作的日志扫描号无效
查看>>
导入https证书
查看>>
SAP R3和JAVA交换数据之JCO
查看>>
近期给朋友推荐的笔记本型号
查看>>
sqlserver使用存储过程发送http请求
查看>>