Подтвердить что ты не робот

Экспорт CSS элементов DOM

Я часто нахожу красивые стили в Интернете. Чтобы скопировать CSS элемента DOM, я проверяю этот элемент с помощью инструментов разработчика Google Chrome, просматриваю различные свойства CSS и копирую их вручную в собственные таблицы стилей.

Можно ли легко экспортировать все свойства CSS данного элемента DOM?

4b9b3361

Ответ 1

Вот код для метода 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");
    }

})();

Этот код основывается на моем ответе на несколько смежный вопрос: Извлечь текущую DOM и напечатать ее как строку со стилями нетронутыми

Ответ 2

Я цитирую Doozer Blake отличный ответ, указанный выше в качестве комментария. Если вам нравится этот ответ, пожалуйста, подтвердите его первоначальный комментарий выше:

Не прямой ответ, но с помощью инструментов разработчика Chrome вы можете щелкнуть внутри стилей или вычисленных стилей, нажать Ctrl + A, а затем Ctrl + C, чтобы скопировать все стили в этих заданных областях. Он не идеален на вкладке "Стиль", потому что он поднимает некоторые дополнительные вещи. Лучше, чем выбирать их один за другим, я думаю. - Doozer Blake 3 часа назад

Вы можете сделать то же самое, используя Firebug для Firefox, используя Боковая панель Firebug "Computed" .

Ответ 3

Есть несколько способов сделать это.

Посмотрите FireDiff

Также посмотрите cssUpdater Это только для локального CSS]

И посмотрите этот Q для более похожих инструментов: Почему я не могу сохранить изменения CSS в Firebug?

Также этот платный продукт утверждает, что может это сделать: http://www.skybound.ca/