介绍
像 任何其他编程语言 一样,CSS 也有函数。它们可以插入到您放置值的位置,或者在某些情况下,与其他值声明一起使用。某些 CSS 函数甚至允许您在其中嵌套其他函数!
更多
在编程中,函数是执行特定任务的命名代码部分。例如,在 JavaScript 中编写的名为 sayWoof():
的函数:
function sayWoof() {
console.log("Woof!");
}
我们可以在定义了所需行为后,在代码中稍后使用此函数。在此示例中,您在网站或 Web 应用程序的 JavaScript 中输入 sayWoof()
时,它都会将“Woof!”打印到浏览器的控制台中。
函数还可以使用参数,参数是用于数字或文本片段的插槽,您可以将它们馈送到函数的逻辑中以让它修改它们。它在 JavaScript 中的工作原理如下
function countDogs(amount) {
console.log("There are " + amount + " dogs!");
}
这里,我们有一个名为 countDogs()
的函数,它有一个名为 amount
的参数。当为 amount 提供一个数字时,它将获取该数字并将其添加到预先指定的句子中。这让我们可以创建告诉我们我们统计了多少条狗的句子。
countDogs(3); // There are 3 dogs!
countDogs(276); // There are 276 dogs!
countDogs("many"); // There are many dogs!
一些编程语言附带内置函数,以帮助您不必为每个新项目重新发明轮子。通常,这些函数旨在帮助更轻松地使用语言的主要优势和功能。
例如,库。库是由经过精心挑选的函数集合组成的意见代码集合,旨在帮助加快开发速度并简化开发,实际上就是经过精心挑选的函数集合——比如用于创建灵活视频元素的 FitVids.js。
CSS 函数的基础知识
与其他编程语言不同,我们在 CSS 中无法创建自己的函数。那种逻辑保留给 CSS 选择器,它允许您创建 强大的条件样式规则。
与其他编程语言不同,其他编程语言的函数输出通常会隐式影响后续逻辑,而 CSS 函数的输出本质上是视觉化的。此输出用于控制内容的布局和呈现。例如:
.has-orange-glow {
filter: drop-shadow(0.25rem 0 0.75rem #ef9035);
}
CSS 滤镜函数 drop-shadow()
使用我们提供给它的参数在应用它的任何内容上创建橙色外发光效果。
在下面的演示中,我有一个名为 toggleOrangeGlow
的 JavaScript 函数,它会在 CSS-Tricks 徽标上切换 .has-orange-glow
类别的应用。将此与 CSS 过渡 结合使用,我们可以创建一个很酷的发光效果
您可能熟悉一些 CSS 函数,但这种语言的函数列表出奇地广泛!
与 Web 上的任何其他技术一样,不同的 CSS 函数具有不同的浏览器支持级别。请确保您 进行研究和测试 以确保您的体验适合所有人,并 使用诸如 @supports
之类的东西 来提供优质的替代体验。
常见的 CSS 函数
url()
.el {
background: url(/images/image.jpg);
}
使用 url()
url()
允许您链接到其他资源以加载它们。这可能包括图像、字体,甚至其他样式表。出于性能原因,最好限制您通过 url()
加载的内容,因为每个声明都是一个额外的 HTTP 请求。
attr()
/* <div data-example="foo"> */
div {
content: attr(data-example);
}
使用 attr()
此函数允许我们访问 HTML,获取属性的内容,并将它馈送到 CSS 内容属性。您通常会在 打印样式表 中看到 attr()
,它用于在链接文本之后显示链接的 URL。此函数的另一个很好的应用是使用它来 显示图像未加载时的替代说明。
calc()
.el {
width: calc(100vw - 80px);
}
使用 calc()
如果您应该花时间尝试一个函数,那就是 calc()
。 我们有一个关于 calc()
的完整指南。
此函数接受两个参数,并根据您提供的运算符 (+
、-
、*
、/
) 从参数中计算结果,前提是这些参数是带或不带 单位 的数字。
与 Sass 等 CSS 预处理器不同,calc()
可以混合单位,这意味着您可以执行诸如从 100%
中减去 6rem
之类的事情。calc()
也会动态更新,因此如果 100%
代表宽度,那么即使该宽度发生变化,它仍然可以正常工作。calc()
也可以 接受 CSS 自定义属性作为参数,让您拥有 不可思议的灵活性。
lang()
p:lang(en) {
quotes: "\201C" "\201D" "\2018" "\2019" "\201C" "\201D" "\2018" "\2019";
}
使用 lang()
在 HTML 中包含 lang
属性 是一件非常重要的事情。当它出现在您的 HTML 中时,您就可以使用 lang()
函数来定位属性值的出现并根据它有条件地应用样式。
此选择器的常见用途之一是 设置特定于语言的引号,这对国际化非常有用。
聪明的设计师和开发人员还可以将其用作样式翻译版本的网站的钩子,在这些网站中,文化和/或语言考虑因素意味着对诸如负空间之类的事物存在 不同的看法。
CSS 自定义属性
只有一个特定于 CSS 自定义属性 的函数,但它让整个过程正常运行!
var()
函数用于引用之前在文档中声明的自定义属性。
html {
--color: orange;
}
p {
color: var(--color);
}
与 calc()
结合使用时,它非常强大。
html {
--scale: 1.2;
--size: 0.8rem;
}
.size-2 {
font-size: calc(var(--size) * var(--scale));
}
.size-2 {
font-size: calc(var(--size) * var(--scale) * var(--scale));
}
关于使用 var()
的更多信息
另一个示例是在文档的根目录中声明一个名为 --ratio: 1.618
的自定义属性,然后在我们的 CSS 中稍后调用它来控制行高,例如 line-height: var(--ratio);
。
这里,var()
是一组指令,它告诉浏览器:“去找到在文档中之前声明的称为 --ratio
的参数,获取它的值,并将其应用于此处。”
记住!calc()
允许我们动态地调整事物,包括你通过 var()
提供的参数。
这让我们可以直接在 CSS 中使用几行代码来创建诸如 模块化比例系统 之类的东西。如果你更改 --ratio
的值,整个模块化比例系统将更新以匹配。
在下面的 CodePen 演示中,我正是这样做的。在 Pen 的 CSS 中将 --scale
的值更改为不同的数字,以查看我的意思。
还值得一提的是,JavaScript 的 setProperty
方法可以实时更新自定义属性。这使我们能够快速有效地更改以前可能需要大量复杂代码才能实现的事物。
颜色函数
另一个你经常看到 CSS 函数的地方是在处理颜色时。
rgb()
和 rgba()
.el {
color: rgb(255, 0, 0);
color: rgba(255, 0, 0, 0.5);
color: rgb(255 0 0 / 0.5);
}
使用 rgb()
和 rgba()
这些函数允许你使用数字来描述颜色的红色 (r
)、绿色 (g
)、蓝色 (b
) 和 alpha (a
) 水平。例如,具有 十六进制值 为 #fb1010
的红色也可以描述为 rgba(251, 16, 16, 1)
。红色值 251
远高于绿色和蓝色值 (16
和 16
),因为颜色主要由红色信息组成。
alpha 值为 1 表示它完全不透明,并且不会显示颜色应用于其背后的任何内容。如果我们将 alpha 值更改为 0.5,则颜色将为 50% 透明。如果你使用 rgb()
函数而不是 rgba()
,则不必提供 alpha 值。这曾经意味着你无法提供 alpha 值,但现在无论你使用旧的逗号语法还是新的斜杠语法,该函数都会接受一个 alpha 值。
hsl()
和 hsla()
.el {
background: hsl(100, 100%, 50%);
background: hsla(100, 100%, 50%, 0.5);
background: hsl(100 100% 50% / 0.5);
}
使用 hsl()
和 hsla()
与 rgb()
和 rgba()
类似,hsl()
和 hsla()
是允许你描述颜色的函数。它们不使用红色、绿色和蓝色,而是使用色相 (h
)、饱和度 (s
) 和亮度 (l
)。
我更喜欢使用 hsla()
而不是 rgba()
,因为它的颜色描述模型 非常适合系统化的颜色系统。这些函数的每个颜色级别值都可以是 CSS 自定义属性,允许你 创建功能强大的动态代码。
新的颜色函数
在即将发布的 CSS 颜色模块级别 4 规范中,我们可以忽略 rgba()
和 hsla()
中的 a
部分以及逗号。现在,空格用于分隔 rgb
和 hsl
参数,并带有可选的 /
来指示 alpha 水平。
我们也将开始看到像 lab()
和 lch()
这样的新函数,它们将使用这种新的格式。
伪类选择器函数
这些选择器使用专门的参数符号,指定 要选择的内容的模式。这使你能够执行诸如选择每隔一个元素、每五个元素、第七个元素后的每个第三个元素等操作。
伪类选择器非常通用,但往往被忽视和低估。很多时候,仔细应用 一些这样的选择器可以完成一个或多个节点包的工作。
:nth-child()
.el:nth-child(3n) {
background-color: #eee;
}
nth-child()
允许你定位文档对象模型 (DOM) 树中同一级别上的一组元素中的一個或多个元素。
在正确的人手中,:nth-child()
非常强大。你甚至可以用它 解决 FizzBuzz 问题!如果你正在寻找一个好的入门方法,Chris 有 一个有用的伪选择器食谱集合。
:nth-last-child()
.el:nth-last-child(2) {
opacity: 0.75;
}
.el:last-child {
opacity: 0.5;
}
此伪类选择器定位 DOM 中同一级别上的一组元素中的一个或多个元素。它从组中的最后一个元素开始计数,并向后遍历可用 DOM 节点的列表。
演示
:nth-of-type()
h2:nth-of-type(odd) {
text-indent: 3rem;
}
:nth-of-type()
匹配给定类型的元素的指定集合。例如,声明 img:nth-of-type(5)
将定位页面上的第五张图片。
演示
:nth-last-of-type()
section:nth-last-of-type(3) {
background-color: darkorchid;
}
此伪类选择器可以定位类似类型的一组元素中的一个元素。与 :nth-last-child()
非常相似,它从组中的最后一个元素开始计数。与 :nth-last-child
不同,它会跳过不适用的元素,因为它向后工作。
演示
动画函数
动画是为你的网站或网络应用添加某种难以言喻的东西的重要部分。只需记住将用户的需求放在首位,并 尊重他们的 动画偏好。
创建动画还需要随时间控制事物的状态,因此函数非常适合实现这一点。
cubic-bezier()
.el {
transition-timing-function:
cubic-bezier(0.17, 0.67, 0.83, 0.67);
}
你可以使用 cubic-bezier()
来创建动画的自定义计时函数,而不是像 ease
、ease-in-out
或 linear
这样的关键字值。虽然你可以 阅读有关驱动三次贝塞尔曲线的数学知识,但我认为 尝试制作一个 会更有意思。
path()
.clip-me {
clip-path: path('M0.5,1 C0.5,1,0,0.7,0,0.3 A0.25,0.25,1,1,1,0.5,0.3 A0.25,0.25,1,1,1,1,0.3 C1,0.7,0.5,1,0.5,1 Z');
}
.move-me {
offset-path: path("M56.06,227 ...");
}
此函数与 offset-path
属性 (或 最终,clip-path
属性)配对。它允许你“绘制”一个 SVG 路径,其他元素可以被动画设置为跟随它。
演示
Michelle Barker 和 Dan Wilson 都发布了关于这种动画方法的详细文章。
steps()
.el {
animation: 2s infinite alternate steps(10);
}
这个相对较新的函数允许你设置动画的缓动时间,这使得你能够更好地控制动画的哪一部分在什么时候发生。Dan Wilson 有 另一篇关于它如何融入现有动画缓动场景的优秀文章 。
尺寸和缩放(变换)函数
我们在动画中最常做的事情之一是 拉伸和压缩东西 。以下函数允许你精确地做到这一点。但是有一个问题:这些 CSS 函数是一个特殊的子集,因为它们只能与 transform
属性 一起使用。
scaleX()
,scaleY()
,scaleZ()
,scale3d()
,以及scale()
.double {
transform: scale(2);
}
缩放函数允许你沿一个或多个轴增加或减小某个东西的大小。如果你使用scale3d()
,你甚至可以在三个维度上做到这一点!
translateX()
,translateY()
,translateZ()
,translate3d()
,以及translate()
.center {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
平移函数允许你沿一个或多个轴重新定位元素。与缩放函数类似,你也可以将这种操作扩展到三个维度。
perspective()
.cube {
transform: perspective(50em) rotateY(50deg)
}
这个函数 允许你调整对象的外观,使其看起来像从背景中突出并向外投影。
rotateX()
,rotateY()
,rotateZ()
,rotate3d()
,以及rotate()
.avatar {
transform: rotate(25deg);
}
旋转函数允许你沿一个或多个轴旋转元素,就像抓住一个球并在手中转动它一样。
skewX()
,skewY()
,以及skew()
.header {
transform: skew(25deg, 15deg);
}
倾斜函数与缩放和旋转函数略有不同,因为它们相对于一个点应用扭曲效果。扭曲的程度与声明的角度和距离成比例,这意味着效果在某个方向上持续的时间越长,它就越明显。
Jorge Moreno 也为我们做了好事,并制作了一个很棒的工具,叫做 CSS 变换函数可视化器 。它允许你实时调整尺寸和缩放,以便更好地理解所有这些函数是如何协同工作的。
作为负责任的网络专业人士,我们应该注意我们的用户,以及他们可能没有使用新的或强大的硬件来查看我们的内容这一事实。大型和复杂的动画可能会减慢体验速度,甚至在极端情况下导致浏览器崩溃。
为了防止这种情况,我们可以使用 will-change
之类的技术来 为浏览器准备即将发生的事情 ,以及 update
媒体特征 在不支持快速刷新率的设备上删除动画。
滤镜函数
CSS 滤镜函数是 CSS 函数的另一个特殊子集,因为它们只能与 filter
属性 一起使用。滤镜是应用于元素的特殊效果, 模仿图形编辑程序的功能 ,如 Photoshop。
你可以用 CSS 滤镜函数做一些非常疯狂的事情,比如 重新创建你可以在 Instagram 上的帖子中应用的效果 !
brightness()
.avatar:hover {
filter: brightness(150%);
}
此函数调整某物看起来的亮度。将其设置为较低的值将使其看起来像在其上投下了阴影。将其设置为较高值将使其亮度过高,就像曝光过度的照片一样。
演示
blur()
.ghost {
filter: blur(50%);
}
如果你熟悉 Photoshop 的 高斯模糊 滤镜,你就知道blur()
的工作原理。你应用的越多,你应用它的东西看起来就越模糊。
演示
contrast()
.wow {
filter: contrast(200%);
}
contrast()
将调整应用于内容的最亮部分和最暗部分之间的差异程度。
演示
grayscale()
.no-color {
filter: grayscale(100%);
}
grayscale()
从它所应用的内容中删除颜色信息。记住,这不是一个全有或全无的事情!你可以应用部分灰度效果,使某物看起来风化或褪色。
grayscale()
的一个有趣的应用可能是 在启用深色模式时稍微应用它到图像 ,在用户可能希望减少眼睛疲劳的情况下,稍微降低颜色的整体活力。
演示
invert()
虽然 invert()
可用于使某些内容看起来像照片底片,但我最喜欢的技巧是在 反转颜色媒体查询 中使用它来反转反转的图像和视频
@media (inverted-colors: inverted) {
img,
video {
filter: invert(100%);
}
}
这可确保图像和视频内容无论用户的浏览模式偏好如何都能以预期的方式显示。
opacity()
.filter-visibility {
filter: opacity(0);
}
此函数控制应用该函数的元素(和子元素)的背景在多大程度上可见。
演示
不透明度为 0% 的元素将完全透明,尽管它仍然存在于 DOM 中。如果您需要完全删除对象,请使用其他技术,例如 隐藏属性。
saturate()
.full-color {
filter: saturate(100%);
}
应用此过滤器可以增强或降低应用对象颜色的强度。增强图像的饱和度是摄影师用来修复曝光不足的照片的一种常见技巧。
演示
sepia()
.is-old-timey {
filter: sepia(1);
}
有更复杂的方法来描述它,但实际上它是一个使某些内容看起来像老式照片的函数。
演示
drop-shadow()
.fit-shape-shadow {
filter: drop-shadow(3rem 0 0.5rem #e486da);
}
下拉阴影是一种应用于对象的视觉效果,使其看起来像悬浮在页面上。这里有一点技巧,即 CSS 也允许您将下拉阴影效果应用于 文本 和 元素。它不同于 box-shadow 属性,因为它 将下拉阴影应用于元素的形状 而不是元素的实际框。
熟练的设计师和开发人员可以利用这一点来创建复杂的视觉效果。
演示
hue-rotate()
.change-color {
filter: hue-rotate(180deg);
}
当包含 hue-rotate() 声明的类应用于元素时,用于绘制该元素的每个像素的色调值将按您指定的量进行偏移。hue-rotate()
的效果应用于它应用的每个像素,因此所有颜色将相对于其色调值的起始点更新。
当应用于包含大量颜色信息的内容(如照片)时,这会产生一种非常迷幻的效果。
演示
SVG 过滤器
filter()
还允许我们导入 SVG 过滤器以用于创建 专门的视觉效果。这个主题太复杂了,无法在本文中详细介绍——如果您正在寻找一个好的起点,我建议您阅读 Dirk Weber 撰写的“SVG 过滤器的艺术及其为何如此出色”。
比较函数
这些函数的想法是,我们可以比较多个值并应用(或表示,如 规范 所述)它们在评估时的值。
clamp()
.page-wrap {
width: clamp(320px, 80%, 1200px);
}
body {
font-size: clamp(12px, 1rem + 2vw, 18px);
}
当提供最小值、最大值和首选值作为参数时,clamp()
将尊重首选值,只要它不超过最小值和最大值边界。
clamp()
将允许我们编写诸如其大小将随着视窗大小而缩放但不会缩小或增长到特定大小之外的组件。这对于创建 CSS 锁 将特别有用,在 CSS 锁中,您可以确保响应式字体大小不会变得太小而无法阅读。
max()
和 min()
.minimum-of-these {
width: max(500px, 50%);
}
.maximum-of-these {
width: min(320px, 90%);
}
这些函数允许您从您提供的范围值中选择最大值或最小值。与 clamp()
类似,这些函数允许我们在达到某个点之前使内容具有响应性。
逻辑组合
规范将这些函数归类为“逻辑组合”标题下,但也许将它们视为用于匹配选择器的函数更容易。
:is()
和 :where()
:is()
经历了一点身份危机。以前被称为 matches()
以及作为 :-webkit-any
/:-moz-any
的供应商前缀,现在它拥有一个标准化且一致的名称。它是一个伪类选择器,接受一系列选择器作为其参数。
这允许作者以高效的方式对各种选择器进行分组和定位。:where()
与 :is()
很像,只是它的 特异性 为零,而 :is()
的特异性设置为提供的选择器列表中的最高特异性。
:is(section, article, aside, nav) :is(h1, h2, h3, h4, h5, h6) {
color: #BADA55;
}
/* ... which is equivalent to: */
section h1, section h2, section h3, section h4, section h5, section h6,
article h1, article h2, article h3, article h4, article h5, article h6,
aside h1, aside h2, aside h3, aside h4, aside h5, aside h6,
nav h1, nav h2, nav h3, nav h4, nav h5, nav h6 {
color: #BADA55;
}
:is()
和 :where()
为我们提供了关于如何选择要设置样式的内容的灵活性,特别是在您可能无法完全控制网站或 Web 应用程序样式表(例如第三方集成、广告等)的情况下。
#CSS
— Adam Argyle (@argyleink) 2019 年 11 月 7 日
:is() 选择器 🎉
:any() 和 :matches() 的继承者
我们演讲的预告,这里有一个我用 XD 制作的漂亮动图,展示了 :is() 选择器语法可以做什么。准备好参加 Chrome Dev Summit 了吧!https://127.0.0.1/0r2CcUx9Hv pic.twitter.com/wSuGOsDLvZ
渐变函数
当您将一种颜色过渡到一种或多种其他颜色时,就会创建渐变。它们是现代用户界面的主力军——熟练的设计师和开发人员使用它们为他们的工作增添一丝精致和高雅。
渐变函数允许您指定一系列属性,包括
- 颜色值,
- 该颜色在渐变区域上的位置,
- 渐变的放置角度。
没错,你猜对了:我们用于渐变的颜色可以使用 CSS 颜色函数来描述!
linear-gradient()
和 repeating-linear-gradient()
线性渐变在一条直线上应用颜色转换,从一个点到另一个点 - 这条线也可以设置成一个角度。在渐变面积大于实际面积的情况下,使用 repeating-linear-gradient()
将会重复你描述的渐变,直到所有可用区域都被填充。
演示
radial-gradient()
和 repeating-radial-gradient()
径向渐变很像线性渐变,只是它不是一条直线,颜色转换从中心点向外辐射。它们通常用于创建一个半透明的屏幕,帮助将模态窗口与它所放置的背景分离。
演示
conic-gradient()
和 repeating-conical-gradient
圆锥渐变不同于径向渐变,因为它围绕圆形旋转颜色。因此,我们可以做一些很酷的事情,例如 创建圆环图。不幸的是,对圆锥渐变的支持仍然很差,因此请谨慎使用它们。
网格函数
CSS 网格 是这门语言中一个相对较新的功能。它允许我们高效地为多种屏幕尺寸创建自适应、健壮的布局。
值得承认我们的根源。在网格之前,CSS 中的布局很大程度上是一系列为了使原本设计用来格式化学术文档的语言能够工作而使用的编码技巧。网格的引入进一步说明了这门语言的意图已经发生了变化。
现代 CSS 是一种高效、容错的语言,用于控制各种设备表单因素的呈现和布局。借助网格和其他属性,例如弹性盒模型,我们能够创建以前版本的 CSS 无法实现的布局。
网格引入了以下 CSS 函数来帮助你使用它。
fit-content()
此函数“限制”网格行或列的大小,让你可以指定网格轨道可以扩展到的最大尺寸。fit-content()
接受一系列值,但其中最值得注意的是 min-content
和 max-content
。这些值允许你将布局绑定到它包含的内容。令人印象深刻的东西!
演示
repeat()
你可以使用 repeat()
循环遍历网格列和行的模式。这对于两种情况非常有用:
- 当你知道需要多少行或列时,但手动输入它们会很费力。一个很好的例子就是为日历构建网格。
- 当你不知道需要多少行或列时。在这里,你可以指定一个模板,浏览器会在它 将内容传播到你的布局时遵守这个模板。
演示
形状函数
与 filter()
和 transform()
一样,形状 CSS 函数只对一个属性起作用:clip-path
。此属性用于屏蔽某个部分,允许你创建各种很酷的效果。
circle()
此函数为你的遮罩创建一个圆形形状,允许你指定它的半径和位置。
演示
ellipse()
与 circle()
一样,ellipse()
会绘制一个圆形,只是它不是完美的圆形,ellipse()
允许你构建一个椭圆形的遮罩。
演示
inset()
此函数会屏蔽你应用它到的元素内部的矩形。
演示
杂项函数
这些是无法分类的 CSS 函数,一些无法整齐地归入其他类别的东西。
element()
曾经将相机对准自己的视频提要吗?这有点像 element()
的作用。它允许你指定另一个元素的 ID 来创建该元素外观的“图像”。然后你可以对该图像应用其他 CSS,包括 CSS 过滤器!
可能需要一段时间才能理解这个概念 - 并且它存在一些支持问题 - 但 element()
在正确的人手中可能非常强大。
Preethi Sam 的 “使用鲜为人知的 CSS element() 函数来创建小地图导航器” 演示了如何使用它来创建代码小地图,并且是一篇非常棒的阅读材料。
在这里,她为阅读长篇幅的文章创建了一个小地图。
image-set()
.responsive-background {
background-image:
image-set("image.png" 1x,
"image-2x.png" 2x,
"image-print.png" 600dpi
);
}
此函数允许您指定一个图像列表,供浏览器根据其对显示器功能和连接速度的了解选择作为背景图像。它类似于您对 srcset
属性 的操作。
::slotted()
::slotted(.marker) {
background: lightyellow;
}
这是一个伪元素选择器,用于定位已放置在 HTML 模板中插槽内的元素。::slotted()
旨在用于使用 Web Components,它们是自定义的、开发人员定义的 HTML 元素。
尚未准备好大规模使用
与任何其他活生生的编程语言一样,CSS 包含正在积极开发的功能和功能。
这些功能有时可以使用具有前沿访问权限的浏览器进行预览。 Firefox Nightly 和 Chrome Canary 是两个这样的浏览器。其他功能和功能非常新,它们只存在于 W3C 正在积极讨论的内容中。
annotation()
此函数启用备用注释形式,这些字符保留用于标记诸如符号和注释之类的事物。这些字符通常用圆形、方形或菱形突出显示。
并非所有字体都包含备用注释形式,因此在尝试使用 annotation()
之前,最好检查您使用的字体是否包含它们。 Wakamai Fondue 等工具 可以帮助您做到这一点。
counter()
和 counters()
当您在 HTML 中创建一个有序列表时,浏览器会自动为您生成数字,并将其放置在列表项内容之前。这些浏览器生成的列表内容称为计数器。
通过结合使用 ::marker
伪元素选择器、content
属性和 counter()
函数,我们可以控制有序列表中计数器的内容和表现形式。对于尚不支持 counter()
或 counters()
的浏览器,您仍然可以获得不错的体验,因为浏览器会自动回退到其生成的的内容。
对于嵌套有序列表的情况,counters()
函数允许子有序列表访问其父级。这使我们能够控制它们的内容和表现形式。如果您想了解 ::marker
、counter()
和 counters()
的强大功能,您可以阅读 “CSS 列表、标记和计数器”,作者是 Rachel Andrew。
cross-fade()
此函数将允许您将一个背景图像与一个或多个其他背景图像混合。它提出的语法类似于渐变函数,您可以在其中指定图像开始和结束的停止点。
dir()
此函数允许您翻转语言的阅读顺序方向。对于英语,这意味着从左到右 (ltr
) 的阅读顺序将变成从右到左 (rtl
)。 目前只有 Firefox 支持 dir()
,但您可以在基于 Chromium 的浏览器中使用属性选择器(例如 [dir="rtl"]
)来实现相同的效果。
演示
env()
body {
padding:
env(safe-area-inset-top)
env(safe-area-inset-right)
env(safe-area-inset-bottom)
env(safe-area-inset-left);
}
env()
(环境的缩写)允许您 创建条件逻辑,如果设备的 用户代理 匹配,则会触发该逻辑。它因 iPhone X 作为一种处理其刘海的方法而流行起来。
话虽如此,设备嗅探是一个谬误的行为——您不应该认为 env()
是一种欺骗它的方法。相反,应该按预期使用它:确保您的设计适用于在视窗上施加独特硬件约束的设备。
has()
has()
是一个关系伪类,它将定位包含另一个元素的元素,前提是 HTML 源代码中至少有一个匹配项。例如 a:has(> img)
,它告诉浏览器定位包含图像的任何链接。
有趣的是,has()
目前被提议为只能在 JavaScript 中编写的 CSS。如果要推测一下原因,可能是为了出于性能原因限定选择器。通过这种方法,只有在浏览器被告知处理条件逻辑并因此查询事物状态之后,才会触发 has()
。
image()
.help::before {
content: image("try.webp", "try.svg", "try.gif");
}
此函数将允许您插入静态图像 (使用 url()
引用),或通过渐变和 element()
动态绘制图像。
三角函数
这些函数将允许我们执行更 高级的数学运算:
- 正弦:
sin()
- 余弦:
cos()
- 正切:
tan()
- 反余弦:
acos()
- 反正弦:
asin()
- 反正切:
atan()
- 反正切:
atan2()
- 平方根:
sqrt()
- 其参数的平方和的平方根:
hypot()
- 幂:
pow()
我特别期待看到比我聪明的人用这些函数做些什么,尤其是用于动画之类的东西!
:host()
和 :host-context()
说实话,我对 Shadow DOM 背后的术语和机制细节有点模糊。这是 MDN 对 host()
的描述
:host()
CSS 伪类 函数选择包含使用它的 CSS 的 Shadow DOM 的影子宿主(因此你可以从其 Shadow DOM 内部选择自定义元素)——但仅当作为函数参数给出的选择器与影子宿主匹配时。
:host-context()
CSS 伪类函数选择包含使用它的 CSS 的 Shadow DOM 的影子宿主(因此你可以从其 Shadow DOM 内部选择自定义元素)——但仅当作为函数参数给出的选择器与影子宿主在 DOM 层次结构中所处位置的祖先匹配时。
:nth-col()
和 :nth-last-col()
这些伪类将允许你选择 CSS 网格中的一列或一系列指定的列,并对其应用样式。这些函数的工作原理可以类比 CSS 伪类选择器的操作方式。与伪类选择器不同,:nth-col()
和 :nth-last-col()
应该能够针对 隐式网格列。
symbols()
此函数允许你指定一个字符列表,用于列表项目符号。类似于 annotation()
,在尝试使用 symbols()
之前,你需要确保你使用的字体包含你想要用作符号的字形。
已弃用的函数
有时候事情不会像你想象的那样发展。虽然已弃用的 CSS 函数可能由于向后兼容的原因仍在浏览器中渲染,但建议你不要再使用它们。
matrix()
和 matrix3d()
这些函数被转换为更独立的 大小和缩放函数。
rect()
此函数是已弃用的 clip
属性的一部分。请使用 clip-path
属性 及其 值。
target-counter()
、target-counters()
和 target-text()
这些函数旨在帮助处理分页(打印)媒体的片段 URL。你可以从 W3C 的 CSS 生成的内容用于分页媒体模块 文档中了解更多关于它们的信息。
排版
网络就是排版,因此有必要对你的文字进行细致入微的处理。虽然 CSS 提供了一些专门用于释放你的网站或 Web 应用程序所选字体的潜力的函数,但建议不要使用以下函数来访问这些高级功能。
相反,使用 font-feature-settings
的低级语法。你可以使用 Wakamai Fondue 等工具 来确定你使用的字体是否支持这些功能。
character-variant()
、styleset()
和 stylistic()
许多专业铸造厂制作的字体包含某些字母或字母组合的备用处理方式。一个用例是为设计成手写字体的字体提供常用字母的不同变体,以帮助使其看起来更自然。
使用这些函数将激活这些特殊的备用字符,前提是它们存在于字体的 字形集中。
不幸的是,这不是标准化的服务。不同的字体将拥有不同的支持范围,这取决于排版师选择包含的内容。在编写任何代码之前,最好检查你使用的字体是否支持这些特殊功能。
format()
当你通过 url()
函数 导入字体 时,format()
函数是一个可选的提示,它允许你手动指定字体的文件格式。如果提供了此提示,则浏览器在不识别指定的文件格式的情况下不会下载字体。
@font-face {
font-family: 'MyWebFont';
src: url('mywebfont.woff2') format('woff2'), /* Cutting edge browsers */
url('mywebfont.woff') format('woff'), /* Most modern Browsers */
url('mywebfont.ttf') format('truetype'); /* Older Safari, Android, iOS */
}
leader()
你知道当你阅读餐厅的菜单时,会有一系列句点来帮助你确定哪个价格对应哪个菜单项吗?这些就是引导线。
W3C 曾经在其 CSS 生成的内容用于分页媒体模块 中为它们制定了计划,但不幸的是,leader()
似乎从未真正流行起来。幸运的是,W3C 还提供了如何 使用 content
属性的巧妙应用来实现此效果 的示例。
local()
local()
允许你指定本地安装的字体,这意味着它存在于设备上。本地字体要么随设备一起提供,要么可以手动安装。
依靠别人安装字体来使你的内容看起来符合预期非常冒险!因此,建议你不要指定需要手动安装的本地字体。你的网站不会像预期的那样显示,尤其是如果你没有 指定备用字体。
@font-face {
font-family: 'FeltTipPen';
src: local('Felt Tip Pen Web'), /* Full font name */
local('FeltTipPen-Regular'); /* Postscript name */
}
swash()
装饰字是字母的替代视觉处理方式,为它们提供额外的花哨装饰。它们通常出现在斜体和草书字体中。
为什么这么多?
CSS 经常被误解,也经常被贬低。要理解为什么所有这些功能都对我们可用,指导思想是了解 CSS 不是规定性的——并非每个网站都必须像 Microsoft Word 文档一样。
为 Web 提供支持的技术是以这样一种方式设计的,即任何对 Web 充满兴趣的人都可以构建他们想要的任何东西。这是一个强大而革命性的概念,这是 Web 变得如此普遍的原因之一。
涉及狗的示例天生就更清晰!:]
我总是感谢 css-tricks。这篇文章写得很好,对任何人都有帮助。
很好的文章,可以帮助理解 CSS 中的函数是什么。
但我希望得到这个问题的答案:我们是否能够在 CSS 中编写自己的函数?
有可能!您可能想查看 Houdini。它提供对 CSSOM 的访问,这是一个非常强大的东西。
非常棒的文章,请更多这样的文章
calc()
简直太棒了!就是这样。不错,尤其是 has 和其他任何浏览器都不支持的函数:https://mdn.org.cn/en-US/docs/Web/CSS/:has
关于 fit-content() 函数
我在哪里遗漏了?在您的示例中,250 px 与 350 px...
在这个示例中,我们使用 fit-content() 函数的 250px 参数。这告诉浏览器将第一个网格列限制为 350px 的宽度,
我忘了在我的第一条评论中说明,我认为这篇文章是一项很棒的作品。向完成此工作的人致敬!
一些说明
translate[x|y|z|3d]
(平移)、rotate[x|y|z|3d]
(旋转)、skew[x|y]
(倾斜) 也不执行缩放。它们是变换函数,就像matrix
和matrix3d
一样,据我所知,它们并没有被弃用。至少 规范中没有关于它们被弃用的说明,所以我不知道这些信息从哪里来的。该部分中链接的来源返回 404。然而,几乎十年来,skew(x, y)
函数(规范) 被弃用。它甚至在 2012 年 8 月从 Firefox 中删除,但后来由于向后兼容性原因被重新引入。关于倾斜的其他说明:“扭曲量与声明的角度和距离成正比”——skew[x|y]
函数中没有距离。 此部分 解释了倾斜的工作原理,以及它在 HTML 和 SVG 元素上应用方式之间的区别。请注意,拉伸和压缩只是变换函数可以完成的众多功能中的一小部分。
sqrt()
、pow()
和hypot()
不是三角函数。它们与log()
和exp()
一起被归类为指数函数。还有与符号相关的函数 (abs()
和sign()
) 和阶梯值函数 (round()
、mod()
、rem()
)。这是 该规范。conic-gradient()
实际上现在有很好的支持,如果我们忽略 pre-Chromium Edge。Chromium 浏览器支持它。Safari 支持它。即使 Firefox 也在标志背后支持它——转到about:config
,搜索layout.css.conic-gradient.enabled
标志,并将它的值设置为true
(默认值为false
,双击将其设置为true
)。min()
、max()
和clamp()
也是如此。撇开旧的 Edge/IE 不谈,它们肯定不会演变为支持它们,实际上它们得到了很好的支持。感谢您的回复,Ana。我非常尊重您的工作,并感谢您花时间指出上述内容。我会尽快将根据您的反馈进行的更新整合进来。
感谢这篇文章!
(Gosh CSS 函数自我在 2000 年代初学习以来已经膨胀了。这个指南让我在几分钟内了解了最新情况。)
只想指出 三角函数 下面有一点格式错误。对于
acos()
和hypot()
函数,代码格式开始得比应该早。愿源代码与你同在!
感谢您的提醒!感谢您一路读到这儿。