在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當(dāng)前位置:雨林木風(fēng)下載站 > 網(wǎng)頁(yè)設(shè)計(jì)教程 > 詳細(xì)頁(yè)面

如何使用CSS與GSAP完成有多個(gè)關(guān)鍵幀的連續(xù)動(dòng)畫(附源碼)

如何使用CSS與GSAP完成有多個(gè)關(guān)鍵幀的連續(xù)動(dòng)畫(附源碼)

更新時(shí)間:2025-11-23 文章作者:未知 信息來(lái)源:網(wǎng)絡(luò) 閱讀次數(shù):

導(dǎo)網(wǎng)頁(yè)的本質(zhì)就是超級(jí)文本標(biāo)記語(yǔ)言,通過(guò)結(jié)合使用其他的Web技術(shù)(如:腳本語(yǔ)言、公共網(wǎng)關(guān)接口、組件等),可以創(chuàng)造出功能強(qiáng)大的網(wǎng)頁(yè)。因而,超級(jí)文本標(biāo)記語(yǔ)言是萬(wàn)維網(wǎng)(Web)編程的基礎(chǔ),也就是說(shuō)萬(wàn)維網(wǎng)是建立...
網(wǎng)頁(yè)的本質(zhì)就是超級(jí)文本標(biāo)記語(yǔ)言,通過(guò)結(jié)合使用其他的Web技術(shù)(如:腳本語(yǔ)言、公共網(wǎng)關(guān)接口、組件等),可以創(chuàng)造出功能強(qiáng)大的網(wǎng)頁(yè)。因而,超級(jí)文本標(biāo)記語(yǔ)言是萬(wàn)維網(wǎng)(Web)編程的基礎(chǔ),也就是說(shuō)萬(wàn)維網(wǎng)是建立在超文本基礎(chǔ)之上的。超級(jí)文本標(biāo)記語(yǔ)言之所以稱為超文本標(biāo)記語(yǔ)言,是因?yàn)槲谋局邪怂^“超級(jí)鏈接”點(diǎn)。
本篇文章給大家?guī)?lái)的內(nèi)容是關(guān)于如何使用CSS和GSAP實(shí)現(xiàn)有多個(gè)關(guān)鍵幀的連續(xù)動(dòng)畫(附源碼),有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。

效果預(yù)覽


4094838559-5b985d3ec76bc_articlex.gif

源代碼下載

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

代碼解讀

定義 dom,容器中包含 10 個(gè) p 子元素,每個(gè) p 中包含 1 個(gè) span 元素:

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

居中顯示:

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

定義容器的尺寸和樣式:

.container {
    width: 400px;
    height: 400px;
    background: linear-gradient(45deg, tomato, gold);
    border-radius: 3%;
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
}

畫出容器里的 1 個(gè)元素,它有一個(gè)外殼 p,里面是一個(gè)白色的小方塊 span

.container {
    position: relative;
}

.container p {
    position: absolute;
    width: inherit;
    height: inherit;
    display: flex;
    align-items: center;
    justify-content: center;
}

.container p span {
    position: absolute;
    width: 40px;
    height: 40px;
    background-color: white;
}

為容器中的元素定義下標(biāo)變量,并讓元素的外殼依次旋轉(zhuǎn),圍合成一個(gè)圓形,其中 outline 是輔助線:

.container p {
    outline: 1px dashed black;
    transform: rotate(calc((var(--n) - 1) * 36deg));
}

.container p:nth-child(1) { --n: 1; }
.container p:nth-child(2) { --n: 2; }
.container p:nth-child(3) { --n: 3; }
.container p:nth-child(4) { --n: 4; }
.container p:nth-child(5) { --n: 5; }
.container p:nth-child(6) { --n: 6; }
.container p:nth-child(7) { --n: 7; }
.container p:nth-child(8) { --n: 8; }
.container p:nth-child(9) { --n: 9; }
.container p:nth-child(10) { --n: 10; }

