美文网首页web前端知识点极乐科技
前端面试经典问题:CSS中居中的几种方式

前端面试经典问题:CSS中居中的几种方式

作者: coderLfy | 来源:发表于2017-02-20 00:35 被阅读5055次

作为面试常客,学会这些,面试多点把握,同学间逼格升高
周五,老大说他面试了一个问题,是css居中的问题,然后我们在这边就讨论了一番,周末嗨玩,尾巴上想起这件事,特来总结,希望能帮助到求职和学习的朋友!
参考了这篇文章,快速传送门内容都是我手敲实践过的可靠!

![](img1.jpg)这类的其实是img标签,这个markdown转换有问题,特来提醒

1.水平居中的 margin:0 auto;

关于这个,大家也不陌生做网页让其居中用的比较多,
这个是用于子元素上的,前提是不受float影响

<style>
    *{
        padding: 0;
        margin: 0;
    }
        .box{
            width: 300px;
            height: 300px;
            border: 3px solid red;
            /*text-align: center;*/
        }
        img{
            display: block;
            width: 100px;
            height: 100px;
            margin: 0 auto;
        }
    </style>

<!--html-->
<body>
    <div class="box">
        ![](img1.jpg)
    </div>
</body>

2.水平居中 text-align:center;

img的display:inline-block;类似一样在不受float影响下进行
实在父元素上添加效果让它进行水平居中

<style>
    *{
        padding: 0;
        margin: 0;
    }
        .box{
            width: 300px;
            height: 300px;
            border: 3px solid red;
            text-align: center;
        }
        img{
            display: inline-block;
            width: 100px;
            height: 100px;
            /*margin: 0 auto;*/
        }
    </style>

<!--html-->
<body>
    <div class="box">
        ![](img1.jpg)
    </div>
</body>

3.水平垂直居中(一)定位和需要定位的元素的margin减去宽高的一半
这种方法的局限性在于需要知道需要垂直居中的宽高才能实现,经常使用这种方法

    <style>
        *{
            padding: 0;
            margin: 0;
        }
        .box{
            width: 300px;
            height: 300px;
            background:#e9dfc7; 
            border:1px solid red;
            position: relative;
        }
        img{
            width: 100px;
            height: 150px;
            position: absolute;
            top: 50%;
            left: 50%;
            margin-top: -75px;
            margin-left: -50px;
        }
    </style>
<!--html -->
<body>
    <div class="box" >
        ![](2.jpg)
    </div>
</body>
水平垂直居中1

4.水平垂直居中(二)定位和margin:auto;
这个方法也很实用,不用受到宽高的限制,也很好用

    <style>
        *{
            padding: 0;
            margin: 0;
        }
        .box{
            width: 300px;
            height: 300px;
            background:#e9dfc7; 
            border:1px solid red;
            position: relative;

        }
        img{
            width: 100px;
            height: 100px;
            position: absolute;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            margin: auto;
        }
    </style>
<!--html -->
<body>
    <div class="box" >
        ![](3.jpg)
    </div>
</body>
水平垂直居中2

5.水平垂直居中(三)绝对定位和transfrom
这个方法比较高级了,用到了形变,据我所知很多大神喜欢使用这个方法进行定位,逼格很高的,学会后面试一定要用!这个是不需要知道居中元素的宽高就可以使用的,代码里的图片稍微有点大,改改宽高,仅此而已,在面试中大部分人会问如果不知道宽高该如何居中,答这个,加分!对transform不了解的同学可以查阅一下资料了解一下!

<style>
    *{
        padding: 0;
        margin: 0;
    }
    .box{
        width: 300px;
        height: 300px;
        background:#e9dfc7; 
        border:1px solid red;
        position: relative;

    }
    img{
        width: 100px;
        height: 100px;
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%,-50%);
    }
</style>
<!--html -->
<body>
    <div class="box" >
        ![](4.jpg)
    </div>
</body>
水平垂直居中3

6.水平垂直居中(四)diplay:table-cell

其实这个就是把其变成表格样式,再利用表格的样式来进行居中,很方便

<style>
    .box{
            width: 300px;
            height: 300px;
            background:#e9dfc7; 
            border:1px solid red;
            display: table-cell;
            vertical-align: middle;
            text-align: center;
        }
        img{
            width: 100px;
            height: 150px;
            /*margin: 0 auto;*/  这个也行
        }
