Skip to main content

10 posts tagged with "CSS"

View All Tags
· 5 min read

核心观点:CSS 级联按"属性"算胜负,不是按"类名"合并。

  1. 裁决顺序:specificity → layer → 源码顺序,最后登场者赢
  2. 冲突点:同一属性只能保留一个值,类名再多也是同一个声明位
  3. 典型坑:layout.css 后加载的 .flex-col 会把 utils.css 的 .lg:flex-row 改回去
  4. 回答"flex-col flex 能不能拆开":不能,CSS 不按类名分摊属性
  5. 推论:抢不同属性时互不干扰,按 reset/utilities/components 拆文件完全可行
  6. 排查路径:DevTools → Computed → 看属性右边列出哪些规则在抢
· 5 min read

微前端样式隔离的本质是"作用域隔离"——子应用样式限定在自己容器内,不污染全局。

  1. 三种策略:默认不隔离、容器作用域隔离、Shadow DOM 强隔离
  2. 工程首选容器作用域,运行时或构建时给规则前置容器 ID
  3. 核心做法:拦截样式表,自动加 #subapp .btn { ... }
  4. 构建方案:PostCSS 插件打包阶段前置,零运行时开销
  5. 根级陷阱html/body/:root 不能前置,否则全局 reset 失效
  6. Shadow DOM 代价:Ant Design / Arco 的 Portal 会被拦截,组件渲染错位
  7. Portal 应对:选库时确认 Modal/Drawer 支持自定义挂载点
  8. 结论:绝大多数项目走容器作用域,Shadow DOM 留给零污染少数场景
· 4 min read

CSS @layer 用声明式层级替代了特异性战争——无需 !important 也能精确控级。

  1. 机制先声明的层优先级最低,顺序决定一切
  2. 核心:layer 优先于特异性,子选择器也能覆盖上层
  3. 反转!important 反转层级,重要样式反而走底层
  4. 嵌套:子层用 . 访问,写成 @layer base.forms { }
  5. 场景框架 reset + 业务定制分层
  6. 兼容:2023 起所有现代浏览器原生支持
· 7 min read

Tailwind v3 的三条 @tailwind 指令对应 三个不同职责,不是同级概念。

  1. @tailwind base:Preflight 重置,抹平浏览器默认
  2. @tailwind components:复合组件类(.btn),中间层
  3. @tailwind utilities:原子类,按需生成,最后输出
  4. 级联顺序:base → components → utilities,后写的赢
  5. v4 变化:三条合并成 @import "tailwindcss",components 删

原则:重置写 base,复合组件写 components,原子类写 utilities。

· 5 min read

Tailwind v4 重新设计 CSS 入口,几条新指令各司其职,不再像 v3 那样靠 @tailwind 堆叠。

  1. @import "tailwindcss":替代 v3 的三条 @tailwind,整合 base + utilities
  2. @theme:设计 token 入口,颜色字号间距都在这定义
  3. @utility:自定义工具类,替代 v3 的 @layer 写法
  4. @variant:自定义变体(hover / focus / ...),替代 v3 的 JS 配置
  5. 级联顺序:v4 只剩 base → utilities 两层

核心:@theme 把设计 token 从 JS 搬到 CSS,样式与变量同源。

· 3 min read

Tailwind 是构建时按需生成 CSS 的工具,不是预制类库。 这是它和 Bootstrap、iconfont 这类传统 class 库最本质的区别。

  • 本质区别:Bootstrap 是运行时可用的预制 CSS,Tailwind 是构建时扫源码生成
  • 类何时存在:Bootstrap 加载即用,Tailwind 必须被构建器扫到源码才生成
  • 体积策略:Bootstrap 固定(库大小决定),Tailwind 动态(你用多少决定)
  • 跨包坑点:monorepo 子包构建器只扫自己源码,看不到别的包用到的 class
  • 配置关键:tailwind.config.jscontent 必须覆盖到所有源码路径
· 6 min read

input:checked 改成父元素边框高亮、img 存在时父容器切两栏布局、表单校验状态动态联动——以前这些都需要 JS 去监听子元素状态再回头改父元素。:has() 的出现,把"子元素状态驱动父元素样式"这件事直接搬进了 CSS。

  1. 核心能力:has() 是名副其实的父选择器,根据子元素/后代/兄弟的状态反向匹配父元素或前面的兄弟。
  2. 浏览器覆盖:Chrome 105+、Safari 15.4+、Firefox 121+ 已全部支持,2024 年底起可以在生产环境放心用。
  3. 性能真相:锚定到具体类(.card:has(img))的开销是微秒级;只有 div:has(...) 这种宽泛选择器 + 频繁 DOM 变更时才是问题。
  4. 能用 CSS 就别用 JS:表单校验态切换、空状态检测、数量查询这些场景,:has() 替代 JS 后代码量减半、不会漏同步。

性能提醒:has() 选择器锚定越具体越好,避免 body:has()*:has() 这种全局监听。

· 3 min read

Preflight 是 Tailwind CSS 内置的「基础样式重置/规范化」工具,基于 modern-normalize,抹平浏览器默认样式差异,统一基线,让你只用工具类就能一致地控制布局与外观。

核心做了 5 件事:

  1. 全局 box-sizing:所有元素默认 border-box,保证 padding/border 不会撑宽元素

  2. 清空默认边距:清除 h1~h6、p、ul、blockquote 等默认 margin/padding,避免意外留白

  3. 语义化但无外观:标题不再自带大小/加粗,列表去掉项目符号,只保留语义

  4. 媒体默认 block:img、svg、video、canvas 默认 display: block,避免底部空白间隙

  5. 表单元素统一:修复 Safari 等浏览器的控件样式差异,继承字体

注入到 base 层,优先级低于 components/utilities,完全不影响你写的样式。
· 6 min read

Flexbox 是 容器定方向,子项定大小 两套属性加起来 12 个的事。

  1. 启动display: flex 一行,元素变弹性容器
  2. 容器 6 属性:flex-direction / flex-wrap / justify-content / align-items / align-content / gap
  3. 子项 6 属性:flex-grow / flex-shrink / flex-basis / flex / order / align-self
  4. 核心思路:先想主轴(默认水平),再选对齐方式
  5. 现代选择gap 替代 margin 间距
  6. 常见坑主轴 / 交叉轴搞反,90% 的 flex bug 都是这个
  7. 默认行为grow=0 / shrink=1不抢必缩