CSS 函数
CSS 函数允许在样式表中执行计算、调整颜色、创建渐变等操作。它们为 CSS 提供了更强大的功能,使开发者能够创建更复杂和动态的样式效果。
数学函数
calc()
[calc()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数允许在 CSS 中进行数学计算。
.element {
width: calc(100% - 40px);
height: calc(50vh - 20px);
font-size: calc(1rem + 1vw);
padding: calc(1em + 5px);
}
.grid-item {
width: calc((100% - 30px) / 3);
}支持的运算符:
+加法-减法*乘法/除法
注意事项:
- 运算符前后必须有空格
- 除数不能为 0
- 可以混合使用不同单位
min()
[min()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数选择一组值中的最小值。
.element {
font-size: min(20px, 2em, 3vw);
width: min(500px, 80%);
}max()
[max()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数选择一组值中的最大值。
.element {
font-size: max(16px, 1.2em);
width: max(300px, 50%);
}clamp()
[clamp()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数将值限制在最小值和最大值之间。
.element {
font-size: clamp(16px, 2em, 24px);
/* 等同于 max(16px, min(2em, 24px)) */
width: clamp(300px, 50%, 800px);
}颜色函数
rgb() 和 rgba()
[rgb()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 和 [rgba()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数定义 RGB 颜色。
.element {
color: rgb(255, 0, 0); /* 红色 */
background: rgba(255, 0, 0, 0.5); /* 半透明红色 */
}hsl() 和 hsla()
[hsl()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 和 [hsla()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数定义 HSL 颜色。
.element {
color: hsl(0, 100%, 50%); /* 红色 */
background: hsla(0, 100%, 50%, 0.5); /* 半透明红色 */
}hwb()
[hwb()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数使用色相、白度和黑度定义颜色。
.element {
color: hwb(0 0% 0%); /* 红色 */
background: hwb(120 20% 10%); /* 绿色 */
}lab() 和 lch()
[lab()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 和 [lch()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数使用更现代的颜色空间定义颜色。
.element {
color: lab(50% 20 30);
background: lch(50% 50 120);
}color-mod()
[color-mod()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数修改现有颜色的属性(目前浏览器支持有限)。
.element {
color: color-mod(red alpha(50%));
background: color-mod(blue tint(30%));
}渐变函数
linear-gradient()
[linear-gradient()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数创建线性渐变。
.element {
background: linear-gradient(to right, red, blue);
background: linear-gradient(45deg, red, blue, green);
background: linear-gradient(to bottom,
red 0%,
orange 20%,
yellow 40%,
green 60%,
blue 80%,
purple 100%);
}radial-gradient()
[radial-gradient()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数创建径向渐变。
.element {
background: radial-gradient(red, blue);
background: radial-gradient(circle, red, blue);
background: radial-gradient(ellipse at center, red 0%, blue 100%);
}conic-gradient()
[conic-gradient()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数创建圆锥渐变。
.element {
background: conic-gradient(red, yellow, lime, aqua, blue, magenta, red);
background: conic-gradient(from 45deg, red, blue);
}repeating-linear-gradient()
[repeating-linear-gradient()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数创建重复线性渐变。
.element {
background: repeating-linear-gradient(
45deg,
red,
red 10px,
blue 10px,
blue 20px
);
}repeating-radial-gradient()
[repeating-radial-gradient()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数创建重复径向渐变。
.element {
background: repeating-radial-gradient(
circle,
red,
red 10px,
blue 10px,
blue 20px
);
}变换函数
translate()
[translate()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数移动元素。
.element {
transform: translate(50px, 30px);
transform: translateX(50px);
transform: translateY(30px);
}scale()
[scale()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数缩放元素。
.element {
transform: scale(1.5);
transform: scaleX(1.2);
transform: scaleY(0.8);
}rotate()
[rotate()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数旋转元素。
.element {
transform: rotate(45deg);
transform: rotateX(45deg);
transform: rotateY(45deg);
}skew()
[skew()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数倾斜元素。
.element {
transform: skew(30deg);
transform: skewX(30deg);
transform: skewY(15deg);
}形状函数
circle()
[circle()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数创建圆形。
.element {
clip-path: circle(50% at center);
clip-path: circle(100px at 200px 100px);
}ellipse()
[ellipse()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数创建椭圆。
.element {
clip-path: ellipse(25% 40% at center);
}inset()
[inset()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数创建矩形。
.element {
clip-path: inset(20px 30px 10px 40px round 10px);
}polygon()
[polygon()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数创建多边形。
.element {
clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
}网格函数
repeat()
[repeat()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数重复网格轨道。
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(2, 100px);
}minmax()
[minmax()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数定义网格轨道的最小和最大尺寸。
.grid {
display: grid;
grid-template-columns: minmax(200px, 1fr) minmax(300px, 2fr);
}fit-content()
[fit-content()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数将轨道大小调整为内容大小。
.grid {
display: grid;
grid-template-columns: fit-content(200px) 1fr;
}其他有用函数
attr()
[attr()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数获取元素属性值。
a::after {
content: " (" attr(href) ")";
}
.progress::before {
content: attr(data-progress) "%";
}counter()
[counter()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数用于创建计数器。
ol {
counter-reset: list-counter;
}
li {
counter-increment: list-counter;
}
li::before {
content: counter(list-counter) ". ";
}var()
[var()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数使用 CSS 自定义属性。
:root {
--main-color: #3498db;
}
.element {
color: var(--main-color);
background: var(--secondary-color, #eee); /* 带默认值 */
}env()
[env()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 函数获取用户代理定义的环境变量。
.element {
padding-top: env(safe-area-inset-top);
padding-right: env(safe-area-inset-right);
padding-bottom: env(safe-area-inset-bottom);
padding-left: env(safe-area-inset-left);
}实际应用示例
响应式字体大小
.responsive-text {
font-size: clamp(1rem, 2.5vw, 2rem);
}动态渐变背景
.gradient-bg {
background: linear-gradient(
45deg,
hsl(0, 100%, 50%),
hsl(60, 100%, 50%),
hsl(120, 100%, 50%),
hsl(180, 100%, 50%),
hsl(240, 100%, 50%),
hsl(300, 100%, 50%)
);
}自适应网格布局
.auto-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 1rem;
}动态阴影
.dynamic-shadow {
box-shadow: 0 calc(0.5rem * var(--shadow-depth, 1))
calc(1rem * var(--shadow-depth, 1))
rgba(0, 0, 0, 0.1);
}复杂几何形状
.star {
clip-path: polygon(
50% 0%,
61% 35%,
98% 35%,
68% 57%,
79% 91%,
50% 70%,
21% 91%,
32% 57%,
2% 35%,
39% 35%
);
}自定义进度条
.progress-bar {
height: 20px;
background: linear-gradient(
to right,
#4caf50 0%,
#4caf50 calc(100% * var(--progress, 0)),
#e0e0e0 calc(100% * var(--progress, 0)),
#e0e0e0 100%
);
}浏览器兼容性
- [calc()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 在 IE9+ 支持
- [min()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js), [max()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js), [clamp()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 在较新的浏览器中支持
- 颜色函数在现代浏览器中有不同程度的支持
- 渐变函数在 IE10+ 支持
- [var()](file:///Users/jry/Documents/WWW/xyito/lingyun/webstudy/node_modules/.vitepress/cache/deps/vue.js) 在 IE 不支持
最佳实践
- 渐进增强:为不支持某些函数的浏览器提供备选方案
- 性能考虑:避免在动画中使用复杂的函数
- 可读性:在复杂函数中使用换行和缩进提高可读性
- 测试兼容性:在目标浏览器中测试函数支持情况
- 合理使用:不要过度使用函数,保持代码简洁
总结
CSS 函数为样式表提供了强大的功能,使开发者能够创建更动态和复杂的视觉效果。掌握这些函数可以帮助我们编写更灵活、更可维护的 CSS 代码。随着浏览器支持的不断改进,这些函数在现代 Web 开发中变得越来越重要。