【问题标题】:Export CSS of DOM elements导出 DOM 元素的 CSS
【发布时间】:2011-12-06 22:56:40
【问题描述】:

我经常在网上找到漂亮的样式。为了复制 DOM 元素的 CSS,我使用 Google Chrome 开发者工具检查该元素,查看各种 CSS 属性,然后将它们手动复制到我自己的样式表中。

是否可以轻松导出给定 DOM 元素的所有 CSS 属性?

【问题讨论】:

  • 有人可能会编写一个快速程序来执行此操作。
  • 不是直接的答案,但使用 Chrome 开发人员工具,您可以在样式或计算样式中单击,按 Ctrl+A,然后按 Ctrl+C 复制这些给定区域中的所有样式。它在样式选项卡中并不完美,因为它收集了一些额外的东西。我猜比一个一个选择要好。
  • 我可以制作一个书签来做到这一点......
  • 必须说我很惊讶没有人想出办法来做到这一点,尽管我认为从您选择的开发人员工具中复制和粘贴很容易。说我认为能够导出元素 css 将是一个不错的功能。
  • Firebug 也是一个更好的插件,可以用来检查 html 元素并复制样式。

标签: css


【解决方案1】:

有几种方法几乎可以做到这一点。

看看FireDiff

还可以查看cssUpdater 这仅适用于本地 CSS]

有关更多类似工具,请参阅此 Q:Why can't I save CSS changes in Firebug?

这个付费产品也声称能够做到这一点:http://www.skybound.ca/

【讨论】:

    【解决方案2】:

    我引用了Doozer Blake 的出色答案,上面作为评论提供。如果您喜欢这个答案,请在上面为他的原始评论点赞:

    不是直接的答案,但使用 Chrome 开发人员工具,您可以在样式或计算样式中单击,按 Ctrl+A,然后按 Ctrl+C 以复制这些给定区域中的所有样式。它在样式选项卡中并不完美,因为它收集了一些额外的东西。我猜比一一选择要好。 – Doozer Blake 3 小时前

    您可以使用Firebug for Firefox 执行相同的操作,使用Firebug's "Computed" side panel

    【讨论】:

      【解决方案3】:

      这里是 exportStyles() 方法的代码,它应该返回一个 CSS 字符串,包括给定元素的所有内联和外部样式,除了默认值(这是主要困难)。

      例如:console.log(someElement.exportStyles());

      由于您使用的是 Chrome,我没有费心让它与 IE 兼容。 实际上它只需要浏览器支持getComputedStyle(element) 方法。

      Element.prototype.exportStyles = (function () {  
      
          // Mapping between tag names and css default values lookup tables. This allows to exclude default values in the result.
          var defaultStylesByTagName = {};
      
          // Styles inherited from style sheets will not be rendered for elements with these tag names
          var noStyleTags = {"BASE":true,"HEAD":true,"HTML":true,"META":true,"NOFRAME":true,"NOSCRIPT":true,"PARAM":true,"SCRIPT":true,"STYLE":true,"TITLE":true};
      
          // This list determines which css default values lookup tables are precomputed at load time
          // Lookup tables for other tag names will be automatically built at runtime if needed
          var tagNames = ["A","ABBR","ADDRESS","AREA","ARTICLE","ASIDE","AUDIO","B","BASE","BDI","BDO","BLOCKQUOTE","BODY","BR","BUTTON","CANVAS","CAPTION","CENTER","CITE","CODE","COL","COLGROUP","COMMAND","DATALIST","DD","DEL","DETAILS","DFN","DIV","DL","DT","EM","EMBED","FIELDSET","FIGCAPTION","FIGURE","FONT","FOOTER","FORM","H1","H2","H3","H4","H5","H6","HEAD","HEADER","HGROUP","HR","HTML","I","IFRAME","IMG","INPUT","INS","KBD","KEYGEN","LABEL","LEGEND","LI","LINK","MAP","MARK","MATH","MENU","META","METER","NAV","NOBR","NOSCRIPT","OBJECT","OL","OPTION","OPTGROUP","OUTPUT","P","PARAM","PRE","PROGRESS","Q","RP","RT","RUBY","S","SAMP","SCRIPT","SECTION","SELECT","SMALL","SOURCE","SPAN","STRONG","STYLE","SUB","SUMMARY","SUP","SVG","TABLE","TBODY","TD","TEXTAREA","TFOOT","TH","THEAD","TIME","TITLE","TR","TRACK","U","UL","VAR","VIDEO","WBR"];
      
          // Precompute the lookup tables.
          for (var i = 0; i < tagNames.length; i++) {
              if(!noStyleTags[tagNames[i]]) {
                  defaultStylesByTagName[tagNames[i]] = computeDefaultStyleByTagName(tagNames[i]);
              }
          }
      
          function computeDefaultStyleByTagName(tagName) {
              var defaultStyle = {};
              var element = document.body.appendChild(document.createElement(tagName));
              var computedStyle = getComputedStyle(element);
              for (var i = 0; i < computedStyle.length; i++) {
                  defaultStyle[computedStyle[i]] = computedStyle[computedStyle[i]];
              }
              document.body.removeChild(element); 
              return defaultStyle;
          }
      
          function getDefaultStyleByTagName(tagName) {
              tagName = tagName.toUpperCase();
              if (!defaultStylesByTagName[tagName]) {
                  defaultStylesByTagName[tagName] = computeDefaultStyleByTagName(tagName);
              }
              return defaultStylesByTagName[tagName];
          }
      
          return function exportStyles() {
              if (this.nodeType !== Node.ELEMENT_NODE) {
                  throw new TypeError("The exportStyles method only works on elements, not on " + this.nodeType + " nodes.");
              }
              if (noStyleTags[this.tagName]) {
                  throw new TypeError("The exportStyles method does not work on " + this.tagName + " elements.");
              }
              var styles = {};
              var computedStyle = getComputedStyle(this);
              var defaultStyle = getDefaultStyleByTagName(this.tagName);
              for (var i = 0; i < computedStyle.length; i++) {
                  var cssPropName = computedStyle[i];
                  if (computedStyle[cssPropName] !== defaultStyle[cssPropName]) {
                      styles[cssPropName] = computedStyle[cssPropName];
                  }
              }
      
              var a = ["{"];
              for(var i in styles) {
                  a[a.length] = i + ": " + styles[i] + ";";
              }
              a[a.length] = "}"
              return a.join("\r\n");
          }
      
      })();
      

      此代码基于我对一个稍微相关的问题的回答:Extract the current DOM and print it as a string, with styles intact

      【讨论】:

      • 不知何故,我认为您不包括 :focus:blur 等。不过到目前为止做得很好!
      • @Randomblue:没错,它不包括伪类样式。我会考虑的!
      • 我为伪类设置了赏金!我希望你能得到它。
      • 可以通过使用getComputedStyle(element, ":first-letter") 来找到与:first-letter:first-line 等伪元素相关联的样式,但在我上面的代码中实现它在很多情况下可能会增加三倍需要计算时间,仅针对两个伪元素,并且对于更多伪元素使其更慢......
      • ... 对于伪类(:active:hover 等),getComputedStyle 根本不起作用。无论如何,如果页面包含类似 theElement.addEventListener("onmouseover", function (event) { $(this).addClassName(someClass); }); 的代码怎么办?然后,检索动态样式的唯一方法是以编程方式触发事件 - 这对于悬停事件可能是可以的,但对于单击或焦点事件不是! - 或者在调用 exportStyles 之前手动悬停或聚焦元素,这不是你想要的对不起...
      猜你喜欢
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 2012-10-22
      相关资源
      最近更新 更多