最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js動(dòng)態(tài)設(shè)置關(guān)鍵偵@keyframes的方法技巧

 更新時(shí)間:2024年04月10日 10:19:29   作者:Champion.XL  
這篇文章主要給大家介紹了關(guān)于js動(dòng)態(tài)設(shè)置關(guān)鍵偵@keyframes的方法技巧,@keyframes規(guī)則通過(guò)在動(dòng)畫(huà)序列中定義關(guān)鍵幀(或waypoints)的樣式來(lái)控制CSS動(dòng)畫(huà)序列中的中間步驟,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

1.前置知識(shí)

關(guān)鍵偵@keyframes規(guī)則通過(guò)在動(dòng)畫(huà)序列中定義關(guān)鍵偵的樣式來(lái)控制CSS動(dòng)畫(huà)序列的中間步驟

@keyframes slidein {
  from {
    transform: translateX(0%);
  }

  to {
    transform: translateX(100%);
  }
}
// from 等價(jià)于 0%;to 等價(jià)與 100%
// 或者
@keyframes slidein {
  0% {
    top: 0;
    left: 0;
  }
  30% {
    top: 50px;
  }
  68%,
  72% {
    left: 50px;
  }
  100% {
    top: 100px;
    left: 100%;
  }
}

注意,如果在CSS中定義了兩個(gè)相同名字的keyframes,后這會(huì)覆蓋前者

如上圖所示,定義了兩個(gè)相同的動(dòng)畫(huà)偵之后,最終在瀏覽器中應(yīng)用的是后者

2.js動(dòng)態(tài)控制keyframes

背景
在 Vue 項(xiàng)目中由于 css 樣式是直接寫(xiě)在 style 標(biāo)簽中的,那些值都是事先寫(xiě)死的,比如說(shuō)上面的 translateX(disX),disX 是通過(guò) js 動(dòng)態(tài)計(jì)算出來(lái)的。如果要實(shí)現(xiàn)動(dòng)畫(huà)的效果是通過(guò)js動(dòng)態(tài)計(jì)算出來(lái)的,會(huì)比較困難。所以可以通過(guò) js 去設(shè)置 styleSheet 里面的樣式規(guī)則,從而能夠動(dòng)態(tài)的控制 keyframes

StyleSheetjavaScript中表示樣式表的接口,而styleSheet是一個(gè)DOM元素的對(duì)應(yīng)屬性,用于獲取該元素所關(guān)聯(lián)的樣式表

  • 獲取樣式表:通過(guò)styleSheet屬性可以獲取元素關(guān)聯(lián)的樣式表
// 獲取第一個(gè)樣式表
const firstStyleSheet = document.styleSheet[0]
// document.styleSheet 可以理解為一個(gè)二維數(shù)組(但是不是數(shù)組)
// 有多個(gè)樣式表,每個(gè)樣式表中都有多條規(guī)則
  • 插入樣式列表:通過(guò)樣式列表的insertRules方法可以在樣式列表中插入新的規(guī)則
const styleSheet = document.styleSheet[0]
styleSheet.insertRule(`.styleSheetCls { width: 200px; height: 200px}`,0)
// insertRule 方法中的第二個(gè)參數(shù)表示將樣式插入樣式表的哪里
// 這個(gè)規(guī)則會(huì)出現(xiàn)在第一個(gè)樣式表的第一條
  • 刪除樣式規(guī)則:使用樣式表的deleteRule方法可以刪除指定位置的規(guī)則
const styleSheet = document.styleSheet[0]
styleSheet.deleteRule(0)
// 刪除第一個(gè)樣式表的第一條

我們可以通過(guò)styleSheetinsertRule方法動(dòng)態(tài)的添加關(guān)鍵偵樣式

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>動(dòng)態(tài)添加 Keyframes</title>
  <style id="dynamic-styles"></style>