至此,子元素繪制完成,接下來(lái)開始寫動(dòng)畫腳本。
引入 GSAP 庫(kù):

<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/2.0.2/TweenMax.min.js"></script>

定義一個(gè)變量,代表子元素選擇器:

let elements = '.container p span';

聲明一個(gè)時(shí)間線對(duì)象:

let animation = new TimelineMax();

先設(shè)定入場(chǎng)方式為由小(第1幀)變大(第2幀),其中并沒(méi)有第 2 幀的代碼,它是隱含在語(yǔ)義中的:

animation.from(elements, 1, {scale: 0});

讓子元素變成豎長(zhǎng)條,向四周散開(第3幀):

animation.from(elements, 1, {scale: 0})
    .to(elements, 1, {y: '-100px', scaleX: 0.25});

讓豎長(zhǎng)條旋轉(zhuǎn)著變成小方塊(第4幀):

animation.from(elements, 1, {scale: 0})
    .to(elements, 1, {y: '-100px', scaleX: 0.25})
    .to(elements, 1, {scaleY: 0.25, rotation: 180});

讓小方塊變成橫長(zhǎng)條,圍成一個(gè)圓形(第5幀):

animation.from(elements, 1, {scale: 0})
    .to(elements, 1, {y: '-100px', scaleX: 0.25})
    .to(elements, 1, {scaleY: 0.25, rotation: 180})
    .to(elements, 1, {scaleX: 1});

注意,因 scrimba 在錄制過(guò)多幀時(shí)會(huì)崩潰,所以第 6 幀至第 11 幀沒(méi)有在視頻中體現(xiàn)。
讓圓形向內(nèi)收斂,同時(shí)線條變細(xì)(第6幀):

animation.from(elements, 1, {scale: 0})
    .to(elements, 1, {y: '-100px', scaleX: 0.25})
    .to(elements, 1, {scaleY: 0.25, rotation: 180})
    .to(elements, 1, {scaleX: 1})
    .to(elements, 1, {y: '-60px', scaleY: 0.1});

讓線條向左擺動(dòng)(第7幀):

animation.from(elements, 1, {scale: 0})
    .to(elements, 1, {y: '-100px', scaleX: 0.25})
    .to(elements, 1, {scaleY: 0.25, rotation: 180})
    .to(elements, 1, {scaleX: 1})
    .to(elements, 1, {y: '-60px', scaleY: 0.1})
    .to(elements, 1, {x: '-30px'});

再讓線條向右擺動(dòng)(第8幀):

animation.from(elements, 1, {scale: 0})
    .to(elements, 1, {y: '-100px', scaleX: 0.25})
    .to(elements, 1, {scaleY: 0.25, rotation: 180})
    .to(elements, 1, {scaleX: 1})
    .to(elements, 1, {y: '-60px', scaleY: 0.1})
    .to(elements, 1, {x: '-30px'})
    .to(elements, 1, {x: '30px'});

再把橫線變?yōu)樨Q線,造型與第 3 幀相似,只是線更細(xì),更向內(nèi)收斂(第9幀):

animation.from(elements, 1, {scale: 0})
    .to(elements, 1, {y: '-100px', scaleX: 0.25})
    .to(elements, 1, {scaleY: 0.25, rotation: 180})
    .to(elements, 1, {scaleX: 1})
    .to(elements, 1, {y: '-60px', scaleY: 0.1})
    .to(elements, 1, {x: '-30px'})
    .to(elements, 1, {x: '30px'})
    .to(elements, 1, {x: '0', scaleX: 0.1, scaleY: 1});

再把豎線變?yōu)闄M線,造型與第 5 幀相似,但線短一些(第10幀):

animation.from(elements, 1, {scale: 0})
    .to(elements, 1, {y: '-100px', scaleX: 0.25})
    .to(elements, 1, {scaleY: 0.25, rotation: 180})
    .to(elements, 1, {scaleX: 1})
    .to(elements, 1, {y: '-60px', scaleY: 0.1})
    .to(elements, 1, {x: '-30px'})
    .to(elements, 1, {x: '30px'})
    .to(elements, 1, {x: '0', scaleX: 0.1, scaleY: 1})
    .to(elements, 1, {scaleX: 0.5, scaleY: 0.1})

