聊聊你可能不了解的CSS属性函数 attr()


当前第2页 返回上一页

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

// 获取页面中所有的CSS自定义属性

var isSameDomain = function (styleSheet) {

    if (!styleSheet.href) {

        return true;

    }

 

    return styleSheet.href.indexOf(window.location.origin) === 0;

};

 

var isStyleRule = function (rule) {

    return rule.type === 1;

};

 

var arrCSSCustomProps = (function () {

    return [].slice.call(document.styleSheets).filter(isSameDomain).reduce(function (finalArr, sheet) {

        return finalArr.concat([].slice.call(sheet.cssRules).filter(isStyleRule).reduce(function (propValArr, rule) {

            var props = [].slice.call(rule.style).map(function (propName) {

                return [

                    propName.trim(),

                    rule.style.getPropertyValue(propName).trim()

                ];

            }).filter(function ([propName]) {

                return propName.indexOf('--') === 0;

            });

 

            return [].concat(propValArr, props);

        }, []));

    }, []);

})();

打印下 arrCSSCustomProps ,得到

2.png

最后一步是遍历Dom,如果设置了对应的自定义属性,就将通过attr定义属性值,转换成css能够解析的自定义属性值 var

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

// attr()语法转换成目前CSS变量可识别的语法

var funAttrVar2NormalVar = function (objParseAttr, valueAttr) {

    // attr()语法 attr( <attr-name> <type-or-unit>? [, <attr-fallback> ]? )

    // valueVar示意:attr(bgcolor color, deeppink)

    // valueAttr示意: 'deepskyblue'或者null

 

    var attrName = objParseAttr.attrName;

    var typeOrUnit = objParseAttr.typeOrUnit;

 

    // typeOrUnit值包括:

    // string | color | url | integer | number | length | angle | time | frequency | cap | ch | em | ex | ic | lh | rlh | rem | vb | vi | vw | vh | vmin | vmax | mm | Q | cm | in | pt | pc | px | deg | grad | rad | turn | ms | s | Hz | kHz | %

 

    var arrUnits = ['ch', 'em', 'ex', 'ic', 'lh', 'rlh', 'rem', 'vb', 'vi', 'vw', 'vh', 'vmin', 'vmax', 'mm', 'cm', 'in', 'pt', 'pc', 'px', 'deg', 'grad', 'rad', 'turn', 'ms', 's', 'Hz', 'kHz', '%'];

 

    var valueVarNormal = valueAttr;

    // 如果是string类型

    switch (typeOrUnit) {

        case 'string': {

            valueVarNormal = '"' + valueAttr + '"';

            break;

        }

        case 'url': {

            if (/^url\(/i.test(valueAttr) == false) {

                valueVarNormal = 'url(' + valueAttr + ')';

            }

            break;

        }

    }

 

    // 数值变单位的处理

    if (arrUnits.includes(typeOrUnit) && valueAttr.indexOf(typeOrUnit) == -1 && parseFloat(valueAttr) == valueAttr) {

        valueVarNormal = parseFloat(valueAttr) + typeOrUnit;

    }

 

    return valueVarNormal;

};

 

    var valueVarNormal = funAttrVar2NormalVar(objParseAttr, strHtmlAttr);

 

    console.log(valueVarNormal); //100px

    // 设置

    node.style.setProperty(cssProp, valueVarNormal);  // margin-bottom : 100px

objParseAttr就是 attr(mb px)解析后的对象,valueAttr就是 自定义属性的值,也就是例子中的 100

3.png

效果图

4.png

最后

attr()加上做兼容后的实验功能很强大,非常的灵活,后面我打算整合一些常用的需要这种写法的属性,封装成npm包,方便日常应用的开发。本文相关代码,访问:https://github.com/Kerinlin/CSS-Function/tree/main/%E5%B1%9E%E6%80%A7%E5%87%BD%E6%95%B0

更多编程相关知识,请访问:编程教学!!

以上就是聊聊你可能不了解的CSS属性函数 attr()的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

HTML5/css3 网页加载进度条的实现,下载进度条等经典案例

css怎么去掉div间距

css继承样式有哪些

使用HTML5 canvas封装一个echarts实现不了的饼图

css如何取消下划线

HTML5的下拉框应该如何增加用户体验

css outline-style属性怎么用

css中伪类和伪元素有什么区别

HTML5 border属性怎么设置?HTML5 table中的border属性介绍

HTML5+a*算法实现游戏寻路的代码分享

更多相关阅读请进入《HTML5》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...