คุณจะเพิ่ม CSS ด้วย Javascript ได้อย่างไร


154

คุณจะเพิ่มกฎ CSS (เช่นstrong { color: red }) โดยใช้ Javascript ได้อย่างไร


คำถามเดียวกัน (คำตอบคือ crossbrowser jQuery) stackoverflow.com/a/266110/341744
ninMonkey

18
@monkey: นั่นเป็นคำตอบที่ไม่ดีนักและไม่ได้ทำตามที่ขอเลย เช่นจะเกิดอะไรขึ้นหากมีการเพิ่ม<strong>องค์ประกอบใหม่ลงในเอกสาร
nickf

คำตอบ:


115

คุณสามารถทำได้โดยใช้อินเทอร์เฟซ CSS ระดับ DOM ( MDN ):

var sheet = window.document.styleSheets[0];
sheet.insertRule('strong { color: red; }', sheet.cssRules.length);

... แต่ทั้งหมด (ตามธรรมชาติ) IE8 และก่อนหน้าซึ่งใช้ถ้อยคำที่แตกต่างกันเล็กน้อย:

sheet.addRule('strong', 'color: red;', -1);

มีข้อได้เปรียบทางทฤษฎีในเรื่องนี้เมื่อเทียบกับวิธี createElement-set-innerHTML ซึ่งคุณไม่ต้องกังวลกับการใส่อักขระ HTML พิเศษใน InnerHTML แต่ในองค์ประกอบสไตล์การปฏิบัติคือ CDATA ใน HTML ดั้งเดิมและ '<' และ '&' ไม่ค่อยได้ใช้ในสไตล์ชีทเลย

คุณต้องมีสไตล์ชีทก่อนจึงจะเริ่มต่อท้ายได้เช่นนี้ นั่นอาจเป็นสไตล์ชีทที่ใช้งานอยู่: ภายนอกฝังหรือว่างเปล่ามันไม่สำคัญ หากไม่มีวิธีเดียวเท่านั้นวิธีมาตรฐานในการสร้างในขณะนี้คือ createElement


"สี" .. โอ้ใช่แล้วโอ๊ะโอ! โชคดีที่เป็นเพียงตัวอย่าง ฉันสงสัยว่าอาจมีวิธี DOM สำหรับสิ่งนี้ขอบคุณ! +1
nickf

14
ชีตมาจากsheet = window.document.styleSheets[0] (คุณต้องมี <style type = "text / css"> </style> อย่างน้อยหนึ่งรายการ)
AJP

1
ขอบคุณตัวอย่างทั้งหมดที่ Google แสดงครั้งแรกนั้นมีขนาดใหญ่มากเมื่อสิ่งที่ฉันต้องการคือการรีเฟรชหน่วยความจำของฉันในสองบรรทัดนี้
ElDoRado1239

1
ฉันรู้ว่ามันได้รับในขณะที่ แต่เมื่อฉันทดสอบครั้งแรกที่ฉันได้รับSecurityError: The operation is insecure.
user10089632

3
@ user10089632 สไตล์ชีทที่คุณกำลังเข้าถึงจำเป็นต้องให้บริการจากโฮสต์เดียวกันกับเอกสารหลักเพื่อให้ทำงานได้
bobince

225

วิธีการที่ง่ายและตรงคือการสร้างและเพิ่มstyleโหนดใหม่ให้กับเอกสาร

// Your CSS as text
var styles = `
    .qwebirc-qui .ircwindow div { 
        font-family: Georgia,Cambria,"Times New Roman",Times,serif;
        margin: 26px auto 0 auto;
        max-width: 650px;
    }
    .qwebirc-qui .lines {
        font-size: 18px;
        line-height: 1.58;
        letter-spacing: -.004em;
    }

    .qwebirc-qui .nicklist a {
        margin: 6px;
    }
`

var styleSheet = document.createElement("style")
styleSheet.type = "text/css"
styleSheet.innerText = styles
document.head.appendChild(styleSheet)

12
ไม่ควรผนวกเข้ากับส่วนหัวของเอกสารมากกว่าเนื้อความใช่หรือไม่
s

3
@bince - ตามข้อกำหนด HTML อย่างแน่นอน แต่เบราว์เซอร์ทั้งหมดจะจดจำได้ทุกที่ document.bodyสั้นลงเพื่อพิมพ์และเร็วกว่าในการดำเนินการมากกว่าdocument.getElementsByTagName("head")[0]และหลีกเลี่ยงปัญหาข้ามเบราว์เซอร์ของ insertRule / addRule
Ben Blank

4
ทางออกควรตามด้วย "duhhhh" ที่ยาว ไม่อยากเชื่อเลยว่าฉันจะไม่คิดถึงมัน
George Mauer

8
document.head.appendChildในเบราว์เซอร์ล่าสุดทั้งหมดคุณก็สามารถใช้
Gajus