橫線稍向外擴(kuò)散,變?yōu)閳A點(diǎn)(第11幀):

animation.from(elements, 1, {scale: 0})
    .to(elements, 1, {y: '-100px', scaleX: 0.25})
    .to(elements, 1, {scaleY: 0.25, rotation: 180})
    .to(elements, 1, {scaleX: 1})
    .to(elements, 1, {y: '-60px', scaleY: 0.1})
    .to(elements, 1, {x: '-30px'})
    .to(elements, 1, {x: '30px'})
    .to(elements, 1, {x: '0', scaleX: 0.1, scaleY: 1})
    .to(elements, 1, {scaleX: 0.5, scaleY: 0.1})
    .to(elements, 1, {y: '-80px', scaleY: 0.5, borderRadius: '50%'});

讓圓點(diǎn)變形為豎線,并向內(nèi)收縮,這個(gè)變化的距離長(zhǎng),所以動(dòng)畫時(shí)間也要長(zhǎng)一些(第12幀):

animation.from(elements, 1, {scale: 0})
    .to(elements, 1, {y: '-100px', scaleX: 0.25})
    .to(elements, 1, {scaleY: 0.25, rotation: 180})
    .to(elements, 1, {scaleX: 1})
    .to(elements, 1, {y: '-60px', scaleY: 0.1})
    .to(elements, 1, {x: '-30px'})
    .to(elements, 1, {x: '30px'})
    .to(elements, 1, {x: '0', scaleX: 0.1, scaleY: 1})
    .to(elements, 1, {scaleX: 0.5, scaleY: 0.1})
    .to(elements, 1, {y: '-80px', scaleY: 0.5, borderRadius: '50%'})
    .to(elements, 1, {y: '-10px', scaleX: 0.1, scaleY: 0.5, borderRadius: '0%', rotation: 0});

讓豎線從中心向外快速擴(kuò)散,擴(kuò)散前稍停片刻,好像線條都被發(fā)射出一樣(第13幀):

animation.from(elements, 1, {scale: 0})
    .to(elements, 1, {y: '-100px', scaleX: 0.25})
    .to(elements, 1, {scaleY: 0.25, rotation: 180})
    .to(elements, 1, {scaleX: 1})
    .to(elements, 1, {y: '-60px', scaleY: 0.1})
    .to(elements, 1, {x: '-30px'})
    .to(elements, 1, {x: '30px'})
    .to(elements, 1, {x: '0', scaleX: 0.1, scaleY: 1})
    .to(elements, 1, {scaleX: 0.5, scaleY: 0.1})
    .to(elements, 1, {y: '-80px', scaleY: 0.5, borderRadius: '50%'})
    .to(elements, 1, {y: '-10px', scaleX: 0.1, scaleY: 0.5, borderRadius: '0%', rotation: 0})
    .to(elements, 1, {y: '-300px', delay: 0.5});

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

animation.from(elements, 1, {scale: 0})
    .to(elements, 1, {y: '-100px', scaleX: 0.25})
    .to(elements, 1, {scaleY: 0.25, rotation: 180})
    .to(elements, 1, {scaleX: 1})
    .to(elements, 1, {y: '-60px', scaleY: 0.1})
    .to(elements, 1, {x: '-30px'})
    .to(elements, 1, {x: '30px'})
    .to(elements, 1, {x: '0', scaleX: 0.1, scaleY: 1})
    .to(elements, 1, {scaleX: 0.5, scaleY: 0.1})
    .to(elements, 1, {y: '-80px', scaleY: 0.5, borderRadius: '50%'})
    .to(elements, 1, {y: '-10px', scaleX: 0.1, scaleY: 0.5, borderRadius: '0%', rotation: 0})
    .to(elements, 1, {y: '-300px', delay: 0.5})
    .timeScale(2);

