果 .parent 的 height 不寫,你只需要 padding: 10px 0; 就能將 .child 垂直居中;
如果 .parent 的 height 寫死了,就很難把 .child 居中
忠告:能不寫死高度就不寫死高度
demo地址 https://jsbin.com/cuyifid/edit?html,css,output
使用 table 標簽,自帶的特性可以使元素垂直居中
HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>使用 table 自帶屬性實現垂直居中</title>
</head>
<body>
<table class="parent">
<tr>
<td class="child">
內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容
內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容
內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容內容
</td>
</tr>
</table>
</body>
</html>
復制代碼
CSS
素分類
在講解CSS布局之前,我們需要提前知道一些知識,在CSS中,html中的標簽元素大體被分為三種不同的類型:
塊狀元素、內聯元素(又叫行內元素)和內聯塊狀元素。
常用的內聯元素有:
<a>、<span>、<br/>、<sub>、<sup>、<label>、<b>、<i>、<u>、<del>
常用的塊狀元素有:
<div>、<p>、<h1>...<h6>、<ol>、<ul>、<li>、<dl>、<dt>、<dl>、<table>、<marquee>、<form>、<pre>
常用的內聯塊狀元素(又叫行內塊元素)有:
<img>、<input>
內聯元素(行內)
在html中,<span>、<a>、<label>、<input>、 <img>、 <strong> 和<em>就是典型的內聯元素(行內元素)(inline)元素。
當然塊狀元素也可以通過代碼display:inline將元素設置為內聯元素。如下代碼就是將塊狀元素div轉換為內聯元素,從頁使用div元素具有內聯元素特點。
div{display:inline}
內聯元素(行內)特點:
1、和其他元素都在一行上;
2、元素的高度、寬度、行高及頂部和底部邊距不可設置;(padding可以設置)
3、元素的寬度就是它包含的文字或圖片的寬度,不可改變。
塊級元素
什么是塊級元素?在html中<div>、<p>、<h1>、<form>、<ul> 和 <li>就是塊級元素。
設置display:block就是將元素顯示為塊級元素。如下代碼就是將內聯元素a轉換為塊狀元素,從而使a元素具有塊狀元素特點。
a{display:block;}
塊級元素特點:
1、每個塊級元素都從新的一行開始,并且其后的元素也另起一行。(真霸道,一個塊級元素獨占一行)
2、元素的高度、寬度、行高以及頂和底邊距都可設置。
3、元素寬度在不設置的情況下,是它本身父容器的100%(和父元素的寬度一致),除非設定一個寬度。
內聯塊狀元素(行內塊)
內聯塊狀元素(inline-block)就是同時具備內聯元素、塊狀元素的特點,
代碼display:inline-block就是將元素設置為內聯塊狀元素。(css2.1新增),<img>、<input>標簽就是這種內聯塊狀標簽。
inline-block元素特點:
1、和其他元素都在一行上;
2、元素的高度、寬度、行高以及頂和底邊距都可設置。
提示:下一小節是用視頻動畫來講解css中的盒模型。
塊元素盡量采用div嵌套, 行內元素盡量采用span嵌套
顯示模式的轉換
塊級、行內 、行內塊元素三者是可以相互轉換的。
display 顯示 的意思
block 塊
inline 行內
塊級 → 行內元素 display: inline;
<style>
div{
width:100px;
height:100px;
background-color:#036;
display:inline;
}
</style>
行內元素 → 塊級元素 display: block;
<style>
a{
width:100px;
height:100px;
background-color:#960;
display:block
}
</style>
行內和塊級 → 行內塊 display:inline-block;
span{
width:100px;
height:100px;
background-color:#960;
didplay:inline-block;
}
水平居中設置-行內元素
如果被設置元素為文本、圖片等行內元素時,水平居中是通過給父元素設置text-align:center來實現的。如下代碼:
html代碼:
<body>
<div class="txtCenter">我是文本,哈哈,我想要在父容器中水平居中顯示。</div>
<div class="imgCenter"><img src="http://img.mukewang.com/52da54ed0001ecfa04120172.jpg" /></div>
</body>
css代碼:
<style>
div.txtCenter{
text-align:center;
}
div.imgCenter{
text-align:center;
}
</style>
水平居中設置-定寬塊狀元素
當被設置元素為塊狀元素時用text-align:center就不起作用了,這時也分兩種情況:定寬塊狀元素和不定寬塊狀元素。
滿足定寬和塊狀兩個條件的元素是可以通過設置"左右margin"值為"auto"來實現居中的。我們來看個例子就是設置div這個塊狀元素水平居中:
第一種方法
html代碼:
<body>
<div>我是定寬塊狀元素,哈哈,我要水平居中顯示。</div>
</body>
css代碼:
<style>
div{
border:1px solid red;/*為了顯示居中效果明顯為 div 設置了邊框*/
width:500px;/*定寬*/
margin:20px auto;/* margin-left 與 margin-right 設置為 auto */
}
</style>
也可以寫成:
margin-left:auto;
margin-right:auto;
注意:元素的"上下margin"是可以隨意設置的。這種水平居中的方法兩個2個條件缺一不可
第二種方法
html代碼:
<body>
<div>我是定寬塊狀元素,哈哈,我要水平居中顯示。</div>
</body>
css代碼:
<style>
div{
border:1px solid red;/*為了顯示居中效果明顯為 div 設置了邊框*/
width:500px;/*定寬*/
position:absoute;
left:50px;
margin-left:-25px;
}
</style>
水平居中設置-不定寬塊狀元素
在實際工作中我們會遇到需要為"不定寬度的塊狀元素"設置居中,比如網頁上的分頁導航,因為分頁的數量是不確定的,所以我們不能通過設置寬度來限制它的彈性。
不定寬度的塊狀元素有三種方法居中(這三種方法目前使用的都比多):
加入table標簽
設置display;inline方法
設置position:relative和left:50%;
(1)第一種方法:
第一步:為需要設置的居中的元素外面加入一個table標簽(包括<tbody>、<tr>、<td>)。
第二步:為這個table設置"左右margin auto"(這個和定寬塊狀元素的方法一樣)。舉例如下:
html代碼:
<div>
<table>
<tbody>
<tr><td>
<ul>
<li><a href="#">1</a></li>
<li><a href="#">2</a></li>
<li><a href="#">3</a></li>
</ul>
</td></tr>
</tbody>
</table>
</div>
css代碼:
<style>
table{
margin:0 auto;
}
ul{list-style:none;margin:0;padding:0;}
li{float:left;display:inline;margin-right:8px;}
</style>
(2)第二種方法:
改變塊級元素的dispaly為inline類型,然后使用text-align:center來實現居中效果。如下例子:
html代碼:
<body>
<div class="container">
<ul>
<li><a href="#">1</a></li>
<li><a href="#">2</a></li>
<li><a href="#">3</a></li>
</ul>
</div>
</body>
css代碼:
<style>
.container{
text-align:center;
}
.container ul{
list-style:none;
margin:0;
padding:0;
display:inline;
}
.container li{
margin-right:8px;
display:inline;
}
</style>
這種方法相比第一種方法的優勢是不用增加無語義標簽,簡化了標簽的嵌套深度,
但也存在著一些問題:它將塊狀元素的display類型改為inline,變成了行內元素,所以少了一些功能,比如設定長度值。
(2)第三種方法:
通過給父元素設置float,然后給父元素設置position:relative和left:50%,子元素設置position:relative和left:-50%來實現水平居中
代碼如下:
<body>
<div class="container">
<ul>
<li><a href="#">1</a></li>
<li><a href="#">2</a></li>
<li><a href="#">3</a></li>
</ul>
</div>
</body>
css代碼:
<style>
.container{
float:left;
position:relative;
left:50%
}
.container ul{
list-style:none;
margin:0;
padding:0;
position:relative;
left:-50%;
}
.container li{float:left;display:inline;margin-right:8px;}
</style>
這種方法可以保留塊狀元素仍以display:block的形式顯示,優點不添加無語議表標簽,不增加嵌套深度,
但它的缺點是設置了position:relative,帶來了一定的副作用。
這三種方法使用得都非常廣泛,各有優缺點,具體選用哪種方法,可以視具體情況而定。
隱性改變display類型
有一個有趣的現象就是當為元素(不論之前是什么類型元素,display:none除外)設置以下2個句之一:
position:absolute
float:left或float:right
元素會自動變為以display:inline-block的方式顯示,當然就可以設置元素的width和height了且默認寬度不占滿父元素。
如下面的代碼,小伙伴們都知道a標簽是行內元素,所以設置它的width是沒有效果的,但是設置為position:absolute以后,就可以了。
<div class="container">
<a href="#" title="">進入課程請單擊這里</a>
</div>
css代碼
<style>
.container a{
position:absolute;
width:200px;
background:#ccc;
}
</style>
如何讓一段文字水平居中且垂直居中
<div>水平垂直居中</div>
div{
width:200px;height:200px; /*設置div的大小*/
border:1px solid green; /*邊框*/
text-align: center; /*文字水平居中對齊*/
line-height: 200px; /*設置文字行距等于div的高度*/
overflow:hidden;
}
text-align 和margin auto 區別
text-align 可以讓塊級元素里面的文字內容居中對齊.
文字內容==(圖片 input 行內元素 行內塊元素)
但是對于里面的塊級元素無效
讓一個塊級元素居中對齊 : margin:0 auto;
【實例】
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>趙麗穎的圖片</title>
<style type="text/css">
body{
text-align:center; /* 所有的元素居中 */
}
div{ /*塊元素的居中方法*/
width:600px;
margin:30px auto;
}
.img1{ /*行內塊元素的居中方法 */
display:block;
width:600px;
margin:30px auto;
}
.img2{ /*行內塊元素的居中方法 */
position:relative;
left:50%;
margin-left:-300px;
}
.form1 input{
width:200px; /*塊容器包裹下的行內塊元素居中方法*/
margin:10px auto;
}
.img3{ /*塊容器包裹下的行內塊元素居中方法*/
text-align:center;
}
</style>
</head>
<body>
<div><img src="../../photo/趙麗穎.jpeg" /></div>
<img class="img1" src="../../photo/趙麗穎.jpeg" />
<img class="img2" src="../../photo/趙麗穎.jpeg" />
<div class="form1">
<form action="" method="get" accept-charset="utf-8">
<label>電子郵箱: <input type="text" name="email" value="" placeholder="請輸入電子郵箱"/></label><br/>
<label>密碼: <input type="password" name="password"/></label><br/>
<label for="address">地址</label>
<input type="text" name="address" id="address" placeholder="請輸入地址" />
</form>
</div>
<div class="img3">
<img src="../../photo/趙麗穎.jpeg" />
</div>
</body>
</html>
CSS布局水平居中實戰
方法一:margin + width
<!Doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<title>css布局水平居中margin + width</title>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
.box {
width: 100px;
margin: 0 auto;
background: red;
}
</style>
</head>
<body>
<div class="box">Demo</div>
</body>
</html>
說明:這個水平居中方法, 我們最熟悉了, 也是最常用的, width可以固定px也可以使用百分比
方法二:table + margin
<!Doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<title>css布局水平居中table + margin</title>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
.box {
display: table;
margin: 0 auto;
background: red;
}
</style>
</head>
<body>
<div class="box">Demo</div>
</body>
</html>
說明:display: table在表現上類似block元素,但是寬度為內容寬。無需設置父元素樣式 (支持 IE 8 及其以上版本) 兼容 IE 8 一下版本需要調整為<table>
方法三:inline-block + text-align
<!Doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<title>css布局水平居中inline-block + text-align</title>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
.content {
text-align: center;
}
.box {
display: inline-block;
background: red;
}
</style>
</head>
<body>
<div class="content">
<div class="box">Demo</div>
</div>
</body>
</html>
說明:兼容性佳(甚至可以兼容 IE 6 和 IE 7)
方法四:absolute + margin-left
<!Doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<title>css布局水平居中absolute + margin-left</title>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
.content {
position: relative;
}
.box {
position: absolute;
left: 50%;
width: 100px;
margin-left: -50px;
background: red;
}
</style>
</head>
<body>
<div class="content">
<div class="box">Demo</div>
</div>
</body>
</html>
說明:寬度固定相比于使用transform, 有兼容性更好
方法五:absolute + transform
<!Doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<title>css布局水平居中absolute + transform</title>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
.content {
position: relative;
}
.box {
position: absolute;
left: 50%;
transform: translateX(-50%);
background: red;
}
</style>
</head>
<body>
<div class="content">
<div class="box">Demo</div>
</div>
</body>
</html>
說明:絕對定位脫離文檔流, 不會對后續元素的布局造成影響。transform為 CSS3 屬性, 有兼容性問題
方法六:flex + justify-content
面布局中最常見的需求就是元素或者文字居中了,但是根據場景的不同,居中也有簡單到復雜各種不同的實現方式,本篇就帶大家一起了解下,各種場景下,該如何使用 CSS 實現居中
頁面布局中最常見的需求就是元素或者文字居中了,但是根據場景的不同,居中也有簡單到復雜各種不同的實現方式,有的特定場景下可能還有一些稀奇古怪的bug,本篇就帶大家一起了解下,各種場景下,該如何使用 CSS 實現居中
根據應用場景,我們把居中的需求分為與盒子相關的居中和內容相關的居中,盒子相關的居中比較好理解,也是我們比較常見的應用場景,內容相關實際也很常用,只是平時注意得比較少,但如果對概念理解不清晰,實現出來的效果可能經常會偏差那么一丟丟,然后就開始窮舉法解決問題了,這里也是我們本次討論的重點
盒子模型相關的居中基本上可以根據盒子有沒有給定寬高度分為分為兩大類
我們先預設一下頁面結構設置樣式
<div class="parent">
<div class="children"></div>
</div>
給定寬高的場景比較簡單,能獲取到元素的寬高那么直接計算子元素需要的偏移量就可以了,或者借助表格元table-cell現居中,但是大部分時候我們遇到的場景是不確定,并且不確定的解決方案可以向下兼容給定寬高的,這里就不過多贅敘了,直接看下一種情況
寬高不固定時,主流的解決方案有兩種,一種是使用彈性布局,另一種是使用定位
.parent {
display: flex;
justify-content: center;
align-items: center;
}
.children {
position: relative;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.parent {
position: relative;
}
.children {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
基本現在瀏覽器對彈性布局的支持已經很好了,也是主流的居中解決方案,放心用即可
提到內容,最常想到的就是文字,圖片,icon這些,這些元素的對齊大部分時候都是根據基準線來實現的baseline,可以使用設置行高line-height(這種方案有瑕疵,后面會詳細介紹),文字居中屬性text-align來實現,當然也可以轉換成彈性布局來實現居中,都是可以的
這里我們舉一個稍微特殊點的案例來進行分析,看應該如何進行居中
結構
<div class="parent">
<span class="children1">HelloWorld</span>
<span class="children2">世界你好</span>
</div>
樣式
.parent {
width: 100%;
height: 100px;
background-color: aquamarine;
}
.children1 {
font-size: 42px;
background-color: red;
}
.children2 {
font-size: 18px;
background-color: yellow;
}
.parent {
display: flex;
justify-content: center;
align-items: center;
}
簡單省心,達到效果
.parent {
line-height: 100px;
text-align: center;
}
這個時候就會發現,水平方向使用text-align來居中沒有問題,但是垂直方向出來的效果就和預想的有偏差了,我們先來分析為什么會這樣
line-height 等于元素高度的時候文本并不是真的居中了,而是看著居中了,當元素高度和font-size差距較大的時候,這種不是真正的居中就越發的明顯
line-height,指的是兩行文字基線之間的距離(這說法實際有點爭議,也可以字面理解就行的高度),如果 line-height 剛好等于盒子的高度,那么意味著基線就在盒子一半的位置,這樣就實現了內容的垂直居中
我們在用line-height實現文字垂直居中的時候,有個前提,一個是單行元素,另外沒有多種內聯元素(不同大小的圖片,文字,icon等等),不然你會在對齊內聯元素的時候遇到很多麻煩
那么如何解決這個問題呢,首先要了解,行內元素在垂直方向的定位,是基于什么,先來看一張圖,可能大家在其它地方也看過,輔助我們理解
在父元素定義了line-height的條件下,vertical-align的作用是讓(inline/inline-block)子元素依據父元素的基點對齊。
根據上圖示意,不難看出,不管文字的大小,它們都是基于基線(baseline)來確定垂直方向的定位(可看helloWorld和世界你好的底部是在同一水平線的)
看到這里有的同學應該就想到了,可以通過設置vertical-align修改對齊方式不就好了嗎?我們來試試先把世界你好的設置下vertical-align: middle試一試
可以看到耶,為什么沒有效果,這時可能同學就要急了,但先別急,你在把HelloWorld也設置一下試試
.children1 {
font-size: 42px;
background-color: red;
vertical-align: middle;
}
.children2 {
font-size: 24px;
background-color: yellow;
vertical-align: middle;
}
這個時候效果就出來了,怎么樣,是不是很神奇~
我們再來一起看 vertical-align
vertical-align 屬性設置元素的垂直對齊方式。該屬性定義行內元素的基線相對于該元素所在行的基線的垂直對齊
如果我們只設置一個元素的 vertical-align 屬性的化,那么就是后設置的和前面的對齊,我們可以把這兩個大小字體調換下順序,然后單獨給HelloWorld設置middle
可以看到這個字體是有點向下偏移一點點,原因就是這時它是跟小字號的baseline對齊了
我們同樣把兩個都設置成middle再看下
這時就正常啦~簡單總結一下,就是在使用vertical-align這個屬性進行垂直對齊居中時,一定要注意,如果有多個元素,一定要保證他們的基準線是一致的,這樣才能達到我們想要的效果
*請認真填寫需求信息,我們會在24小時內與您取得聯系。