【使用 DOM】為DOM元素設置樣式

来源:http://www.cnblogs.com/luka/archive/2016/08/16/5766060.html
-Advertisement-
Play Games

1. 使用樣式表 可以通過document.styleSheets屬性訪問文檔中可用的CSS樣式表,它會返回一組對象集合,這些對象代表了與文檔管理的各個樣式表。 每個樣式表 都由一個CSSStyleSheet 對象代表,它提供了一組屬性和方法來操作文檔里的樣式。 1.1 獲得樣式表的基本信息 第一步 ...


1. 使用樣式表

可以通過document.styleSheets屬性訪問文檔中可用的CSS樣式表,它會返回一組對象集合,這些對象代表了與文檔管理的各個樣式表。

每個樣式表 都由一個CSSStyleSheet 對象代表,它提供了一組屬性和方法來操作文檔里的樣式。

 

1.1 獲得樣式表的基本信息

第一步是獲得定義在文檔中的樣式表的一些基本信息。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>為DOM元素設置樣式</title>
    <style title="core styles">
        p {border: medium double green; background-color: lightgray;}
        #block1 {color: white;}
        table {border: thin solid red;border-collapse: collapse; margin: 5px;float: left;}
        td {padding: 2px;}
    </style>
    <link rel="stylesheet" type="text/css" href="css/style.css" />
    <style media="screen AND (min-width:500px)" type="text/css">
        #block2 {color: yellow;font-style: italic;}
    </style>
</head>
<body>
<p id="block1">
    你承受的苦難並不比他人多太多,痛苦主要來自敏感和脆弱
</p>
<p id="block2">
    一些年輕人,通過高端消費來營造自己高端收入的形象
</p>
<div id="placeholder"></div>
<script>
    var placeholder = document.getElementById("placeholder");
    var sheets = document.styleSheets;
    for(var i= 0;i<sheets.length;i++){
        var newElem = document.createElement("table");
        newElem.setAttribute("border","1");
        addRow(newElem,"Index",i);
        addRow(newElem,"href",sheets[i].href);
        addRow(newElem,"title",sheets[i].title);
        addRow(newElem,"type",sheets[i].type);
        addRow(newElem,"ownerNode",sheets[i].ownerNode.tagName);
        placeholder.appendChild(newElem);
    }

    function addRow(elem,header,value){
        elem.innerHTML += "<tr><td>" + header + ":</td><td>" + value + "</td></tr>";
    }
</script>
</body>
</html>

此例枚舉了文檔內定義的所有樣式表,併為每個樣式都創建了一個table元素以容納可用的基本信息。這個文檔里有三個樣式表。其中兩個是用script元素定義的,另一個則包含在名為style.css的外部文件里,是通過link元素導入文檔中的。從下圖可以看到腳本輸出的結果:

請註意,不是所有的屬性都帶有值。舉個慄子,href 屬性只有在樣式表由外部文件載入時才會返回一個值。

 

1.2 使用媒介限制

當定義樣式表時可以使用media屬性來限制樣式應用的場合。可以使用CSSStyleSheet.media 屬性訪問這些限制,它會返回一個 MediaList 對象。下表介紹了MediaList對象的方法和屬性:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用MediaList對象</title>
    <style title="core styles">
        p {border: medium double green; background-color: lightgray;}
        #block1 {color: white;}
        table {border: thin solid red;border-collapse: collapse; margin: 5px;float: left;}
        td {padding: 2px;}
    </style>
    <link rel="stylesheet" type="text/css" href="../css/style.css" />
    <style media="screen AND (min-width:500px)" type="text/css">
        #block2 {color: yellow;font-style: italic;}
    </style>
</head>
<body>
<p id="block1">
    你承受的苦難並不比他人多太多,痛苦主要來自敏感和脆弱
</p>
<p id="block2">
    一些年輕人,通過高端消費來營造自己高端收入的形象
</p>
<div id="placeholder"></div>
<script>
    var placeholder = document.getElementById("placeholder");
    var sheets = document.styleSheets;
    for(var i = 0; i < sheets.length; i++){
        if(sheets[i].media.length > 0){
            var newElem = document.createElement("table");
            newElem.setAttribute("border","1");
            addRow(newElem,"Media Count",sheets[i].media.length);
            addRow(newElem,"Media Text",sheets[i].media.mediaText);
            for(var j = 0;j < sheets[i].media.length; j++){
                addRow(newElem,"Media " + j, sheets[i].media.item(j));
            }
            placeholder.appendChild(newElem);
        }
    }

    function addRow(elem,header,value){
        elem.innerHTML += "<tr><td>" + header + ":</td><td>" + value + "</td></tr>";
    }