修改聲明時(shí)間線的代碼,使動(dòng)畫重復(fù)播放:

let animation = new TimelineMax({repeat: -1, repeatDelay: 1});

至此,動(dòng)畫完成。
隱藏容器外的內(nèi)容,并刪掉輔助線;

.container {
    overflow: hidden;
}

.container p {
    /* outline: 1px dashed black; */
}

最后,裝飾一下頁(yè)面的角落:

body {
    overflow: hidden;
}

body::before,
body::after {
    content: '';
    position: absolute;
    width: 60vmin;
    height: 60vmin;
    border-radius: 50%;
    background: radial-gradient(
        transparent 25%,
        gold 25%, gold 50%,
        tomato 50%
    );
}

body::before {
    left: -30vmin;
    bottom: -30vmin;
}

body::after {
    right: -30vmin;
    top: -30vmin;
}

大功告成!

相關(guān)推薦:

如何使用純CSS實(shí)現(xiàn)一把剪刀的效果(附源碼)

如何使用純CSS實(shí)現(xiàn)條紋錯(cuò)覺(jué)的動(dòng)畫效果(附源碼)

以上就是如何使用CSS和GSAP實(shí)現(xiàn)有多個(gè)關(guān)鍵幀的連續(xù)動(dòng)畫(附源碼)的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!


網(wǎng)站建設(shè)是一個(gè)廣義的術(shù)語(yǔ),涵蓋了許多不同的技能和學(xué)科中所使用的生產(chǎn)和維護(hù)的網(wǎng)站。

溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

本類教程下載

