@规则:其他

CSS @规则是以 @ 符号开头的语句,后跟标识符。语句结束条件:遇到分号 ; 或者 CSS 代码块 {},以先到者为准。

其他 @规则:

  • @charset:设置样式表字符编码;
  • @import:导入外部样式表;
  • @namespace:处理 XML、SVG 命名空间;
  • @supports:浏览器 CSS 特性检测(特征查询);
  • @layer:层叠层,控制 CSS 层叠优先级;
  • @page:打印分页布局设置。

@charset

@charset 规定 CSS 样式表文件的字符编码。

语法约束

  • 必须放在样式表最开头,前面不能有任何字符、空格、注释;
  • 不能嵌套在其他 @规则条件块内部;
  • 多张 @charset 声明,仅第一个生效;
  • 不能写在 HTML 的 <style> 标签内。

浏览器编码判定优先级(从上往下匹配,命中即停止):

  • 文件 Unicode BOM 字节标记;
  • HTTP 响应头 Content-Type 的 charset;
  • CSS @charset 规则;
  • HTML <link> 的 charset 属性(HTML5 已废弃);
  • 默认回退:UTF-8

必须使用双引号@charset 和字符串之间仅允许一个空格,末尾分号:

/* 合法,大小写不敏感 */
@charset "UTF-8";
@charset "utf-8";

/* 非法示例 */
@charset 'UTF-8';   /* 单引号不允许 */
@charset  "UTF-8";  /* 多于一个空格 */
 @charset "UTF-8";  /* 开头存在空格 */
@charset UTF-8;     /* 缺少引号 */

@import

用于导入外部 CSS 样式表。

语法约束

  • 位置:必须写在所有样式、其他 @规则之前,仅允许在 @charset 之后;如果使用 @layer,@import 也可以写在层定义内部
  • 不能嵌套在 @media@supports 等条件规则块内部
  • 支持附加媒体查询条件,做条件导入;
  • 性能提示:@import 会阻塞样式解析,生产环境优先使用构建工具合并 CSS,不建议大量使用。
@import url;
@import url 媒体查询列表;
@import url supports(特征查询);
@import url supports(特征查询) 媒体查询列表;
@import "common.css";
@import url("print.css") print;
@import url("speech.css") speech;
@import url("landscape.css") screen and (orientation: landscape);

@namespace

为样式表定义 XML 命名空间;主要用于 HTML 内联 SVG、MathML、XML 文档,限定选择器只匹配指定命名空间下的元素。

语法约束:书写顺序 @charset@import@namespace → 其余样式与 @规则。

HTML5 自动分配命名空间:

  • HTML 元素:默认 XHTML 命名空间 http://www.w3.org/1999/xhtml
  • SVG:http://www.w3.org/2000/svg
  • MathML:http://www.w3.org/1998/Math/MathML
/* 默认命名空间 */
@namespace url(XML-namespace-URL);

/* 带前缀命名空间 */
@namespace 前缀名 url(XML-namespace-URL);
@namespace url(http://www.w3.org/1999/xhtml);
@namespace svg url(http://www.w3.org/2000/svg);

/* 匹配 XHTML 的 <a> */
a {}

/* 匹配 SVG 内部的 <a> */
svg|a {}

/* 匹配任意命名空间下的 <a> */
*|a {}

@supports

检测浏览器是否支持某项 CSS 语法/特性,条件成立则块内样式生效;支持写在顶层,也可以嵌套在其他条件 @规则内部。

语法:表达式放在圆括号内;支持逻辑运算符 notandor;支持 selector() 检测选择器兼容性。

@supports (transform-origin: 5% 5%) {}
@supports not (transform-origin: 10em 10em 10em) {}
@supports (display: grid) and (gap: 10px) {}
@supports (transform) or (-webkit-transform) {}
@supports selector(:is(.a, .b)) {}

JS 中做同样的特性检测,返回布尔值(IE11及以下不支持):

CSS.supports("display", "grid");
CSS.supports("(display: grid)");
CSS.supports("(--my-var: #fff)");

@layer

@layer 用于定义层叠层(cascade layer),用来控制 CSS 层叠优先级,解决样式覆盖冲突。

层优先级规则后定义的层 > 先定义的层;未归入任何层的样式,优先级高于所有命名层

声明层名称(预定义层顺序):

/* 预先定义层顺序,优先级:base < components < utils */
@layer base, components, utils;

直接在层内写样式:

@layer base {}
@layer components {}
@layer utils {}

@import 导入样式到指定层:

@import url("./base.css") layer(base);

@layer 嵌套层:@layer A { @layer B {} } 会生成嵌套层全名 A.B,也可以外部直接使用点语法 @layer A.B {} 追加样式。

嵌套层普通样式(无 !important)

  • 在同一个父层内部:父层直接书写的样式 > 父层内所有嵌套子层;
  • 同级嵌套子层之间:后定义子层 > 先定义子层;
  • 所有嵌套子层,仍然属于命名层,优先级低于全局未分层普通样式。

嵌套层样式带 !important

  • 同级嵌套子层之间:优先级反转,先定义子层 !important > 后定义子层 !important
  • 父层直接写的 !important > 内部子层 !important
  • 嵌套子层的 !important 依旧属于层内 !important,整体优先级高于全局未分层 !important
@layer components {
    @layer button {}
}

注意:层之间比较时,!important 层顺序颠倒:先定义层的 !important > 后定义层的 !important

注意:所有层内 !important 声明,优先级高于层外(未分层)!important 声明;层外普通声明,优先级高于层内普通声明。

@page

用于打印场景,修改打印页面布局;仅少数属性可用marginsizemarksbleed,其余属性全部忽略。

@page 四个描述符:

  • margin:打印页面的页边距,控制页面内容区域距离纸张四边的空白;支持简写、分四边设置,单位常用 mmcmin,不支持百分比。
  • size:设置纸张尺寸与方向,可以用标准纸张关键字,也可以写自定义宽高;支持 portrait(纵向,默认)、landscape(横向)。
  • marks:印刷标记,在页面盒子外部绘制印刷辅助线;仅用于印刷出 PDF,普通办公打印一般用 none
    • crop裁切标记,页面四角短线,标记纸张实际裁切位置。
    • cross套准十字标记,多色印刷用来对齐各色版。
  • bleed:出血位,定义页面盒子向外延伸多少毫米。印刷时背景、图片超出裁切线,防止裁切后边缘出现白边。
@page {
  size: A4 landscape;
  margin: 15mm;
  marks: crop cross;
  bleed: 3mm;
}

支持 @page 伪类:

  • :first:文档打印第一页;
  • :left:打印所有左侧页面;
  • :right:打印所有右侧页面;
  • :blank:空白页;
@page :first {
  margin: 2cm;
}

参考资料

MDN CSS @规则

MDN @charset

MDN @import

MDN @supports

© lizhao all right reserved,powered by Gitbook文件修订时间: 2026-08-20 21:42:37

results matching ""

    No results matching ""