CSS 操做css
經過 JavaScript 操做 CSShtml
<div style="background-color:red; border:1px solid black;" />
div.setAttribute("style'", "background-color:red; border:1px solid black;" );
ele.style.backgroundColor // 對應css 屬性 background-color ele.style.cssFloat // 對應 css 屬性 float
<div id="ele" style="background:yellow"></div>web
ele.style.cssText; // 返回字符串 "background:yellow"數組
ele.style.cssText = ""; // 清空行內樣式瀏覽器
判斷當前瀏覽器是否支持某個模塊app
typeof element.style.attrName === 'string';
// 注意,無論 CSS 屬性名的寫法帶不帶連詞線,屬性上都能反映出該屬性是否存在
styleele.style['backgroundColor'] // "" === "string" 返回 true
document.body.style['background-color'] // "" === "string" 返回 true
// 使用的時候,須要把不一樣瀏覽器的 CSS 前綴也考慮進去
ele.style['-webkit-animation'] === 'string'
function isPropertySupported(cssPropStr) { if (cssPropStr in document.body.style){ return true; } var prefixes = ['Moz', 'Webkit', 'O', 'ms', 'Khtml']; var prefProperty = cssPropStr.charAt(0).toUpperCase() + cssPropStr.substr(1); for(var i = 0; i < prefixes.length; i++){ if((prefixes[i] + prefProperty) in document.body.style){ return true; } } return false; } isPropertySupported('background-clip'); // true
document.querySelector('#' + CSS.escape('foo#bar')); // #號,該字符在 CSS 選擇器裏面有特殊含義 // 不能直接寫成 document.querySelector('#foo#bar') // 只能寫成 document.querySelector('#foo\\#bar') // 這裏必須使用雙斜槓的緣由是,單引號字符串自己會轉義一次斜槓
// 第一種寫法 CSS.supports('transform-origin', '5px'); // true
// 第二種寫法 CSS.supports('display: table-cell'); // true
var result = window.getComputedStyle(ele, ':before')["background"];
經過 CSS 向 DOM 添加的元素函數
主要是經過 :before 和 :after 選擇器生成,而後用 content 屬性指定僞元素的內容flex
// <div id="test">Test content</div> #test:before { content: 'Before '; color: #FF0; } var test = document.getElementById('#test'); // 節點元素的 style 對象沒法讀寫僞元素的樣式 var result = window.getComputedStyle(test, ':before').content; var color = window.getComputedStyle(test, ':before').color;
表明網頁的一張樣式表,包括行內樣式表,內部樣式表,外部樣式表ui
嚴格來講,不只包括網頁樣式表,還包括 XML 文檔的樣式表spa
document.styleSheets 返回一個相似數組的對象,表明當前頁面的全部 StyleSheet 實例(即全部樣式表)
// <style id="myStyle"> // </style> var myStyleSheet = document.getElementById('myStyle').sheet; myStyleSheet instanceof StyleSheet; // true
document.styleSheets[0].href
var sheet = document.querySelector('#styleElement').sheet; sheet.insertRule('#block { color: white }', 0); sheet.insertRule('p { color: red }', 1);
瀏覽器對腳本在樣式表裏面插入規則有不少限制。因此,這個方法最好放在 try...catch
裏使用
@media
規則的生效條件
// HTML 代碼以下 // <style id="myStyle"> // @media screen and (min-width: 900px) { // article { display: flex; } // } // </style> var styleSheet = document.getElementById('myStyle').sheet; styleSheet.cssRules[0] instanceof CSSMediaRule // true styleSheet.cssRules[0].media // { // 0: "screen and (min-width: 900px)", // appendMedium: function, // deleteMedium: function, // item: function, // length: 1, // mediaText: "screen and (min-width: 900px)" // } styleSheet.cssRules[0].conditionText // "screen and (min-width: 900px)"
MediaQueryList
對象來存放媒體查詢的結果var mql = window.matchMedia("(orientation: portrait)");
var mql = window.matchMedia('(min-width: 400px)'); mql.media // "(min-width: 400px)"
var result = window.matchMedia("(max-width: 700px)"); if (result.matches){ var linkElm = document.createElement('link'); linkElm.setAttribute('rel', 'stylesheet'); linkElm.setAttribute('type', 'text/css'); linkElm.setAttribute('href', 'small.css'); document.head.appendChild(linkElm); }
var mql = window.matchMedia('(max-width: 600px)'); mql.onchange = function(e) { if (e.matches) { /* 視口不超過 600 像素 */ } else { /* 視口超過 600 像素 */ } }
上面代碼中,change事件發生後,存在兩種可能。
一種是顯示寬度從700像素以上變爲如下
另外一種是從700像素如下變爲以上,
因此在監聽函數內部要判斷一下當前是哪種狀況
var mql = window.matchMedia('(max-width: 600px)'); // 指定監聽函數 mql.addListener(mqCallback);
// 撤銷監聽函數 mql.removeListener(mqCallback); function mqCallback(e) { if (e.matches) { /* 視口不超過 600 像素 */ } else { /* 視口超過 600 像素 */ } }