List unique CSS properties for all DOM elements

January 12, 2017 · View on GitHub

/**

  • List unique CSS properties for all DOM elements
  • Initially created to list unique font stacks on a page
  • @see {@link http://stackoverflow.com/a/35022690/ Inspired by this StackOverflow answer}
  • @see {@link https://gist.github.com/macbookandrew/f33dbbc0aa582d0515919dc5fb95c00a/ URL for this file}
  • @author AndrewRMinion Design (https://andrewrminion.com)
  • @version 1.1
  • @license MIT
  • @copyright AndrewRMinion Design
  • @example Show all unique font stacks in use on the current page
  •      console.log(styleInPage('fontFamily'));
    
  • @example Show a list of all DOM elements with their computed font stack
  •      console.log(styleInPage('fontFamily', true));
    
  • @example Highlight all DOM elements using a particular font stack (pass in the array key from styleInPage)
  •      var fontStacksInUse = styleInPage('fontFamily');
    
  •      console.log(fontStacksInUse);
    
  •      highlightInPage(8);
    

*/

/**

  • Get an array of elements with their computed styles

  • @param {string} css CSS property, camelCased for JS

  • @param {boolean} verbose whether to output an array of all elements with their style properties

  • @returns {array} array of unique properties, or if verbose is true, array of all elements with their properties */ function styleInPage(css, verbose) { // polyfill getComputedStyle if (typeof getComputedStyle == "undefined") { getComputedStyle = function (elem) { return elem.currentStyle; } }

    // set vars var style, thisNode, styleId, allStyles = [], nodes = document.body.getElementsByTagName('*');

    // loop over all elements for (var i = 0; i < nodes.length; i++) { thisNode = nodes[i]; if (thisNode.style) { styleId = '#' + (thisNode.id || thisNode.nodeName + '(' + i + ')'); style = thisNode.style.fontFamily || getComputedStyle(thisNode, '')[css];

         // get element’s style
         if (style) {
             if (verbose) {
                 allStyles.push([styleId, style]);
             } else if (allStyles.indexOf(style) == -1) {
                 allStyles.push(style);
             }
    
             // add data-attribute with key for allStyles array
             thisNode.dataset.styleId = allStyles.indexOf(style);
         }
    
         // get element:before’s style
         styleBefore = getComputedStyle(thisNode, ':before')[css];
         if (styleBefore) {
             if (verbose) {
                 allStyles.push([styleId, styleBefore]);
             } else if (allStyles.indexOf(styleBefore) == -1) {
                 allStyles.push(styleBefore);
             }
    
             // add data-attribute with key for allStyles array
             thisNode.dataset.styleId = allStyles.indexOf(styleBefore);
         }
    
         // get element:after’s style
         styleAfter = getComputedStyle(thisNode, ':after')[css];
         if (styleAfter) {
             if (verbose) {
                 allStyles.push([styleId, styleAfter]);
             } else if (allStyles.indexOf(styleAfter) == -1) {
                 allStyles.push(styleAfter);
             }
    
             // add data-attribute with key for allStyles array
             thisNode.dataset.styleId = allStyles.indexOf(styleAfter);
         }
     }
    

    } return allStyles; }

/**

  • Highlight elements with the specified style

  • @param {integer} styleId data-style-id to highlight / function highlightInPage(styleId) { var thisNode, allNodes = document.body.getElementsByTagName(''), nodes = document.body.querySelectorAll('[data-style-id="' + styleId + '"]');

    // remove previous highlights for (var i = 0; i < allNodes.length; i++) { allNodes[i].classList.remove('style-highlight'); }

    // add highlight to specified nodes for (var i = 0; i < nodes.length; i++) { thisNode = nodes[i]; thisNode.classList.add('style-highlight'); } }

/**

  • Clear all highlights */ function clearHighlights() { highlightInPage(); }

/**

  • Add blank stylesheet for highlight rule

  • @returns {CSSStyleSheet} new blankstylesheet */ var sheet = (function() { // Create the

    // WebKit hack :( style.appendChild(document.createTextNode(""));

    // Add the

    return style.sheet; })();

/**

  • Add specified CSS rule to the specified stylesheet
  • @param {CSSStyleSheet} sheet a CSSStyleSheet object
  • @param {string} selector CSS selector rule; include “.” for classes or “#” for IDs
  • @param {string} rules CSS properties for this selector
  • @param {integer} index index detailing where to add the new rule */ function addCSSRule(sheet, selector, rules, index = 0) { if ("insertRule" in sheet) { sheet.insertRule(selector + "{" + rules + "}", index); } else if ("addRule" in sheet) { sheet.addRule(selector, rules, index); } }

// add a yellow background to highlighted elements addCSSRule(sheet, ".style-highlight", "background-color: yellow");