CSS布局与水平垂直居中

  • 左右布局
  • 左中右布局
  • 水平居中
  • 垂直居中
  • 水平垂直居中

左右布局

float实现左右布局

子元素设置float: left父元素设置clearfix类,清除浮动

<div class="wrap clearfix">
        <div class="left-box">
            左边
        </div>
        <div class="right-box">
            右边
        </div>
</div>


body{
    margin: 0;
}
.clearfix::after{
    content: "";
    display: block;
    clear: both;
}
.wrap{
    width: 500px;
    margin: 50px auto 0;
}
.left-box{
    float: left;
    background: #ff9e2c;
    font-size: 30px;
    width: 50%;
    text-align: center;
    height: 300px;
    color: #fff;
    line-height: 300px;
}
.right-box{
    float: left;
    background: #b6701e;
    font-size: 30px;
    width: 50%;
    text-align: center;
    height: 300px;
    color: #fff;
    line-height: 300px;
}

用绝对定位实现左右布局

子绝父相

body{
    margin: 0;
}
.wrap{
    position: relative;
    width: 1000px;
    margin: 50px auto 0;
}
.wrap div{
    position: absolute;
    font-size: 30px;
    width: 50%;
    text-align: center;
    height: 300px;
    color: #fff;
    line-height: 300px;
}
.left-box{ 
    top: 0;
    left: 0;
    background: #ff9e2c;
}
.right-box{
    top: 0;
    right:0;
    background: #b6701e;
}

左中右布局

最经典的双飞翼&圣杯布局简介:

  • 都是两侧定宽,中间自适应
  • 分左中右三个盒子,三个盒子都浮动。
  • 圣杯布局缩小时有滚动条,但能保证中间一定能显示出东西
圣杯一般情况下.png
圣杯缩小情况下.png
  • 双飞翼布局缩到最小时,中间会消失,只剩左右

双飞翼布局

html代码:

<body>
<div id="header"></div>
<!--中间栏需要放在前面-->
<div id="parent">
    <div id="center">
        <div id="center_inbox">中间自适应</div>
        <hr>  <!--方便观察原理-->
    </div>
    <div id="left">左列定宽</div>
    <div id="right">右列定宽</div>
</div>
<div id="footer"></div>
</body>

css代码:

#header {
    height: 60px;
    background-color: #ccc;
}
#left {
    float: left;
    width: 100px;
    height: 500px;
    margin-left: -100%; /*调整#left的位置,值等于自身宽度*/
    background-color: #f00;
    opacity: 0.5;
}
#center {
    height: 500px;
    float: left;
    width: 100%;
    background-color: #eeff2b;
}
#center_inbox{
    height: 480px;
    border: 1px solid #000;
    margin: 0 220px 0 120px;  /*关键!!!左右边界等于左右盒子的宽度,多出来的为盒子间隔*/
}
#right {
    float: left;
    width: 200px;
    height: 500px;
    margin-left: -200px;  /*使right到指定的位置,值等于自身宽度*/
    background-color: #0f0;
    opacity: 0.5;
}
#footer {
    clear: both;  /*注意清除浮动!!*/
    height: 60px;
    background-color: #ccc;
}

圣杯布局方法

html代码:

<body>
<div id="header"></div>
<div id="parent">
    <!--#center需要放在前面-->
    <div id="center">中间自适应
        <hr>
    </div>
    <div id="left">左列定宽</div>
    <div id="right">右列定宽</div>
</div>
<div id="footer"></div>
</body>

css代码:

#header{
    height: 60px;
    background-color: #ccc;
}
#parent {
    box-sizing: border-box;
    height: 500px;
    padding: 0 215px 0 115px;  /*为了使#center摆正,左右padding分别等于左右盒子的宽,可以结合左右盒子相对定位的left调整间距*/
}
#left {
    margin-left: -100%;  /*使#left上去一行*/
    position: relative;
    left: -115px;  /*相对定位调整#left的位置,正值大于或等于自身宽度*/
    float: left;
    width: 100px;
    height: 500px;
    background-color: #f00;
    opacity: 0.5;
}
#center {
    float: left;
    width: 100%;  /*由于#parent的padding,达到自适应的目的*/
    height: 500px;
    box-sizing: border-box;
    border: 1px solid #000;
    background-color: #eeff2b;
}
#right {
    position: relative;
    left: 215px; /*相对定位调整#right的位置,大于或等于自身宽度*/
    width: 200px;
    height: 500px;
    margin-left: -200px;  /*使#right上去一行*/
    float: left;
    background-color: #0f0;
    opacity: 0.5;
}
#footer{
    height: 60px;
    background-color: #ccc;
}


水平居中

父子嵌套,parent>son的结构

1.inline/inline-block

父元素设置text-align: center

.parent{
    text-align: center;
}
2.单个块级元素

子元素设置margin: 0 auto

.son{
    width: 100px; /*必须定宽*/
    margin: 0 auto;
}
3.多个块级元素

父元素设置text-align: center,子元素设为inline/inline-block

.parent{
    text-align: center;
}
.son{
    display: inline-block; /*改为行内或者行内块级形式,让text-align对其生效*/
}
4.任意元素(flex)
.parent{
    display: flex;
    justify-content: center;
}
★总结:

