import 指令

  1. @importCSS 中的核心指令,用于从外部导入 CSS 样式表到当前样式表中,实现样式的模块化管理;

  2. 它本质上是将外部 CSS 文件的内容 “嵌入” 到当前文件的 @import 声明位置,最终合并为一个完整的样式规则集;

import 基本用法

  1. 核心格式:

    /* 基础语法:导入外部 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);
    
  2. 语法规则:

    1. 必须以分号结尾:@importCSS 语句,末尾必须加 ;,否则解析失败;
    2. 路径规则:
      1. 相对路径:相对于当前 CSS 文件 (而非 HTML 文件),如 ./css/reset.css…/style.css
      2. 绝对路径:如 https://cdn.example.com/style.css
    3. 媒体查询可选:可附加媒体类型 (screen/print/all) 或媒体特性 (max-width/orientation),仅当媒体条件匹配时,浏览器才会加载并应用该样式表;

使用位置限制

  1. @import 必须放在样式表的最顶部 (仅允许在 @charset 之后、其他所有 CSS 规则之前),否则会被浏览器忽略;

  2. 错误示例(无效):

    /* 错误:@import 出现在选择器之后 */
    body { margin: 0; }
    @import "style.css"; /* 浏览器会忽略此声明 */
    
  3. 正确示例:

    @charset "UTF-8"; /* 可选,必须在最前 */
    @import "reset.css"; /* 正确:在所有规则之前 */
    @import "mobile.css" screen and (max-width: 768px);
    
    /* 其他 CSS 规则 */
    body { font-size: 16px; }
    

