纯CSS七大居中方法,使用Sass优雅并快捷的兑现CSS中的垂直水平居中

运用 Sass mixin 完结 CSS 的居中成效

2015/08/15 · CSS ·
Sass

原稿出处: Hugo
Giraudel   译文出处:公子肥马轻裘   

就算应用 CSS
成立居中作用必要耍一些噱头,越发是笔直居中作用,但我觉着经过暴发的诬告,对于
CSS 则是有失公允的。实际上大家有太多的章程利用 CSS
创设居中效果了,而且作为一名前端开发者,你真的有必不可少对内部的原理明白有限。

行文本文的目标不是为了向各位解释这么些艺术的工作规律,而是介绍将那几个方式编写为
Sass mixin 的法门,继而将它们复用到各个项目中。若是您还不熟悉使用 CSS
创制居中效果的艺术,我提议您细心翻阅以下那篇作品:Centering In CSS: A
Complete Guide纯CSS七大居中方法,使用Sass优雅并快捷的兑现CSS中的垂直水平居中。。

嵌套-伪类嵌套
   伪类嵌套和性质嵌套极度接近,只不过他需求借助“&”符号一起合作使用
    例如:sass
      .clearfix{
          &:before,
          &:after {
              content:””;
          display: table;
          }
          &:after {
              clear:both;
              overflow: hidden;
            }
      }
    编译出来的 CSS:
        clearfix:before, .clearfix:after {
            content: “”;
            display: table;
        }
        .clearfix:after {
            clear: both;
            overflow: hidden;
      }
掺杂宏-注明混合宏
    借使你的一体网站中有几处小样式类似,比如颜色,字体等,在 Sass
可以动用变量来归并处理,那么那种选用如故不错的。
    但当你的体裁变得愈加复杂,必要重复使用大段的样式时,使用变量就不可能达到大家目了。
    不带参数混合宏:
    在 Sass 中,使用“@mixin”来声称一个混合宏。
      @mixin border-radius{
          -webkit-border-radius: 5px;
          border-radius: 5px;
    }
    复杂的混合宏:
      Sass中的混合宏还提供更为复杂的,你可以在括号里写上含蓄逻辑关系,辅助更好的做你想做的事务。
        @mixin box-shadow($shadow…){
          @if length($shadow) >= 1{
            @include prefixer(box-shadow,$shadow);
        }@else{
          $shadow:0 0 4px rgba(0,0,.3);
          @include prefixer(box-shadow,$shadow);
          }
        }
        这一个 box-shadow
的混合宏,带有七个参数,那个时候可以动用“ … ”来代替。简单的解释一下,当
$shadow 的参数数量值超出或
        等于“ 1 ”时,表示有多个阴影值,反之调用默许的参数值“ 0 0
4px rgba(0,0,0,.3) ”。
    混合宏-调用混合宏
      在Sass 中通过@mixin
关键词表明了一个混合宏,那么在实质上调用中,在出色了一个紧要词“@include”来调用申明好
      的混合宏。
      @mixin border-radius{
          -webkit-border-radius:3px;
          border-radius:3px;
      }
      在一个按钮中腰调用定义好的混合宏“border-radius”可以这么使用
      button{
          @include border-radius;
      }
     编译出来的css
        button{
          -webkit-border-radius:3px;
          border-radius:3px;
      }
    混合宏的参数-传一个不带值的参数
    Sass
的混合宏有一个有力的听从,可以传参,那么在Sass中传参首要有以下三种样式
      (A)传一个不带值的参数
          在混合和宏中,可以穿个不在任何值的参数 比如:
        @mixin border-radius($radius){
          -webkit-border-radius:$radius:
          border-radius:$radius:
        }
    在混合宏“border-radius”中定义了一个不带任何值的参数$radius
    在调用的时候可以给那几个混合宏专递一个数值
      .box{
        @include border-radius(3px);
      }
    在那里代表混合宏传递了一个“border-radius”的值为“3px”。
      .box{
          -webkit-border-radius:3px;
            border-radius:3px;
      }
