使用CSS和D3實(shí)現(xiàn)一個(gè)舞動(dòng)畫面的方法?這個(gè)問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個(gè)問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!
目前創(chuàng)新互聯(lián)已為上1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站托管、服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、雄縣網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
https://github.com/comehope/front-end-daily-challenges
定義 dom,容器中包含 1 個(gè) .square
子容器,子容器中包含 4 個(gè) <span>
,每個(gè) <span>
代表一個(gè)對角扇形:
<figure class="container"> <div class="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; }
設(shè)置容器的尺寸單位,1em
等于 8px
:
.container { font-size: 8px; }
子容器中的 4 個(gè) <span>
不設(shè)寬高,只設(shè)邊框,其中第 1 個(gè)和第 4 個(gè) <span>
只取左右邊框,第 2 個(gè)和第 3 個(gè) <span>
只取上下邊框:
.square span { display: block; border: 2.5em solid transparent; color: #ddd; } .square span:nth-child(1), .square span:nth-child(4) { border-left-color: currentColor; border-right-color: currentColor; } .square span:nth-child(2), .square span:nth-child(3) { border-top-color: currentColor; border-bottom-color: currentColor; }
把邊框改為圓弧:
.square span { border-radius: 50%; }
在子容器中用 grid 布局把 4 個(gè) <span>
設(shè)置為 2 * 2 的網(wǎng)格:
.square { display: grid; grid-template-columns: repeat(2, 1fr); grid-gap: 0.2em; padding: 0.1em; }
旋轉(zhuǎn) 4 個(gè) <span>
,使它們圍合成一個(gè)正方形,看起來像一個(gè)花朵,算式的結(jié)果是 45 度,寫成這樣是為了和接下來的動(dòng)畫的算式的形式保持一致:
.square span { transform: rotate(calc(45deg + 90deg * 0)); }
增加讓 <span>
旋轉(zhuǎn)的動(dòng)畫,整個(gè)動(dòng)畫過程旋轉(zhuǎn) 4 次,每次旋轉(zhuǎn) 90 度,4 次旋轉(zhuǎn)之后即返回原位:
.square span { animation: rotation 2s ease-in-out infinite; } @keyframes rotation { 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 個(gè) <span>
朝相反的方向運(yùn)動(dòng):
.square span:nth-child(2), .square span:nth-child(3) { animation-direction: reverse; }
至此,一個(gè) .square
子容器的動(dòng)畫已經(jīng)完成,接下來制作 4 個(gè) .square
的動(dòng)畫。
在 dom 中再增加 3 組 .square
子容器:
<figure class="container"> <div class="square"> <span></span> <span></span> <span></span> <span></span> </div> <div class="square"> <span></span> <span></span> <span></span> <span></span> </div> <div class="square"> <span></span> <span></span> <span></span> <span></span> </div> <div class="square"> <span></span> <span></span> <span></span> <span></span> </div> </figure>
用 grid 布局把 4 個(gè) .square
布局成網(wǎng)格狀,變量 --columns
是網(wǎng)格的邊長,即每邊有 2 個(gè) .square
子容器:
.container { display: grid; --columns: 2; grid-template-columns: repeat(var(--columns), 1fr); }
現(xiàn)在看起來好像是有幾個(gè)黑色的小方塊在不停地移動(dòng),當(dāng) dom 元素越多時(shí),動(dòng)畫效果看起來就越壯觀,就像集體舞一樣,人越多越有氣勢。接下來用 d3 批量增加 dom 的元素。
引入 d3 庫:
<script src="https://d3js.org/d3.v5.min.js"></script>
聲明一個(gè) COLUMNS
常量,表示網(wǎng)格的邊長:
const COLUMNS = 2;
刪除掉 html 文件中的 .square
子元素,改為用 d3 動(dòng)態(tài)創(chuàng)建:
d3.select('.container') .selectAll('p') .data(d3.range(COLUMNS * COLUMNS)) .enter() .append('p') .attr('class', 'square');
繼續(xù)用連綴語法增加 <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 動(dòng)態(tài)聲明:
d3.select('.container') .style('--columns', COLUMNS) /*略*/
最后,把邊長改為 4,即讓 16 個(gè) .square
一起動(dòng)畫:
const COLUMNS = 4;
感謝各位的閱讀!看完上述內(nèi)容,你們對使用CSS和D3實(shí)現(xiàn)一個(gè)舞動(dòng)畫面的方法大概了解了嗎?希望文章內(nèi)容對大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
新聞名稱:使用CSS和D3實(shí)現(xiàn)一個(gè)舞動(dòng)畫面的方法
文章轉(zhuǎn)載:http://jinyejixie.com/article40/pggeho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、App設(shè)計(jì)、關(guān)鍵詞優(yōu)化、品牌網(wǎng)站制作、Google、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)