使用JS操作CSS

HTML 元素的 style 屬性

操作 CSS 樣式最簡單的方法桩了,就是使用網(wǎng)頁元素節(jié)點的getAttribute()方法附帽、setAttribute()方法和removeAttribute()方法,直接讀寫或刪除網(wǎng)頁元素的style屬性井誉。但style不僅可以使用字符串讀寫蕉扮,它本身還是一個對象,部署了 CSSStyleDeclaration 接口颗圣,可以直接讀寫個別屬性喳钟。

e.style.fontSize = '18px';
e.style.color = 'black';

CSSStyleDeclaration 接口

Style接口簡介

CSSStyleDeclaration 接口用來操作元素的樣式屁使。三個地方部署了這個接口。

  1. 元素節(jié)點的style屬性(Element.style)
  2. CSSStyle實例的style屬性
  3. window.getComputedStyle()的返回值
    CSSStyleDeclaration 接口可以直接讀寫 CSS 的樣式屬性奔则,不過蛮寂,連詞號需要變成駱駝拼寫法日月。
var divStyle = document.querySelector('div').style;

divStyle.backgroundColor = 'red';
divStyle.border = '1px solid black';
divStyle.width = '100px';
divStyle.height = '100px';
divStyle.fontSize = '10em';

divStyle.backgroundColor // red
divStyle.border // 1px solid black
divStyle.height // 100px
divStyle.width // 100px

該對象的屬性值都是字符串焕蹄,設(shè)置時必須包括單位,但是不含規(guī)則結(jié)尾的分號左冬。比如抽莱,divStyle.width不能寫為100范抓,而要寫為100px。另外食铐,Element.style返回的只是行內(nèi)樣式匕垫,并不是該元素的全部樣式。通過樣式表設(shè)置的樣式璃岳,或者從父元素繼承的樣式年缎,無法通過這個屬性得到。元素的全部樣式要通過window.getComputedStyle()得到铃慷。

CSSStyleDeclaration 實例屬性

**CSSStyleDeclaration.cssText

var divStyle = document.querySelector('div').style;

divStyle.cssText = 'background-color: red;'
  + 'border: 1px solid black;'
  + 'height: 100px;'
  + 'width: 100px;';

ssText的屬性值不用改寫 CSS 屬性名单芜。
CSSStyleDeclaration.length
返回一個整數(shù)值,表示當(dāng)前規(guī)則包含多少條樣式聲明犁柜。

// HTML 代碼如下
// <div id="myDiv"
//   style="height: 1px;width: 100%;background-color: #CA1;"
// ></div>
var myDiv = document.getElementById('myDiv');
var divStyle = myDiv.style;
divStyle.length // 3

CSSStyleDeclaration 實例方法

CSSStyleDeclaration.getPropertyPriority
方法接受 CSS 樣式的屬性名作為參數(shù)洲鸠,返回一個字符串,表示有沒有設(shè)置important優(yōu)先級馋缅。如果有就返回important扒腕,否則返回空字符串。

margin屬性有important優(yōu)先級萤悴,color屬性沒有瘾腰。
CSSStyleDeclaration.getPropertyValue()

接受 CSS 樣式屬性名作為參數(shù),返回一個字符串覆履,表示該屬性的屬性值蹋盆。

// HTML 代碼為
// <div id="myDiv" style="margin: 10px!important; color: red;"/>
var style = document.getElementById('myDiv').style;
style.margin // "10px"
style.getPropertyValue("margin") // "10px"

CSSStyleDeclaration.item()
方法接受一個整數(shù)值作為參數(shù),返回該位置的 CSS 屬性名硝全。

// HTML 代碼為
// <div id="myDiv" style="color: red; background-color: white;"/>
var style = document.getElementById('myDiv').style;
style.item(0) // "color"
style.item(1) // "background-color"

CSSStyleDeclaration.removeProperty()

CSSStyleDeclaration.removeProperty方法接受一個屬性名作為參數(shù)栖雾,在 CSS 規(guī)則里面移除這個屬性,返回這個屬性原來的值伟众。

// HTML 代碼為
// <div id="myDiv" style="color: red; background-color: white;">
//   111
// </div>
var style = document.getElementById('myDiv').style;
style.removeProperty('color') // 'red'
// HTML 代碼變?yōu)?// <div id="myDiv" style="background-color: white;">

CSSStyleDeclaration.setProperty()
CSSStyleDeclaration.setProperty方法用來設(shè)置新的 CSS 屬性析藕。該方法沒有返回值。

該方法可以接受三個參數(shù)凳厢。
第一個參數(shù):屬性名账胧,該參數(shù)是必需的竞慢。
第二個參數(shù):屬性值,該參數(shù)可選治泥。如果省略梗顺,則參數(shù)值默認為空字符串。
第三個參數(shù):優(yōu)先級车摄,該參數(shù)可選。如果設(shè)置仑鸥,唯一的合法值是important吮播,表示 CSS 規(guī)則里面的!important。

// HTML 代碼為
// <div id="myDiv" style="color: red; background-color: white;">
//   111
// </div>
var style = document.getElementById('myDiv').style;
style.setProperty('border', '1px solid blue');

