คุณจะเพิ่มกฎ CSS (เช่นstrong { color: red }
) โดยใช้ Javascript ได้อย่างไร
<strong>
องค์ประกอบใหม่ลงในเอกสาร
คุณจะเพิ่มกฎ CSS (เช่นstrong { color: red }
) โดยใช้ Javascript ได้อย่างไร
<strong>
องค์ประกอบใหม่ลงในเอกสาร
คำตอบ:
คุณสามารถทำได้โดยใช้อินเทอร์เฟซ 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
sheet = window.document.styleSheets[0]
(คุณต้องมี <style type = "text / css"> </style> อย่างน้อยหนึ่งรายการ)
SecurityError: The operation is insecure.
วิธีการที่ง่ายและตรงคือการสร้างและเพิ่ม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)
document.body
สั้นลงเพื่อพิมพ์และเร็วกว่าในการดำเนินการมากกว่าdocument.getElementsByTagName("head")[0]
และหลีกเลี่ยงปัญหาข้ามเบราว์เซอร์ของ insertRule / addRule
document.head.appendChild
ในเบราว์เซอร์ล่าสุดทั้งหมดคุณก็สามารถใช้
document.body.appendChild(css);
คุณต้องแน่ใจว่า CSS ใหม่นั้นเป็นกฎสุดท้ายเสมอ
การแก้ปัญหาโดย 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);
}
head
ก่อนหน้า.cssText
หรือ IE6-8 จะหยุดทำงานหากcssCode
มี @ -directive เช่น@import
หรือ@font-face
ดูอัปเดตเป็นphpied.com/dynamic-script-and-style-elements-in-ieและstackoverflow .com / a / 7952904
นี่คือโซลูชันของ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 );
}
head
ก่อนตั้งค่า.cssText
หรือ IE6-8 จะหยุดทำงานหากcode
มี @ -directive เช่น@import
หรือ@font-face
ดูอัปเดตเป็นphpied.com/dynamic-script-and-style-elements-in-ieและstackoverflow .com / a / 7952904
หนึ่งซับที่สั้นที่สุด
// One liner function:
const addCSS = s =>(d=>{d.head.appendChild(d.createElement("style")).innerHTML=s})(document);
// Usage:
addCSS("body{ background:red; }")
คุณสามารถเพิ่มคลาสหรือแอตทริบิวต์สไตล์ในองค์ประกอบตามองค์ประกอบ
ตัวอย่างเช่น:
<a name="myelement" onclick="this.style.color='#FF0';">text</a>
คุณสามารถทำสิ่งนี้ได้ที่ style.background this.style.font-size ฯลฯ คุณยังสามารถใช้สไตล์โดยใช้เมธอดเดียวกันนี้ได้
this.className='classname';
หากคุณต้องการทำสิ่งนี้ในฟังก์ชัน javascript คุณสามารถใช้ getElementByID แทน 'this'
ตัวอย่างง่ายๆของการเพิ่ม<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
YUI เพิ่งเพิ่มโปรแกรมอรรถประโยชน์สำหรับสิ่งนี้โดยเฉพาะ ดูstylesheet.jsที่นี่
นี่เป็นโซลูชันของฉันในการเพิ่มกฎ 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 }");
อีกตัวเลือกหนึ่งคือการใช้ 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" });
นี่อาจไม่ได้เป็นวิธีที่มีประสิทธิภาพที่สุด (ฉันเปิดให้คำแนะนำเกี่ยวกับวิธีการปรับปรุงนี้ :)) แต่มันใช้งานได้จริง
นี่คือตัวอย่างเทมเพลตที่จะช่วยคุณเริ่มต้นใช้งาน
ต้องใช้ 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;}"
)
หากคุณรู้ว่ามีอย่างน้อยหนึ่ง<style>
แท็กในหน้าให้ใช้ฟังก์ชันนี้:
CSS=function(i){document.getElementsByTagName('style')[0].innerHTML+=i};
การใช้งาน:
CSS("div{background:#00F}");
นี่คือฟังก์ชั่นวัตถุประสงค์ทั่วไปของฉันซึ่งกำหนดตัวเลือกและกฎ 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);
}
}
ใช้.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>