关键特性

  1. 串行加载加载机制:浏览器解析到 @import 时,会暂停当前 CSS 文件的解析,先下载并解析导入的外部文件,再继续解析当前文件 (可能导致渲染阻塞)

    特性 @import <link rel=“stylesheet”>
    加载时机 串行加载 (阻塞当前 CSS 解析) 并行加载 (不阻塞 HTML 解析)
    兼容性 IE5+ 支持 IE4+ 支持
    动态加载 无法通过 JS 动态修改 (需重建样式表) 可通过 JS 动态创建 <link> 标签
    媒体查询 支持 (语法内嵌) 支持 (media 属性)
    CSSOM 访问 导入的样式融入当前样式表,无独立节点 每个 <link> 对应独立的 CSSOM 节点
  2. 嵌套导入:@import 支持嵌套:即被导入的 CSS 文件中可以再次使用 @import 导入其他文件,但嵌套层级过深会导致:

    1. 加载性能下降 (多层串行下载)
    2. 调试难度增加 (样式来源追溯复杂)
  3. 优先级规则:导入的样式表优先级遵循 「后声明覆盖先声明」 + 「选择器特异性」 规则:

    1. 若当前样式表与导入的样式表有相同选择器,后出现的规则覆盖先出现的;
    2. 选择器特异性更高的规则优先 (如 #id > .class > 标签选择器)
  4. 兼容性

    1. 基本语法:所有现代浏览器 + IE5+ 支持;
    2. 媒体查询结合:IE9+ 支持,IE8 及以下忽略媒体条件,直接加载;
    3. CSS 层叠 (layer) 结合:仅现代浏览器 (Chrome 99+、Firefox 97+) 支持;

高级用法

  1. 媒体查询条件导入:按需加载不同设备 / 场景的样式,减少无用样式加载:

    /* 仅打印时加载打印样式 */
    @import "print.css" print;
    
    /* 仅移动端(宽度≤768px)加载移动端样式 */
    @import "mobile.css" screen and (max-width: 768px);
    
    /* 仅支持 flex 布局的浏览器加载 */
    @import "flex.css" supports(display: flex);
    
  2. CSS 层叠 (@layer) 结合:导入样式到指定层,明确优先级 (层内规则不影响层外)

    /* 定义层顺序:base < component < override */
    @layer base, component, override;
    
    /* 导入样式到 base 层 */
    @import "base.css" layer(base);
    /* 导入样式到 component 层 */
    @import "component.css" layer(component);
    

使用建议 & 注意事项

  1. 不推荐场景

    1. 高性能要求的项目:@import 串行加载易导致首屏渲染延迟,建议用 <link> 并行加载;
    2. 大量嵌套导入:层级超过 2-3 层时,加载性能和可维护性大幅下降;
    3. 动态样式切换:无法通过 JS 直接修改 @import,需替换整个样式表,不如 <link> 灵活;
  2. 推荐场景

    1. 小型项目 / 模块化管理:如通用 reset 样式、公共组件样式,简化代码结构;
    2. 按需加载小众样式:如打印样式、低优先级的兼容样式;
    3. CSS 预处理器配合:在 Less/Sass 中用 @import 导入变量 / 混合 (预处理器会编译为单个 CSS 文件,避免浏览器串行加载)
  3. 优化技巧

    1. 避免嵌套 @import,尽量扁平化导入;
    2. 结合构建工具 (Webpack/Vite) 将多个 CSS 文件打包为一个,消除 @import 的加载性能问题;
    3. 对关键样式 (如首屏样式) 直接内联到 HTML,非关键样式用 <link rel=“preload”> 预加载;

CSS3 中的 calc 函数

  1. calc()CSS3 新增的计算函数,用于动态计算长度、百分比、角度、时间等 CSS 值,支持加减乘除四则运算,能解决静态数值无法适配灵活布局的问题 (如响应式、动态容器尺寸)

核心特性

  1. 支持的单位:可混合不同单位 (如 px/%/em/rem/vw/vh 等),但除法分母必须是纯数字,乘法至少一个操作数是纯数字;

  2. 运算规则:

    1. 加减运算:操作数与运算符之间必须加空格 (如 100% - 20px,而非 100%-20px)
    2. 乘除运算:空格可选,但建议统一加空格以保持规范;
    3. 优先级:支持括号 () 提升运算优先级 (如 calc((100vw - 80px) / 2))
  3. 兼容性:所有现代浏览器 (Chrome/Firefox/Safari/Edge) 均支持,IE9+ 也兼容 (无需前缀)

常用场景示例

  1. 自适应容器宽度 / 高度:解决 “容器宽度为父容器 100% 减去固定边距” 的经典场景:

    /* 容器宽度 = 父容器100% - 左右各20px边距 */
    .box {
      width: calc(100% - 40px);
      margin: 0 20px;
      height: calc(50vh - 50px); /* 高度 = 视口50% - 50px */
    }
    
  2. 等分布局 (无需 Flex/Grid):将容器分为 3 列,每列间距 10px

    .column {
      float: left;
      width: calc((100% - 20px) / 3); /* 2个间距,总间距20px */
      margin-right: 10px;
    }
    
    .column:last-child {
      margin-right: 0; /* 最后一列取消右边距 */
    }
    
  3. 字体大小适配:混合 rempx 动态调整字体:

    .text {
      font-size: calc(1rem + 2px); /* 基础1rem + 固定2px */
    }
    
    /* 响应式调整 */
    @media (min-width: 768px) {
      .text {
        font-size: calc(1.2rem + 4px);
      }
    }
    
  4. 定位偏移:动态计算绝对定位的偏移量:

    .modal {
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      width: calc(80vw - 60px);
      height: calc(60vh - 40px);
    }
    
  5. 嵌套计算:复杂场景可嵌套 calc() (外层括号可省略,建议保留以提升可读性)

    .box {
      width: calc(calc(100% / 4) - calc(15px * 2));
      /* 简化写法:calc(100% / 4 - 30px) */
    }
    

注意事项

  1. 空格要求:+- 两侧必须有空格 (如 calc(100px + 20%) 正确,calc(100px+20%) 错误)*/ 无强制空格,但建议统一风格;

  2. 除法限制:分母不能为 0,且必须是纯数字 (如 calc(100px / 2) 合法,calc(100px / 2px) 非法)

  3. 负值处理:支持负值 (如 calc(-10px)),但需注意运算符空格 (calc(100% - -20px) 正确)

  4. 变量结合:可与 CSS 变量配合,提升灵活性:

    :root {
      --gap: 20px;
      --columns: 3;
    }
    .grid-item {
      width: calc((100% - (var(--columns) - 1) * var(--gap)) / var(--columns));
      margin-right: var(--gap);
    }
    

clip-path

  1. clip-pathCSS 中用于裁剪元素可视区域的属性,通过定义裁剪路径 (路径内的区域可见,路径外的区域隐藏),实现灵活的形状裁剪,替代了传统的 clip 属性 (仅支持矩形且已废弃)

  2. 它支持多种裁剪方式,包括基本形状、SVG 路径、几何盒模型等,是实现非矩形布局 / 动效的核心工具;

核心概念

  1. 裁剪区域:由 clip-path 的值定义的封闭路径 / 形状,仅该区域内的元素内容可见;

  2. 坐标系统:默认以元素的左上角为原点 (0,0)X 轴向右,Y 轴向下;单位支持 px%emrem(百分比相对元素自身的宽 / 高)

  3. 兼容性:现代浏览器 (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;

形状函数

  1. 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%);
    }
    
  2. 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%);
    }
    
  3. 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%);
    }
    
  4. 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%);
    }
    
  5. 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');
    }
    
  6. 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>
    
  7. 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 案例

打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

你好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. import 指令
    1. 1.1. import 基本用法
    2. 1.2. 使用位置限制
    3. 1.3. 关键特性
    4. 1.4. 高级用法
    5. 1.5. 使用建议 & 注意事项
  2. 2. CSS3 中的 calc 函数
    1. 2.1. 核心特性
    2. 2.2. 常用场景示例
    3. 2.3. 注意事项
  3. 3. clip-path
    1. 3.1. 核心概念
    2. 3.2. 语法格式
    3. 3.3. 形状函数
    4. 3.4. clip-path 案例