混合宏的参数-传个带值的参数
    在Sass的鱼目混珠宏中,还足以给混合宏的参数传递一个默认值,例如:
        @mixin border-radius($radius:3px){
            -webkit-border-radius:$radius;
              border-radius:$radius;
        }
    混合宏“border-radius”传了一个参数“$radius”,而且给这些参数赋予了一个默许值“3px”。

运用Sass优雅并飞快的兑现CSS中的垂直水平居中(附带Flex布局,CSS3+SASS完美版),sasscss3

贯彻css水平垂直居中的方法有成百上千,在此间我概括的说下七种比较常用的不二法门:

1.使用CSS3中的Flex布局

对此flex,大家要精通的是它是一个display的性质,而且必需要给他的父元素设置flex属性(flex必须协作相对定位应用!!!!!),除了设置display:flex之外,还有此外四个特性必要设置,分别是justify-content和align-items,他们的情趣分别是水平居中和垂直居中。HTML+CSS代码如下:

body {
    position: absolute;
    width: 100%;
    height: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
}
.parentNode {
    width: 400px;
    height: 400px;
    background: #f00;
}

<body>
    <div class="parentNode"></div>
</body>

当须要变动时,比如大家要在此div里面嵌套一个div,根据自身下边提到的,要想子DIV垂直水平居中,我们也要给父DIV同样如此设置

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        body {
            position: absolute; // flex必须配合absolute使用才会生效
            width: 100%;
            height: 100%;
            display: flex;
            justify-content: center;
            align-items: center;
        }
        .parentNode {
            width: 400px;
            height: 400px;
            background: #f00;
            position: relative;  // 这里必须用relative 原因是 相对于 body这个父标签定位 如果用absolute会找上级的relative,如果没有,就到顶级的document
            display: flex;
            justify-content: center;
            align-items: center;
        }
        .childNode {
            width: 200px;
            height: 200px;
            background: #fff;
        }
    </style>
</head>
<body>
    <div class="parentNode">
        <div class="childNode"></div>
    </div>
</body>
</html>

亚洲必赢官网 1

2.使用CSS3中的transform

.parentNode {
    width: 400px;
    height: 400px;
    background: #f00; 
    position: absolute;  
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
}

 

3.当你知道元素的width与height时,使用CSS2中的最平凡不过的margin

.parentNode {
    width: 400px;
    height: 400px;
    background: #f00; 
    position: absolute;  
    left: 50%;
    top: 50%;
    margin: -200px 0 0 -200px;
}

 

4.应用相比独特的margin:auto

.parentNode {
    width: 400px;
    height: 400px;
    background: #f00;
    overflow: auto;  
    margin: auto;      // 在标准流的情况下,让 margin-top 以及 margin-bottom 都为0
    position: absolute;  
    top: 0; left: 0; bottom: 0; right: 0;  // 使浏览器对其元素所在的区域内重新渲染,四个值都设为0目的是让整个窗口都为该元素的重新渲染区域,之后margin-top以及margin-bottom都相等  
}

现今让我们来选拔强劲的SASS重构一下那多少个样式,先拿flex开刀吧,

@mixin center {
    display: flex;
    justify-content: center;
    align-items: center;
}
body {
    position: absolute; 
    width: 100%;
    height: 100%;
    @include center;

    .parentNode {
        width: 400px;
        height: 400px;
        background: #f00;
        position: relative;  
        @include center;

        .childNode {
           width: 200px;
           height: 200px;
           background: #fff;
        }
    }
}

假诺您的任何网站中有几处小样式类似,比如颜色,字体等,在 Sass
可以应用”$”变量来归并处理,那么那种接纳照旧不错的。但当您的体制变得越来越复杂,须求重复使用大段的体裁时,使用变量就不能达成大家目了。那一个时候
Sass
中的混合宏就会变得可怜有含义,@mixin 是用来声称混合宏的基本点词,有点类似
CSS 中的 @media、@font-face 一样。center
是混合宏的名目。大括号里面是复用的样式代码。@include为调用混合宏。除了注明一(Wissu)个不带参数的混合宏之外,还足以在概念混合宏时带有参数,并且在里面还是能写更加扑朔迷离的逻辑。

