当前位置: 首页 > Web前端 > HTML

CSS自定义属性指南

时间:2023-03-28 16:52:33 HTML

前言在现代浏览器中,我们经常会看到这样的属性:element{--main-bg-color:brown;}这里我们就来介绍一下他,并提供一些相关的DescriptionofIntroductionCustomproperties(有时也称为CSS变量或级联变量)由CSS作者定义并包含可在整个文档中重复使用的值。通过自定义属性标签(eg:--main-color:black;)设置值,通过var()函数获取值(eg:color:var(--main-color);)Declarationdeclares自定义属性,属性名需要以两个减号(--)开头,属性值可以是任何有效的CSS值。前言中的--main-bg-color属性的一般最佳实践是将其定义在根伪类:root下,以便可以在HTML文档中的任何位置访问它:/*:root选择器匹配文档根元素。*//*在HTML中,根元素始终是html元素。*//*也就是说:root表示根元素*/:root{--main-bg-color:brown;}注意:自定义属性名是区分大小写的,--my-color和--my-颜色将被视为两个不同的自定义属性。同时不能包含$、[、^、(、%等字符,普通字符仅限于“数字[0-9]”、“字母[a-zA-Z]”、"underscore_"和"dash-"这些组合,但可以是中文、日文或韩文,例如body{--darkblue:#369;background-color:var(--darkblue);}使用element{background-color:var(--main-bg-color);}这些自定义属性只会在需要的时候计算,不会按照其他规则保存。比如你不能给一个元素设置一个属性,然后让它从兄弟或后代的规则中获取值,该属性只用于匹配当前选择器及其后代,与通常的CSS相同,默认值使用var()函数定义多个回退值时。thegivenvalueisnotdefined,fallbackvaluewillbeusedValuesubstitution./*如果提供第二个参数,则表示替代值,当自定义属性时生效但值无效。第二个参数可以嵌套,但不能继续平铺,例如:*/.two{color:var(--my-var,red);/*如果--my-var未定义则为红色*/}.three{background-color:var(--my-var,var(--my-background,pink));/*粉红色,如果--my-var和--my-background未定义*/}.three{background-color:var(--my-var,--my-background,pink);/*Invalid:"--my-background,pink"*/}第二个例子展示了如何处理多个回退。这种技术可能会导致性能问题,因为它会花费更多时间来处理这些变量。js中的操作在JavaScript中获取或修改CSS变量与操作普通的CSS属性是一样的://获取Dom节点上的CSS变量element.style.getPropertyValue("--my-var");//获取任意CSS变量在Dom节点上getComputedStyle(element).getPropertyValue("--my-var");//在Dom节点上修改一个CSS变量element.style.setProperty("--my-var",jsVar+4);SpaceCSS变量主体的尾随特征{--size:20;font-size:var(--size)px;}其中font-size:var(--size)px相当于font-size:20px,注意20后面有个空格,所以这里的font-size使用元素的默认大小。使用场景简单实现一个进度条:外面有一个背景图层,然后里面有一个进度条和进度值。以前是用两层div元素,然后JS改变里面的彩条宽度,同时设置进度值。

.bar{height:20px;宽度:300px;背景色:#f5f5f5;}.bar::before{显示:块;计数器重置:进度变量(--百分比);内容:计数器(进度)'%\2002';宽度:计算(1%*var(--百分比));颜色:#fff;背景色:#2486ff;文本对齐:右;空白:nowrap;overflow:hidden;}可以看到,我们只需要一层div标签,DOM层级很简单,然后,需要修改的HTML变化项只有一个--percent自定义属性。更多场景可以参考这篇文章:https://www.zhangxinxu.com/wo...Extension我们可以通过@property扩展CSS变量:他的语法:@property--property-name{syntax:'';继承:假的;initial-value:#c0ffee;}@property规则中的语法和继承描述符是必需的;如果缺少其中任何一个,则整个规则将无效并被忽略。如果语法描述符是为通用语法定义的,则初始值描述符是可选的,否则初始值也是必需的-如果此时缺少此描述符,则整个规则将失败并被忽略。当然我们也可以用js创建:window.CSS.registerProperty({name:'--my-color',syntax:'',inherits:false,initialValue:'#c0ffee',});他的很多时候是为了实现一些以往无法轻易实现的动画效果。具体可以参考这篇文章,里面举了几个例子:https://juejin.cn/post/695120...Compatibility当前css变量的兼容性是最低的Chrome49:我们也可以在CSS中做兼容性处理:.selector:{}@supports((--a:0)){/*支持*/.selector:{}}@supports(not(--a:0)){/*不支持*/.selector:{}}也可以在js中做相应的判断constisSupported=window.CSS&&window.CSS.supports&&window.CSS.supports('--a',0);而@property只是一个实验性的属性,它的兼容性要求非常高:polyfillhttps://github.com/jhildenbid...使用这个兼容性可以直接实现的兼容性:Chrome19+Edge12+Firefox6+IE9+Safari6+目前大部分项目使用的是less/sass,而这些css预处理工具使用的是less/sass/scss。另外,如果CSS原生变量一起使用,会显得多余。对于这些预处理器,我们使用原生的CSS变量来代替原来的变量,其他的保持不变。js中的CSS是在root中定义的。基础CSS之后,就可以在js中使用了。在这个框架中,有atomiccss,发挥空间很大。现在常用的一个原子CSS框架:tailwindcss在这个框架中,CSS变量在内部被广泛使用。所以如果你可以使用Tailwind,可以用CSS变量来总结一下CSS变量的作用。目前的浏览器支持足够,对现有的CSS预处理器有一定的适配。如果打算使用,可以尝试介绍一下。当然,目前还没有全面的解决方案。如果想观望,参考https://developer.mozilla.org没问题...https://www.zhangxinxu.com/wo....https://juejin.cn/post/693753...https://www.zhangxinxu.com/wo...https://developer.mozilla.org...