JavaScript實作動態建立CSS樣式規則方案_javascript技巧
現在Web應用程式中有大量的JavaScript程式碼,而我們也一直在追尋各種讓他們更快的解決方案。
1.我們透過 事件代理(event delegation) 讓事件監聽更有效率,
2.我們利用函數降頻技術(function debouncing) 來限制一段時間內給定方法被調用的次數,請參考:如何防止事件函數的高頻觸發(中文翻譯)
3.我們使用 JavaScript載入器 來載入我們確實需要的那部分資源,等等。
還有一種方式,可以讓我們的頁面更加的快速和高效.那就是直接通過JS動態地添加和刪除樣式表中的某些樣式,用來取代不斷地查詢DOM元素,並應用各種樣式。下面是它的工作原理。
取得樣式表
你可以選擇任意的樣式表來新增樣式規則。如果你有確定的樣式表,則可以在HTML頁面中為 或
/*
回傳值類似下面這樣:
StyleSheetList
{
0: CSSStyleSheet,
1: CSSStyleSheet,
2: CSSStyleSheet,
3: CSSStyleSheet,
4: CSSStyleSheet,
length: 5,
item: function
}
*/
// 取得第一個sheet, 先不管 media屬性
var sheet = document.styleSheets[0];
需要特別注意的是樣式表的media屬性 —— 當你想在螢幕上顯示的時候,你絕對不能把CSS規則加到列印樣式表中。你可以仔細的看一下CSSStyleSheet物件的屬性資訊:
// 控制台輸出第一個樣式表的資訊
console.log(document.styleSheets[0]);
/*
回傳值:
CSSStyleSheet
cssRules: CSSRuleList[物件]
disabled: false
href: "http://davidwalsh.name/somesheet.css"
media: MediaList[物件]
ownerNode: link[物件]
ownerRule: null
parentStyleSheet: null
rules: CSSRuleList[物件]
title: null
type: "text/css"
*/
// 取得媒體類型(media type)
console.log(document.styleSheets[0].media.mediaText)
/*
傳回值可能是:
"all" 或 "print" 或是其他套用到此樣式表的 media
*/
在各種情況下,你肯定都有辦法來取得到要新增規則的樣式表。
建立一個新樣式表
在許多情況下,最好的方法可能是創建一個新的
// 可以新增一個媒體(/媒體查詢,media query)屬性
// style.setAttribute("media", "screen")
// style.setAttribute("media", "only screen and (max-width : 1024px)")
// 對WebKit hack :(
style.appendChild(document.createTextNode(""));
// 將
return style.sheet;
})();
悲劇的是WebKit需要一點hack手段才能正確創建,但我們只需要關心這個sheet。
插入規則
在早期版本的IE中 Stylesheets 的 insertRule方法並不可用,雖然現在這是規則注入的標準。 insertRule 方法需要寫整個CSS規則,和在樣式表中是一樣的寫法:
sheet.insertRule("header { float: left; opacity: 0.8; }", 1);
這個JavaScript API方法雖然看起來有點土,但它確實就是這樣運作的。第二個參數 index 表示要插入規則的位置(索引)。這也是非常有用的,這樣你就可以插入同樣的規則/代碼,這可以讓靠後的規則生效。預設的index是 -1 ,代表整個集合的結尾。如果想要有額外的/懶惰控制規則,你也可以加上 !important 標記到某條規則後,以避免索引的問題。
新增規則 —— 非標準的 addRule 方法
CSSStyleSheet 物件有一個 addRule 方法,允許你註冊CSS規則到樣式表中。 addRule 方法接受三個參數: 第一個參數是選擇器(selector)、第二個參數是CSS規則碼, 第三個則是從0開始的整數索引,表示樣式的位置(在同一個選擇器中):
sheet.addRule("#myList li", "float: left; background: red !important;", 1);
addRule方法的回傳值總是 -1,所以這個值並沒有什麼實際意義.
記住,這種方式的優點在於,從頁面添加的元素自動擁有了應用於他們的樣式,也就是說你不必將它們添加到具體的元素上,而是直接注入到頁面中。當然效率更高!
安全應用規則
因為並不是所有的瀏覽器都支援 insertRule 方法, 所以最好建立一個包裝函數來處理規則應用。下面是一個快速的土方法:
function addCSSRule(sheet, selector, rules, index) {
if("insertRule" in sheet) {
sheet.insertRule(selector "{" rules "}", index);
}
else if("addRule" in sheet) {
sheet.addRule(selector, rules, index);
}
}
// 使用方式
addCSSRule(document.styleSheets[0], "header", "float: left");
這個工具方法應該涵蓋了所有新增style規則的情況。如果你擔心在應用程式中出錯, 那麼應該將該方法的程式碼用一個 try{} catch(e){} 區塊包起來。
插入媒體查詢規則
媒體查詢規則的新增有兩種方式。第一個是使用標準 insertRule 方法:
sheet.insertRule(
"@media only screen and (max-width : 1140px) { header { display: none; } }"
);
當然,因為IE舊版不支援 insertRule,所以另一種方法就是建立一個 STYLE 元素,並指定適當的 media 屬性,然後將樣式新增到新的樣式表中。這可能需要使用多個 STYLE 元素,但也是很容易的。我可能會創建一個物件,指定媒體查詢以及索引,並那樣創建/獲取他們。
動態添加規則到樣式表是高效的手段,可能比你想像的還要簡單。請記住這種方案,可能在你的下一個大應用中需要使用,因為它能在代碼和元素處理這兩方面避免你掉進坑里。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

JavaScript是一種廣泛應用於Web開發的程式語言,而WebSocket則是一種用於即時通訊的網路協定。結合二者的強大功能,我們可以打造一個高效率的即時影像處理系統。本文將介紹如何利用JavaScript和WebSocket來實作這個系統,並提供具體的程式碼範例。首先,我們需要明確指出即時影像處理系統的需求和目標。假設我們有一個攝影機設備,可以擷取即時的影像數