下边我将会用到if else语句以及@mixin混合宏来封装我们地点的第2,3,4情势。

俺们的笔触是先将DIV的左上角相对定位到容器的主题岗位,然后为 mixin
添加八个可选参数($width,$height),分别代表元素的宽高,要是传递了参数,那么就使用负向 margin 的不二法门已毕居中;倘诺没有传递参数,就动用
CSS3的transform 的方法。

/**
 * 为子元素设定定位上下文
 */
.parent {
    position: relative;
}

/**
 * 让子元素绝对居中于父容器
 * 没有向 Sass mixin 传递宽和高,使用 CSS transform 属性实现居中效果
 */
.child-with-unknown-direction {
    @include center;
}

/**
 * 让子元素绝对居中于父容器
 * 向 Sass mixin 传递了宽度,所以就使用负向 margin 处理水平位置,
 * 使用 CSS transform translateY 处理垂直位置 
 */
.child-with-known-width {
    @include center(400px);
}

/**
 * 让子元素绝对居中于父容器
 * 向 Sass mixin 传递了高度,所以就使用负向 margin 处理垂直位置,
 * 使用 CSS transform translateX 处理水平位置 
 */
.child-with-known-height {
    @include center($height: 400px);
}

/**
 * 让子元素绝对居中于父容器
 * 向 Sass mixin 传递了高度和宽度,所以就使用负向 margin 处理水平和垂直位置
 */
.child-with-known-direction {
    @include center(400px, 400px);
}

现在大家开端封装@mixin,由地点的CSS分析知,要完毕居中务必先让要素相对定位

@mixin center($width: null, $height: null) {
    position: absolute;
    top: 50%;
    left: 50%;
}

下一场按照下边的逻辑搭建@mixin的骨子

width height solution
null null translate
defined defined margin
defined null margin-left + translateY
null defined margin-right + translateX

 

 

 

 

 

@mixin center($width:null,$height:null){
    display: flex;
    justify-content: center;
    align-items: center;
    @if $width and $height {
        // do margin
    } @else if not $width and not $height {
        // do transform translate(-50%,-50%)
    } @else if not $width {
        // do margin-top and transform translateX
    } @else {
    // do margin-left and transform translateY
    }
}

最终大家把现实的代码插入到分裂的口径中去

@mixin center($width:null,$height:null){
    position: absolute;
            top: 50%;
            left: 50%;
    @if $width and $height {
            // do margin
            width: $width;
            height: $height;
            margin: -($height / 2) #{0 0} -($width / 2);   //这里如果直接写 0 0 他会编译为 margin: xx 0 xx 而不是 margin:xx 0 0 xx,所以用 #{0 0}

    } @else if not $width and not $height {
            // do transform translate(-50%,-50%)
            transform: translate(-50%,-50);
    } @else if not $width {
            // do margin-top and transform translateX
            height: $height;
            margin-top: -(height / 2);
            transform: translateX(-50%); 
    } @else {
            // do margin-left and transform translateY
            width: $width;
            margin-top: -(width / 2);
            transform: translateY(-50%); 
    }
}

末段大家得以经过Koala软件离线编译也得以透过

@charset "UTF-8";
/**
 * 为子元素设定定位上下文
 */
.parent {
  position: relative;
}

/**
 * 让子元素绝对居中于父容器
 * 没有向 Sass mixin 传递宽和高,使用 CSS transform 属性实现居中效果
 */
.child-with-unknown-direction {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50);
}

/**
 * 让子元素绝对居中于父容器
 * 向 Sass mixin 传递了宽度,所以就使用负向 margin 处理水平位置,
 * 使用 CSS transform translateY 处理垂直位置 
 */
.child-with-known-width {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 400px;
  margin-top: -width/2;
  transform: translateY(-50%);
}

/**
 * 让子元素绝对居中于父容器
 * 向 Sass mixin 传递了高度,所以就使用负向 margin 处理垂直位置,
 * 使用 CSS transform translateX 处理水平位置 
 */
