如何使用CSS和D3實現黑白交疊的動畫效果

來源:互聯網
上載者:User
本篇文章給大家帶來的內容是關於如何使用CSS和D3實現黑白交疊的動畫效果,文章介紹了對js中this的理解,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所協助。

效果預覽

代碼解讀

定義 dom,容器中包含 3 個子項目,每個子項目代表一個圓:

<div class="circles">    <span></span>    <span></span>    <span></span></div>

置中顯示:

body {    margin: 0;    height: 100vh;    display: flex;    align-items: center;    justify-content: center;    background-color: black;}

定義容器尺寸:

.circles {    width: 60vmin;    height: 60vmin;}

畫出容器中的1個圓:

.circles {    position: relative;}.circles span {    position: absolute;    box-sizing: border-box;    width: 50%;    height: 50%;    background-color: white;    border-radius: 50%;    left: 25%;}

定義變數,畫出多個圓,每個圓圍繞著第 1 個圓的底部中點旋轉,圍成一個更大的圓形:

.circles {    --particles: 3;}.circles span {    transform-origin: bottom center;    --deg: calc(360deg / var(--particles) * (var(--n) - 1));    transform: rotate(var(--deg));}.circles span:nth-child(1) {    --n: 1;}.circles span:nth-child(2) {    --n: 2;}.circles span:nth-child(3) {    --n: 3;}

為子項目增加動畫效果:

.circles span {    animation: rotating 5s ease-in-out infinite;}@keyframes rotating {    0% {        transform: rotate(0);    }    50% {        transform: rotate(var(--deg)) translateY(0);    }    100% {        transform: rotate(var(--deg)) translateY(100%) scale(2);    }}

設定子項目混色模式,使子項目間交疊的部分顯示成黑色:

.circles span {    mix-blend-mode: difference;}

為容器增加動畫效果,抵銷子項目放大,使動畫流暢銜接:

.circles {    animation: zoom 5s linear infinite;}@keyframes zoom {    to {        transform: scale(0.5) translateY(-50%);    }}

接下來用 d3 批量處理 dom 元素和 css 變數。
引入 d3 庫:

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

用 d3 為表示圓數量的變數賦值:

const COUNT_OF_PARTICLES = 30;d3.select('.circles')    .style('--particles', COUNT_OF_PARTICLES)

用 d3 產生 dom 元素:

d3.select('.circles')    .style('--particles', COUNT_OF_PARTICLES)    .selectAll('span')    .data(d3.range(COUNT_OF_PARTICLES))    .enter()    .append('span');

用 d3 為表示子項目下標的變數賦值:

d3.select('.circles')    .style('--particles', COUNT_OF_PARTICLES)    .selectAll('span')    .data(d3.range(COUNT_OF_PARTICLES))    .enter()    .append('span')    .style('--n', (d) => d + 1);

刪除掉 html 檔案中的相關 dom 元素和 css 檔案中相關的 css 變數。

最後,把圓的數量調整為 30 個:

const COUNT_OF_PARTICLES = 30;

大功告成!

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.