From 33058f2b292b3a581333bdfb21b8f671898c5060 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:40:17 -0500 Subject: initial commit --- .../web/api/cssstylesheet/deleterule/index.html | 36 ++++ files/zh-cn/web/api/cssstylesheet/index.html | 181 ++++++++++++++++++ .../web/api/cssstylesheet/insertrule/index.html | 206 +++++++++++++++++++++ 3 files changed, 423 insertions(+) create mode 100644 files/zh-cn/web/api/cssstylesheet/deleterule/index.html create mode 100644 files/zh-cn/web/api/cssstylesheet/index.html create mode 100644 files/zh-cn/web/api/cssstylesheet/insertrule/index.html (limited to 'files/zh-cn/web/api/cssstylesheet') diff --git a/files/zh-cn/web/api/cssstylesheet/deleterule/index.html b/files/zh-cn/web/api/cssstylesheet/deleterule/index.html new file mode 100644 index 0000000000..66346da53f --- /dev/null +++ b/files/zh-cn/web/api/cssstylesheet/deleterule/index.html @@ -0,0 +1,36 @@ +--- +title: CSSStyleSheet.deleteRule() +slug: Web/API/CSSStyleSheet/deleteRule +translation_of: Web/API/CSSStyleSheet/deleteRule +--- +

{{ APIRef("CSSOM") }}

+ +

概述

+ +

deleteRule方法用来从当前样式表对象中删除指定的样式规则.

+ +

语法

+ +
stylesheet.deleteRule(index)
+
+ +

参数

+ + + +

示例

+ +
 myStyles.deleteRule(0);
+
+ +

相关链接

+ + + +

规范

+ +

deleteRule

diff --git a/files/zh-cn/web/api/cssstylesheet/index.html b/files/zh-cn/web/api/cssstylesheet/index.html new file mode 100644 index 0000000000..1252210d3b --- /dev/null +++ b/files/zh-cn/web/api/cssstylesheet/index.html @@ -0,0 +1,181 @@ +--- +title: CSSStyleSheet +slug: Web/API/CSSStyleSheet +tags: + - API + - CSSOM + - CSSOM API + - CSSStyleSheet + - Interface + - Reference + - Stylesheets + - TopicStub +translation_of: Web/API/CSSStyleSheet +--- +

{{ APIRef("CSSOM") }}

+ +

CSSStyleSheet 接口代表一个 CSS 样式表,并允许检查和编辑样式表中的规则列表。它从父类型 {{domxref("StyleSheet")}} 继承属性和方法。

+ +

一个 CSS 样式表包含了一组表示规则的 {{domxref("CSSRule")}} 对象。每条 CSS 规则可以通过与之相关联的对象进行操作,这些规则被包含在 {{domxref("CSSRuleList")}} 内,可以通过样式表的 {{domxref("CSSStyleSheet.cssRules", "cssRules")}} 属性获取。

+ +

例如,{{domxref("CSSStyleRule")}} 对象中的一条规则可能包含这样的样式:

+ +
h1, h2 {
+  font-size: 16pt;
+}
+
+ +

另一条规则可能是一条“@”规则(at-rule),例如  {{cssxref("@import")}} 或 {{cssxref("@media")}} 等等。

+ +

在{{anch("说明")}}部分中查看 CSSStyleSheet 对象的多种获取方式。

+ +

属性

+ +

继承自 {{domxref("StyleSheet")}}。

+ +
+
{{domxref("CSSStyleSheet.cssRules", "cssRules")}} {{ReadOnlyInline}}
+
+

返回一个实时的 {{domxref("CSSRuleList")}},其中包含组成样式表的 {{domxref("CSSRule")}} 对象的一个最新列表。

+ +

这一般用于获取单条规则,如下:

+ +
styleSheet.cssRules[i] // where i = 0..cssRules.length-1
+ +

使用CSSStyleSheet 的 {{domxref("CSSStyleSheet.insertRule", "insertRule()")}} 和 {{domxref("CSSStyleSheet.deleteRule", "deleteRule()")}} 方法以在 cssRules 中添加或移除规则。