2
วิธีนี้ดีกว่ามาก! ลองนึกภาพว่าคุณมีสไตล์ชีทมากกว่าหนึ่ง: ด้วย @bobince โซลูชัน CSS ที่เพิ่มใหม่ของคุณอาจถูกเขียนทับโดยตัวที่สอง / สาม / ฯลฯ สไตล์ชีทบนหน้า การใช้document.body.appendChild(css);คุณต้องแน่ใจว่า CSS ใหม่นั้นเป็นกฎสุดท้ายเสมอ
AvL

27

การแก้ปัญหาโดย Ben Blank จะไม่ทำงานใน IE8 สำหรับฉัน

อย่างไรก็ตามสิ่งนี้ใช้ได้ใน IE8

function addCss(cssCode) {
var styleElement = document.createElement("style");
  styleElement.type = "text/css";
  if (styleElement.styleSheet) {
    styleElement.styleSheet.cssText = cssCode;
  } else {
    styleElement.appendChild(document.createTextNode(cssCode));
  }
  document.getElementsByTagName("head")[0].appendChild(styleElement);
}

12
IE แบบเก่าที่ดีทำให้ชีวิตง่ายขึ้นเสมอ
อเล็กซ์ W

2
คุณควรผนวกองค์ประกอบเข้ากับการตั้งค่าhead ก่อนหน้า.cssTextหรือ IE6-8 จะหยุดทำงานหากcssCodeมี @ -directive เช่น@importหรือ@font-faceดูอัปเดตเป็นphpied.com/dynamic-script-and-style-elements-in-ieและstackoverflow .com / a / 7952904
ฮันโซล - โอ

24

นี่คือโซลูชันของChris Herringรุ่นที่ได้รับการอัปเดตเล็กน้อยโดยคำนึงถึงว่าคุณสามารถใช้งานได้innerHTMLดีแทนที่จะสร้างโหนดข้อความใหม่:

function insertCss( code ) {
    var style = document.createElement('style');
    style.type = 'text/css';

    if (style.styleSheet) {
        // IE
        style.styleSheet.cssText = code;
    } else {
        // Other browsers
        style.innerHTML = code;
    }

    document.getElementsByTagName("head")[0].appendChild( style );
}

3
คุณควรเพิ่มองค์ประกอบต่อท้ายhead ก่อนตั้งค่า.cssTextหรือ IE6-8 จะหยุดทำงานหากcodeมี @ -directive เช่น@importหรือ@font-faceดูอัปเดตเป็นphpied.com/dynamic-script-and-style-elements-in-ieและstackoverflow .com / a / 7952904
ฮันโซล - โอ


3

คุณสามารถเพิ่มคลาสหรือแอตทริบิวต์สไตล์ในองค์ประกอบตามองค์ประกอบ

ตัวอย่างเช่น:

<a name="myelement" onclick="this.style.color='#FF0';">text</a>

คุณสามารถทำสิ่งนี้ได้ที่ style.background this.style.font-size ฯลฯ คุณยังสามารถใช้สไตล์โดยใช้เมธอดเดียวกันนี้ได้

this.className='classname';

หากคุณต้องการทำสิ่งนี้ในฟังก์ชัน javascript คุณสามารถใช้ getElementByID แทน 'this'


5
JavaScript แบบอินไลน์โดยใช้ตัวจัดการเหตุการณ์เป็นแนวคิดที่ไม่ดี คุณควรแยกเนื้อหาของคุณออกจากฟังก์ชั่นและตัวจัดการเหตุการณ์เชื่อมโยงใน JavaScript โดยเฉพาะอย่างยิ่งในไฟล์ภายนอก
พันเอก Sponsz

3

ตัวอย่างง่ายๆของการเพิ่ม<style>ในส่วนหัวของ html

var sheet = document.createElement('style');
sheet.innerHTML = "table th{padding-bottom: 0 !important;padding-top: 0 !important;}\n"
+ "table ul {    margin-top: 0 !important;    margin-bottom: 0 !important;}\n"
+ "table td{padding-bottom: 0 !important;padding-top: 0 !important;}\n"
+ ".messages.error{display:none !important;}\n"
+ ".messages.status{display:none !important;} ";

document.body.appendChild(sheet); // append in body
document.head.appendChild(sheet); // append in head

สไตล์ไดนามิกของซอร์ส- จัดการ CSS ด้วย JavaScript


3

YUI เพิ่งเพิ่มโปรแกรมอรรถประโยชน์สำหรับสิ่งนี้โดยเฉพาะ ดูstylesheet.jsที่นี่


ขณะนี้ฉันใช้ YUI สำหรับงานของฉันและพยายามหาวิธีแก้ไขสไตล์ชีตภายนอกของกฎ css ที่มีอยู่ ไม่ทราบเกี่ยวกับยูทิลิตี้นี้ดูเหมือนจะสมบูรณ์แบบ! ขอบคุณรัสเซล
Jaime

2

นี่เป็นโซลูชันของฉันในการเพิ่มกฎ css ที่ท้ายรายการสไตล์ชีทสุดท้าย:

var css = new function()
{
    function addStyleSheet()
    {
        let head = document.head;
        let style = document.createElement("style");

        head.appendChild(style);
    }

    this.insert = function(rule)
    {
        if(document.styleSheets.length == 0) { addStyleSheet(); }

        let sheet = document.styleSheets[document.styleSheets.length - 1];
        let rules = sheet.rules;

        sheet.insertRule(rule, rules.length);
    }
}