系統(tǒng)下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 99精品免费在线观看| 午夜影院免费版| 老汉色影院首页| 乱妇乱女熟妇熟女网站| 黑人巨大国产9丨视频| 一区二区三区入口| 国产aⅴ爽av久久久久| 日韩av新片网| 日本高清xxxx| 特级西西人体www高清大胆| 亚洲国产日韩欧美在线观看| 美女网站免费观看视频| 欧美一级片中文字幕| 国模无码视频一区二区三区| 国产一二三在线视频| 久久男人资源站| 2019日韩中文字幕mv| 久久艹国产精品| 欧美三级在线观看视频| 国产视频九色蝌蚪| 992tv人人草| 成年人在线看片| 午夜免费福利网站| 国产一区二区在线视频播放| 男女私大尺度视频| 久久国产精品网| 一个色综合久久| 欧美成人免费高清视频| 四虎成人在线播放| 国产手机免费视频| av磁力番号网| 影音先锋男人的网站| 免费看日b视频| 国产xxxxx视频| 日韩a一级欧美一级| 精品少妇在线视频| 亚洲欧美激情网| 成年人视频大全| 8x8ⅹ国产精品一区二区二区| 国产三级生活片| 欧美国产综合在线| 手机在线成人免费视频| 天堂8在线天堂资源bt| 国产www免费| 激情婷婷综合网| 乱熟女高潮一区二区在线| 虎白女粉嫩尤物福利视频| 日韩精品手机在线观看| 日本熟妇人妻xxxxx| 强开小嫩苞一区二区三区网站| 黄色a级片免费| 大西瓜av在线| 黄色免费观看视频网站| www.久久久精品| 成人羞羞国产免费网站| 国产精品一色哟哟| 国产成人生活片| 91视频福利网| 九九热在线免费| 黄色动漫在线免费看| 7777在线视频| 91免费视频污| 在线观看日本www| 尤蜜粉嫩av国产一区二区三区| 免费观看美女裸体网站| 久久精品无码中文字幕| 九九久久九九久久| 北条麻妃亚洲一区| 日本久久久久久久久久久久| 国产亚洲精品网站| 日本男女交配视频| 日韩成人午夜影院| 无套内谢丰满少妇中文字幕| 国产亚洲视频一区| 中文字幕1234区| 一区二区在线免费看| 小早川怜子一区二区三区| 日本高清久久久| jizzzz日本| 日韩av影视大全| 欧美一级中文字幕| 8x8x华人在线| 欧美日韩不卡在线视频| 久久国产成人精品国产成人亚洲| 国产中文字幕视频在线观看| 女人帮男人橹视频播放| 久久视频这里有精品| 18岁网站在线观看| 国产精彩免费视频| 香蕉视频999| 色撸撸在线观看| 久无码久无码av无码| 日韩欧美在线免费观看视频| 北条麻妃视频在线| 亚洲国产成人va在线观看麻豆| 99视频在线观看视频| 亚洲五码在线观看视频| 蜜臀av午夜一区二区三区| 免费av不卡在线| 欧美久久久久久久久久久久久久| 日本免费黄视频| 奇米777在线视频| 免费观看精品视频| 欧美第一页浮力影院| 免费网站在线观看黄| 国产欧美123| 亚洲视频在线观看一区二区三区| 色噜噜狠狠永久免费| 久久久久久久久久久久久久久国产 | 日韩av手机版| 最新视频 - x88av| 日本999视频| 亚洲欧洲日产国码无码久久99| 日本肉体xxxx裸体xxx免费| 超碰97免费观看| 东京热加勒比无码少妇| 91最新在线观看| 可以在线看的av网站| 国产偷人视频免费| 国产欧美自拍视频| 日日干日日操日日射| 亚洲网中文字幕| 91日韩视频在线观看| 青娱乐精品在线| 国产精品99久久免费黑人人妻| 国产熟人av一二三区| 欧美三级理论片| 艳母动漫在线观看| 一二三四视频社区在线| 国产精品久久久久9999小说| 在线播放 亚洲| 国产高清视频网站| 日韩一级性生活片| 三年中国中文在线观看免费播放| 能在线观看的av网站| 久久精品免费一区二区| 性欧美videossex精品| 俄罗斯av网站| 人妻少妇精品无码专区二区| 国内外成人激情免费视频| 欧美三级午夜理伦三级| 久久久久99精品成人片| 深夜做爰性大片蜜桃| 亚洲免费成人在线视频| 在线观看的毛片| 日本网站免费在线观看| 国产情侣第一页| 亚洲不卡视频在线| 色综合av综合无码综合网站| 日日碰狠狠添天天爽超碰97| 成人性生交视频免费观看| 亚洲精品成人在线播放| 手机看片福利盒子久久| wwww.国产| 国产成人无码av在线播放dvd| 波多野结衣乳巨码无在线| 在线免费黄色小视频| 热这里只有精品| 成人小视频在线观看免费| 免费看av软件| 丰满的少妇愉情hd高清果冻传媒 | 国产精品波多野结衣| 亚洲一二三区av| 在线观看av的网址| 一本—道久久a久久精品蜜桃| 国产精品久久久久久久99| 国产免费内射又粗又爽密桃视频| 久久久久久av无码免费网站下载| 福利视频免费在线观看| 久久人妻精品白浆国产| chinese少妇国语对白| 亚洲欧美国产中文| www.18av.com| 日韩a∨精品日韩在线观看| 国产黄色特级片| 男人c女人视频| 国产一区二区视频免费在线观看 | 亚洲第一成肉网| 日韩欧美国产综合在线| 欧美性久久久久| 午夜精品在线免费观看| 欧美精品一区二区三区三州| 少妇熟女一区二区| 欧美三级在线观看视频| 亚洲精品无码久久久久久| 四季av一区二区三区| 黄色a级三级三级三级| 国产av麻豆mag剧集| 超碰在线97免费| 欧美性猛交xxx乱久交| 久久成人免费观看| av7777777| 国产小视频精品| 日本三日本三级少妇三级66| 大陆极品少妇内射aaaaaa| 水蜜桃在线免费观看| 无码粉嫩虎白一线天在线观看| 妺妺窝人体色www在线小说| 天天操狠狠操夜夜操| 啊啊啊一区二区|