不能直接用 display: flex 写通用 mixin,因为需兼容 ie11 等旧浏览器,其 flex 行为不一致且对 absolute 子元素无效;应按「已知宽高」「未知宽高」「绝对定位」三类场景拆分为 center-known、center-unknown、center-flex 三个独立 mixin,并避免硬编码、注重命名与参数灵活性。

为什么不能直接用 display: flex 写通用 mixin?
因为真实项目里常要兼容 IE11 或老版移动端,flex 的 align-items/justify-content 在 IE 中行为不一致,且无法对 position: absolute 子元素生效。通用 mixin 必须覆盖多种定位场景,不能只押一种方案。
center-align mixin 要区分三种定位上下文
水平垂直居中本质是「已知宽高」「未知宽高」「绝对定位子元素」三类问题,混在一起写只会出 bug。推荐拆成三个独立 mixin:
-
@mixin center-known($width, $height):适用于固定尺寸元素,用margin: auto+position: absolute四边设 0 -
@mixin center-unknown:适用于图片、图标等无显式宽高的内容,依赖transform: translate(-50%, -50%)+top: 50%; left: 50% -
@mixin center-flex:仅用于现代浏览器容器,内部用display: flex+align-items/justify-content
别试图用一个参数列表兜住所有情况——$method: flex 这种开关式设计在实际维护中极易漏掉 fallback,反而增加调试成本。
IE11 下 transform 的坑必须手动处理
IE11 对 transform: translate(-50%, -50%) 的解析有偏差,尤其当父容器有 border 或 padding 时,偏移量会错位。解决方案不是加 hack,而是加一层条件判断:
@mixin center-unknown {
position: absolute;
top: 50%;
left: 50%;
@if $legacy-support == true {
// IE11 需要额外修正
margin-left: -16px; // 假设内容平均宽 32px
margin-top: -16px;
} @else {
transform: translate(-50%, -50%);
}
}
更稳妥的做法是把 $legacy-support 设为全局变量,在构建时根据目标浏览器决定是否启用修正值,而不是靠运行时检测。
不要在 mixin 里硬编码单位或像素值
常见错误是写 margin-top: -20px 或 width: 200px ——这会让 mixin 失去复用价值。正确做法是全部接收参数:
- 宽高用
$w: auto、$h: auto,允许传em、rem、% - 偏移量用
$offset-x: 50%、$offset-y: 50%,而非固定像素 - 如果要支持 CSS 自定义属性(比如主题色居中提示框),就在 mixin 里用
var(--center-offset-x, 50%)
真正难的不是写出能跑的代码,而是让别人接手时不用翻文档就能猜出每个参数干啥——命名比逻辑更重要。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











