居中和布局

水平居中

分子元素是行内元素还是快状元素。

1、行内元素:在父元素上设置text-align:center
2、定宽快状元素:在该元素上设置margin:auto
3、不定宽块状元素: 设置子元素为display:inline,然后在父元素上设置text-align:center;
4、通用方案: flex布局,对父元素设置display:flex;justify-content:center;

垂直居中

1、父元素一定,子元素为单行内联文本:设置父元素的height等于行高line-height
2、父元素一定,子元素为多行内联文本:设置父元素的display:table-cell,再设置vertical-align:middle;父亲是body也适用

//多行内联html
<div class="d">
       <span>ddff</span>
       <span>ddfs</span>
       <span>ddsa</span>
       <span>ddgg</span>
   </div>
//css
.d{
    width: 100px;
    height: 100px;
    border: 1px solid;
  }

.d {
    display: table-cell;
    vertical-align:middle;
}

多行内联垂直居中.png

多行内联,使用伪元素垂直居中

//css
.ghost-center {
  position: relative;
  width: 200px;
  height: 300px;
  border: 1px solid;
}
.ghost-center::before {
  content: " ";
  display: inline-block;
  height: 100%;
  width: 1%;
  vertical-align: middle;
}
.ghost-center p {
  display: inline-block;
  vertical-align: middle;
}
//dom
<div class="ghost-center">
    <p>dfdfdfsf</p>
    <p>fdsffsaf</p>
</div>

3、定宽块状元素:父元素设置position:relative,设置子元素position:absolute,然后设置margin:auto;left: 0; right: 0;,若水平也居中则设置top :0 ; bottom: 0;

//html
<div class="d">
       <div class="c">f</div>
   </div>
//css
.d{
    position: relative;
 width: 100px;
    height: 100px;
    border: 1px solid;
}
.c{
    width: 10px;
    height: 10px;
    position: absolute;
    left: 0;//垂直居中
    right: 0;
    /*top :0;水平居中
    bottom: 0;*/
    margin: auto;
}

4、通用方案: flex布局,给父元素设置{display:flex; align-items:center;}
5、使用伪元素:brfore,:after实现水平垂直居中

//html
<div class="p"></div>
//css
.p{
    position: relative;
}
.p:before{
    content: '';
    position: absolute;
    top:50%;
    left: 0;
   width: 100%;
   border: 1px solid #fc0;
   
}
.p:after{
 content: '';
    position: absolute;
    top:0;
    left: 50%;
   height: 100%;
   border: 1px solid #fc0;
}

图片.png

垂直水平居中(父亲是body也适用,其他方法在父亲是body的时候,垂直居中不适用)
1、元素宽高不定
父亲相对定位,孩子绝对定位,top,left各50%,然后相对自身移动一半

//dom
<div id="bd">         
    <div class="main">main</div>        
</div> 
//css
#bd{
    position: relative;
    height: 100px;
    width: 100px;
    border: 1px solid;
}
.main{
    position: absolute;
    top:50%;
    left: 50%;
    transform: translate(-50%,-50%); 
}

2、元素宽高一定

.parent {
  position: relative;
}

.child {
  width: 300px;
  height: 100px;
  padding: 20px;

  position: absolute;
  top: 50%;
  left: 50%;

  margin: -70px 0 0 -170px;
}

单栏布局

1、headercontentfooter宽度都相同,其一般不会占满浏览器的最宽宽度,但当浏览器宽度缩小低于其最大宽度时,宽度会自适应.
headercontentfooter统一设置width或max-width,并通过margin:auto实现居中。

//html
<header class="com">头部</header>
<div id="content" class="com">内容</div>
 <footer class="com">脚步</footer>
//css
.com{
    max-width: 900px;
    border:1px solid;
    margin: auto;
}

2、headerfooter宽度相同且为浏览器宽度width:100%;,但其内容与content宽度相同。

//html
 <header  id="header">
            <div class="com">头部内容</div>
        </header>
        <div id="content" class="com">内容</div>
        <footer id="footer">
            <div class="com">脚部内容</div>
        </footer>
//css
.com{
    max-width: 900px;//浏览器宽度小于900px,自适应
    border:1px solid;
    margin: auto;

}
#header,#footer{
    width:100%;
    border:1px solid;
}

二栏&三栏布局


三栏布局去掉一栏可看成二栏布局
1、float+margin
原理:两侧边栏左右浮动,中栏间主给左右腾出边距,不设置中间宽度即可实现宽度自适应。

//css
.sub{
    width: 100px;
    float: left;
    background: red;
}
.extra{
    width: 200px;
    float: right;
    background: red;

}
.main{
    margin-left: 100px; 
    margin-right: 200px;
    background: green;

}
//html
 <div id="content"> 
    <div class="sub">sub</div>
    <div class="extra">extra</div>
   <div class="main">main</div>
</div>