css.insert("body { background-color: red }");

1

อีกตัวเลือกหนึ่งคือการใช้ JQuery เพื่อจัดเก็บคุณสมบัติสไตล์ขององค์ประกอบในบรรทัดผนวกเข้ากับองค์ประกอบแล้วอัปเดตคุณสมบัติคุณสมบัติขององค์ประกอบด้วยค่าใหม่ ดังต่อไปนี้:

function appendCSSToElement(element, CssProperties)
        {
            var existingCSS = $(element).attr("style");

             if(existingCSS == undefined) existingCSS = "";

            $.each(CssProperties, function(key,value)
            {
                existingCSS += " " + key + ": " + value + ";";
            });

            $(element).attr("style", existingCSS);

            return $(element);
        }

จากนั้นเรียกใช้งานมันด้วยคุณสมบัติ CSS ใหม่เป็นวัตถุ

appendCSSToElement("#ElementID", { "color": "white", "background-color": "green", "font-weight": "bold" });

นี่อาจไม่ได้เป็นวิธีที่มีประสิทธิภาพที่สุด (ฉันเปิดให้คำแนะนำเกี่ยวกับวิธีการปรับปรุงนี้ :)) แต่มันใช้งานได้จริง


1

นี่คือตัวอย่างเทมเพลตที่จะช่วยคุณเริ่มต้นใช้งาน

ต้องใช้ 0 ไลบรารีและใช้ javascript เท่านั้นในการฉีดทั้ง HTML และ CSS

ฟังก์ชันถูกยืมจากผู้ใช้ @Husky ด้านบน

มีประโยชน์หากคุณต้องการเรียกใช้สคริปต์ tampermonkey และต้องการเพิ่มการซ้อนทับสลับบนเว็บไซต์ (เช่นแอปโน้ตเป็นต้น)

// INJECTING THE HTML
document.querySelector('body').innerHTML += '<div id="injection">Hello World</div>';

// CSS INJECTION FUNCTION
///programming/707565/how-do-you-add-css-with-javascript
function insertCss( code ) {
    var style = document.createElement('style');
    style.type = 'text/css';
    if (style.styleSheet) {
        // IE
        style.styleSheet.cssText = code;
    } else {
        // Other browsers
        style.innerHTML = code;
    }
    document.getElementsByTagName("head")[0].appendChild( style );
}

// INJECT THE CSS INTO FUNCTION
// Write the css as you normally would... but treat it as strings and concatenate for multilines
insertCss(
  "#injection {color :red; font-size: 30px;}" +
  "body {background-color: lightblue;}"
)


1

หากคุณรู้ว่ามีอย่างน้อยหนึ่ง<style>แท็กในหน้าให้ใช้ฟังก์ชันนี้:

CSS=function(i){document.getElementsByTagName('style')[0].innerHTML+=i};

การใช้งาน:

CSS("div{background:#00F}");

0

นี่คือฟังก์ชั่นวัตถุประสงค์ทั่วไปของฉันซึ่งกำหนดตัวเลือกและกฎ CSS ไว้และเลือกใช้ชื่อไฟล์ css (คำนึงถึงตัวพิมพ์ใหญ่) หากคุณต้องการเพิ่มลงในชีตเฉพาะแทน (มิฉะนั้นถ้าคุณไม่ได้กำหนดชื่อไฟล์ CSS ไว้ จะสร้างองค์ประกอบสไตล์ใหม่และผนวกเข้ากับส่วนหัวที่มีอยู่โดยจะสร้างองค์ประกอบสไตล์ใหม่ได้สูงสุดหนึ่งรายการและนำมาใช้ใหม่ในการเรียกใช้ฟังก์ชันในอนาคต) ใช้งานได้กับ FF, Chrome และ IE9 + (อาจเร็วเกินไป, ยังไม่ได้ทดสอบ)

function addCssRules(selector, rules, /*Optional*/ sheetName) {
    // We want the last sheet so that rules are not overridden.
    var styleSheet = document.styleSheets[document.styleSheets.length - 1];
    if (sheetName) {
        for (var i in document.styleSheets) {
            if (document.styleSheets[i].href && document.styleSheets[i].href.indexOf(sheetName) > -1) {
                styleSheet = document.styleSheets[i];
                break;
            }
        }
    }
    if (typeof styleSheet === 'undefined' || styleSheet === null) {
        var styleElement = document.createElement("style");
        styleElement.type = "text/css";
        document.head.appendChild(styleElement);
        styleSheet = styleElement.sheet;
    }

    if (styleSheet) {
        if (styleSheet.insertRule)
            styleSheet.insertRule(selector + ' {' + rules + '}', styleSheet.cssRules.length);
        else if (styleSheet.addRule)
            styleSheet.addRule(selector, rules);
    }
}

-1

ใช้.cssใน Jquery เช่น$('strong').css('background','red');

$('strong').css('background','red');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<strong> Example
</strong> 


1
javascript, OP ไม่ได้พูดอะไรเกี่ยวกับ jQuery
agapitocandemor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.