如何在CSS中使用变量
CSS变量(官方称为自定义属性)是用户定义的值,可以设置一次,并在整个代码库中多次使用。它们可以更容易地管理颜色、字体、大小和动画值,并确保跨web应用程序的一致性。
例如,您可以将品牌颜色设置为CSS属性(——primarycolor: # 7232
)并在使用您的品牌颜色的任何组件或样式中使用此值(背景:var(——primarycolor);
).
除了提供更清晰和非重复的代码外,CSS变量还可以用于构建<一个href="#h-color-palettes">调色板一个>,<一个href="#h-media-queries">提高响应能力一个>,并创建动态类型系统。
这篇文章摘自我的指南,<一个href="//www.shaoxingby.com/premium/books/css-master-3rd-edition/">CSS的主人一个>,教你写更好,更有效的CSS。您还将学习掌握将改进您的工作流程和构建更好的应用程序的工具。
定义CSS变量
若要定义自定义属性,请选择一个名称并在其前面加上两个连字符。任何字母数字字符都可以成为名称的一部分。连字符(-
)和下划线(_
)字符也可以。广泛的Unicode字符可以是自定义属性名的一部分。这包括表情符号,但为了清晰和可读性,请坚持使用字母数字名称。
这里有一个例子:
——primarycolor:# 0 ad0f9ff;/* RGB alpha十六进制颜色符号*/
的--
指示CSS解析器这是一个自定义属性。当作为变量使用时,解析引擎将用属性的值替换属性。
自定义属性名为区分大小写的.这意味着——primaryColor
而且——primarycolor
被认为是两个不同的属性名。这与传统CSS不同,在传统CSS中,属性和值大小写并不重要。然而,它与ECMAScript中变量名的规则是一致的。
与其他属性一样,例如显示
或字体
, CSS自定义属性必须在声明块中定义。类定义自定义属性是一种常见的模式:根
作为选择器的伪元素:
:根{——primarycolor:# 0 ad0f9ff;}
:根
是引用文档根元素的伪元素。对于HTML文档,这是< html >
元素。对于SVG文档,它是svg < >
元素。使用:根
使属性在整个文档中立即可用。
使用CSS变量
属性作为变量使用自定义属性,需要使用var ()
函数。例如,如果我们想使用我们的——primarycolor
自定义属性作为背景色,我们将执行以下操作:
身体{背景颜色:var(——primarycolor);}
属性的计算值将成为背景颜色
财产。
到目前为止,自定义属性只能用作为标准CSS属性设置值的变量。例如,您不能存储属性的名字作为变量,然后重用它。下面的CSS将不起作用:
:根{——顶边框:border-top;/*不能将属性设置为自定义属性的值*/var(——顶边框):10px固体# bc84d8;/*不能使用变量作为属性*/}
您也不能存储属性值一对作为变量并重用它。下面的示例也是无效的:
:根{——文本颜色:颜色:橙色的;/*无效的属性值*/}身体{var(——文本颜色);/*属性的无效使用*/}
最后,你不能将变量连接为值字符串的一部分:
:根{——基础字体大小:10;}身体{字体:var(——基础字体大小)px/1.25无衬线;/*错误的CSS语法*/}
CSS自定义属性与CSS变量
“自定义属性”是一个面向未来的名称,说明该特性将来可能会如何使用。然而,这种情况可能会改变<一个类="" href="https://drafts.csswg.org/css-extensions/" target="_blank" rel="noreferrer noopener">CSS扩展一个>规范由浏览器供应商实现。该规范定义了使用自定义选择器组合、函数和at-rules扩展CSS的方法。
我们通常称自定义属性为“变量”,到目前为止,这是我们使用它们的唯一方式。理论上,它们不是完全可以互换的术语。在实践中,就目前而言,确实如此。我主要用自定义属性在这篇文章中,因为这是他们的专有名称。我将使用变量当它使句子更清晰的时候。
设置回退值
的var ()
函数最多接受两个参数。第一个参数应该是自定义属性名。第二个参数是可选的,但必须是声明值。此声明值用作未定义自定义属性值时应用的回退值或默认值。
让我们以以下CSS为例:
.btn__call-to-action{背景:var(——强调色,deepskyblue);}
如果——强调色
我们设它的值是# + 30
-然后填充任何路径的颜色.btn__call-to-action
类属性将有一个红橙色填充。如果它没有定义,填充将是深天蓝色。
声明值也可以嵌套。方法的回退值也就是说,可以使用变量作为var
功能:
身体{背景颜色:var(——books-bg,var(——arts-bg));}
在上面的CSS中,如果——books-bg
定义时,背景颜色将设置为——books-bg
财产。如果不是,背景颜色将改为赋值的任何值——arts-bg
.如果这两个都没有定义,背景颜色将是属性的初始值——在本例中,透明的
.
当自定义属性的值对于与其一起使用的属性无效时,也会发生类似的情况。考虑下面的CSS:
:根{——text-primary:# 600;——footer-link-hover:#0cg;/*不是有效的颜色值*/}身体{颜色:var(——text-primary);}一个:链接{颜色:蓝色的;}一个:徘徊{颜色:红色的;}页脚一个:徘徊{颜色:var(——footer-link-hover);}
的值——footer-link-hover
属性不是有效的颜色。相反,页脚:徘徊
对象的颜色继承<身体>
元素。
自定义属性的解析方法与其他CSS值的解析方法相同。如果该值无效或未定义,如果属性是可继承的,CSS解析器将使用继承的值(例如颜色
或字体
),如果不是,则为初始值(与背景颜色
).
级联值
自定义属性也遵循级联规则。它们的值可以被后续规则覆盖:
:根{——文本颜色:# 190736;/*海军*/}身体{——文本颜色:# 333;/*深灰色*/}身体{颜色:var(——文本颜色);}
在上面的例子中,我们的正文文本是深灰色的。我们还可以在每个选择器的基础上重置值。让我们在这个CSS中添加更多的规则:
:根{——文本颜色:# 190736;/*海军*/}身体{——文本颜色:# 333;/*深灰色*/}p{——文本颜色:#法郎;/* orange */}身体{颜色:var(——文本颜色);}p{颜色:var(——文本颜色)}
在本例中,是任何被换行的文本< p >
元素标签将是橙色的。但是里面有文本< div >
或者其他元素仍然是深灰色。
属性设置自定义属性的值风格
属性的例子,风格= "——brand-color: # 9 a09af "
.
自定义属性和调色板
自定义属性尤其适用于管理HSL调色板。奥软代表色相,饱和度,明度.这是一个基于光的颜色模型,类似于RGB。我们可以在CSS中使用HSL值,这得益于奥软()
而且hsla ()
颜色的功能。的奥软()
函数接受三个参数:色调、饱和度和亮度。的hlsa ()
函数还接受第四个参数,指示颜色的alpha透明度(值在0到1之间)。
RGB系统将颜色表示为红、绿和蓝的比例,而HSL使用一个颜色圈,其中色相是该圈上的度位置,色调或阴影使用饱和度和明度值定义。饱和度可以从0%到100%,其中0%是灰色,100%是全色。明度也可以从0%到100%,其中0%是黑色,100%是白色,50%是正常颜色。
彩色轮by<一个href="https://openclipart.org/detail/226044/chromatic-wheel" class="" target="_blank" rel="noreferrer noopener">CrazyTerabyte一个>从Openclipart。
在HSL颜色系统中,红、绿、蓝三原色分别位于120度,分别为0度/360度、120度和240度。次生色——青色、品红和黄色——也相距120度,但与原色相对,分别为180度、300度和60度/420度。第三色、第四色和其他颜色介于两者之间,大约递增10度。蓝色是用HSL符号写的Hsl (240, 100%, 50%)
.
参数单位
类的第一个参数使用无单位值时奥软()
而且hsla ()
函数,浏览器假设它是一个角度单位。但是,您可以使用任何一种<一个href="https://drafts.csswg.org/css-values-4/" class="" target="_blank" rel="noreferrer noopener">支撑CSS角单位一个>.蓝色也可以表达为Hsl(240度,100%,50%)
,Hsl (4.188rad, 100%, 50%)
或Hsla(0.66转,100% 50%)
.
有趣的地方就在这里。我们可以使用自定义属性设置色调值,并通过调整饱和度和明度值来设置浅色调和暗色调:
:根{——brand-hue:270度;/*紫色*/——brand-hue-alt:二十五分转;/*绿色*//* hsl()和hsla()可以接受逗号分隔或空格分隔的参数,但较老的浏览器(如Internet Explorer 11)只支持逗号分隔的参数。* /——brand-primary:奥软(var(——brand-hue)One hundred.%50%);——brand-highlight:奥软(var(——brand-hue)One hundred.%75%);——brand-lowlight:奥软(var(——brand-hue)One hundred.%25%);——brand-inactive:奥软(var(——brand-hue)50%50%);——brand-secondary:奥软(var(——brand-hue-alt)One hundred.%50%);——brand-2nd-highlight:奥软(var(——brand-hue-alt)One hundred.%75%);——brand-2nd-lowlight:奥软(var(——brand-hue-alt)One hundred.%25%);——brand-2nd-inactive:奥软(var(——brand-hue-alt)50%50%);}
上面的CSS提供了如下所示的调色板。
这是一个简单的版本,但你也可以使用自定义属性来调整饱和度和亮度值。
健壮的调色板生成
Dieter Raber在“<一个href="https://css-tricks.com/creating-color-themes-with-custom-properties-hsl-and-a-little-calc/" class="" target="_blank" rel="noreferrer noopener">使用自定义属性、HSL和一个小calc()创建颜色主题一个>”。
另一种想法是将自定义属性和钙()
函数从基本色相生成正方形配色方案。让我们在下一个例子中创建一个方形配色方案。一个方形配色方案由四种颜色组成,它们在色轮上彼此等距离,即相隔90度:
:根{——base-hue:310度;/*粉红色*/——距离:90度;——颜色:奥软(var(——base-hue),One hundred.%,50%);——color-b:奥软(calc(var(——base-hue)+var(——距离)),One hundred.%,50%);——color-c:奥软(calc(var(——base-hue)+(var(——距离)*2)),One hundred.%,50%);——color-d:奥软(calc(var(——base-hue)+(var(——距离)*3.)),One hundred.%,50%);}
这部分CSS为我们提供了如下所示的热带色彩方案。
自定义属性也可以很好地用于媒体查询,我们将在后面的小节中看到这一点。
使用CSS变量制作Dark Theme调色板
您可以使用CSS自定义属性为站点上的深色和浅色主题定义一组变量。
以下面的页面样式为例,在为中对应的颜色定义自定义属性后,我们可以用变量替换不同选择器中的所有HSL颜色:根
:
:根{/ * * /——nav-bg-color:奥软(var(——primarycolor),50%,50%);——nav-text-color:奥软(var(——primarycolor),50%,10%);——container-bg-color:奥软(var(——primarycolor),50%,95%);——content-text-color:奥软(var(——primarycolor),50%,50%);——title-color:奥软(var(——primarycolor),50%,20.%);——footer-bg-color:奥软(var(——primarycolor),93%,88%);——button-text-color:奥软(var(——primarycolor),50%,20.%);}
已经为自定义属性使用了适当的名称。例如,——nav-bg-color
是指导航背景的颜色,而——nav-text-color
是指前景色/文本的颜色.
现在复制:根
选择器的内容,但添加主题属性黑暗值:
:根[主题=“黑暗”]{/ * * /}
此主题将被激活,如果主题属性。黑暗值被添加到< html >
元素。
我们现在可以手动处理这些变量的值,通过降低HSL颜色的明度值来提供一个黑暗的主题,或者我们可以使用其他技术,如CSS过滤器转化()
而且亮度()
,通常用于调整图像的渲染,但也可以用于任何其他元素。
将以下代码添加到主题:根(= '黑暗']
:
:根[主题=“黑暗”]{——暗色调:240;——light-hue:250;——primarycolor:var(——暗色调);——nav-bg-color:奥软(var(——primarycolor),50%,90%);——nav-text-color:奥软(var(——primarycolor),50%,10%);——container-bg-color:奥软(var(——primarycolor),50%,95%);——content-text-color:奥软(var(——primarycolor),50%,50%);——title-color:奥软(——primarycolor,50%,20.%);——footer-bg-color:奥软(var(——primarycolor),93%,88%);——button-text-color:奥软(var(——primarycolor),50%,20.%);过滤器:反(1)亮度(0.6);}
的转化()
滤镜颠倒所选元素中的所有颜色(本例中的每个元素)。反转值可以用百分比或数字来指定。值为100%
或1
将完全颠倒元素的色调、饱和度和明度值。
的亮度()
滤镜使元素更亮或更暗。值为0
结果在一个完全黑暗的元素。
的转化()
滤镜使一些元素非常明亮。这些都是通过设置来淡化的亮度(0.6)
.
有不同黑暗程度的黑暗主题:
用JavaScript切换主题
元素时,让我们使用JavaScript在深色和浅色主题之间切换黑暗和光明按钮。在HTML中添加内联<脚本>
结案前身体< / >
使用以下代码:
常量toggleBtn=文档.querySelector(“# toggle-theme”);toggleBtn.addEventListener(“点击”,e= >{控制台.日志(“切换主题”);如果(文档.documentElement.hasAttribute(“主题”)){文档.documentElement.removeAttribute(“主题”);}其他的{文档.documentElement.setAttribute(“主题”,“黑暗”);}});
Document.documentElement引用文档的根DOM元素-即,< html >
.此代码检查是否存在主题属性,使用.hasAttribute ()
方法添加属性黑暗值如果它不存在,导致切换到黑暗主题。否则,它将删除该属性,从而导致切换到light主题。
注意:还应该将此方法与<一个href="https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme">prefers-color-scheme一个>CSS中的一个特性,它可以用来自动改变用户操作系统或用户代理(浏览器)设置的亮/暗主题。这将在下一节中展示。
使用自定义属性和媒体查询
我们还可以对媒体查询使用自定义属性。例如,您可以使用自定义属性来定义浅色和深色配色方案:
:根{——background-primary:奥软(34,78%,91%);——text-primary:奥软(25,76%,10%);——button-primary-bg:奥软(214,77%,10%);——button-primary-fg:奥软(214,77%,98%);}@media屏幕而且(prefers-color-scheme:黑暗){:根{——background-primary:奥软(25,76%,10%);——text-primary:奥软(34,78%,91%);——button-primary-bg:奥软(214,77%,98%);——button-primary-fg:奥软(214,77%,10%);}}
类似地,我们可以使用自定义属性来更改屏幕和打印的基本字体大小:
r::根{——基础字体大小:10px;}@media打印{:根{——基础字体大小:10pt;}}超文本标记语言{字体:var(——基础字体大小)/1.5无衬线;}身体{字体大小:1.6快速眼动;}
在本例中,我们使用适合媒体的打印和屏幕单元。对于这两种媒体,我们将使用基本字体大小为10个单位——像素用于屏幕,点用于打印。我们也会用到的值——基础字体大小:
为根元素设置起始大小(超文本标记语言
).我们可以用<一个href="//www.shaoxingby.com/understanding-and-using-rem-units-in-css/">快速眼动
单位一个>相对于基本字体大小来调整排版的大小。
使用JavaScript自定义属性
记住:自定义属性是CSS属性,我们可以这样与它们交互。例如,我们可以使用CSS.supports ()
API来测试浏览器是否支持自定义属性:
常量supportsCustomProps=CSS.支持(”——主要文本:# 000);//在支持自定义属性的浏览器中,控制台日志为true控制台.日志(supportsCustomProps);
我们也可以用setProperty ()
方法设置自定义属性值:
文档.身体.风格.setProperty(“——bg-home”,“烟白”);
使用removeProperty ()
类似的工作。只需要传递自定义属性名作为参数:
文档.身体.风格.removeProperty(“——bg-home”);
要在JavaScript中使用自定义属性作为值,请使用var ()
函数使用属性名作为参数:
文档.身体.风格.写成backgroundColor=“var(——bg-home)”;
可惜的是,您不能使用方括号语法或样式对象的camelwrapped属性设置自定义属性。换句话说,两者都不是document.body.style.——bg-home
也不document.body.style['——bg-home ')
将工作。
自定义属性和组件
像React、Angular和Vue这样的JavaScript框架允许开发人员使用JavaScript创建可重用、可共享的HTML块,通常带有在组件级别定义的CSS。
下面是一个React组件的示例JSX一个>, JavaScript的语法扩展:
进口反应从“反应”;/*将关联的CSS导入到该组件*/进口“. . / css / field-button.css”;类FieldButtonGroup扩展反应.组件{渲染(){返回(<div类名=“field__button__group”><标签htmlFor={这.道具.id}>{这.道具.labelText}</标签><div><输入类型={这.道具.类型}的名字={这.道具.的名字}id={这.道具.id}onChange={这.道具.onChangeHandler}/><按钮类型=“提交”>{这.道具.buttonText}</按钮></div></div>);}}出口默认的FieldButtonGroup;
更多关于JavaScript框架
必威西盟体育网页登录如果你想了解更多使用JavaScript框架的知识,SitePoint有关于React、Angular和Vue的大量资源。对于React,请查看使用React的第一周一个>和广泛的<一个类="" href="//www.shaoxingby.com/tag/react/" target="_blank" rel="noreferrer noopener">反应的文章一个>.对于Angular来说,有学习Angular:第一周一个>还有很多<一个类="" href="//www.shaoxingby.com/tag/angular/" target="_blank" rel="noreferrer noopener">Angular文章和教程一个>.对于Vue,请查看开始Vue.js一个>和更多的<一个类="" href="//www.shaoxingby.com/tag/vue/" target="_blank" rel="noreferrer noopener">Vue文章一个>.
我们的React组件将CSS导入到JavaScript文件中。的内容在编译时field-button.css
内联加载。下面是一种使用自定义属性的方法:
.field__button__group标签{显示:块;}.field__button__group按钮{flex:0110快速眼动;背景颜色:var(——button-bg-color,rgb(103,58,183));/*包含默认的*/颜色:# fff;边境:没有一个;}
在本例中,我们使用了一个自定义属性-——button-bg-color
-用于按钮的背景色,以及以防万一的默认颜色——button-bg-color
永远不会被定义。从这里,我们可以设置值为——button-bg-color
,在全局样式表中或通过风格
属性。
让我们将该值设置为React“prop”。反应道具(简称属性)模拟元素属性。它们是一种将数据传递到React组件的方法。在本例中,我们将添加一个名为buttonBgColor
:
进口FieldButtonGroup从“. . / FieldButtonGroup”;类NewsletterSignup扩展反应.组件{渲染(){//为简洁起见,我们省略了onChangeHandler道具。返回(<FieldButtonGroup类型=“电子邮件”的名字=“通讯”id=“通讯”labelText=“电子邮件地址”buttonText=“订阅”buttonBgColor="rgb(75, 97, 108)"/>);}}出口默认的NewsletterSignup;
现在我们需要更新我们的FieldButtonGroup
为了支持这一变化:
类FieldButtonGroup扩展反应.组件{渲染(){/*在React中,样式属性值必须使用JavaScript对象设置,其中对象键是CSS属性。属性应该是驼峰式的(例如backgroundColor)或者用引号括起来。* /常量buttonStyle={“——button-bg-color”:这.道具.buttonBgColor};返回(<div类名=“field__button__group”><标签htmlFor={这.道具.id}>{这.道具.labelText}</标签><div><输入类型={这.道具.类型}的名字={这.道具.的名字}id={这.道具.id}onChange={这.道具.onChangeHandler}/><按钮类型=“提交”风格={buttonStyle}>{这.道具.buttonText}</按钮></div></div>);}}
在上面的代码中,我们添加了一个buttonStyle
对象,该对象保存自定义属性的名称,并将其值设置为buttonBgColor
道具和风格
属性为我们的按钮。
使用风格
属性可能与您所学习的关于CSS的所有内容背道而驰。CSS的一个卖点是,我们可以定义一组样式在多个HTML和XML文档中使用。的风格
属性,另一方面,将CSS的范围限制到它所应用的元素。我们不能重复使用它。我们也不能利用这种连锁反应。
但是在基于组件的前端体系结构中,一个组件可以在多个上下文中由多个团队使用,甚至可以在客户机项目之间共享。类提供的狭窄的“局部作用域”与级联的“全局作用域”相结合风格
属性。
属性设置自定义属性值风格
属性将效果限制为这个特殊的例子的FieldButtonGroup
组件。但是因为我们使用了自定义属性而不是标准的CSS属性,所以我们仍然可以选择定义——button-bg-color
在链接样式表中,而不是作为组件道具。
结论
自定义属性采用了预处理程序最好的特性之一——变量——并使它们成为CSS的原生属性。使用自定义属性,我们可以:
- 创建可重用的主题组件
- 轻松调整填充,空白和排版的视口大小和媒体的范围
- 提高CSS中颜色值的一致性
变量有一系列的应用,在基于组件的设计系统中尤其有用。
我希望你现在对如何在CSS中使用变量或自定义属性有了更好的理解。看看我的课程,<一个href="//www.shaoxingby.com/premium/books/css-master-3rd-edition/">CSS的主人一个>,来扩展你的CSS知识,并获得更多有用的技巧。