CSS系列篇:居中的实现以及使用场景

前言

总结实现水平方向、垂直方向的元素居中的方法以及应用场景。

一、水平居中

场景:行内元素的水平居中——在父元素中设置:text-align:center;
  场景:元素内部文字水平居中--在元素中设置:text-align:center;**
  具体例子:
  注意,例子中a标签是行内元素,padding的设置对其本身高度没有影响,左右padding生效,上下padding不生效。这是需要设置其为display:inline-block才能让padding的设置生效。

设置为inline-block后上下padding生效.png
二、块级元素的水平居中

场景:块级元素的水平居中
方法:设定宽度值,然后设置margin:0 auto。先设定宽度值,让块级元素不会占满整行宽度,然后margin的auto设置才生效。
如果还需要设定块级元素内部文字居中,就再使用text-align:center
具体例子:

Paste_Image.png

页面居中布局:

Paste_Image.png

三、vertical-align实现的单行图片居中

说明:vertical-align这个属性,是只对行内元素和table-cell才起效果。设置元素的基准线:top/bottom/middle。
  应用场景:父容器只包含一个图片img,父容器高度不固定,是可变的,要让图片垂直居中
  因为vertical-align这个属性,是只对行内元素和table-cell才起效果这个特性,对于img这个行内元素生效,设置为vertical-align:middle。然后可以在图片img前面通过伪元素插入一个行内元素,设置为inline-block,设置其高度和父元素高度一样,然后设置为vertical-align:middle,这样两个元素都是基线中间对准,就实现图片的居中。

