Javascript로 CSS를 어떻게 추가합니까?


154

strong { color: red }Javascript를 사용하여 CSS 규칙을 어떻게 추가 합니까?


같은 질문 (답변은 크로스 브라우저 jQuery입니다) stackoverflow.com/a/266110/341744
ninMonkey

18
@monkey : 그것은 꽤 나쁜 해결책이며 실제로 여기에 요청 된 것을하지 않습니다. 예 : 새 <strong>요소가 문서에 추가 되면 어떻게됩니까 ?
nickf

답변:


115

DOM 레벨 2 CSS 인터페이스 ( 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 메소드와 비교하여 이론상 이점이 있습니다. innerHTML에 특수 HTML 문자를 넣을 까 걱정할 필요는 없지만 실제로는 스타일 요소가 레거시 HTML에서 CDATA이고 '<' 그리고 '&'는 스타일 시트에서 거의 사용되지 않습니다.

다음과 같이 스타일 시트를 추가하기 전에 스타일 시트가 필요합니다. 외부, 내장 또는 비어있는 기존 활성 스타일 시트 일 수 있습니다. 존재하지 않는 경우 현재 생성하는 유일한 표준 방법은 createElement를 사용하는 것입니다.


"컬러".. 오, 그래! 고맙게도 그것은 단지 예일뿐입니다. 나는 이것에 대한 DOM 방법이 있다고 생각했다. +1
nickf

14
시트가 제공됩니다 sheet = window.document.styleSheets[0] (<style type = "text / css"> </ style>가 하나 이상 있어야 함).
AJP December

1
감사합니다. Google이 처음 보여주는 모든 예제는 이 두 줄에서 메모리를 새로 고치는 것만 큼 매우 큽니다.
ElDoRado1239

1
시간이 SecurityError: The operation is insecure.
오래 걸렸지 만

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
본문이 아닌 문서의 머리 부분에 추가해서는 안됩니까?
bobince

3
@bobince — 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는 항상 인생을 편하게 만듭니다
Alex W

2
당신은에 요소를 추가해야 head 하기 전에 설정 .cssText또는 IE6-8는 것이다 충돌 (가) 경우 cssCode을 포함 @ -directive처럼 @import@font-face에 업데이트를 참조 phpied.com/dynamic-script-and-style-elements-in-ie유래 .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유래 .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 등을 수행 할 수있는 곳.이 동일한 방법을 사용하여 스타일을 적용 할 수도 있습니다.

this.className='classname';

자바 스크립트 함수 에서이 작업을 수행하려면 'this'대신 getElementByID를 사용할 수 있습니다.


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

소스 동적 스타일-JavaScript를 사용하여 CSS 조작


3

유이 최근 에 유틸리티를 추가 위해 특별히 . 여기에서 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 개의 라이브러리가 필요하며 자바 스크립트 만 사용하여 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>page에 태그가 하나 이상 있다는 것을 알고 있으면 다음 함수를 사용하십시오.

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
자바 스크립트, 영업 이익은 jQuery를에 대해 아무것도 말하지 않는다
agapitocandemor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.