</script>
</body>
</html>

此例中,為所有具備media屬性的樣式表分別創建了一張表格,並枚舉了其中的各個媒介、屬性值里的媒介總數和整個media字元串。

 

1.3 禁用樣式表

CSSStyleSheet.disabled屬性可以用來一次性啟動和禁用某個樣式表裡的所有樣式。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>啟用和禁用樣式表</title>
    <style title="core styles">
        p {border: medium double green; background-color: lightgray;}
        #block1 {color: white;border: thick solid green; background-color: gray;}
    </style>
</head>
<body>
<p id="block1">
    你承受的苦難並不比他人多太多,痛苦主要來自敏感和脆弱。
</p>
<div><button id="pressme">Press Me</button></div>
<script>
    document.getElementById("pressme").onclick = function(){
       document.styleSheets[0].disabled = !document.styleSheets[0].disabled;
    }
</script>
</body>
</html>

此例中,點擊按鈕會切換(唯一一個)樣式表上disabled屬性的值。一旦樣式表被禁用,它所包含的任何樣式都不會被應用到元素上。

 

1.4 CSSRuleList對象的成員

CSSStyleSheet.cssRules屬性會返回一個CSSRuleList對象,它允許你訪問樣式表裡的各種樣式。下表介紹了這個對象的成員。

樣式表裡的每一種CSS樣式都由一個CSSStyleRule對象代表。

 下麵的例子展示了CSSRuleList對象的用法和CSSStyleRule對象的基本屬性。這裡說的基本是因為style屬性所返回的CSSStyleDeclaration對象可以深入樣式內部,而且給某個元素應用樣式時用的也是這個對象。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用CSSRuleList和CSSStyleRule對象</title>
    <style title="core styles">
        p {border: medium double green; background-color: lightgray;}
        #block1 {color: white;}
        table {border: thin solid red;border-collapse: collapse; margin: 5px;float: left;}
        td {padding: 2px;}
    </style>
</head>
<body>
<p id="block1">
    你承受的苦難並不比他人多太多,痛苦主要來自敏感和脆弱。
</p>
<p id="block2">
    一些年輕人,通過高端消費來營造自己高端收入的形象。
</p>
<div><button id="pressme">Press Me</button> </div>
<div id="placeholder"></div>
<script>
    var placeholder = document.getElementById("placeholder");
    processStyleSheet();

    document.getElementById("pressme").onclick = function(){
        document.styleSheets[0].cssRules.item(1).selectorText = "#block2";
        if(placeholder.hasChildNodes()){
            var childCount = placeholder.childNodes.length;
            for(var i = 0; i < childCount; i++){
                placeholder.removeChild(placeholder.firstChild);
            }
        }
        processStyleSheet();
    }

    function  processStyleSheet(){
        var ruleList = document.styleSheets[0].cssRules;
        for(var i = 0; i < ruleList.length; i++){
            var rule = ruleList.item(i);
            var newElem = document.createElement("table");
            newElem.setAttribute("border","1");
            addRow(newElem,"parentStyleSheet",rule.parentStyleSheet.title);
            addRow(newElem,"selectorText",rule.selectorText);
            addRow(newElem,"cssText",rule.cssText);
            placeholder.appendChild(newElem);
        }
    }

    function addRow(elem,header,value){
        elem.innerHTML += "<tr><td>" + header + ":</td><td>" + value + "</td></tr>";
    }
</script>
</body>
</html>

此例對這些對象做了兩件事。第一件事是簡單地獲取已定義樣式的信息,報告它的父樣式表、選擇器和樣式所包含的各條規則聲明。

這段腳本還演示瞭如何輕鬆改變某個樣式。點擊button後,其中一個樣式的選擇器會從#block1變成#block2,產生的效果是改變了此樣式所應用的p元素。就像其他對DOM的改動一樣,瀏覽器會立即反映出新選擇器並更新樣式應用的方式。

 

2. 使用元素樣式

要獲取某個元素的style屬性所定義的樣式屬性,需要讀取HTMLElement對象里定義的style屬性值。style屬性會返回一個CSSStyleDeclaration對象,它和通過樣式表所獲取的對象屬於同一類型。

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>從一個HTMLElement上獲取CSSStyleDeclaration對象</title>
</head>
<body>
<p id="block1">
    你承受的苦難並不比他人多太多,痛苦主要來自敏感和脆弱。
