将DOM提取为Less样式

本文介绍了一个用于生成DOM元素样式树的JavaScript函数,该函数能递归遍历DOM树并收集所有非预设的类样式,最终以CSS形式输出,便于开发者快速获取页面样式结构。
        function getClassTree(dom) {
            const spaceCount = 2;   // 缩进空格数
            const ignore = 'ng-';   // 忽略类名
            const preset = [        // 预设样式
                'font-size: unset'
            ];

            if (typeof dom === 'string') {
                dom = document.querySelector(dom);
            }

            const tree = {};

            function getTree(parent, node) {
                if (node) {
                    let child = {
                        $$preset: preset
                    };
                    let name = '';

                    let classList = [];
                    if (node.classList && node.classList.length > 0) {
                        classList = Array.from(node.classList).filter(function (o) {
                            return o.indexOf(ignore) === -1;
                        });
                    }

                    if (classList.length > 0) {
                        name = '.' + classList.join(', .');

                    } else if (node.id) {
                        name = '#' + node.id;

                    } else if (node.tagName) {
                        name = node.tagName;

                    } else {
                        name = '*';
                    }

                    if (node.children && node.children.length > 0) {
                        Array.from(node.children).forEach(function (n) {
                            getTree(child, n);
                        });
                    }

                    if (parent[name]) {
                        Object.assign(parent[name], child);
                    } else {
                        parent[name] = child;
                    }
                }
            }

            getTree(tree, dom);

            function getTreeCss(obj, index) {
                const space = spaceCount ? new Array(index).join(new Array(spaceCount + 1).join(' ')) : '';
                let result = '';
                if (obj) {
                    Object.keys(obj).forEach(function (k) {
                        if (k === '$$preset') {
                            result += `${space}${obj.$$preset.join(`;\n${space}`)};`;

                        } else {
                            result += `\n\n${space}${k} {
${getTreeCss(obj[k], index + 1)}
${space}}\n`;
                        }
                    });
                }
                return result;
            }

            const text = getTreeCss(tree, 1);

            const input = document.createElement('textarea');
            input.value = text;
            document.body.appendChild(input);
            input.select();
            input.setSelectionRange(0, input.value.length);
            document.execCommand('Copy');
            document.body.removeChild(input);

            return text;
        }

调用方法:getClassTree(‘body’);

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值