Bagaimana Anda menambahkan CSS dengan Javascript?

154

Bagaimana Anda menambahkan aturan CSS (misalnya strong { color: red }) dengan menggunakan Javascript?

nickf
sumber
pertanyaan yang sama (jawabannya adalah crossbrowser jQuery) stackoverflow.com/a/266110/341744
ninMonkey
18
@monkey: Itu solusi yang sangat buruk, dan tidak benar-benar melakukan apa yang diminta di sini. misalnya: apa yang terjadi jika <strong>elemen baru ditambahkan ke dokumen.
nickf

Jawaban:

115

Anda juga dapat melakukan ini menggunakan antarmuka CSS DOM Level 2 ( MDN ):

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

... pada semua kecuali (secara alami) IE8 dan sebelumnya, yang menggunakan kata-katanya yang sedikit berbeda:

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

Ada keuntungan teoretis dalam hal ini dibandingkan dengan metode createElement-set-innerHTML, di mana Anda tidak perlu khawatir tentang menempatkan karakter HTML khusus di innerHTML, tetapi dalam praktiknya elemen gaya adalah CDATA dalam HTML lawas, dan '<' dan '&' jarang digunakan dalam stylesheet.

Anda memang membutuhkan stylesheet sebelum Anda dapat mulai menambahkannya seperti ini. Itu bisa berupa stylesheet aktif apa pun yang ada: eksternal, tertanam atau kosong, tidak masalah. Jika tidak ada, satu-satunya cara standar untuk membuatnya saat ini adalah dengan createElement.

bobince
sumber
"warna" .. oh yeah, oops! untungnya itu hanya sebuah contoh. Saya curiga mungkin ada metode DOM untuk ini, terima kasih! +1
nickf
14
sheet berasal sheet = window.document.styleSheets[0] (Anda harus memiliki setidaknya satu <style type = "text / css"> </style> di sana).
AJP
1
Terima kasih, semua contoh yang ditampilkan Google pertama kali sangat besar ketika yang saya butuhkan adalah menyegarkan ingatan saya pada dua baris ini.
ElDoRado1239
1
Saya tahu ini sudah lama, tetapi ketika saya menguji yang pertama, saya dapatSecurityError: The operation is insecure.
user10089632
3
@ user10089632 stylesheet yang Anda akses perlu dilayani dari host yang sama dengan dokumen induk agar ini berfungsi.
bobince
225

Pendekatan sederhana dan langsung adalah membuat dan menambahkan stylesimpul baru ke dokumen.

// 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)
Ben Blank
sumber
12
Bukankah seharusnya ditambahkan ke kepala dokumen daripada badan?
bobince
3
@obobince - Menurut spesifikasi HTML, tentu saja, tetapi semua browser mengenalinya di mana saja. document.bodyjuga lebih pendek untuk mengetik dan lebih cepat dieksekusi daripada document.getElementsByTagName("head")[0]dan menghindari masalah lintas-browser dari insertRule / addRule.
Ben Blank
4
Solusi harus diikuti oleh "duhhhh" yang panjang. Tidak percaya saya tidak memikirkannya.
George Mauer
8
Di semua browser terbaru, Anda bisa menggunakan document.head.appendChild.
Gajus
2
Solusi ini jauh lebih baik! Bayangkan Anda memiliki lebih dari satu stylesheet: Dengan solusi @bobince, CSS Anda yang baru ditambahkan mungkin ditimpa oleh yang kedua / ketiga / etc. stylesheet pada halaman. Menggunakan document.body.appendChild(css);Anda pastikan CSS baru selalu merupakan aturan terakhir.
AvL
27

Solusi oleh Ben Blank tidak akan bekerja di IE8 untuk saya.

Namun ini berhasil di 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);
}
Chris Herring
sumber
12
IE lama yang baik selalu membuat hidup lebih mudah
Alex W
2
Anda harus menambahkan elemen ke head sebelum pengaturan .cssText, atau IE6-8 akan kecelakaan jika cssCodemengandung @ -directive, seperti @importatau @font-face, melihat Update untuk phpied.com/dynamic-script-and-style-elements-in-ie dan stackoverflow .com / a / 7952904
Han Seoul-Oh
24