+
+
{{domxref("CSSStyleSheet.ownerRule", "ownerRule")}} {{ReadOnlyInline}}
+
如果一个样式表示通过{{cssxref("@import")}} 规则引入文档,那么 ownerRule 属性会返回相应的{{domxref("CSSImportRule")}}对象,否则返回 null
+
+ +

方法

+ +

继承自 {{domxref("StyleSheet")}}。

+ +
+
{{domxref("CSSStyleSheet.deleteRule", "deleteRule()")}}
+
从样式表中删除特定位置的一条规则。
+
{{domxref("CSSStyleSheet.insertRule", "insertRule()")}}
+
向样式表的特定位置插入一条新规则,需要提供新规则的完整文本。
+
+ +

遗留属性

+ +

这些遗留属性是很久以前由微软提出的,不应该再使用,但这些属性短期内不会被移除。

+ +
+
{{domxref("CSSStyleSheet.rules", "rules")}} {{ReadOnlyInline}}
+
rules 属性的功能与标准的{{domxref("CSSStyleSheet.cssRules", "cssRules")}}属性相同;它返回一个实时的 {{domxref("CSSRuleList")}}, 其中包含样式表中所有规则的一个最新列表。
+
+ +

遗留方法

+ +

这些遗留方法是很久以前由微软提出的,应尽量避免使用,但这些方法短期内不会被移除。

+ +
+
{{domxref("CSSStyleSheet.addRule", "addRule()")}}
+
+

向样式表添加一条新规则,需要提供应用样式的选择器和应用在匹配元素上的样式块。

+ +

这和 {{domxref("CSSStyleSheet.insertRule", "insertRule()")}} 不同,后者只是简单地将整个传入的规则文本当作一个字符串。

+
+
{{domxref("CSSStyleSheet.removeRule", "removeRule()")}}
+
与{{domxref("CSSStyleSheet.deleteRule", "deleteRule()")}}功能相同;从样式表的规则列表的特定位置中移除规则。
+
+ +

说明

+ +

在一些浏览器中,如果一个样式表加载自不同的域,访问 cssRules 属性时会抛出 SecurityError

+ +

一个样式表最多与一个{{domxref("Document")}}链接,即所应用的那个{{domxref("Document")}}(除非{{domxref("StyleSheet.disabled", "disabled")}})。一个特定文档的 CSSStyleSheet 对象列表可用 {{domxref("document.styleSheets")}} 属性获取。一个特定的样式表也可以通过其所在对象(Node 或 CSSImportRule)获取,如果有的话。

+ +

在文档的样式表加载时,一个 CSSStyleSheet 对象由浏览器自动创建并插入至文档的{{domxref("Document.styleSheets")}}列表中。由于样式表列表不能直接修改,我们没有什么有效的手段取手动创建一个新的 CSSStyleSheet 对象(不过Constructable Stylesheet Objects很快会来到web平台,而且Blink早已支持)。需要创建新的样式表就直接在文档中插入{{HTMLElement("style")}} 或 {{HTMLElement("link")}} 元素吧。

+ +

以下是将样式表链接到文档的一些方式(可能不完整):

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
样式表与文档链接的原因是否出现在document.
+ styleSheets
 列表中
获取样式表对象所在的元素/规则所在对象的接口从所在对象获取CSSStyleSheet对象
文档中的{{HTMLElement("style")}} 和{{HTMLElement("link")}} 元素{{domxref("StyleSheet.ownerNode", ".ownerNode")}}{{domxref("HTMLLinkElement")}},
+ {{domxref("HTMLStyleElement")}},
+ 或 {{domxref("SVGStyleElement")}}
{{domxref("LinkStyle.sheet", ".sheet")}}
使用CSS {{cssxref("@import")}} 从其他样式表导入并应用到文档的规则{{domxref("CSSStyleSheet.ownerRule", ".ownerRule")}}{{domxref("CSSImportRule")}}{{domxref("CSSImportRule.styleSheet", ".styleSheet")}}
<?xml-stylesheet ?> processing instruction in the (non-HTML) document{{domxref("StyleSheet.ownerNode", ".ownerNode")}}{{domxref("ProcessingInstruction")}}{{domxref("LinkStyle.sheet", ".sheet")}}
HTTP链接头部N/AN/AN/A
用户代理(默认)样式表N/AN/AN/A
+ +