</style>
<!--html -->
<body>
    <div class="box" >
        ![](5.jpg)
    </div>
</body>
水平垂直居中4

7.水平垂直居中(五)flexBox居中

这个用了C3新特性flex,非常方便快捷,在移动端使用完美,pc端有兼容性问题,以后会成为主流的

<style>
    .box{
            width: 300px;
            height: 300px;
            background:#e9dfc7; 
            border:1px solid red;
            display: flex;
            justify-content: center;
            align-items:center;
        }
        img{
            width: 150px;
            height: 100px;
        }
</style>
<!--html -->
<body>
    <div class="box" >
        ![](6.jpg)
    </div>
</body>
垂直居中5

8.水平垂直居中(六)利用vertical-align:middle;
这方法不常见,但是这位朋友@不二很纯洁 补充后我觉得也不失为一种好方法可以让别人刮目相看,这个方法关键要有一个和容器一样高的元素作为居中的一个参照就像b元素一样

<style>
    .wrap{
            width:300px;
            height:300px; 
            background:rgba(0,0,0,0.5);
            text-align:center;
            font-size:0;
            }
    .vamb{
        display:inline-block; 
        width:0px;
        height:100%;
        vertical-align:middle;
        }
    .test{
        display:inline-block;
        vertical-align:middle;
        font-size:16px;
        text-align:left;
        background:red;
        }
</style>
<body>
    <div class="wrap">
        <b class="vamb"></b>
        <div class="test">
        宽高不定<br>
        垂直水平居中
        </div>
    </div>
</body>

常见又实用的例子就先写到这,欢迎提意见,谢谢大家!喜欢请点个喜欢,也是对我的支持和鼓励!

相关文章

