成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

前端每日實(shí)戰(zhàn):144# 視頻演示如何用 D3 和 GSAP 創(chuàng)作一個(gè)集體舞動(dòng)畫

kviccn / 2778人閱讀

摘要:效果預(yù)覽按下右側(cè)的點(diǎn)擊預(yù)覽按鈕可以在當(dāng)前頁(yè)面預(yù)覽,點(diǎn)擊鏈接可以全屏預(yù)覽??山换ヒ曨l此視頻是可以交互的,你可以隨時(shí)暫停視頻,編輯視頻中的代碼。引入庫(kù)刪除掉文件中的子元素節(jié)點(diǎn),刪除掉文件中聲明的變量。

效果預(yù)覽

按下右側(cè)的“點(diǎn)擊預(yù)覽”按鈕可以在當(dāng)前頁(yè)面預(yù)覽,點(diǎn)擊鏈接可以全屏預(yù)覽。

https://codepen.io/comehope/pen/gdVObN

可交互視頻

此視頻是可以交互的,你可以隨時(shí)暫停視頻,編輯視頻中的代碼。

請(qǐng)用 chrome, safari, edge 打開(kāi)觀看。

https://scrimba.com/p/pEgDAM/caRLack

源代碼下載

每日前端實(shí)戰(zhàn)系列的全部源代碼請(qǐng)從 github 下載:

https://github.com/comehope/front-end-daily-challenges

代碼解讀

定義 dom,容器中包含 2 個(gè)子容器,.horizontal 代表水平的線段,.vertical 代表垂直的線段,每個(gè)子容器中包含 4 個(gè)子元素:

居中顯示:

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

設(shè)置容器尺寸,其中 --side-length 是方陣的每一邊的元素?cái)?shù)量:

.container {
    --side-length: 2;
    position: relative;
    width: calc(40px * calc(var(--side-length)));
    height: calc(40px * calc(var(--side-length)));
}

用 grid 布局排列子元素,4 個(gè)元素排列成 2 * 2 的方陣:

.container .horizontal,
.container .vertical {
    position: absolute;
    top: 0;
    left: 0;
    display: grid;
    grid-template-columns: repeat(var(--side-length), 1fr);
}

設(shè)置子元素的樣式,.horizontal 內(nèi)的子元素是橫條,.vertical 內(nèi)的子元素是豎條:

.container .horizontal span {
    width: 40px;
    height: 10px;
    background: #fff;
    margin: 15px 0;
}

.container .vertical span {
    width: 10px;
    height: 40px;
    background: #fff;
    margin: 0 15px;
}

至此,靜態(tài)布局完成,接下來(lái)用 d3 批量處理子元素。
引入 d3 庫(kù):

刪除掉 html 文件中的子元素 dom 節(jié)點(diǎn),刪除掉 css 文件中聲明的 css 變量。
定義方陣每一邊的元素?cái)?shù)量,并把這個(gè)數(shù)值賦給 css 變量:

const SIDE_LENGTH = 2;

let container = d3.select(".container")
    .style("--side-length", SIDE_LENGTH);

定義一個(gè)添加 span 子元素的函數(shù),分別添加橫向和豎向的子元素:

function appendSpan(selector) {
    container.select(selector)
    .selectAll("span")
    .data(d3.range(SIDE_LENGTH * SIDE_LENGTH))
    .enter()
    .append("span");
}

appendSpan(".horizontal");
appendSpan(".vertical");

此時(shí),布局已改為動(dòng)態(tài)的,可以通過(guò)修改 SIDE_LENGTH 的值來(lái)創(chuàng)建不同邊長(zhǎng)的方陣,比如以下語(yǔ)句將創(chuàng)建 5 * 5 的方陣:

const SIDE_LENGTH = 5;

接下來(lái)用 GSAP 創(chuàng)建動(dòng)畫。(注:因 scrimba 在使用 gsap 時(shí)會(huì)崩潰,所以視頻演示采用 css 動(dòng)畫,但 codepen 和 github 均采用 gsap 動(dòng)畫)
引入 GSAP 庫(kù):

聲明動(dòng)畫變量 animation,聲明代表 dom 元素的變量 $horizontalSpan$verticalSpan

let animation = new TimelineMax({repeat: -1});
let $horizontalSpan = ".container .horizontal span";
let $verticalSpan = ".container .vertical span";

先創(chuàng)建橫條的動(dòng)畫,共分成 4 步,每個(gè) to 語(yǔ)句的最后一個(gè)參數(shù)是步驟的名稱:

animation.to($horizontalSpan, 1, {rotation: 45}, "step1")
    .to($horizontalSpan, 1, {x: "-10px", y: "-10px"}, "step2")
    .to($horizontalSpan, 1, {rotation: 0, x: "0", y: "0", scaleY: 2, scaleX: 0.5}, "step3")
    .to($horizontalSpan, 1, {rotation: 90, scaleY: 1, scaleX: 1}, "step4")

再創(chuàng)建豎條的動(dòng)畫,to 語(yǔ)句的步驟名稱與橫條的步驟名稱相同,以便與橫條保持動(dòng)畫同步:

animation.to($verticalSpan, 1, {rotation: 45}, "step1")
    .to($verticalSpan, 1, {x: "10px", y: "10px"}, "step2")
    .to($verticalSpan, 1, {x: "0", y: "0", scaleX: 2, scaleY: 0.5}, "step3")
    .to($verticalSpan, 1, {rotation: 90, scaleX: 1, scaleY: 1}, "step4");

在動(dòng)畫的末尾用時(shí)間尺度縮放函數(shù)讓動(dòng)畫播放速度加快一倍:

animation.timeScale(2);

最后,把方陣的邊長(zhǎng)改為 10,方陣越大就越有氣勢(shì):

const SIDE_LENGTH = 10;

大功告成!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/117004.html

相關(guān)文章

  • 前端每日實(shí)戰(zhàn)144# 視頻演示何用 D3 GSAP 創(chuàng)作一個(gè)體舞動(dòng)畫

    摘要:效果預(yù)覽按下右側(cè)的點(diǎn)擊預(yù)覽按鈕可以在當(dāng)前頁(yè)面預(yù)覽,點(diǎn)擊鏈接可以全屏預(yù)覽??山换ヒ曨l此視頻是可以交互的,你可以隨時(shí)暫停視頻,編輯視頻中的代碼。引入庫(kù)刪除掉文件中的子元素節(jié)點(diǎn),刪除掉文件中聲明的變量。 showImg(https://segmentfault.com/img/bVbht5j?w=400&h=301); 效果預(yù)覽 按下右側(cè)的點(diǎn)擊預(yù)覽按鈕可以在當(dāng)前頁(yè)面預(yù)覽,點(diǎn)擊鏈接可以全屏預(yù)覽...

    niuxiaowei111 評(píng)論0 收藏0
  • 前端每日實(shí)戰(zhàn) 2018 年 9 月份項(xiàng)目匯總(共 26 個(gè)項(xiàng)目)

    摘要:過(guò)往項(xiàng)目年月份項(xiàng)目匯總共個(gè)項(xiàng)目年月份項(xiàng)目匯總共個(gè)項(xiàng)目年月份項(xiàng)目匯總共個(gè)項(xiàng)目年月份項(xiàng)目匯總共個(gè)項(xiàng)目年月份項(xiàng)目匯總共個(gè)項(xiàng)目年月份發(fā)布的項(xiàng)目前端每日實(shí)戰(zhàn)專欄每天分解一個(gè)前端項(xiàng)目,用視頻記錄編碼過(guò)程,再配合詳細(xì)的代碼解讀,是學(xué)習(xí)前端開(kāi)發(fā)的活的參考書 過(guò)往項(xiàng)目 2018 年 8 月份項(xiàng)目匯總(共 29 個(gè)項(xiàng)目) 2018 年 7 月份項(xiàng)目匯總(共 29 個(gè)項(xiàng)目) 2018 年 6 月份項(xiàng)目匯總(...

    lavnFan 評(píng)論0 收藏0
  • 前端每日實(shí)戰(zhàn) 2018 年 9 月份項(xiàng)目匯總(共 26 個(gè)項(xiàng)目)

    摘要:過(guò)往項(xiàng)目年月份項(xiàng)目匯總共個(gè)項(xiàng)目年月份項(xiàng)目匯總共個(gè)項(xiàng)目年月份項(xiàng)目匯總共個(gè)項(xiàng)目年月份項(xiàng)目匯總共個(gè)項(xiàng)目年月份項(xiàng)目匯總共個(gè)項(xiàng)目年月份發(fā)布的項(xiàng)目前端每日實(shí)戰(zhàn)專欄每天分解一個(gè)前端項(xiàng)目,用視頻記錄編碼過(guò)程,再配合詳細(xì)的代碼解讀,是學(xué)習(xí)前端開(kāi)發(fā)的活的參考書 過(guò)往項(xiàng)目 2018 年 8 月份項(xiàng)目匯總(共 29 個(gè)項(xiàng)目) 2018 年 7 月份項(xiàng)目匯總(共 29 個(gè)項(xiàng)目) 2018 年 6 月份項(xiàng)目匯總(...

    whatsns 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<