Как добавить CSS с помощью Javascript?

154

Как вы добавляете правила CSS (например strong { color: red }), используя Javascript?

nickf
источник
тот же вопрос (ответ - перекрестный jQuery) stackoverflow.com/a/266110/341744
ninMonkey
18
@monkey: Это довольно плохое решение, и оно не выполняет то, о чем здесь просили. Например: что произойдет, если новый <strong>элемент будет добавлен в документ.
nickf

Ответы:

115

Вы также можете сделать это с помощью CSS-интерфейсов DOM Level 2 ( 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.

bobince
источник
"цвет" .. о да, ой! К счастью, это был просто пример. Я подозревал, что для этого может быть метод 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
Разве это не должно быть добавлено к голове документа, а не к телу?
бобинце
3
@bobince - В соответствии со спецификациями HTML, безусловно, но все браузеры распознают их где угодно. document.bodyтакже короче, чтобы набрать и быстрее выполнить, document.getElementsByTagName("head")[0]и избегает кросс-браузерных проблем с insertRule / addRule.
Бен Бланк
4
Решение должно сопровождаться долгим "духом". Не могу поверить, что я не думал об этом.
Джордж Мауэр
8
Во всех последних браузерах вы можете просто использовать document.head.appendChild.
Gajus
2
Это решение намного лучше! Представьте, что у вас более одной таблицы стилей: с помощью решения @bobince ваш недавно добавленный CSS может быть перезаписан вторым / третьим / etc. таблица стилей на странице. Используя document.body.appendChild(css);его, убедитесь, что новый CSS всегда является последним правилом.
AvL
27

Решение Бена Бланка не будет работать в 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 всегда облегчает жизнь
Alex W
2
Вы должны добавить элемент к настройке head before.cssText , иначе IE6-8 потерпит крах, если он cssCodeсодержит @ -directive, например @importили @font-face, см. Обновление phpied.com/dynamic-script-and-style-elements-in-ie и stackoverflow .com / a / 7952904
Хан Сеул-О,
24

Вот немного обновленная версия решения Криса Херринга с учетом того, что вы также можете использовать 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
Хан Сеул-О,
5

Самый короткий лайнер

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

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

куры
источник
3

Вы можете добавлять классы или атрибуты стиля для каждого элемента отдельно.

Например:

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

Где вы могли бы сделать this.style.background, this.style.font-size и т. Д. Вы также можете применить стиль, используя тот же самый метод ala

this.className='classname';

Если вы хотите сделать это в функции javascript, вы можете использовать getElementByID, а не «this».

Мингала
источник
5
Встроенный JavaScript с использованием обработчиков событий - очень плохая идея. Вы должны отделять свой контент от своих функций и связывать обработчики событий в JavaScript - предпочтительно во внешнем файле.
полковник Спонс
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

DarckBlezzer
источник
3

YUI только недавно добавил утилиту специально для этого. Смотрите stylesheet.js здесь.

Рассел Леггетт
источник
В настоящее время я использую YUI для своей работы и пытался выяснить, как редактировать внешние таблицы стилей существующих правил CSS. Не знал об этой утилите, она кажется идеальной! Спасибо Рассел.
Хайме
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" });

Это не обязательно самый эффективный метод (я открыт для предложений о том, как это улучшить. :)), но он определенно работает.

XtraSimplicity
источник
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