Paste_Image.png
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  <div class="box">
    ![](http://upload-images.jianshu.io/upload_images/4476214-9643bf12056c7a5a.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  </div>
</body>
</html>

/*样式设置*/
.box{
  border:1px solid black;
  width:400px;
  height:400px;
  text-align:center;
}

.box:before{
  content:" ";
  display:inline-block;
  height:100%;
  vertical-align:middle;
}

.box img{
  width:300px;
  height:260px;
  vertical-align:middle;
}
Paste_Image.png

四、table-cell实现居中

场景:利用table-cell表格可以使用vertical-align的特性,将元素display为table-cell,但这样也会有相应的副作用,成为一个表格。这个方法的使用看具体情况而定,设置display:table-cell没有别的副作用的话,就可以使用。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  <div class="box">
    ![](http://upload-images.jianshu.io/upload_images/4476214-9643bf12056c7a5a.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  </div>
</body>
</html>
/*样式设置*/
.box{
  border:1px solid black;
  width:400px;
  height:400px;
  text-align:center;
  display:table-cell;
  vertical-align:middle;
}

.box img{
  width:300px;
  height:260px;
}

五、垂直居中

这一类型的实现,方法的选择需要根据具体场景而来,而非一味套用同一种方法。
  1、场景一:对于元素中的文字内容会不断增加,然后还要保证不管加多少文字,都还是居中。
  方法:只需要在元素不设定高度值的情况下,简单设置上下padding值相等就行。

Paste_Image.png
Paste_Image.png

一般而言,不要刻意给元素设定高度,让其由内容撑开,这样做比较好。

2、场景二:单行元素的垂直居中
  方法:设置高度值和行高值相等就行

<div class="btn">
      <a>hello world</a>
 </div>

/*样式设置如下:*/
.btn{
  text-align:center;
  color:#fff;
  background-color:red;
  border:none;
  height:80px;
  line-height:80px;
}
Paste_Image.png
六、垂直水平绝对居中

1、情景一:父元素的宽度不是固定的,比如页面宽度。在任何宽度的显示器打开,内容都是垂直水平居中的。
  方法这种应用场景的实现就需要借助:绝对定位,然后设置top/left为50%,然后设置margin-left和margin-top为宽高的各一半大小。
  然后不管屏幕大小怎么缩小放大变化,子元素永远都是在垂直水平居中位置。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
  <style>
    .wrapper{
      position:absolute;
      top:0;
      left:0;
      right:0;
      bottom:0;
      background-color:pink;
    }
    .mid{
      position:absolute;
      width:200px;
      height:200px;
      background-color:#fff;
      top:50%;
      left:50%;
      margin-left:-100px;
      margin-top:-100px;
    }
  </style>
</head>
<body>
    <div class="wrapper">
      <div class="mid">
      </div>
    </div>
</body>
</html>
Paste_Image.png

实现效果:

Paste_Image.png

情景二:父元素固定宽高,子元素也固定宽高,实现子元素垂直水平绝对居中

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  <div class="wrapper">
    <div class="box"></div>
  </div>
</body>
</html>
/*样式设置*/
.wrapper{
  position:relative;
  width:400px;
  height:400px;
  border:1px solid black;
}
.box{
  position:absolute;
  width:200px;
  height:200px;
  border:1px solid red;
  top:50%;
  left:50%;
  margin-left:-100px;
  margin-top:-100px;
}

效果截图:

Paste_Image.png

情景三:如果子元素的宽高不确定,根据子元素内的内容来撑开宽高的。那么要怎么保证子元素居中呢?这时候用到CSS3的属性:transform:translate(-50%,-50%);
具体实现:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
  <style>
    .wrapper{
      position:absolute;
      top:0;
      left:0;
      right:0;
      bottom:0;
      background-color:pink;
    }
    .mid{
      position:absolute;
      background-color:#fff;
      top:50%;
      left:50%;
      /*CSS3属性的实现*/
      transform:translate(-50%,-50%); 
      /*没有width和height,无需再设置margin-left和margin-top的大小了*/
      text-align:center;
    }
  </style>
</head>
<body>
    <div class="wrapper">
      <div class="mid">
        <h1>hahahahahhahah</h1>
        <h1>haha</h1>
        <h1>haha</h1>
      </div>
    </div>
</body>
</html>

实现效果:


Paste_Image.png

平时用惯了这种“父相子绝”的用法,会忽略我大多数时候的用法都是父元素固定宽高,子元素固定宽高的情况下使用的。会以为这种方法下,子元素是能撑开父元素的,忘了实际是父元素本身的宽高的撑开,而子元素设置为position:absolute则是已经脱离文档流了,只能保证它在父元素的位置范围内,而无法撑开高度。今天因为忽略这一点,一直在找撑开父元素的方法,但其实是不合理的。
  面对这种需求:父元素使用相对定位relative,子元素使用绝对定位absolute,这个时候子元素脱离了文档流,父元素的高度是0,想要用CSS方法,让父元素的高度根据子元素的高度自适应,让父元素被撑开。以后就要记得是无法实现的,要用JS的方法
  JS方法,是将子元素的高度值赋值给父元素的高度,才将其撑开。

七、扩展:全屏方式的实现:

1、实现方式一

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
    <div class="wrapper">
      <div class="mid">
      </div>
    </div>
    <div class="wrapper wr2">
      <div class="mid">
      </div>
    </div>
</body>
</html>
/*样式设置*/
*{
  margin:0;
  padding:0;
}
body,html{
  height:100%;  /*父元素的根节点高度也进行设置*/
}
.wrapper{
  height:100%;
  background-color:blue; /*和父元素的高度相同*/
}
.wr2{
  background-color:pink;
}

这样就能实现全屏,多屏滚动,每屏都是全屏幕的效果:

滚动至中间截图

2、实现方法二:单屏的全屏
不需要滚动,只需要占据屏幕全屏的做法:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
    <div class="wrapper">
      <div class="mid">
      </div>
    </div>
</body>
</html>
/*样式设置*/
.wrapper{
  position:absolute;
  top:0;
  left:0;
  right:0;
  bottom:0;
  background-color:pink;
}

这种方法,不再需要设置任何宽高,只需要设定绝对定位,top/left/bottom/right都设置为0即可

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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,703评论 1 92
  • 收听音频,戳链接,旧号itclan已暂停使用,欢迎关注微信itclanCoder公众号可收听更多音频 前言 关于网...
    itclanCoder阅读 8,143评论 3 30
  • 前言 温馨提示:本文较长,图片较多,本来是想写一篇 CSS 布局方式的,但是奈何 CSS 布局方式种类太多并且实现...
    sunshine小小倩阅读 3,097评论 0 59
  • CSS格式化排版 1、字体 我们可以使用css样式为网页中的文字设置字体、字号、颜色等样式属性。下面我们来看一个例...
    张文靖同学阅读 1,264评论 0 3
  • 1、 一个人坐上出租汽车,当接近自己家时,发现身上已分文不剩。 “在这里停下,”他喊道,“我到路旁的小卖店买包香烟...
    十年后的我阅读 176评论 0 0