.child-with-known-height {
  position: absolute;
  top: 50%;
  left: 50%;
  height: 400px;
  margin-top: -height/2;
  transform: translateX(-50%);
}

/**
 * 让子元素绝对居中于父容器
 * 向 Sass mixin 传递了高度和宽度,所以就使用负向 margin 处理水平和垂直位置
 */
.child-with-known-direction {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 400px;
  height: 400px;
  margin: -200px 0 0 -200px;
}

 亚洲必赢官网 2 亚洲必赢官网 3

 

达成css水平垂直居中的方法有众多,在此地我概括的说…

记得有次找工作面试的时候,一面试官问了一个CSS方面的题目:怎么样让要素在浏览器窗口中上下左右居中。我纪念当时给了个答案是,先用JS获取浏览器窗口中度,然后给body设置line-height为窗口中度并设置text-align:center,
接着再设置该元素display:inline-block和vertical-align:middle。唉,现在思考自己都以为累。

完全概述

本文将会专注于解决子元素居中于父类容器的题材,就实践经验来说,那也是最常使用到的居中效果。当您请教别人CSS
中和居中作用相关的难题时,他们屡屡会反问你:你驾驭元素具体的宽高吗?之所以会有那般的反问,是因为倘诺领悟元素的宽高,那么最好的解决方案就是行使
CSS transform
属性。即使该属性在浏览器中的援救度稍低,但却有所惊人灵活的特征;假设因为浏览器包容性令你不可以应用
CSS transform
属性,或者也不精晓元素的宽高,那么完成居中功用的最简易方法就是选用负向
margin。

俺们前些天要创设的 Sass mixin
就是按照上述的办法:将元素的左上角相对定位到容器的主旨岗位,然后为 mixin
添加五个可选参数,分别表示元素的宽高,假诺传递了参数,那么就采用负向
margin 的章程已毕居中;要是没有传递参数,就应用 CSS transform 的艺术。

当我们的 Sass mixin 创立成功后,基本的应用格局如下所示:

Sass

/** * 为子元素设定一定上下文 */ .parent { position: relative; }
/** * 让子元素相对居中于父容器 * 没有向 Sass mixin 传递参数,使用
CSS transform 属性已毕居中效能 */ .child-with-unknown-dimensions {
@include center; } /** * 让子元素相对居中于父容器 * 向 Sass mixin
传递了大幅度,所以就动用负向 margin 处理水平地点, * 使用 CSS transform
处理垂直地方 */ .child-with-known-width { @include center(400px); }
/** * 让子元素相对居中于父容器 * 向 Sass mixin
传递了惊人,所以就采纳负向 margin 处理垂直地点, * 使用 CSS transform
处理水平地点 */ .child-with-known-height { @include center($height:
400px); } /** * 让子元素相对居中于父容器 * 向 Sass mixin
传递了高度和增幅,所以就应用负向 margin 处理水平和垂直地点 */
.child-with-known-dimensions { @include center(400px, 400px); }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/**
* 为子元素设定定位上下文
*/
.parent {
    position: relative;
}
 
/**
* 让子元素绝对居中于父容器
* 没有向 Sass mixin 传递参数,使用 CSS transform 属性实现居中效果
*/
.child-with-unknown-dimensions {
    @include center;
}
 
/**
* 让子元素绝对居中于父容器
* 向 Sass mixin 传递了宽度,所以就使用负向 margin 处理水平位置,
* 使用 CSS transform 处理垂直位置
*/
.child-with-known-width {
    @include center(400px);
}
 
/**
* 让子元素绝对居中于父容器
* 向 Sass mixin 传递了高度,所以就使用负向 margin 处理垂直位置,
* 使用 CSS transform 处理水平位置
*/
.child-with-known-height {
    @include center($height: 400px);
}
 
/**
* 让子元素绝对居中于父容器
* 向 Sass mixin 传递了高度和宽度,所以就使用负向 margin 处理水平和垂直位置
*/
.child-with-known-dimensions {
    @include center(400px, 400px);
}

