使用 js 設(shè)置偽元素樣式

在開發(fā)一個ui編輯功能巡验,因為使用的是Vue辫封,最開始的時候是的方法是直接將styles放在dom元素上面砖第,當(dāng)遇到偽元素就無計可施了(切沒發(fā)現(xiàn)JS直接獲取DOM偽元素的方法)荷腊。

于是就想能不能使用什么方法設(shè)置一段css樣式

網(wǎng)絡(luò)上的辦法

我們可以這樣:

document.styleSheets[0].insertRule('.test::before{color:green}',0)//chrome,firefox,ie9+,Edge,移動端
// 不推薦使用绍移,實際使用過程中未生效
document.styleSheets[0].addRule('.test::before{color:green}',0)// IE 瀏覽器

我們還可以這樣:

var style=document.createElement('style');
style.innerHTML=".test::before{color:green}";
document.head.appendChild(style);

我是在移動端使用的悄窃,實際上這兩種方法都是可以的,但是我選擇使用第二種登夫,因為兼容性更好

解決兼容問題

對于兼容問題MDN上面已經(jīng)給出了一個答案 https://developer.mozilla.org/zh-CN/docs/Web/API/CSSStyleSheet/insertRule

(function(Sheet_proto){
  var originalInsertRule = Sheet_proto.insertRule;

  if (originalInsertRule.length === 2){ // 2 個托管參數(shù): (selector, rules)
    Sheet_proto.insertRule = function(selectorAndRule){
      // 首先广匙,從規(guī)則中分離選擇器
      a: for (var i=0, Len=selectorAndRule.length, isEscaped=0, newCharCode=0; i !== Len; ++i) {
        newCharCode = selectorAndRule.charCodeAt(i);
        if (!isEscaped && (newCharCode === 123)) { // 123 = "{".charCodeAt(0)
          // 其次,找到花括號
          var openBracketPos = i, closeBracketPos = -1;

          for (; i !== Len; ++i) {
            newCharCode = selectorAndRule.charCodeAt(i);
            if (!isEscaped && (newCharCode === 125)) { // 125 = "}".charCodeAt(0)
              closeBracketPos = i;
            }
            isEscaped ^= newCharCode===92?1:isEscaped; // 92 = "\\".charCodeAt(0)
          }

          if (closeBracketPos === -1) break a; // No closing bracket was found!
            /*else*/ return originalInsertRule.call(
            this, // 想要改變的樣式表
            selectorAndRule.substring(0, openBracketPos), // 選擇器
            selectorAndRule.substring(closeBracketPos), // 規(guī)則
            arguments[3] // 插入的索引
          );
        }

        // Works by if the char code is a backslash, then isEscaped
        // gets flipped (XOR-ed by 1), and if it is not a backslash
        // then isEscaped gets XORed by itself, zeroing it
        isEscaped ^= newCharCode===92?1:isEscaped; // 92 = "\\".charCodeAt(0)
      }
      // Else, there is no unescaped bracket
      return originalInsertRule.call(this, selectorAndRule, "", arguments[2]);
    };
  }
})(CSSStyleSheet.prototype);

這段代碼應(yīng)該放在何處才能生效恼策,可以自己思考一下鸦致,至于是否選擇這個兼容方案大家自己選擇。

插入順序問題

這兩個方法因為都是插入了一段CSS代碼涣楷,CSS在解析的時候會根據(jù)引入的先后順序和權(quán)重值來解析分唾,導(dǎo)致我們插入的代碼被覆蓋,雖然第二種方法是插入到了head最后狮斗,一定程度上避免了這種問題绽乔,但是不能完全解決這種隱患

解決辦法就是當(dāng)發(fā)現(xiàn)或者憑經(jīng)驗判斷樣式未生效,需要在當(dāng)前功能執(zhí)行之后在head最后重新添加對應(yīng)的CSS代碼

刪除無效CSS代碼

  • 對于第一種方法
    CSSStyleSheet.deleteRule() 移除指定的CSS代碼
  • 對于第二種方法
    可以在創(chuàng)建style的時候設(shè)置一個id碳褒,可以使用 document.styleSheet來匹配id折砸,可以是移除dom或者使用 CSSStyleSheet.deleteRule()移除指定的CSS代碼

參考地址

DocumentOrShadowRoot.styleSheets
Document.styleSheetSets
CSSStyleSheet
CSSStyleSheet.insertRule()
Document.createElement()

使用 js 設(shè)置偽元素樣式
JavaScript HTML DOM - 改變 CSS
JS addRule()和insertRule()方法:添加CSS樣式
如何使用JS操縱偽元素
Js動態(tài)加載CSS樣式文件的2種方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市沙峻,隨后出現(xiàn)的幾起案子睦授,更是在濱河造成了極大的恐慌,老刑警劉巖摔寨,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件去枷,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機删顶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門竖螃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逗余,你說我怎么就攤上這事特咆。” “怎么了猎荠?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵坚弱,是天一觀的道長。 經(jīng)常有香客問我关摇,道長,這世上最難降的妖魔是什么碾阁? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任输虱,我火速辦了婚禮,結(jié)果婚禮上脂凶,老公的妹妹穿的比我還像新娘宪睹。我一直安慰自己,他們只是感情好蚕钦,可當(dāng)我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布亭病。 她就那樣靜靜地躺著,像睡著了一般嘶居。 火紅的嫁衣襯著肌膚如雪罪帖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天邮屁,我揣著相機與錄音整袁,去河邊找鬼。 笑死佑吝,一個胖子當(dāng)著我的面吹牛坐昙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播芋忿,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼炸客,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了戈钢?” 一聲冷哼從身側(cè)響起痹仙,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逆趣,沒想到半個月后蝶溶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年抖所,在試婚紗的時候發(fā)現(xiàn)自己被綠了梨州。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡田轧,死狀恐怖暴匠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情傻粘,我是刑警寧澤每窖,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站弦悉,受9級特大地震影響窒典,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜稽莉,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一瀑志、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧污秆,春花似錦劈猪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至庸推,卻和暖如春常侦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背予弧。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工刮吧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掖蛤。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓杀捻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蚓庭。 傳聞我的和親對象是個殘疾皇子致讥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容