假设父元素具有 position: relative;
,这四个属性将水平和垂直地将子元素居中,无论两者的大小如何。
@mixin centerer {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.parent {
position: relative;
}
.child {
@include centerer;
}
查看 CodePen 上 Chris Coyier 的 Centerer Mixin。(@chriscoyier)
但是请注意,如果要居中的子元素比父元素高,顶部可能会被切掉。
更复杂
如果你想只在一个方向上居中…
@mixin centerer($horizontal: true, $vertical: true) {
position: absolute;
@if ($horizontal and $vertical) {
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
} @else if ($horizontal) {
left: 50%;
transform: translate(-50%, 0);
} @else if ($vertical) {
top: 50%;
transform: translate(0, -50%);
}
}
查看 CodePen 上 Chris Coyier 的 yybgZd。(@chriscoyier)
你对在父元素上使用 display: table; 以及在子元素上使用 display: table-cell; 以及 vertical-align 等来实现类似效果有什么想法吗?
我经常使用这种技术,但它让我感觉有点肮脏。看看另一种意见会很好。
使用 mixin 而不是占位符选择器是否有任何具体原因,还是仅仅取决于个人喜好?
感谢你,Chris。提醒一下,更复杂版本中缺少 $vertical 的 %,因此在示例中没有正确居中。
感谢你提供 mixin。我稍微修改了一下,使其居中到右下方。我刚开始使用 sass,所以我想知道是否有更简洁的方法来做到这一点。
http://codepen.io/ilokano/pen/mJxJPL
不错的 mixin!
但是,else if 部分有一个拼写错误。
你忘了 %。应该是 translate(0, -50%);
干杯!
CSS transform 需要为完全的浏览器支持添加前缀。
http://shouldiprefix.com/#transforms
-webkit-transform: mytransform(); /* Ch <36, Saf 5.1+, iOS, An =<4.4.4 /
-ms-transform: mytransform(); / IE 9 /
transform: mytransform(); / IE 10, Fx 16+, Op 12.1+ */
请使用 AutoPrefixer 而不是编写浏览器前缀。
此技术效果不错,但在用户缩放页面时,并不完全精确。请尝试缩放此 CodePen:http://codepen.io/anon/pen/NxBXOP
为什么不使用这个?我发现它更适合。
你的父元素需要设置高度才能使它工作,对吧?
感谢!如果有人感兴趣,已转换为 LESS
http://codepen.io/leggomuhgreggo/pen/JXqgxP?editors=0100
喜欢你的代码!我之前用三个单独的 LESS mixin 来完成这件事。这使我免于拆解 sass 代码。
我稍微调整了一下,使其更简单/更易读。也切换到 mixin 来进行供应商前缀。
http://codepen.io/callaginn/pen/mAZmKE