注意

  • dom中左右侧边栏的书写要在主栏之前,否则不在一行上。float浮动脱离文档流
  • 这种布局方式比较简单明了,但缺点是渲染时先渲染了侧边栏,而不是比较重要的主面板。
  • 去掉任意一个侧边栏,可变成两栏布局

    2、 position+margin
    原理说明左右侧边栏使用绝对定位,left,right设为0,设置top:0,主板设置边距腾出侧边栏的宽度。
//css
 <style>
    #content{
        position: relative;
    }
.sub, .extra {
    position: absolute;
    top: 0; 
    width: 200px;
    background-color: red;
}
.sub { 
    left: 0;
}
.extra { 
    right: 0; 
}
.main { 
    margin: 0 200px;
    background: green;
}
 //html
<div id="content"> 
   <div class="sub">left</div>
<div class="main">main</div>
<div class="extra">right</div>
</div>
}


注意,当左右边栏设置top:0时,不需要让主栏写在最后,但是没有该设置时,要注意顺序,同float+margin

  • 与上一种方法相比,本种方法是通过定位来实现侧栏的位置固定。
  • 如果中间栏含有最小宽度限制,或是含有宽度的内部元素,则浏览器窗口小到一定程度,主面板与侧栏会发生重叠。
    3、圣杯布局(float+负margin+padding+position)
    原理说明:div容器包裹主板、左、右(dom是此顺序)三栏,三者均float:left。主板宽度100%,左栏margin:-100%(相对于父框),此时左栏左侧和main对齐,然后左栏设置position:relative,负left左栏宽度。右栏设置负margin:右栏宽度,此时右栏跑到上册,右对齐main,然后设置position:relative,负right:右栏宽度。设置父边框padding,腾出左右位置。
    dom
 <div id="bd">         
    <div class="main"></div>        
    <div class="sub"></div>        
    <div class="extra"></div>  
</div>

css

.main {        
    float: left;       
    width: 100%;   
 }  
 .sub {       
    float: left;        
    width: 190px;        
    margin-left: -100%;               
    position: relative;  
    left: -190px;  
}   
.extra {        
    float: left;        
    width: 230px;        
    margin-left: -230px; 
    position: relative; 
    right: -230px;  
 }
#bd {        
    padding: 0 230px 0 190px;   
 }
  • DOM元素的书写顺序不得更改。
  • 当面板的main内容部分比两边的子面板宽度小的时候,布局就会乱掉。可以通过设置父元素的min-width属性或使用双飞翼布局避免问题。
    使用flex进行圣杯布局,不会出现浏览器宽度不够,布局破坏的现象
//dom
<div id="bd">         
    <div class="main">main</div>        
    <div class="sub">l</div>        
    <div class="extra">r</div>  
</div>
//css
#bd{
    display: flex;
}
.main{
    flex:1;
    background: red;
}
.sub,.extra{
    flex:0 0 200px;
    background: green;
}
.sub{
    order: -1;
}

4、双飞翼布局(float+负margin+margin)
原理说明:双飞翼布局和圣杯布局的思想有些相似,都利用了浮动和负边距,但双飞翼布局在圣杯布局上做了改进,在main元素上加了一层div, 并设置margin,由于两侧栏的负边距都是相对于main-wrap而言,main的margin值变化便不会影响两个侧栏,因此省掉了对两侧栏设置相对布局的步骤

布局步骤:
1、三者都设置向左浮动。
2、 设置main-wrap宽度为100%,设置两个侧栏的宽度。
3、设置 负边距,sub设置负左边距为100%,extra设置负左边距为负的自身宽度。
4、设置main的margin值给左右两个子面板留出空间。

//dom
<div id="main-wrap" class="column">
      <div id="main">#main</div>
</div>
<div class="sub"></div>        
<div class="extra"></div>

//css
.main-wrap {        
    float: left;       
    width: 100%;   
 }  
 .sub {       
    float: left;        
    width: 190px;        
    margin-left: -100%;   
}   
.extra {        
    float: left;        
    width: 230px;        
    margin-left: -230px; 
 }
.main {    
    margin: 0 230px 0 190px;
}

圣杯采用的是padding,而双飞翼采用的margin,解决了圣杯布局main的最小宽度不能小于左侧栏的缺点。
双飞翼布局不用设置相对布局,以及对应的left和right值。

参考资料:
CSS布局十八般武艺都在这里了
CSS布局十八般武艺都在这里了

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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,703评论 1 92
  • 移动开发基本知识点 一.使用rem作为单位 html { font-size: 100px; } @media(m...
    横冲直撞666阅读 3,438评论 0 6
  • H5移动端知识点总结 阅读目录 移动开发基本知识点 calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇阅读 4,360评论 0 26
  • 前言 温馨提示:本文较长,图片较多,本来是想写一篇 CSS 布局方式的,但是奈何 CSS 布局方式种类太多并且实现...
    sunshine小小倩阅读 3,097评论 0 59
  • 收听音频,戳链接,旧号itclan已暂停使用,欢迎关注微信itclanCoder公众号可收听更多音频 前言 关于网...
    itclanCoder阅读 8,143评论 3 30