规范

+ + + + + + + + + + + + + + + + + + + +
规范状态备注
{{SpecName("CSSOM", "#cssstylesheet", 'CSSStyleSheet')}}{{Spec2("CSSOM")}}
{{SpecName("DOM2 Style", "css.html#CSS-CSSStyleSheet", "CSSStyleSheet")}}{{Spec2("DOM2 Style")}}Initial definition
+ +

浏览器兼容性

+ + + +

{{Compat("api.CSSStyleSheet")}}

+ +

参见

+ + diff --git a/files/zh-cn/web/api/cssstylesheet/insertrule/index.html b/files/zh-cn/web/api/cssstylesheet/insertrule/index.html new file mode 100644 index 0000000000..a46b91f5cc --- /dev/null +++ b/files/zh-cn/web/api/cssstylesheet/insertrule/index.html @@ -0,0 +1,206 @@ +--- +title: CSSStyleSheet.insertRule() +slug: Web/API/CSSStyleSheet/insertRule +tags: + - API + - CSSOM + - CSSStyleSheet +translation_of: Web/API/CSSStyleSheet/insertRule +--- +
+

{{ APIRef("CSSOM") }}

+
+ +

CSSStyleSheet.insertRule() 方法用来给当前样式表插入新的样式规则(CSS rule),并且包含一些限制

+ +
+

注意:尽管 insertRule() 是 {{domxref("CSSStyleSheet")}} 的一个方法,但它实际插入的地方是 {{domxref("CSSStyleSheet", "", "", "1")}}.cssRules 的内部 {{domxref("CSSRuleList")}}。

+
+ +

语法

+ +
stylesheet.insertRule(rule [, index])
+ +

参数

+ +
+
rule
+
+

一个包含了将要插入的规则的 {{domxref("DOMString")}}。规则字符串必须包含的内容取决于它的类型:

+ +
    +
  • rule-sets 类型(普通带有选择器的规则)需要选择器和样式声明;
  • +
  • at-rules 类型(以 @ 开头的规则,如 @import, @media 等)需要 at-identifier 和规则内容。
  • +
+
+
index {{optional_inline}}
+
一个小于或等于 stylesheet.cssRules.length 的正整数,表示新插入的规则在{{domxref("CSSStyleSheet", "", "", "1")}}.cssRules 中的位置。默认值是 0。(在过去的实现中,这个参数是必需的,详情参见浏览器兼容性。)
+
+ +

返回值

+ +

新插入的规则在当前样式表规则列表中的索引。

+ +

限制

+ +

CSS 中存在一些直观和不是太直观能感受到的限制规则影响着某些样式规则能否被插入。违反这些规则可能会导致一些 DOM 异常({{domxref("DOMException")}})。

+ + + +

示例

+ +

在样式表顶部插入新的规则

+ +

下面的代码片段将在样式表 myStyle 的顶部插入一条新规则:

+ +
 myStyle.insertRule("#blanc { color: white }", 0);
+
+ +

实现一个添加样式表规则的函数

+ +
/**
+ * 在文档中添加一条样式表规则(这可能是动态改变 class 名的更好的实现方法,
+ * 使得 style 样式内容可以保留在真正的样式表中,以斌面添加额外的元素到 DOM 中)。
+ * 注意这里有必要声明一个数组,因为 ECMAScript 不保证对象按预想的顺序遍历,
+ * 并且 CSS 也是依赖于顺序的。
+ * 类型为数组的参数 decls 接受一个 JSON 编译的数组。
+ * @example
+addStylesheetRules([
+  ['h2', // 还接受第二个参数作为数组中的数组
+    ['color', 'red'],
+    ['background-color', 'green', true] // 'true' for !important rules
+  ],
+  ['.myClass',
+    ['background-color', 'yellow']
+  ]
+]);
+ */
+function addStylesheetRules (decls) {
+    var style = document.createElement('style');
+    document.getElementsByTagName('head')[0].appendChild(style);
+    if (!window.createPopup) { /* For Safari */
+       style.appendChild(document.createTextNode(''));
+    }
+    var s = document.styleSheets[document.styleSheets.length - 1];
+    for (var i=0, dl = decls.length; i < dl; i++) {
+        var j = 1, decl = decls[i], selector = decl[0], rulesStr = '';
+        if (Object.prototype.toString.call(decl[1][0]) === '[object Array]') {
+            decl = decl[1];
+            j = 0;
+        }
+        for (var rl=decl.length; j < rl; j++) {
+            var rule = decl[j];
+            rulesStr += rule[0] + ':' + rule[1] + (rule[2] ? ' !important' : '') + ';\n';
+        }
+
+        if (s.insertRule) {
+            s.insertRule(selector + '{' + rulesStr + '}', s.cssRules.length);
+        }
+        else { /* IE */
+            s.addRule(selector, rulesStr, -1);
+        }
+    }
+}
+ +