</head>
<body>
  <div id="myDiv"></div>

  <script>
    // 獲取樣式表
    // 這里始終將新的 keyframes 規(guī)則添加在第一個(gè)樣式表的第一條
    const styleSheet = document.styleSheet[0];
	let dis = 0
    //... 動(dòng)態(tài)計(jì)算 dis 的值
    
    // 動(dòng)態(tài)創(chuàng)建 @keyframes
    const keyframesName = 'dynamicAnimation';
    const keyframesRule = `@keyframes ${keyframesName} {
      0% { transform: translateX(${dis}px); }
      25% { transform: translateX(-${dis}px) rotate(0.5deg); }
      50% { transform: translateX(${dis}px) rotate(-0.5deg); }
      75% { transform: translateX(-${dis}px) rotate(0.5deg); }
      100% { transform: translateX(0); }
    }`
     `@keyframes dynamicAnimation{
      0% { transform: translateX(5px); }
      100% { transform: translateX(0); }
    }`
    // 每次添加新的規(guī)則之前,可以將之前的規(guī)則給刪除掉,這樣就可以避免第一個(gè)樣式表的規(guī)則里面有多條重復(fù)名稱(chēng)的 keyframes,避免相同名字的 keyframes 前者被后者覆蓋
    // 獲取第一個(gè)樣式表的第一條規(guī)則的名稱(chēng)
    const firstRules = styleSheet.rules || styleSheet.cssRules
    // 這里是以防第一條規(guī)則不是 keyframes 規(guī)則,從而導(dǎo)致獲取 name 失敗
    const ruleName = firstRules[0].name ? firstRules[0].name : ''
    if(ruleName === keyframesName) {
        /**
        * 這里能夠直接刪除,是因?yàn)槲沂冀K將 keyframes 添加在第一個(gè)樣式表的第一條規(guī)則中
        * 如果不能確定樣式位置,那么就需要遍歷整個(gè)樣式表,找到目標(biāo)樣式表的位置
        * document.styleSheet 可以理解為一個(gè)二維數(shù)組(但是不是數(shù)組,不適合使用數(shù)組的遍歷方式進(jìn)行遍歷)
        * 有多個(gè)樣式表,每個(gè)表中都有多條規(guī)則
        **/ 
        styleSheet.deleteRule(0)
    }
    // 這里始終將新的 keyframes 規(guī)則添加在第一個(gè)樣式表的第一條
    styleSheet.insertRule(keyframesRule, 0);

    // 動(dòng)態(tài)應(yīng)用 @keyframes
    const myDiv = document.getElementById('myDiv');
    myDiv.style.animation = `${keyframesName} 2s ease-in-out`;
  </script>
</body>
</html>

3. 編寫(xiě)技巧

  • 在編寫(xiě)keyframes規(guī)則時(shí),我比較推薦在在style標(biāo)簽中將動(dòng)畫(huà)規(guī)則寫(xiě)好了在復(fù)制到JavaScript邏輯代碼中,因?yàn)槿绻麆?dòng)畫(huà)規(guī)則編寫(xiě)有問(wèn)題,那么在insertRule插入樣式的時(shí)候,可能會(huì)導(dǎo)致樣式表識(shí)別不了
  • 查看是否添加成功,可以在控制臺(tái)打印出來(lái)樣式表,尋找我們添加的規(guī)則,如下圖

    可以看到第一個(gè)樣式表中的第一個(gè)樣式是我們添加的keyframes樣式,并且識(shí)別成功了會(huì)有CSSKeyframesRule的屬性,里面就是我們定義的每一幀的動(dòng)畫(huà)樣式

補(bǔ)充知識(shí):js動(dòng)態(tài)修改@keyframes屬性值

CSS3中增加了@keyframes規(guī)則用于創(chuàng)建動(dòng)畫(huà),創(chuàng)建動(dòng)畫(huà)的原理是,將一套 CSS 樣式逐漸變化為另一套樣式。也就是說(shuō)通過(guò)改變CSS樣式而達(dá)到動(dòng)畫(huà)的效果,所以,要?jiǎng)討B(tài)去改變動(dòng)畫(huà),只有修改樣式。

document.styleSheets這個(gè)接口可以獲取網(wǎng)頁(yè)上引入的link樣式表和style樣式表。如下:

拿到樣式表后就可以操作樣式啦~

insertRule方法用來(lái)給當(dāng)前樣式表插入新的樣式規(guī)則。舉個(gè)栗子:

insertRule(rule,index)

  • rule :要添加到樣式表的規(guī)則。
  • index:要把規(guī)則插入或附加到 cssRules 數(shù)組中的位置。

js既然可以改變樣式了,那傳值就方便啦!

var param = 20;
var style = document.styleSheets[0];
style.insertRule("@keyframes rotate_before{from{ transform: translate(0%,0%); }to{ transform: translate(0%,-"+param +"%);}}",9);//寫(xiě)入樣式

根據(jù)具體需求傳值并修改樣式就醬。

總結(jié) 

