Export CSS of DOM elements

后端 未结 3 1415
南笙
南笙 2020-11-30 22:47

I often find nice stylings on the web. To copy the CSS of a DOM element, I inspect that element with Google Chrome Developer Tools, look at the various CSS properties, and c

相关标签:
3条回答
  • 2020-11-30 22:53

    Here is the code for an exportStyles() method that should return a CSS string including all inline and external styles for a given element, except default values (which was the main difficulty).

    For example: console.log(someElement.exportStyles());

    Since you are using Chrome, I did not bother making it compatible with IE. Actually it just needs that the browsers supports the getComputedStyle(element) method.

    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");
        }
    
    })();
    

    This code is base on my answer for a slightly related question: Extract the current DOM and print it as a string, with styles intact

    0 讨论(0)
  • 2020-11-30 22:58

    I'm quoting Doozer Blake's excellent answer, provided above as a comment. If you like this answer, please upvote his original comment above:

    Not a direct answer, but with Chrome Developer Tools, you can click inside Styles or Computed Styles, hit Ctrl+A and then Ctrl+C to copy all the styles in those given areas. It's not perfect in the Style tab because it picks up some extra stuff. Better than selecting them one by one I guess. – Doozer Blake 3 hours ago

    You can do the same using Firebug for Firefox, by using Firebug's "Computed" side panel.

    0 讨论(0)
  • 2020-11-30 23:08

    There are a few ways to almost do this.

    Have a look at FireDiff

    Also have a look at cssUpdater This is for local CSS only]

    And see this Q for more similar tools: Why can't I save CSS changes in Firebug?

    Also this paid product claims to be able to do this: http://www.skybound.ca/

    0 讨论(0)
提交回复
热议问题