Berikut ini adalah versi yang sedikit diperbarui dari solusi Chris Herring , dengan mempertimbangkan bahwa Anda juga dapat menggunakan innerHTMLdaripada membuat simpul teks baru:

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 );
}
Serak
sumber
3
Anda harus menambahkan elemen ke head sebelum pengaturan .cssText, atau IE6-8 akan kecelakaan jika codemengandung @ -directive, seperti @importatau @font-face, melihat Update untuk phpied.com/dynamic-script-and-style-elements-in-ie dan stackoverflow .com / a / 7952904
Han Seoul-Oh
5

Satu Liner Terpendek

// One liner function:
const addCSS = s =>(d=>{d.head.appendChild(d.createElement("style")).innerHTML=s})(document);

// Usage: 
addCSS("body{ background:red; }")

ayam
sumber
3

Anda bisa menambahkan atribut kelas atau gaya pada elemen demi elemen.

Sebagai contoh:

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

Di mana Anda bisa melakukan this.style.background, this.style.font-size, dll. Anda juga dapat menerapkan gaya menggunakan metode yang sama ala

this.className='classname';

Jika Anda ingin melakukan ini dalam fungsi javascript, Anda bisa menggunakan getElementByID daripada 'ini'.

mingala
sumber
5
JavaScript sebaris menggunakan pengendali acara adalah ide yang sangat buruk. Anda harus memisahkan konten Anda dari fungsionalitas Anda dan mengikat penangan acara dalam JavaScript - sebaiknya dalam file eksternal.
Kolonel Sponsz
3

Ini contoh mudah menambahkan <style>kepala 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

Source Dynamic style - memanipulasi CSS dengan JavaScript

DarckBlezzer
sumber
3

YUI baru-baru ini menambahkan utilitas khusus untuk ini. Lihat stylesheet.js di sini.

Russell Leggett
sumber
Saat ini saya menggunakan YUI untuk pekerjaan saya dan berusaha mencari cara untuk mengedit style sheet eksternal aturan css yang ada. Tidak tahu tentang utilitas ini, sepertinya sempurna! Terima kasih Russell.
Jaime
2

Ini solusi saya untuk menambahkan aturan css di akhir daftar style sheet terakhir:

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 }");
Martin Wantke
sumber
1

Opsi lain adalah menggunakan JQuery untuk menyimpan properti gaya in-line elemen, menambahkannya, dan kemudian memperbarui properti gaya elemen dengan nilai-nilai baru. Sebagai berikut:

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);
        }

Dan kemudian jalankan dengan atribut CSS baru sebagai objek.

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

Ini mungkin tidak selalu menjadi metode yang paling efisien (saya terbuka untuk saran tentang cara meningkatkan ini. :)), tetapi pasti berhasil.

Kesederhanaan Xtra
sumber
1

Berikut contoh template untuk membantu Anda memulai

Membutuhkan 0 pustaka dan hanya menggunakan javascript untuk menyuntikkan HTML dan CSS.

Fungsi itu dipinjam dari pengguna @Husky di atas

Berguna jika Anda ingin menjalankan skrip tampermonkey dan ingin menambahkan toggle overlay pada situs web (misalnya aplikasi note, misalnya)

// 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;}"
)

Vincent Tang
sumber
1

jika Anda tahu setidaknya ada satu <style>tag di halaman, gunakan fungsi ini:

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

penggunaan:

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

sumber
0

Inilah fungsi tujuan umum saya yang menentukan parametrize pemilih dan aturan CSS, dan secara opsional menggunakan nama file css (case-sensitive) jika Anda ingin menambahkan ke sheet tertentu (jika tidak, jika Anda tidak memberikan nama file CSS, itu akan membuat elemen gaya baru dan menambahkannya ke kepala yang ada. Ini akan membuat paling banyak satu elemen gaya baru dan menggunakannya kembali pada panggilan fungsi di masa depan). Bekerja dengan FF, Chrome, dan IE9 + (mungkin lebih awal juga, belum diuji).

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);
    }
}
Jon
sumber
-1

gunakan .cssdi Jquery seperti$('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> 

Zain Ali
sumber
1
javascript, OP tidak mengatakan apa-apa tentang jQuery
agapitocandemor