对于水平居中,我们应该先考虑,哪些元素有自带的居中效果,最先想到的应该就是 text-align: center,但是这个只对行内内容有效,所以我们要使用 text-align: center 就必须将子元素设置为display: inline或者 display: inline-block
其次就是考虑能不能用margin: 0 auto;

垂直居中

父子嵌套,parent>son的结构

1.单行文本

将父元素的 heightline-height 设置为相同的值

.parent{
    height: 150px;
    line-height: 150px;  
}
2.多行文本

第一种方法:将父元素设为display: table,同时子元素设置display: table-cell以及vertical-align: middle

<div class="parent">
  <p class="child">在山的那边海的那边,有一群蓝精灵,他们活泼又聪明,他们调皮又灵敏
</p>
</div>

<style>
  .parent {
    display: table;
    width: 150px;
  }
  
  .child {
    display: table-cell;
    vertical-align: middle;
  }
</style>

第二种方法:用p标签包裹多行文本内容,p标签改成inline-block元素
原理:多行文字使用一个标签包裹,同时设置display: inline-block,保持了内联元素的特性,使元素具有单行效果

<div class="parent">
<p class="child">在山的那边海的那边,有一群蓝精灵,他们活泼又聪明,他们调皮又灵敏</p>
</div>

<style>
.parent{
    line-height: 150px;

}
.child{
     display:inline-block;
     line-height:20px;
     vertical-align: middle;
} 
</style>
3.图片

将父元素的 heightline-height 设置为相同的值,子元素设置vertical-align: middle

.parent{
    height: 150px;
    line-height: 150px;
    font-size: 0;
}
img.son{vertical-align: middle;} /*默认是基线对齐,改为middle*/
4.块级元素

分定高与不定高,定高就用注释里的方法

.parent{
    position: relative;
}
.son{
    position: absolute;
    top: 50%;
    /*定高时margin-top:负自身高度一半;*/
    transform: translateY(-50%);
}
5.任意元素(flex)
.parent{
    display: flex;
    align-items: center;
}

或者

.parent{
    display: flex;
}
.son{
    align-self: center;
}

或者

.parent{
    display: flex;
    flex-direction: column;
    justify-content: center;
}
★总结:
  • 对于垂直居中,最先想到的应该就是 line-height 了,但是这个只能用于行内内容;
  • 其次就是考虑能不能用vertical-align: middle ,不过这个一定要熟知原理才能用得顺手,可看vertical-align和line-height的基友关系

水平垂直居中

1.inline/inline-block
.parent{
    height: 150px;
    line-height: 150px;  /*行高的值与height相等*/
    text-align: center;
    font-size: 0;   /*消除幽灵空白节点的bug*/
}
.son{
    vertical-align: middle;
}
2.块级元素

用子绝父相,分定宽高和不定宽高,定宽高就用注释里的方法

.parent{
    position: relative;
}
.son{
    position: absolute;
    top: 50%;
    left: 50%;
    /*定宽高时等同于margin-left:负自身宽度一半;margin-top:负自身高度一半;*/
    transform: translate(-50%,-50%); 
}
3.flex
.parent{
    display: flex;
}
.son{
    margin: auto;
}

或者

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

或者

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

★总结:

  • 一般情况下,水平垂直居中,我们最常用的就是绝对定位加负边距了,缺点就是需要知道宽高,使用transform倒是可以不需要,但是兼容性不好(ie9+)
  • 其次就是绝对居中,绝对定位设置top、left、right、bottom为0,然后margin:auto;让浏览器自动平分边距以达到水平垂直居中的目的
  • 如果是inline/inline-block这些内容,可以优先考虑line-heightvertical-align结合使用,不要忘了还有text-align

小Tips:

1.一般来说,将元素改成inline-block,都要加vertical-align: top

2.inline元素中的非替换元素,对其设置margin-top和margin-bottom是无效的(margin左右有效)

HTML 里的元素分为替换元素(replaced element)和非替换元素(non-replaced element)。

  • 替换元素是指用作为其他内容占位符的一个元素。最典型的就是img,它只是指向一个图像文件。以及大多数表单元素也是替换,例如input等。
  • 非替换元素是指内容包含在文档中的元素。例如,如果一个段落的文本内容都放在该元素本身之内,则这个段落就是一个非替换元素。

讨论margin-top和margin-bottom对行内元素是否起作用,则要对行内替换元素和行内非替换元素分别讨论。

行内替换元素:设置margin-top和margin-bottom是有效的

而非替换元素margin-top和margin-bottom不生效,其原因就在于行内非替换元素的外边距不会改变一个元素的行高。

vertical-align属性生效条件:当一个元素属于inline或是inline-block(table-cell也可以理解为inline-block水平)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,747评论 1 92
  • 收听音频,戳链接,旧号itclan已暂停使用,欢迎关注微信itclanCoder公众号可收听更多音频 前言 关于网...
    itclanCoder阅读 8,163评论 3 30
  • CSS 是什么 css(Cascading Style Sheets),层叠样式表,选择器{属性:值;属性:值}h...
    崔敏嫣阅读 1,478评论 0 5
  • ======= SEO专用 table-cell 定高水平垂直居中 不定高水平垂直居中 单行定高水平垂直居中 单行...
    木白no1阅读 10,403评论 1 15
  • 是我太单纯?还是世界太复杂? 晚上九点50左右我走在新天地的路边, 突然,遇到两个女孩子说自己刚从外地过来,手包忘...
    Andy要过法考阅读 119评论 0 0