window.getComputedStyle()

行內(nèi)樣式(inline style)具有最高的優(yōu)先級眼俊,改變行內(nèi)樣式意狠,通常會立即反映出來。但是疮胖,網(wǎng)頁元素最終的樣式是綜合各種規(guī)則計算出來的环戈。因此,如果想得到元素實際的樣式澎灸,只讀取行內(nèi)樣式是不夠的院塞,需要得到瀏覽器最終計算出來的樣式規(guī)則。

window.getComputedStyle方法性昭,就用來返回瀏覽器計算后得到的最終規(guī)則拦止。它接受一個節(jié)點對象作為參數(shù),返回一個 CSSStyleDeclaration 實例糜颠,包含了指定節(jié)點的最終樣式信息汹族。所謂“最終樣式信息”,指的是各種 CSS 規(guī)則疊加后的結(jié)果其兴。

var div = document.querySelector('div');
var styleObj = window.getComputedStyle(div);
styleObj.backgroundColor

getComputedStyle方法還可以接受第二個參數(shù)顶瞒,表示當(dāng)前元素的偽元素(比如:before、:after元旬、:first-line榴徐、:first-letter等)。

var result = window.getComputedStyle(div, ':before');

CSS偽元素

CSS 偽元素是通過 CSS 向 DOM 添加的元素法绵,主要是通過:before和:after選擇器生成箕速,然后用content屬性指定偽元素的內(nèi)容。節(jié)點元素的style對象無法讀寫偽元素的樣式朋譬,這時就要用到window.getComputedStyle()盐茎。JavaScript 獲取偽元素,可以使用下面的方法徙赢。

var test = document.querySelector('#test');

var result = window.getComputedStyle(test, ':before').content;
var color = window.getComputedStyle(test, ':before').color;

此外字柠,也可以使用 CSSStyleDeclaration 實例的getPropertyValue方法探越,獲取偽元素的屬性

var result = window.getComputedStyle(test, ':before')
  .getPropertyValue('content');
var color = window.getComputedStyle(test, ':before')
  .getPropertyValue('color');

StyleSheet 接口

StyleSheet接口代表網(wǎng)頁的一張樣式表,包括<link>元素加載的樣式表和<style>元素內(nèi)嵌的樣式表窑业。
document對象的styleSheets屬性钦幔,可以返回當(dāng)前頁面的所有StyleSheet實例(即所有樣式表)。它是一個類似數(shù)組的對象常柄。

var sheets = document.styleSheets;
var sheet = document.styleSheets[0];
sheet instanceof StyleSheet // true

如果是<style>元素嵌入的樣式表鲤氢,還有另一種獲取StyleSheet實例的方法,就是這個節(jié)點元素的sheet屬性西潘。

StyleSheet.disabled
StyleSheet.disabled返回一個布爾值卷玉,表示該樣式表是否處于禁用狀態(tài)。手動設(shè)置disabled屬性為true喷市,等同于在<link>元素里面相种,將這張樣式表設(shè)為alternate stylesheet,即該樣式表將不會生效品姓。
注意寝并,disabled屬性只能在 JavaScript 腳本中設(shè)置,不能在 HTML 語句中設(shè)置腹备。
Stylesheet.href
Stylesheet.href返回樣式表的網(wǎng)址衬潦。對于內(nèi)嵌樣式表,該屬性返回null馏谨。該屬性只讀别渔。

document.styleSheets[0].href

StyleSheet.title
StyleSheet.title屬性返回樣式表的title屬性。

StyleSheet.type
StyleSheet.type屬性返回樣式表的type屬性惧互,通常是text/css哎媚。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市喊儡,隨后出現(xiàn)的幾起案子拨与,更是在濱河造成了極大的恐慌,老刑警劉巖艾猜,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件买喧,死亡現(xiàn)場離奇詭異,居然都是意外死亡匆赃,警方通過查閱死者的電腦和手機淤毛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來算柳,“玉大人低淡,你說我怎么就攤上這事。” “怎么了蔗蹋?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵何荚,是天一觀的道長。 經(jīng)常有香客問我猪杭,道長餐塘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任皂吮,我火速辦了婚禮戒傻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜂筹。我一直安慰自己稠鼻,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布狂票。 她就那樣靜靜地躺著,像睡著了一般熙暴。 火紅的嫁衣襯著肌膚如雪闺属。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天周霉,我揣著相機與錄音掂器,去河邊找鬼。 笑死俱箱,一個胖子當(dāng)著我的面吹牛国瓮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播狞谱,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼乃摹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了跟衅?” 一聲冷哼從身側(cè)響起孵睬,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎伶跷,沒想到半個月后掰读,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡叭莫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年蹈集,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雇初。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡拢肆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情善榛,我是刑警寧澤辩蛋,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站移盆,受9級特大地震影響悼院,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咒循,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一据途、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叙甸,春花似錦颖医、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至僚祷,卻和暖如春佛致,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辙谜。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工俺榆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人装哆。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓罐脊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蜕琴。 傳聞我的和親對象是個殘疾皇子萍桌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345