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

本篇文章带大家了解一下css属性函数 attr()。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

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

属性函数 attr() 用于获取HTML元素里面的属性值,并用于样式中,但目前暂时只能应用于CSS元素中的伪元素。

例子

1.png

实现一个Tooltip

立即学习“前端免费学习笔记(深入)”;

              css attr函数          .tooltip {        width: 100px;        position: relative;        margin: 0 auto;      }      .tooltip:hover::after {        padding: 5px;        position: absolute;        /* 在伪元素中作为字符串中使用 */        content: attr(data-tooltip);        color: #fff;        background-color: #000;        border-radius: 10px;        top: 25px;        left: 0;      }      /* 箭头 */      .tooltip:hover .arrow::after {        content: "";        position: absolute;        bottom: -5px;        left: 20%;        margin-left: -5px;        border-width: 5px;        border-style: solid;        border-color: transparent transparent black transparent;      }            
Hover me

语法中的实验属性(目前所有浏览器都不支持)

在新的语法中支持各种类型的CSS属性,具体支持的可查看MDN文档#Specifications “MDN文档”),举个例子,假如需要设置一个margin-top,正常是需要去找到类名然后设置,稍微图省事一点可能会集中书写css类名,然后全局引入再调用.这种写法一定程度上能方便一点,但是不够个性化,假如我要设置成上边距15px,又得重新加一个类名,还是很麻烦。

//style.mt10{ margin-top: 10px;}

但是如果实验属性支持的话,可以写成这样。

//style[mt] { margin-top: attr(mt,0);}

这种写法就很类似组件开发,不需要指定特定大小的px值,在HTML元素上直接能指定任意大小的PX值,而且基于CSS,没有JS的参与,会更加轻巧。但是,很遗憾的是目前所有浏览器都不支持,估计很长一段时间内也是不支持的,这里做一下了解,提供一种组件开发的思路。幸运的是,在找资料的过程发现张鑫旭大佬已经探索过这种可能性,然后对这种特性做了 Polyfill,查看Polyfill。

Polyfill attr()实验属性原理

利用CSS自定义属性传递attr的属性值

      .test-attr {        --mbNum: attr(mb px);        margin-bottom: var(--mbNum);        --mlNum: attr(ml px);        margin-left: var(--mlNum);      }

然后获取所有包含attr()函数的自定义的属性名

    // 获取页面中所有的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

    // attr()语法转换成目前CSS变量可识别的语法    var funAttrVar2NormalVar = function (objParseAttr, valueAttr) {        // attr()语法 attr(  ? [,  ]? )        // 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()的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1617668.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月24日 05:57:08
下一篇 2025年12月24日 05:57:43

相关推荐

  • CSS中处理不同长度文本的几种小技巧

    【推荐教程:CSS视频教程 】 当我们使用 CSS 构建布局时,考虑长短文本内容很重要,如果能清楚地知道当文本长度变化时需要怎么处理,可以避免很多不必要的问题。 在许多情况下,添加或删除一个单词会改变 UI 的外观,更糟的是,它可能会破坏原有的设计,使其无法访问。在我学习 CSS 的早期,我低估了添…

    2025年12月24日 好文分享
    000
  • 提升你的CSS技能的20个css技巧

    随着前端开发越来越关注效率:通过选择器的使用和简化代码来快速加载渲染。像Less、SCSS这样的预处理器在工作的时候,需要绕的路较长,而直接使用css速度会更快。 这里涵盖了20个css技巧来帮助你减少重复规则和复写,在布局中标准化样式流程,不仅可以帮助你高效地创建自己的框架,而且可以解决许多常见的…

    2025年12月24日
    000
  • css如何控制输出字数

    css控制输出字数的方法:首先创建一个HTML示例文件;然后定义一些文本;最后通过css样式“overflow:hidden;”和“text-overflow:ellipsis;”等来实现文本溢出显示省略号效果即可。 本教程操作环境:windows7系统、HTML5&&CSS3版本、…

    2025年12月24日
    000
  • css 页面显示不全怎么办

    css页面显示不全的解决办法:1、取消css中对象的高度css样式;2、减少内容;3、在设置高度和宽度的同时再设置“overflow:hidden”属性样式。 本教程操作环境:windows7系统、HTML5&&CSS3版本、Dell G3电脑。 div css网页显示不完整的原因分…

    2025年12月24日
    000
  • css横着写还是竖着写

    不同的css写法有不同的优势,比如在开发时,css竖着写,按规范编码,格式缩进,一是代码可读性强,二是容易调试;在上线时,css让横着写,可以用gulp或grunt等构建工具编写脚本,优化css缩小css体积,使生成代码变横的。 本教程操作环境:windows7系统、css3版本、Dell G3电脑…

    2025年12月24日
    000
  • 如何解决eclipse css文件乱码问题

    eclipse css文件乱码的解决办法:首先在CSS文件上右键“属性”,查看文件默认的编码;然后将编码改为“UTF8”;最后点击Apply应用新设置即可。 本文操作环境:windows7系统、css3版本、Dell G3电脑。 eclipse导致css文件乱码怎么解决? 如果CSS文件不是使用的U…

    2025年12月24日 好文分享
    000
  • css如何设置输入框不可编辑

    css设置输入框不可编辑的方法:首先创建一个HTML示例文件;然后定义一个input标签;接着给input加上css样式“pointer-events: none;”即可。 本文操作环境:windows7系统、HTML5&&CSS3版本、Dell G3电脑。 css让input不可编…

    2025年12月24日
    000
  • css单元格不换行显示怎么实现

    css单元格不换行显示的实现方法:首先打开相应的代码文件;然后给单元格添加属性为“table td{white-space: nowrap;}”即可让td单元格不换行显示。 本文操作环境:windows7系统、HTML5&&CSS3版本、Dell G3电脑。 很多时候,我们在项目开发…

    2025年12月24日
    000
  • 在css中不属于添加在当前页面的形式是什么

    在css中不属于添加在当前页面的形式是“链接式样式表”和“导入式样式表”。链接式和导入式样式表统称为外部样式表,是将CSS代码写入独立的外部“.css”文件中,再使用link标签或“@import”引用到网页文件中的方式。 本教程操作环境:windows7系统、CSS3版、Dell G3电脑。 在c…

    2025年12月24日
    000
  • 聊聊css中box-align和box-pack属性的用法

    【推荐教程:CSS视频教程 】 css中的box-align与box-pack属性可以用来设置框内元素的位置。 注意: 需要对齐的元素的父元素dispaly的值必须为box box-align值为center时,子元素为垂直居中 立即学习“前端免费学习笔记(深入)”; box-pack 属性规定当框…

    2025年12月24日
    000
  • 深入浅析CSS中的数学表达式calc()

    【推荐教程:CSS视频教程 】 数学表达式calc()是CSS中的函数,主要用于数学运算。使用calc()为页面元素布局提供了便利和新的思路。 定义 数学表达式calc()是calculate计算的缩写,它允许使用+、-、*、/这四种运算符,可以混合使用%、px、em、rem等单位进行计算 立即学习…

    2025年12月24日
    000
  • css 怎么设置透明度渐变

    css设置透明度渐变的方法:首先创建一个HTML示例文件;然后在body中引入图片;最后使用“linear-gradient()”函数并且配合rgba来设置透明度渐变即可。 本文操作环境:windows7系统、HTML5&&CSS3版本、Dell G3电脑。 css设置透明度渐变 在…

    2025年12月24日
    000
  • css如何自适应浏览器

    css自适应浏览器的设置方法:首先打开相应的代码文件;然后使用js代码“ jQuery(window).resize(function(){…}”实现内容自适应浏览器宽度或者高度即可。 本文操作环境:windows7系统、HTML5&&CSS3版本、Dell G3电脑。 …

    2025年12月24日
    000
  • css怎么调整字体

    css调整字体的方法:1、使用font-family属性规定元素的字体系列;2、使用font-weight属性设置文本的粗细;3、使用color属性调整文本的颜色。 本文操作环境:windows7系统、HTML5&&CSS3版本、Dell G3电脑。 在css中,可以使用font-f…

    2025年12月24日
    000
  • 怎样在外连接css文件

    外链接css文件的方法:1、使用link标签链接外部css文件,语句如“”;2、使用@import规则导入外部css文件。 本教程操作环境:windows7系统、HTML5&&CSS3版本,DELL G3电脑。 推荐:css视频教程 有两种连接外部CSS文件的方法 使用link标签链…

    2025年12月24日
    000
  • css3字体可以模糊吗

    css3字体的可以模糊的;开发者可以使用CSS3中的filter属性来实现字体模糊效果,filter语法是“filter: blur(px);”,其filter属性定义了元素的可视效果。 本教程操作环境:windows7系统、CSS3版本,DELL G3电脑。 推荐:css视频教程 我们可以使用CS…

    2025年12月24日
    000
  • eclipse css中文乱码怎么办

    eclipse css中文乱码是因为文件编码与字符编码等不匹配造成的,其解决办法:首先打开eclipse;然后在properties中,找到并选择UTF-8;最后点击Apply应用新设置即可。 本教程操作环境:windows7系统、Eclipse IDE 2020-06 R版本,DELL G3电脑。…

    2025年12月24日 好文分享
    000
  • vs2010 如何支持css3

    vs2010支持css3的方法:首先下载CSS 3 Intellisense Schema并安装;然后用“Win+R”输入“regedit”打开注册表;接着将css30.xml拷贝到“schemasCSS”中;最后重启VS2010即可。 本教程操作环境:windows7系统、vs2010&&…

    2025年12月24日
    000
  • css如何滚动图片

    css滚动图片的方法:首先设置主体代码各处两组一样的图片;然后设置nav的大小和ul大小;接着定义动画,并增加鼠标悬停和动画暂停的效果;最后给nav增加“overflow:hidden”使得超出的部分隐藏即可。 本教程操作环境:windows7系统、HTML5&&CSS3版本,DEL…

    2025年12月24日
    000
  • 怎么下载网页的css文件

    下载网页css文件的方法:首先按下键盘上的“F12”键打开浏览器的控制台;然后点击控制台顶部导航栏上的“Network”按钮;接着点击控制台上的“CSS”按钮;最后右击需要获取的css文件并进行另存为即可。 本教程操作环境:windows7系统、Chrome76.0&&CSS3版本,…

    2025年12月24日 好文分享
    000

发表回复

登录后才能评论
关注微信