网友评论

  • df5e303a0d7b:不是很懂文中第五个方法
    coderLfy:position 让元素左上角达到居中,translate 让元素中心居中:smile:
  • 积微微微:最后这种方式,有点儿疑问。
    不懂为什么当内部test元素宽度与父元素相同时就无法居中,而是在父元素外。而当test的width小于父元素时,可以垂直居中
    coderLfy:@积微微微 vertical-align:middle 是通过 baseline来对齐的,b元素的高度就是为了拉开baseline的高度(个人理解) 可以参考这篇文章,很详细了http://demo.doyoe.com/css/alignment/
  • bixin:第二个图片本身就是行内块吧,不用display 就可以啊
    coderLfy:@演员小新 是的哦,你的眼神很精确,这个当时是为了说明图片就是行内块的。
  • db2cf7d83c89:不用搞另外的元素直接父元素after一个元素 定高更好
  • 9b3254bb5939:把父级的 宽高去掉再说什么不用受到宽高的限制这句话吧。。
    coderLfy:@永仙子 = =不好意思,这个宽高并不是指的父级而是指的要居中的呢个元素,谢谢支持
  • 3c59af1788b9:厉害。受教了
    coderLfy: @3c59af1788b9 能帮助你就好,谢谢支持
  • 浩然先生呀:谢谢大神的指点,希望以后继续有好的东西分享。:+1:
    coderLfy: @An浩然 不是大神,以后还会多多分享的,谢谢支持!
  • d26bf599aadf:收
    coderLfy:@horizon_26 形变呢个一般大牛喜欢提到这个,面试你答这个,加分哦
    d26bf599aadf: @coderLfy 形变那个还没用过,现在试试。记着٩(๑^o^๑)۶
    coderLfy:希望能帮助你
  • 独钓寒江雪_Ly:受教了:pray:
    coderLfy: @独钓寒江雪_Ly 分享使我快乐
  • 不二很纯洁:还有种是仿图片居中的原理来做的,不过IE8+
    <!-- html -->
    <div class="box2">
    <div class="text">
    宽高不定<br />
    垂直水平居中 <br />
    IE8+
    </div>
    </div>

    /* css */
    .box2{float:left; width:300px; height:300px; line-height:300px; text-align:center; background:rgba(0,0,0,0.5);}
    .box2 .text{display:inline-block; line-height:normal; text-align:left; vertical-align:middle; max-width:100%;}
    coderLfy:@不二很纯洁 这个仿图片居中就是把display更换了一下,谢谢补充
  • 不二很纯洁:还有种通过多加一个标签 display: inline-block; 居中来影响要居中的的元素,代码:
    <!-- html -->
    <div class="wrap">
    <b class="vamb"></b>
    <div class="test">
    宽高不定<br>
    垂直水平居中
    </div>
    </div>

    /* css */
    .box{width:300px; height:300px; background:rgba(0,0,0,0.5); text-align:center; font-size:0;}
    .vamb{display:inline-block; width:0px; height:100%; vertical-align:middle;}
    .test{display:inline-block; vertical-align:middle; font-size:16px; text-align:left; background:red;}
    不二很纯洁:@coderLfy 这种如果是支持 before伪类的话,直接可以把b.vamb替换为伪类就可以了
    不二很纯洁:@coderLfy 对,是wrap,写错了
    coderLfy:@不二很纯洁 这个我测试了,这个很有意思,感谢补充,你的css样式box应该是wrap,行内元素能被 vertical-align:middle;影响上一个元素,然后通过自身vertical-align:middle;来调到居中
  • 3a189f615b9f:一脸懵逼………………很厉害的样子
    coderLfy: @万万_b7e9 😂
  • 嘿泡泡: flex-box是王道啊,方便无疑。只可惜还有兼容问题。
    coderLfy: @嘿泡泡 是的,移动端的主流
  • 㱎䖘䵈䶁䘔䶑䘓鋱䩳䵷㒪䪉䉥:厉害了 我的哥
    coderLfy: @Brandshaw 大佬好🤗
  • T1ng4:transform 不用写浏览器前缀麽?
    T1ng4: @coderLfy 是,就是想问这个
    coderLfy:@听安静的时光 transform要使用是有兼容性问题的,我在文章中也有说到,保险是要加上的,在做移动端或者最新浏览器下做项目就可以不用考虑现在大多都支持了
  • 无颜Flower:margin:auto,我们一般这样写margin:0 auto;
    coderLfy: @DaiFlower 😂
    无颜Flower:@coderLfy 对了,搞错了,我只需要左右居中,哈哈
    coderLfy:@DaiFlower 你呢样是不行的,你上下都是0了怎么居中呢?
  • John_Trump:这两个有区别吗?代码都一样
    1.水平居中的 margin:0 auto;
    2.水平居中 text-align:center;
    coderLfy:@John_Trump 这位朋友看书很细心,是的,因为这里代码一样,我就直接复制了,已改正,谢谢你,看我的文章这么认真!
    John_Trump:@coderLfy
    我是想说第二个的代码好像贴错了

    text-align 居中应该这样写
    ```css
    *{
    padding: 0;
    margin: 0;
    }

    .box1{
    width: 300px;
    height: 200px;
    border: 3px solid red;
    text-align: center;
    }

    .box1-center{
    display: inline-block;
    width: 180px;
    height: 100px;
    background-color: #00f;
    }

    ```
    coderLfy:@John_Trump 当然有区别,作用的对象就不一样,text-align是最这个容器里的子元素有效,margin本身就是作用在父元素上的你见过子元素单加margin居中的么?
  • 老刘爱科学:森为妹纸PHP已经遗忘了这些哈哈哈哈
    coderLfy: @JS丶HH 什么鬼,直男不搞基
    24e9e8024d70: @coderLfy 楼主真美~~~
    coderLfy:@众神退下 PHP是宇宙最美的语言:smile:
  • 灰色程序:易懂不错,转载到空间可以不?
    coderLfy:@50215bb8891a 请便
  • 想不到更好的昵称了:通俗易懂,不错。
    coderLfy:@向日葵smill 对你有帮助就好
  • 麻辣小面瘫:楼主万岁。
    coderLfy:@麻辣小面瘫 line-height配合height 这个就可以起到垂直居中的作用
    麻辣小面瘫:@coderLfy 帮助很大。不过用得最多的还是第三个,table cell我目前最多就是用来多行文本垂直居中,不知道楼主有没有更好的办法。
    coderLfy:@麻辣小面瘫 。。。哈哈,希望能对有帮助!
  • MR_LIXP:第四个标题后面应该是 margin:auto;吧 =。=
    coderLfy: @MR_LP 是的,手误了,谢谢你的指正,已修改

本文标题:前端面试经典问题:CSS中居中的几种方式

本文链接:https://www.haomeiwen.com/subject/darswttx.html