到此這篇關(guān)于js動(dòng)態(tài)設(shè)置關(guān)鍵偵@keyframes的文章就介紹到這了,更多相關(guān)js動(dòng)態(tài)設(shè)置關(guān)鍵偵@keyframes內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JS動(dòng)態(tài)添加的div點(diǎn)擊跳轉(zhuǎn)到另一頁(yè)面實(shí)現(xiàn)代碼

    JS動(dòng)態(tài)添加的div點(diǎn)擊跳轉(zhuǎn)到另一頁(yè)面實(shí)現(xiàn)代碼

    這篇文章主要介紹了JS動(dòng)態(tài)添加的div點(diǎn)擊跳轉(zhuǎn)到另一頁(yè)面實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2017-09-09
  • 前端實(shí)現(xiàn)內(nèi)容保護(hù)的幾種有效技術(shù)方案

    前端實(shí)現(xiàn)內(nèi)容保護(hù)的幾種有效技術(shù)方案

    在數(shù)字化時(shí)代,內(nèi)容保護(hù)成為了許多網(wǎng)站和應(yīng)用的重要需求,無(wú)論是付費(fèi)內(nèi)容、考試系統(tǒng)還是敏感信息展示,開(kāi)發(fā)者都需要采取適當(dāng)措施來(lái)防止內(nèi)容被輕易復(fù)制,本文將詳細(xì)介紹幾種前端實(shí)現(xiàn)內(nèi)容保護(hù)的技術(shù)方案,并分析它們的優(yōu)缺點(diǎn),需要的朋友可以參考下
    2025-07-07
  • 用js獲取點(diǎn)擊圖片的值!

    用js獲取點(diǎn)擊圖片的值!

    用js獲取點(diǎn)擊圖片的值!...
    2007-07-07
  • JS?簡(jiǎn)單實(shí)現(xiàn)滑塊驗(yàn)證碼

    JS?簡(jiǎn)單實(shí)現(xiàn)滑塊驗(yàn)證碼

    這篇文章主要為大家介紹了使用JS?簡(jiǎn)單實(shí)現(xiàn)滑塊驗(yàn)證碼示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • js 使用ajax設(shè)置和獲取自定義header信息的方法小結(jié)

    js 使用ajax設(shè)置和獲取自定義header信息的方法小結(jié)

    這篇文章主要介紹了js 使用ajax設(shè)置和獲取自定義header信息的方法,結(jié)合實(shí)例形式總結(jié)分析了js 使用ajax自定義設(shè)置和獲取header響應(yīng)信息相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • layer.msg()去掉默認(rèn)時(shí)間,實(shí)現(xiàn)手動(dòng)關(guān)閉的方法

    layer.msg()去掉默認(rèn)時(shí)間,實(shí)現(xiàn)手動(dòng)關(guān)閉的方法

    今天小編就為大家分享一篇layer.msg()去掉默認(rèn)時(shí)間,實(shí)現(xiàn)手動(dòng)關(guān)閉的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-09-09
  • 微信小程序Vant組件庫(kù)的安裝與使用教程

    微信小程序Vant組件庫(kù)的安裝與使用教程

    之前推薦過(guò)的移動(dòng)端web組件庫(kù) Vant是Vue.js版本的,其對(duì)內(nèi)承載了有贊所有核心業(yè)務(wù),對(duì)外有十多萬(wàn)開(kāi)發(fā)者在使用,一直是業(yè)界主流的移動(dòng)端組件庫(kù)之一,下面這篇文章主要給大家介紹了關(guān)于微信小程序Vant組件庫(kù)的安裝與使用的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • uni-app中如何使用uni.showModal添加輸入框

    uni-app中如何使用uni.showModal添加輸入框

    uni-app是一種使用Vue.js開(kāi)發(fā)所有前端應(yīng)用的框架,uni.showModal是其API之一,用于展示模態(tài)彈窗并可添加輸入框,通過(guò)editable屬性設(shè)置彈窗內(nèi)容是否可編輯,通過(guò)success回調(diào)函數(shù)處理用戶點(diǎn)擊結(jié)果,這提供了一個(gè)交互式元素,方便在應(yīng)用中收集用戶輸入的信息
    2024-09-09
  • javascript中常規(guī)操作節(jié)點(diǎn)的方法合集

    javascript中常規(guī)操作節(jié)點(diǎn)的方法合集

    JavaScript常用操作DOM節(jié)點(diǎn)的方法包括獲取節(jié)點(diǎn),創(chuàng)建節(jié)點(diǎn),添加節(jié)點(diǎn),刪除節(jié)點(diǎn),替換節(jié)點(diǎn)等,下面小編就來(lái)和大家詳細(xì)講講具體的操作方法吧
    2025-05-05
  • 用js寫(xiě)的一個(gè)路由(簡(jiǎn)單實(shí)例)

    用js寫(xiě)的一個(gè)路由(簡(jiǎn)單實(shí)例)

    下面小編就為大家?guī)?lái)一篇用js寫(xiě)的一個(gè)路由(簡(jiǎn)單實(shí)例)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09

最新評(píng)論

渝中区| 佳木斯市| 河北区| 沾化县| 武功县| 峨眉山市| 元朗区| 甘泉县| 贵阳市| 莒南县| 福泉市| 光山县| 朝阳市| 舒兰市| 博湖县| 塘沽区| 新津县| 建湖县| 井陉县| 岑巩县| 丰县| 苗栗县| 密云县| 清河县| 兴业县| 永州市| 乐平市| 循化| 广南县| 铁力市| 钦州市| 浦江县| 镇雄县| 磐石市| 阳江市| 紫云| 石狮市| 长宁县| 乌兰浩特市| 麻江县| 中阳县|