</p>
<div><button id="pressme">Press Me</button> </div>
<div id="placeholder"></div>
<script>
    var placeholder = $("placeholder");
    var targetElem = $("block1");
    displayStyle();
    $("pressme").onclick = function(){
        targetElem.style.cssText = "color:green;"
        displayStyle();
    }
    function displayStyle(){
        if(placeholder.hasChildNodes()){
            placeholder.removeChild(placeholder.firstChild);
        }
        var newElem = document.createElement("table");
        addRow(newElem,"Element CSS",targetElem.style.cssText);
        placeholder.appendChild(newElem);
    }
    function addRow(elem,header,value){
        elem.innerHTML += "<tr><td>" + header + ":</td><td>" + value + "</td></tr>";
    }
    function $(id){
        return document.getElementById(id);
    }
</script>
</body>
</html>

這段腳本會顯示某個元素的style屬性值,並且button被點擊後還會修改這個值以應用另一種樣式。

 

3. 使用CSSStyleDeclaration對象

處理的是樣式表還是某個元素的style屬性並不重要。要通過DOM完全控制CSS,必須使用CSSStyleDeclaration對象。

除了item方法,大多數瀏覽器還支持數組風格的表示法,因此 item(4) 和 item[4] 是等價的。

 

3.1 使用便捷屬性

操作CSSStyleDeclaration 對象最簡單的方式是使用便捷屬性,它們分別對應各個CSS屬性。可以通過讀取對象屬性來確定對應CSS屬性的當前值,並通過給對象屬性指派新值來改變CSS的值。

PS:此節里讀取和修改的值屬於設置值(configured value)。實際讀取和修改的是定義在HTML文檔中的值,它們或者位於樣式表中,或者直接被應用到元素上。當瀏覽器準備顯示某個元素時,它會生成一組計算值(computed value),通過模型來處理瀏覽器樣式、樣式表和style屬性的層疊和繼承。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用CSSStyleDeclaration對象的便捷屬性</title>
    <style title="core styles">
        #block1 {color: white;border:thick solid green;background-color: gray;}
        p {border: medium double blue; background-color: lightgray;}
        table {border: thin solid red;border-collapse: collapse;margin: 5px;float: left;}
        td {padding: 2px;}
    </style>
</head>
<body>
<p id="block1">
    你承受的苦難並不比他人多太多,痛苦主要來自敏感和脆弱。
</p>
<p id="block2" style="border:medium dashed yellow;color: red;padding: 2px;">
    一些年輕人,通過高端消費來營造自己高端收入的形象

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 測試環境是chrome瀏覽器 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.132 Safari/537.36 css樣式 div { cursor:url('1.jpg'), ...
  • display 用來設置元素的顯示方式 display : block | none | inline | inline-block inline:指定對象為內聯元素 block:指定對象為塊元素 inline-block:指定對象為內聯塊元素 none:隱藏對象 float 控制元素是否浮動顯示 ...
  • 1.版本問題 如果你可以獲取下列元素 <input type="hidden"/> <div style="display:none">123</div> 而你使用的JQuery是高於1.3版本的,你獲取不到通過visibility:hidden樣式隱藏的元素就對了 2.解決方案 $("div"). ...
  • 下麵列了五個例子來詳細說明,這幾個例子的主要功能是:在5秒後,自動跳轉到同目錄下的hello.html(根據自己需要自行修改)文件。1) html的實現 優點:簡單缺點:Struts Tiles中無法使用 2) javascript的實現 優點:靈活,可以結合更多的其他功能缺點:受到不同瀏覽器的影響 ...
  • JavaScript閉包 1、什麼是閉包 百度百科對於閉包的解釋是:閉包是指可以包含自由(未綁定到特定對象)變數的代碼塊;這些變數不是在這個代碼塊內或者任何全局上下文中定義的,而是在定義代碼塊的環境中定義(局部變數)。 以代碼進行闡釋: 這樣在執行完var c=a()後,變數c實際上是指向了函數b, ...
  • (上述代碼是改過後正確的)今天在用ajax的時候!出現了愚蠢的錯誤!由於括弧太多加上自己又粗心了!把最後的第68行的發送請求寫到了第63行的大括弧里變了~!導致我找了快一個小時的錯誤了!!!!!!淚奔o(>_<)o ~~發現這個錯誤後我“北京癱”了十分鐘o(>_<)o ~~ ...
  • ...
  • ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...