上述 Sass 代码经过编译之后,输出结果如下:

CSS

.parent { position: relative; } .child-with-unknown-dimensions {
position: absolute; top: 50%; left: 50%; transform: translate(-50%,
-50%); } .child-with-known-width { position: absolute; top: 50%; left:
50%; margin-left: -200px; width: 400px; transform: translateY(-50%); }
.child-with-known-height { position: absolute; top: 50%; left: 50%;
transform: translateX(-50%); margin-top: -200px; height: 400px; }
.child-with-known-dimensions { position: absolute; top: 50%; left: 50%;
margin-left: -200px; width: 400px; margin-top: -200px; height: 400px; }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
.parent {
    position: relative;
}
 
.child-with-unknown-dimensions {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}
 
.child-with-known-width {
    position: absolute;
    top: 50%;
    left: 50%;
    margin-left: -200px;
    width: 400px;
    transform: translateY(-50%);
}
 
.child-with-known-height {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translateX(-50%);
    margin-top: -200px;
    height: 400px;
}
 
.child-with-known-dimensions {
    position: absolute;
    top: 50%;
    left: 50%;
    margin-left: -200px;
    width: 400px;
    margin-top: -200px;
    height: 400px;
}

还不错,就是看起来有点啰嗦,然而是因为是用来做 demo 的,也不要太过强求了。

    在调用类似那样的混合宏时,会多有一个空子,借使你的页面中的圆角很多地点都是“3px”的圆角,那么那么些时候只
    必要调用默许的混合宏“border-radius”:
      .btn {
        @include border-radius;
      }
    编译出来的CSS
      .btn{
        -webkit-border-radius:3px
        border-radius:3px
      }
      但有的时候,页面中稍微元素的圆角值不相同,那么可以随心所欲给混合宏传值,如:
        .box {
          @include border-radius(50%);
        }
    编译出来的 CSS:
      .box {
        -webkit-border-radius: 50%;
          border-radius: 50%;
      }
混合宏的参数-传三个参数
    Sass 混合宏除了能传一个参数之外,还可以够传多个参数,如:
        @mixin center($width,$height){
            width:$width;
            height:$height;
            position:absolute;
            top:50%;
            left:50%:
            margin-top:($height)/2;
            margin-left:-($width)/2;
        }
  在混合宏“center”就传了多个参数。在事实上调用其余混合宏是同等的。
    .box-center{
        @include center(500px,300px);
    }
    编译出来 css
      .box-center{
        width:500px;
        height:300px;
        position:absolute;
        top:50%;
        left:50%;
        margin-top:-150px;
        margin-left:-250px;
        }
    有一个专程的参数“…”,当混合宏穿的参数传的参数过多之时,可以运用参数来代表
