import 指令
@import 是 CSS 中的核心指令,用于从外部导入 CSS 样式表到当前样式表中,实现样式的模块化管理;
它本质上是将外部 CSS 文件的内容 “嵌入” 到当前文件的 @import 声明位置,最终合并为一个完整的样式规则集;
import 基本用法
-
核心格式:
/* 基础语法:导入外部 CSS 文件 */ @import url("路径/文件名.css"); /* 可选:指定媒体查询(仅在匹配条件时加载) */ @import url("print.css") print; @import url("mobile.css") screen and (max-width: 768px); /* 简写:省略 url() (仅文件名/路径) */ @import "style.css"; /* 字符编码声明(极少用,现代浏览器默认 UTF-8) */ @import url("style.css") layer(base) supports(display: flex); -
语法规则:
- 必须以分号结尾:@import 是 CSS 语句,末尾必须加 ;,否则解析失败;
- 路径规则:
- 相对路径:相对于当前 CSS 文件 (而非 HTML 文件),如 ./css/reset.css、…/style.css;
- 绝对路径:如 https://cdn.example.com/style.css;
- 媒体查询可选:可附加媒体类型 (screen/print/all) 或媒体特性 (max-width/orientation),仅当媒体条件匹配时,浏览器才会加载并应用该样式表;
使用位置限制
-
@import 必须放在样式表的最顶部 (仅允许在 @charset 之后、其他所有 CSS 规则之前),否则会被浏览器忽略;
-
错误示例(无效):
/* 错误:@import 出现在选择器之后 */ body { margin: 0; } @import "style.css"; /* 浏览器会忽略此声明 */ -
正确示例:
@charset "UTF-8"; /* 可选,必须在最前 */ @import "reset.css"; /* 正确:在所有规则之前 */ @import "mobile.css" screen and (max-width: 768px); /* 其他 CSS 规则 */ body { font-size: 16px; }
关键特性
-
串行加载加载机制:浏览器解析到 @import 时,会暂停当前 CSS 文件的解析,先下载并解析导入的外部文件,再继续解析当前文件 (可能导致渲染阻塞);
特性 @import <link rel=“stylesheet”> 加载时机 串行加载 (阻塞当前 CSS 解析) 并行加载 (不阻塞 HTML 解析) 兼容性 IE5+ 支持 IE4+ 支持 动态加载 无法通过 JS 动态修改 (需重建样式表) 可通过 JS 动态创建 <link> 标签 媒体查询 支持 (语法内嵌) 支持 (media 属性) CSSOM 访问 导入的样式融入当前样式表,无独立节点 每个 <link> 对应独立的 CSSOM 节点 -
嵌套导入:@import 支持嵌套:即被导入的 CSS 文件中可以再次使用 @import 导入其他文件,但嵌套层级过深会导致:
- 加载性能下降 (多层串行下载);
- 调试难度增加 (样式来源追溯复杂);
-
优先级规则:导入的样式表优先级遵循 「后声明覆盖先声明」 + 「选择器特异性」 规则:
- 若当前样式表与导入的样式表有相同选择器,后出现的规则覆盖先出现的;
- 选择器特异性更高的规则优先 (如 #id > .class > 标签选择器);
-
兼容性
- 基本语法:所有现代浏览器 + IE5+ 支持;
- 媒体查询结合:IE9+ 支持,IE8 及以下忽略媒体条件,直接加载;
- CSS 层叠 (layer) 结合:仅现代浏览器 (Chrome 99+、Firefox 97+) 支持;
高级用法
-
媒体查询条件导入:按需加载不同设备 / 场景的样式,减少无用样式加载:
/* 仅打印时加载打印样式 */ @import "print.css" print; /* 仅移动端(宽度≤768px)加载移动端样式 */ @import "mobile.css" screen and (max-width: 768px); /* 仅支持 flex 布局的浏览器加载 */ @import "flex.css" supports(display: flex); -
CSS 层叠 (@layer) 结合:导入样式到指定层,明确优先级 (层内规则不影响层外):
/* 定义层顺序:base < component < override */ @layer base, component, override; /* 导入样式到 base 层 */ @import "base.css" layer(base); /* 导入样式到 component 层 */ @import "component.css" layer(component);
使用建议 & 注意事项
-
不推荐场景
- 高性能要求的项目:@import 串行加载易导致首屏渲染延迟,建议用 <link> 并行加载;
- 大量嵌套导入:层级超过 2-3 层时,加载性能和可维护性大幅下降;
- 动态样式切换:无法通过 JS 直接修改 @import,需替换整个样式表,不如 <link> 灵活;
-
推荐场景
- 小型项目 / 模块化管理:如通用 reset 样式、公共组件样式,简化代码结构;
- 按需加载小众样式:如打印样式、低优先级的兼容样式;
- CSS 预处理器配合:在 Less/Sass 中用 @import 导入变量 / 混合 (预处理器会编译为单个 CSS 文件,避免浏览器串行加载);
-
优化技巧
- 避免嵌套 @import,尽量扁平化导入;
- 结合构建工具 (Webpack/Vite) 将多个 CSS 文件打包为一个,消除 @import 的加载性能问题;
- 对关键样式 (如首屏样式) 直接内联到 HTML,非关键样式用 <link rel=“preload”> 预加载;
CSS3 中的 calc 函数
calc() 是 CSS3 新增的计算函数,用于动态计算长度、百分比、角度、时间等 CSS 值,支持加减乘除四则运算,能解决静态数值无法适配灵活布局的问题 (如响应式、动态容器尺寸);
核心特性
-
支持的单位:可混合不同单位 (如 px/%/em/rem/vw/vh 等),但除法分母必须是纯数字,乘法至少一个操作数是纯数字;
-
运算规则:
- 加减运算:操作数与运算符之间必须加空格 (如 100% - 20px,而非 100%-20px);
- 乘除运算:空格可选,但建议统一加空格以保持规范;
- 优先级:支持括号 () 提升运算优先级 (如 calc((100vw - 80px) / 2));
-
兼容性:所有现代浏览器 (Chrome/Firefox/Safari/Edge) 均支持,IE9+ 也兼容 (无需前缀);
常用场景示例
-
自适应容器宽度 / 高度:解决 “容器宽度为父容器 100% 减去固定边距” 的经典场景:
/* 容器宽度 = 父容器100% - 左右各20px边距 */ .box { width: calc(100% - 40px); margin: 0 20px; height: calc(50vh - 50px); /* 高度 = 视口50% - 50px */ } -
等分布局 (无需 Flex/Grid):将容器分为 3 列,每列间距 10px:
.column { float: left; width: calc((100% - 20px) / 3); /* 2个间距,总间距20px */ margin-right: 10px; } .column:last-child { margin-right: 0; /* 最后一列取消右边距 */ } -
字体大小适配:混合 rem 和 px 动态调整字体:
.text { font-size: calc(1rem + 2px); /* 基础1rem + 固定2px */ } /* 响应式调整 */ @media (min-width: 768px) { .text { font-size: calc(1.2rem + 4px); } } -
定位偏移:动态计算绝对定位的偏移量:
.modal { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: calc(80vw - 60px); height: calc(60vh - 40px); } -
嵌套计算:复杂场景可嵌套 calc() (外层括号可省略,建议保留以提升可读性):
.box { width: calc(calc(100% / 4) - calc(15px * 2)); /* 简化写法:calc(100% / 4 - 30px) */ }
注意事项
-
空格要求:+、- 两侧必须有空格 (如 calc(100px + 20%) 正确,calc(100px+20%) 错误);*、/ 无强制空格,但建议统一风格;
-
除法限制:分母不能为 0,且必须是纯数字 (如 calc(100px / 2) 合法,calc(100px / 2px) 非法);
-
负值处理:支持负值 (如 calc(-10px)),但需注意运算符空格 (calc(100% - -20px) 正确);
-
变量结合:可与 CSS 变量配合,提升灵活性:
:root { --gap: 20px; --columns: 3; } .grid-item { width: calc((100% - (var(--columns) - 1) * var(--gap)) / var(--columns)); margin-right: var(--gap); }
clip-path
clip-path 是 CSS 中用于裁剪元素可视区域的属性,通过定义裁剪路径 (路径内的区域可见,路径外的区域隐藏),实现灵活的形状裁剪,替代了传统的 clip 属性 (仅支持矩形且已废弃);
它支持多种裁剪方式,包括基本形状、SVG 路径、几何盒模型等,是实现非矩形布局 / 动效的核心工具;
核心概念
-
裁剪区域:由 clip-path 的值定义的封闭路径 / 形状,仅该区域内的元素内容可见;
-
坐标系统:默认以元素的左上角为原点 (0,0),X 轴向右,Y 轴向下;单位支持 px、%、em、rem 等 (百分比相对元素自身的宽 / 高);
-
兼容性:现代浏览器 (Chrome、Firefox、Safari 12+、Edge) 均支持,IE 完全不支持;对 SVG 路径的支持需注意浏览器细节;
语法格式
/*
<clip-source> 引用 SVG 裁剪路径(如 url(#clipPathId))
<basic-shape> 基础形状函数(核心),如 circle()、polygon()、inset() 等
<geometry-box> 配合基础形状使用,定义裁剪的参考盒模型(如 border-box、padding-box)
*/
clip-path: <clip-source> | <basic-shape> | <geometry-box> | none;
形状函数
-
inset():矩形 / 圆角矩形裁剪inset( <top> <right> <bottom> <left> round <top-radius> <right-radius> <bottom-radius> <left-radius> )/* 裁剪出内部 20px 边距的矩形 */ .clip-inset { clip-path: inset(20px); } /* 裁剪出上下 10px、左右 20px 边距,且圆角 15px 的矩形 */ .clip-inset-radius { clip-path: inset(10px 20px round 15px); } /* 百分比单位(相对元素宽高) */ .clip-inset-percent { clip-path: inset(10% 5% 15% 5% round 5%); } -
circle():圆形裁剪/** <radius>:圆的半径,支持 length/%/closest-side(默认,取圆心到元素最近边的距离)/farthest-side(取圆心到最远边的距离) <position>:圆心位置,默认 center(等价于 50% 50%),规则同 background-position(如 top right、30px 50px) */ circle( <radius> at <position> )/* 居中的圆,半径为元素最短边的一半(默认) */ .clip-circle { clip-path: circle(); } /* 半径 80px,圆心在元素右下角 */ .clip-circle-custom { clip-path: circle(80px at right bottom); } /* 半径为元素宽度的 30%,圆心在水平 20%、垂直 50% 处 */ .clip-circle-percent { clip-path: circle(30% at 20% 50%); } -
ellipse():椭圆裁剪/** <x-radius>/<y-radius>:椭圆的水平 / 垂直半径,支持 length/%/closest-side/farthest-side <position>:椭圆中心位置,默认 center */ ellipse( <x-radius> <y-radius> at <position> )/* 居中椭圆,水平半径 100px,垂直半径 60px */ .clip-ellipse { clip-path: ellipse(100px 60px at center); } /* 水平半径 40%,垂直半径 20%,中心在 (80%, 30%) */ .clip-ellipse-percent { clip-path: ellipse(40% 20% at 80% 30%); } -
polygon():多边形裁剪 (最灵活)/** <fill-rule>:填充规则(可选),nonzero(默认)或 evenodd(影响复杂多边形的填充) 坐标点:至少 3 个,用逗号分隔,支持 length/% */ polygon( <fill-rule>? , [ <x1> <y1>, <x2> <y2>, ... ] )/* 三角形(上顶点居中,下左右顶点在边角) */ .clip-triangle { clip-path: polygon(50% 0%, 0% 100%, 100% 100%); } /* 五角星(经典坐标) */ .clip-star { clip-path: polygon( 50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35% ); } /* 菱形(基于百分比) */ .clip-diamond { clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%); } -
path():SVG 路径裁剪 (进阶),兼容性略差 (Safari 13.1+ 支持)/** <string>:SVG 路径指令(如 M 移动、L 画线、C 贝塞尔曲线等) */ path( <fill-rule>? , <string> )/* 心形路径 */ .clip-path-heart { clip-path: path('M100,20 C120,0 180,0 200,20 C220,40 200,70 200,100 C200,130 160,160 100,200 C40,160 0,130 0,100 C0,70 -20,40 0,20 C20,0 80,0 100,20 Z'); } -
SVG 裁剪路径(<clip-source>):通过 SVG 的标签定义裁剪形状,再通过 url() 引用,适合极复杂的形状 (如曲线、不规则图形) <!-- SVG 定义裁剪路径 --> <svg width="0" height="0" viewBox="0 0 200 200"> <clipPath id="clip-svg-heart"> <path d="M100,20 C120,0 180,0 200,20 C220,40 200,70 200,100 C200,130 160,160 100,200 C40,160 0,130 0,100 C0,70 -20,40 0,20 C20,0 80,0 100,20 Z" /> </clipPath> </svg> <!-- 被裁剪的元素 --> <div class="clip-svg">Hello SVG ClipPath</div> <style> .clip-svg { width: 200px; height: 200px; background: red; clip-path: url(#clip-svg-heart); /* 引用 SVG 裁剪路径 */ } </style> -
geometry-box:裁剪参考盒模型值 参考范围 border-box 边框盒(默认),包含边框 padding-box 内边距盒,不含边框 content-box 内容盒,仅内容区域 margin-box 外边距盒(部分浏览器支持) /* 圆形基于内边距盒计算,而非默认的边框盒 */ .clip-box { width: 200px; height: 200px; padding: 20px; border: 10px solid #000; clip-path: circle(50%) padding-box; }
clip-path 案例
CSS 高级✍️ CSS 属性的计算过程、层叠规则、继承规则
上一篇