js 動態(tài)添加踢俄、修改css3 @keyframes

一. 效果圖

效果圖

二. 需求

拖動一個shape缩功,小圓點(diǎn)ball運(yùn)動位置也變化。

三. 技術(shù)分析

其中運(yùn)動ball是反復(fù)重復(fù)一個動作運(yùn)動都办,不能使用transition漸變方式寫嫡锌,因為transition只能執(zhí)行一次漸變效果虑稼,重復(fù)運(yùn)動最佳的方式就是采用animation。

四. 問題

@keyframes寫在css中是寫死的势木,此時需要結(jié)束js操作@keyframes蛛倦,那js是如何操作@keyframes呢,下面是我花了一天查詢資料加上自己的摸索啦桌,解決了兼容IE的解決方案溯壶。

五. js操作@keyframes解決方案

  1. 為了方便查詢以及后面循環(huán)過多產(chǎn)生的性能問題,一開始我們就通過js創(chuàng)建@keyframes
// js創(chuàng)建@keyframes甫男,ball從定位在(10,10)的位置運(yùn)動到(100,100) 的位置
const runkeyframes =` @keyframes ball-run{
    0%{
        left: 10px;
        top: 10px;
    }
    100%{
        left: 100px;
        top: 100px;
    }
}`
// 創(chuàng)建style標(biāo)簽
const style = document.createElement('style');
// 設(shè)置style屬性
style.type = 'text/css';
// 將 keyframes樣式寫入style內(nèi)
style.innerHTML = runkeyframes;
// 將style樣式存放到head標(biāo)簽
document.getElementByTagName('head')[0].appendChild(style);
<style>
  .ball{
      width:10px;
      height:10px;
      border-radius:50%;
      background-color:#fff
  }
</style>
<!-- 這是ball的標(biāo)簽和樣式 -->
<div id="ball" class="ball" style="animaition: ball-run 10s infinite;"></div>
  1. js修改@keyframes
// 獲取所有的style樣式
// 尋找ball keyframes對應(yīng)的style樣式
// 獲取方式:根據(jù)animation運(yùn)動的名稱ball-run查詢到對應(yīng)的keyframes對應(yīng)的style
  getkeyframes=(name)=> {
    var animation = {};
    // 獲取所有的style
    var ss = document.styleSheets;
    for (var i = 0; i < ss.length; ++i) {
      const item = ss[i];
      if (item.cssRules[0] && item.cssRules[0].name && item.cssRules[0].name === name) {
        animation.cssRule = item.cssRules[0];
        animation.styleSheet = ss[i];
        animation.index = 0;
      }
    }
    return animation;
  }

const ballRunKeyframes = getkeyframes('ball-run');
// deleteRule方法用來從當(dāng)前樣式表對象中刪除指定的樣式規(guī)則
ballRunKeyframes.styleSheet.deleteRule(animation.index);
//重新定義ball從定位在(20,30)的位置運(yùn)動到(400,500) 的位置
const runkeyframes =` @keyframes ball-run{
    0%{
        left: 20px;
        top: 30px;
    }
    100%{
        left: 400px;
        top: 500px;
    }
}`;
// insertRule方法用來給當(dāng)前樣式表插入新的樣式規(guī)則.
ballRunKeyframes.styleSheet.insertRule(keyFrames, animation.index);
// 此時已經(jīng)修改好了ball-run 對應(yīng)的keyframes了且改,但是在坑爹的IE中小球ball依然沒有改變?yōu)樗倪\(yùn)動方式,解決方案就是板驳,從新刷新ball Dom中的animation的值
const ball = document.getElementById('ball');
// 隨便給一個animation的名稱
ball.setAttribute('style','animaition: ball-run1 10s infinite;');
setTimeout(_=>{
  // 1ms后糾正animation的名稱
  ball.setAttribute('style','animaition: ball-run 10s infinite;');
},1)

六. 總結(jié)

  1. 上面僅提供解決思想又跛,建議不要復(fù)制,因為這里的代碼是我在簡書上手寫若治,如有疑問咱們可以留言相互探討慨蓝。
  2. 注意:
    1) keyframes單獨(dú)寫在一個style中,方便getkeyframes函數(shù)的內(nèi)部遍歷端幼,想知道為什么礼烈,可以將document.styleSheets打印出來看看里面的結(jié)構(gòu)就明白了。
    2) js修改keyframes之后IE可能沒有效果婆跑,需要重新刷新animation值
  3. 參考insertRule方法用來給當(dāng)前樣式表插入新的樣式規(guī)則.此熬,deleteRule方法用來從當(dāng)前樣式表對象中刪除指定的樣式規(guī)則兩個方法
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市洽蛀,隨后出現(xiàn)的幾起案子摹迷,更是在濱河造成了極大的恐慌疟赊,老刑警劉巖郊供,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異近哟,居然都是意外死亡驮审,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門吉执,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疯淫,“玉大人,你說我怎么就攤上這事戳玫∥醪簦” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵咕宿,是天一觀的道長币绩。 經(jīng)常有香客問我蜡秽,道長,這世上最難降的妖魔是什么缆镣? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任芽突,我火速辦了婚禮,結(jié)果婚禮上董瞻,老公的妹妹穿的比我還像新娘寞蚌。我一直安慰自己,他們只是感情好钠糊,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布挟秤。 她就那樣靜靜地躺著,像睡著了一般抄伍。 火紅的嫁衣襯著肌膚如雪煞聪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天逝慧,我揣著相機(jī)與錄音昔脯,去河邊找鬼。 笑死笛臣,一個胖子當(dāng)著我的面吹牛云稚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沈堡,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼静陈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了诞丽?” 一聲冷哼從身側(cè)響起鲸拥,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎僧免,沒想到半個月后刑赶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡懂衩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年撞叨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浊洞。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡牵敷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出法希,到底是詐尸還是另有隱情枷餐,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布苫亦,位于F島的核電站毛肋,受9級特大地震影響奕锌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜村生,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一惊暴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧趁桃,春花似錦辽话、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蟀苛,卻和暖如春益咬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背帜平。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工幽告, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人裆甩。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓冗锁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嗤栓。 傳聞我的和親對象是個殘疾皇子费彼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359