兼容补丁

+ +

以下补丁将会在 IE 5-8 中纠正提供给 insertRule() 的参数,使其标准化。to standardize them in Internet Explorer 5–8. 它通过一个函数对 insertRule() 进行补充,使得在参数传递给原生的 insertRule() 函数之前将其中的选择器从规则中分离出来。

+ +
(function(Sheet_proto){
+  var originalInsertRule = Sheet_proto.insertRule;
+
+  if (originalInsertRule.length === 2){ // 2 个托管参数: (selector, rules)
+    Sheet_proto.insertRule = function(selectorAndRule){
+      // 首先,从规则中分离选择器
+      a: for (var i=0, Len=selectorAndRule.length, isEscaped=0, newCharCode=0; i !== Len; ++i) {
+        newCharCode = selectorAndRule.charCodeAt(i);
+        if (!isEscaped && (newCharCode === 123)) { // 123 = "{".charCodeAt(0)
+          // 其次,找到花括号
+          var openBracketPos = i, closeBracketPos = -1;
+
+          for (; i !== Len; ++i) {
+            newCharCode = selectorAndRule.charCodeAt(i);
+            if (!isEscaped && (newCharCode === 125)) { // 125 = "}".charCodeAt(0)
+              closeBracketPos = i;
+            }
+            isEscaped ^= newCharCode===92?1:isEscaped; // 92 = "\\".charCodeAt(0)
+          }
+
+          if (closeBracketPos === -1) break a; // No closing bracket was found!
+            /*else*/ return originalInsertRule.call(
+            this, // 想要改变的样式表
+            selectorAndRule.substring(0, openBracketPos), // 选择器
+            selectorAndRule.substring(closeBracketPos), // 规则
+            arguments[3] // 插入的索引
+          );
+        }
+
+        // Works by if the char code is a backslash, then isEscaped
+        // gets flipped (XOR-ed by 1), and if it is not a backslash
+        // then isEscaped gets XORed by itself, zeroing it
+        isEscaped ^= newCharCode===92?1:isEscaped; // 92 = "\\".charCodeAt(0)
+      }
+      // Else, there is no unescaped bracket
+      return originalInsertRule.call(this, selectorAndRule, "", arguments[2]);
+    };
+  }
+})(CSSStyleSheet.prototype);
+
+ +

规范

+ + + + + + + + + + + + + + + + + + + + + +
SpecificationStatusComment
{{SpecName('CSSOM', '#dom-cssstylesheet-insertrule', 'CSSStyleSheet.insertRule')}}{{Spec2('CSSOM')}}No change from {{SpecName('DOM2 Style')}}.
{{SpecName('DOM2 Style', 'css.html#CSS-CSSStyleSheet-insertRule', 'CSSStyleSheet.insertRule')}}{{Spec2('DOM2 Style')}}Initial definition
+ +

+ +

浏览器兼容性

+ + + +

{{Compat("api.CSSStyleSheet.insertRule")}}

+ +

传统浏览器支持

+ +

为了支持 Internet Explorer 8 和更早版本,请使用: addRule(selector, rule [, index]);。例如:addRule('pre', 'font: 14px verdana'); // add rule at end

+ +

另外注意非标准的 removeRule() 和 .rules 方法分别用 {{domxref("CSSStyleSheet.deleteRule","deleteRule()")}} 和{{domxref("CSSStyleSheet",".cssRules")}} 代替。

+ +

相关链接

+ + + +

+ +

-- cgit v1.2.3-54-g00ecf