如;
        @mixin box-shadow($shadows…){
              @if length($shadows) >=1{
                  -webkit-box-shadow:$shadows;
                   box-shadow:$shadows;
                }@else{
                    $shadows: 0 0 2px
rgba(#000,.25);
                    -webkit-box-shadow:$shadow;
                      box-shadow:$shadow;
                  }
                }
    在实际上调用中:
        .box{
            @include box-shadow(0 0 1px rgba(#000,.5),0 0
2px rgba(#000,.2));
      }
    编译出来的css:
      .box{
          -webkit-box-shadow:0 0 1px rgba(0,0,0,0.5),0 0 2px
rgba(0,0,0,0.2);
              box-shadow:0 0 1px rgba(0,0,0,0.5),0 0 2px
rgba(0,0,0,0.2);
      }
混合宏的参数–混合宏的欠缺
      混合宏在实际上编码中给我们带来许多利于之处,尤其是对此复用重复代码块,不过最大的不足之处是生育
        冗余的代码块,比如在不相同的地方调用一个等同的混合宏。
            @mixin border-radius{
                -webkit-border-radius:3px;
                  border-radius:3px;
            }
.            box{
                @include border-radius;
                 margin-bottom:5px;
            }
            .btn{
              @include border-radius;
            }
      示例在“.box”和“.btn”中等能调用了概念好的“border-radius”混合宏。先来看编译出来的css;
      .box{
        -webkit-border-radius:3px;
          border-radius:3px;
          margin-bottom:5px;
        }
      .btn{
          -webkit-border-radius;3ox;
          border-radius:3px;
    }
      sass
在调用相同的混合宏时,并无法智能的将同一的样式代码块合并在一块。那也是
Sass 的混合宏最不足之处

莫非就肯定要用到JS吗?就不可以有一种只用CSS方法就能促成要素居中的方法呢?答案是,有!而且格局远不止一种!

创建 mixin

思路屡清楚了,上边开工!根据地点的代码片段,大家早已了解了这一个 mixin
的显要特点:接收八个可选的参数,用来代表元素的宽高($width 和 $height)。

Sass

/// Horizontal, vertical or absolute centering of element within its
parent /// If specified, this mixin will use negative margins based on
element’s /// dimensions. Else, it will rely on CSS transforms which
have a lesser /// browser support but are more flexible as they are
dimension-agnostic. /// /// @author Hugo Giraudel /// /// @param {Length
| null} $width [null] – Element width /// @param {Length | null}
$height [null] – Element height /// @mixin center($width: null,
$height: null) { .. }

1
2
3
4
5
6
7
8
9
10
11
/// Horizontal, vertical or absolute centering of element within its parent
/// If specified, this mixin will use negative margins based on element’s
/// dimensions. Else, it will rely on CSS transforms which have a lesser
/// browser support but are more flexible as they are dimension-agnostic.
///
/// @author Hugo Giraudel
///
/// @param {Length | null} $width [null] – Element width
/// @param {Length | null} $height [null] – Element height
///
@mixin center($width: null, $height: null) { .. }

然后,由分析知,要落成居中务必让要素相对定位:

Sass

@mixin center($width: null, $height: null) { position: absolute; top:
50%; left: 50%; }

1
2
3
4
5
@mixin center($width: null, $height: null) {
    position: absolute;
    top: 50%;
    left: 50%;
}

在此地让大家刹车一下,深刻剖析后续逻辑的层系:

width height solution
null null translate
defined defined margin
defined null margin-left + translateY
null defined margin-right + translateX

秀代码:

Sass

@mixin center($width: null, $height: null) { position: absolute; top:
50%; left: 50%; <a
href=”; not
$width and not $height { // Go with `translate` } @else if $width and
$height { // Go width `margin` } @else if not $height { // Go with
`margin-left` and `translateY` } @else { // Go with `margin-top`
and `translateX`亚洲必赢官网, } }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@mixin center($width: null, $height: null) {
    position: absolute;
    top: 50%;
    left: 50%;
 
    <a href="http://www.jobbole.com/members/jinyi7016">@if</a> not $width and not $height {
        // Go with `translate`
    } @else if $width and $height {
        // Go width `margin`
    } @else if not $height {
        // Go with `margin-left` and `translateY`
    } @else {
        // Go with `margin-top` and `translateX`
    }
}

经过地点的代码,大家早已搭好了 mixin
的骨子,只须要再添加上具体的逻辑代码即可:

Sass

@mixin center($width: null, $height: null) { position: absolute; top:
50%; left: 50%; <a
href=”; not
$width and not $height { transform: translate(-50%, -50%); } @else if
$width and $height { width: $width; height: $height; margin: -($width /
2) #{0 0} -($height / 2); } @else if not $height { width: $width;
margin-left: -($width / 2); transform: translateY(-50%); } @else {
height: $height; margin-top: -($height / 2); transform:
translateX(-50%); } }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@mixin center($width: null, $height: null) {
    position: absolute;
    top: 50%;
    left: 50%;
 
    <a href="http://www.jobbole.com/members/jinyi7016">@if</a> not $width and not $height {
        transform: translate(-50%, -50%);
    } @else if $width and $height {
        width: $width;
        height: $height;
        margin: -($width / 2) #{0 0} -($height / 2);
    } @else if not $height {
        width: $width;
        margin-left: -($width / 2);
        transform: translateY(-50%);
    } @else {
        height: $height;
        margin-top: -($height / 2);
        transform: translateX(-50%);
    }
}

瞩目!上边代码中的 #{0 0} 实际上一种容错措施,如若直接行使 0 0 的话,Sass
解析器会尝试举办数值运算(在那边会活动进行 0 -($height / 2) 的数学运算),进而导致我们获取 margin: mt 0 ml; 而不是想要获得的 margin: mt 0 0 ml;

一、line-height居中法

父元素:text-align: center; line-height:600px; font-size: 0;

子元素:display: inline-block; vertical-align: middle;

注:600px必须为父元素的可观,那里还需注意的少数是font-size需设为零,若未写该属性将招致元素并无法准确垂直居中。该措施即为我面试时所答的点子,缺点很扎眼,父元素中度须确定。(包容IE8+)

通俗

骨干的效应完成后,大家仍能够增加更加多的表征,比如添加 @support 来检查浏览器对
CSS transform 的支持度,进而可以根据 CSS transform
的支撑度输出相应的条件样式。其余,大家还是能够更审慎地去测试出入的参数是还是不是是有效数值……

二、table-cell居中法

父元素:display: table-cell; text-align: center; vertical-align:
middle;

子元素:display: inline-block;

注:兼容IE8+

使用 Flexbox

看来 Flexbox 这几个词是否就很提神啊,少年!确实,使用 Flexbox
确实是最简便的格局,它和眼前方法首要的出入在于,使用 Flexbox
须要为父容器设定相关样式,而使用前面的办法则重要是为子元素设定相关样式(当然,父容器须求被设定为除 static 之外的任意 position)。

应用 Flexbox 已毕子元素的居中效果,只需三行代码:

Sass

@mixin center-children { display: flex; justify-content: center;
align-items: center; }

1
2
3
4
5
@mixin center-children {
    display: flex;
    justify-content: center;
    align-items: center;
}

鉴于 Flexbox
如故相比较新的属性,那么添加上相关的浏览器前缀的话,会让它兼具更宽泛的包容性。

Sass

.parent { @include center-children; }

1
2
3
.parent {
    @include center-children;
}

正如您料想的那么,就那样简单大家就贯彻了:

CSS

.parent { display: flex; justify-content: center; align-items: center; }

1
2
3
4
5
.parent {
    display: flex;
    justify-content: center;
    align-items: center;
}

三、上下左右永恒+margin居中国和法国

父元素:position: relative;

子元素:position: absolute; left: 0; right: 0; top: 0; bottom: 0;
margin: auto;

注:兼容IE8+

总结

咱俩就想要一个简便的 mixin
让要素在父容器中居中,我们已毕了,而且做的更好。它不但简单易用无副成效,而且提供了杰出的付出接口。

1 赞 1 收藏
评论

亚洲必赢官网 4

四、50%定位+margin居中法

父元素:position: relative;

子元素:position: absolute; left: 50%; top: 50%; margin: -200px 0 0
-200px;

注:200px须为该子元素的宽高的一半。例如该子元素宽为100px,高为50px,那么margin取值为-25px
0 0 -50px。该办法缺点是须确定子元素宽高。(包容IE8+)

五、50%定位+translate居中法

父元素:position: relative;

子元素:position: absolute; left: 50%; top: 50%; transform:
translate(-50%,-50%);

注:该方法应用了CSS3 transform属性,适合用于移动端。(包容IE9+)

六、Flexbox居中法

父元素:display: flex; justify-content: center; align-items: center;

注:该情势运用了Flexbox弹性布局,移动端包容性也存在很大标题。(包容IE10+)

七、Flexbox+margin居中法

父元素:display: flex;

子元素:margin: auto;

注:同上,兼容IE10+

如上就是前几天所要介绍的四种纯CSS居中方法,各有各的利害,须依据真实情况接纳最佳方案。

本文为原创文章,转发请评释出处,谢谢!

网站地图xml地图