位前端開發(fā)者們,你們還在為CSS中的垂直居中問題而頭疼嗎?好消息來了!2024年,CSS終于在默認布局中實現(xiàn)了簡單的垂直居中。讓我們一起來看看這個激動人心的變革,以及它將如何改變我們的開發(fā)方式。
簡單而強大的新方法
在2024年之前,垂直居中一直是前端開發(fā)中的一個痛點。但現(xiàn)在,我們只需要一個CSS屬性就能輕松實現(xiàn):
<div style="align-content: center; height: 100px;">
<code>align-content</code> 就是這么簡單!
</div>
這個簡單的align-content: center;屬性在默認布局中就能工作,無需切換到flexbox或grid布局。這意味著我們可以在不改變現(xiàn)有布局結構的情況下,輕松實現(xiàn)垂直居中。
新方法的優(yōu)勢
這個變化看似簡單,卻是CSS發(fā)展史上的一個重要里程碑。它大大簡化了我們的工作流程,使得頁面布局更加直觀和高效。
在這個革命性的變化之前,開發(fā)者們不得不使用各種"奇技淫巧"來實現(xiàn)垂直居中。讓我們回顧一下這些方法,以更好地理解新方法帶來的便利。
方法1:表格單元格法(Table Cell)
理智度:★★★☆☆
在Flexbox和Grid出現(xiàn)之前,表格布局是最早能實現(xiàn)垂直居中的方法之一。
<div style="display: table;">
<div style="display: table-cell; vertical-align: middle;">
內(nèi)容
</div>
</div>
這種方法的優(yōu)點是兼容性好,但需要額外的HTML結構,不夠直觀。
方法2:絕對定位法(Absolute Positioning)
理智度:☆☆☆☆☆
這種方法使用絕對定位和變換來實現(xiàn)居中:
<div style="position: relative;">
<div style="position: absolute; top: 50%; transform: translateY(-50%);">
內(nèi)容
</div>
</div>
雖然這種方法可以工作,但它繞過了正常的布局流,使用起來較為復雜。
方法3:行內(nèi)內(nèi)容法(Inline Content)
理智度:☆☆☆☆☆
這種方法利用了行內(nèi)元素的垂直對齊特性:
<div class="container">
::before
<div class="content">內(nèi)容</div>
</div>
.container::before {
content: '';
height: 100%;
display: inline-block;
vertical-align: middle;
}
.content {
display: inline-block;
vertical-align: middle;
}
這種方法的缺點是需要使用偽元素,并且可能會產(chǎn)生意外的空白字符。
方法4:單行Flexbox
理智度:★★★☆☆
Flexbox的出現(xiàn)大大簡化了垂直居中的實現(xiàn):
<div style="display: flex; align-items: center;">
<div>內(nèi)容</div>
</div>
或者使用列方向的flex:
<div style="display: flex; flex-flow: column; justify-content: center;">
<div>內(nèi)容</div>
</div>
方法5:多行Flexbox
理智度:★★★☆☆
在多行Flexbox中,我們可以使用align-content來居中內(nèi)容:
<div style="display: flex; flex-flow: row wrap; align-content: center;">
<div>內(nèi)容</div>
</div>
方法6:Grid內(nèi)容對齊
理智度:★★★★☆
Grid布局讓對齊變得更加簡單:
<div style="display: grid; align-content: center;">
<div>內(nèi)容</div>
</div>
方法7:Grid單元格對齊
理智度:★★★★☆
與前一種方法略有不同,這種方法是對單元格內(nèi)的內(nèi)容進行居中:
<div style="display: grid; align-items: center;">
<div>內(nèi)容</div>
</div>
方法8:自動外邊距(Auto Margin)
理智度:★★★☆☆
在Grid和Flexbox布局中,使用自動外邊距可以實現(xiàn)居中:
<div style="display: grid;">
<div style="margin-block: auto;">
內(nèi)容
</div>
</div>
方法9:2024年的新方法
理智度:★★★★★
終于,在2024年,瀏覽器直接支持了最簡單的垂直居中方式:
<div style="align-content: center;">
<code>align-content</code> 就是這么簡單!
</div>
這種方法不需要改變布局模式,直接在默認流布局中就能工作,是目前為止最直觀、最簡單的垂直居中方法。
新的align-content方法與舊方法相比,有以下優(yōu)勢:
這種簡化不僅提高了開發(fā)效率,還降低了出錯的可能性。
CSS的這次更新雖然看似微小,卻代表了Web技術向著更加直觀、易用的方向發(fā)展。它讓我們看到了CSS設計者們在努力簡化開發(fā)流程,提高開發(fā)效率。
作為前端開發(fā)者,應該積極擁抱這些新特性,同時也要記住那些曾經(jīng)幫助我們解決問題的舊方法。畢竟,了解歷史才能更好地把握未來。
讓我們一起期待CSS的未來發(fā)展,相信在不久的將來,我們會擁有更多簡潔而強大的布局工具!
自己是一名從事了多年開發(fā)的web前端老程序員,目前辭職在做自己的web前端私人定制課程,今年年初我花了一個月整理了一份最適合2019年學習的web前端學習干貨,各種框架都有整理,送給每一位前端小伙伴,想要獲取的可以關注我的頭條號并在后臺私信我:前端,即可免費獲取
Html5-CSS之五大居中方式
你是不是也對元素居中的知識點很是模糊?是不是苦于找不到一個總結的通俗易懂的說明?是不是自己懶得去總結?恭喜你,搜到這篇博客! 這是鄙人在前端的學習與實踐中總結出的元素的五大居中方式,黏貼了代碼并對代碼做了解釋,希望對迷茫的有所幫助!
下面的居中示例中,統(tǒng)一使用了同一個div作為父元素和p作為子元素
設置一個div,并且設置了div的寬高邊框,div里面設置一個塊元素p,設置了它的寬高和背景色
css居中方式1
<!doctype html> <html> <head> <meta charset="utf-8"> <title>五大居中1</title> <style> *{margin:0;} div{width:200px;height:300px;border:2px solid #000;margin:200px auto; text-align:center;font-size:0; } div p{width:100px;height:100px;background:#666; display:inline-block;vertical-align:middle; } div:after{content:"";display:inline-block;height:100%;vertical-align:middle;} </style> </head> <body> <div> <p></p> </div> </body> </html>
這里利用了偽元素讓子元素p在div盒子里左右水平居中只需要在它的父元素div里加text-align:center;垂直方向居中需要在父元素后面加了一個偽元素,并使得樣式為inline-block;height:100%;就是和父元素一樣高,vertical-align:middle;垂直居中,也就是p元素相對與偽元素居中,由于偽元素和div一樣高,所以相當于p元素在div里垂直居中。
css居中方式2
<!doctype html> <html> <head> <meta charset="utf-8"> <title>五大居中2</title> <style> *{margin:0;} div{position:relative;width:300px;height:400px;border:1px solid #000;margin:100px auto;} p{position:absolute;left:0;bottom:0;right:0;top:0;margin:auto;width:100px;height:100px;background:#f99;} </style> </head> <body> <div> <p></p> </div> </body> </html>
這里利用了定位居中
子元素p設置position:absolute脫離文檔流,默認以html作為父元素,所以我們給父元素div設置position:relative;使得p以div為父元素做位置的變動,left:0;tight:0;top:0;bottom:0;(只有設置了定位的元素才可以使用這種方式來移動),最后margin:auto;就會水平和垂直都居中。
css居中方式3
<!doctype html> <html> <head> <meta charset="utf-8"> <title>五大居中3</title> <style> *{margin:0;} div{display:flex;justify-content:center;align-items:center;width:300px;height:400px;border:1px solid #000;margin:100px auto;} p{width:100px;height:100px;background:#f99;} </style> </head> <body> <div> <p></p> </div> </body> </html>
這里利用了彈性盒居中
父元素div設置成彈性盒樣式,justify-content:center;主軸居中
align-items:center;垂直居中(而且這兩個只能設置在父元素上,彈性盒知識)
css居中方式4
<!doctype html> <html> <head> <meta charset="utf-8"> <title>五大居中4</title> <style> *{margin:0;} div{position:relative;width:300px;height:400px;border:1px solid #000;margin:100px auto;} p{width:100px;height:100px;background:#f99;position:absolute; left:50%;top:50%;margin:-50px 0 0 -50px;} </style> </head> <body> <div> <p></p> </div> </body> </html>
利用定位線左上角居中,然后左移子元素寬度的一半,再上移子元素高度的一半。
css居中方式5
<!doctype html> <html> <head> <meta charset="utf-8"> <title>五大居中5</title> <style> *{margin:0;} div{position:relative;width:300px;height:400px;border:1px solid #000;margin:100px auto;} p{position:absolute;width:100px;height:100px;background:#f99;left:50%;top:50%; transform:translate(-50%,-50%);} </style> </head> <body> <div> <p></p> </div> </body> </html>
利用動畫移動屬性transform
結語
相信看了上面的有關Html5、css的元素五大居中方式,你們就可以解決自己的小問題了,但是也要養(yǎng)成一個總結的好習慣。好記性不如爛筆頭!以前留下來的話語總是有他的道理。Come on!
原文鏈接:https://blog.csdn.net/qq_38110274/article/details/102756968
素分類
在講解CSS布局之前,我們需要提前知道一些知識,在CSS中,html中的標簽元素大體被分為三種不同的類型:
塊狀元素、內(nèi)聯(lián)元素(又叫行內(nèi)元素)和內(nèi)聯(lián)塊狀元素。
常用的內(nèi)聯(lián)元素有:
<a>、<span>、<br/>、<sub>、<sup>、<label>、<b>、<i>、<u>、<del>
常用的塊狀元素有:
<div>、<p>、<h1>...<h6>、<ol>、<ul>、<li>、<dl>、<dt>、<dl>、<table>、<marquee>、<form>、<pre>
常用的內(nèi)聯(lián)塊狀元素(又叫行內(nèi)塊元素)有:
<img>、<input>
內(nèi)聯(lián)元素(行內(nèi))
在html中,<span>、<a>、<label>、<input>、 <img>、 <strong> 和<em>就是典型的內(nèi)聯(lián)元素(行內(nèi)元素)(inline)元素。
當然塊狀元素也可以通過代碼display:inline將元素設置為內(nèi)聯(lián)元素。如下代碼就是將塊狀元素div轉換為內(nèi)聯(lián)元素,從頁使用div元素具有內(nèi)聯(lián)元素特點。
div{display:inline}
內(nèi)聯(lián)元素(行內(nèi))特點:
1、和其他元素都在一行上;
2、元素的高度、寬度、行高及頂部和底部邊距不可設置;(padding可以設置)
3、元素的寬度就是它包含的文字或圖片的寬度,不可改變。
塊級元素
什么是塊級元素?在html中<div>、<p>、<h1>、<form>、<ul> 和 <li>就是塊級元素。
設置display:block就是將元素顯示為塊級元素。如下代碼就是將內(nèi)聯(lián)元素a轉換為塊狀元素,從而使a元素具有塊狀元素特點。
a{display:block;}
塊級元素特點:
1、每個塊級元素都從新的一行開始,并且其后的元素也另起一行。(真霸道,一個塊級元素獨占一行)
2、元素的高度、寬度、行高以及頂和底邊距都可設置。
3、元素寬度在不設置的情況下,是它本身父容器的100%(和父元素的寬度一致),除非設定一個寬度。
內(nèi)聯(lián)塊狀元素(行內(nèi)塊)
內(nèi)聯(lián)塊狀元素(inline-block)就是同時具備內(nèi)聯(lián)元素、塊狀元素的特點,
代碼display:inline-block就是將元素設置為內(nèi)聯(lián)塊狀元素。(css2.1新增),<img>、<input>標簽就是這種內(nèi)聯(lián)塊狀標簽。
inline-block元素特點:
1、和其他元素都在一行上;
2、元素的高度、寬度、行高以及頂和底邊距都可設置。
提示:下一小節(jié)是用視頻動畫來講解css中的盒模型。
塊元素盡量采用div嵌套, 行內(nèi)元素盡量采用span嵌套
顯示模式的轉換
塊級、行內(nèi) 、行內(nèi)塊元素三者是可以相互轉換的。
display 顯示 的意思
block 塊
inline 行內(nèi)
塊級 → 行內(nèi)元素 display: inline;
<style>
div{
width:100px;
height:100px;
background-color:#036;
display:inline;
}
</style>
行內(nèi)元素 → 塊級元素 display: block;
<style>
a{
width:100px;
height:100px;
background-color:#960;
display:block
}
</style>
行內(nèi)和塊級 → 行內(nèi)塊 display:inline-block;
span{
width:100px;
height:100px;
background-color:#960;
didplay:inline-block;
}
水平居中設置-行內(nèi)元素
如果被設置元素為文本、圖片等行內(nèi)元素時,水平居中是通過給父元素設置text-align:center來實現(xiàn)的。如下代碼:
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"來實現(xiàn)居中的。我們來看個例子就是設置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>
水平居中設置-不定寬塊狀元素
在實際工作中我們會遇到需要為"不定寬度的塊狀元素"設置居中,比如網(wǎng)頁上的分頁導航,因為分頁的數(shù)量是不確定的,所以我們不能通過設置寬度來限制它的彈性。
不定寬度的塊狀元素有三種方法居中(這三種方法目前使用的都比多):
加入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來實現(xiàn)居中效果。如下例子:
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>
這種方法相比第一種方法的優(yōu)勢是不用增加無語義標簽,簡化了標簽的嵌套深度,
但也存在著一些問題:它將塊狀元素的display類型改為inline,變成了行內(nèi)元素,所以少了一些功能,比如設定長度值。
(2)第三種方法:
通過給父元素設置float,然后給父元素設置position:relative和left:50%,子元素設置position:relative和left:-50%來實現(xiàn)水平居中
代碼如下:
<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的形式顯示,優(yōu)點不添加無語議表標簽,不增加嵌套深度,
但它的缺點是設置了position:relative,帶來了一定的副作用。
這三種方法使用得都非常廣泛,各有優(yōu)缺點,具體選用哪種方法,可以視具體情況而定。
隱性改變display類型
有一個有趣的現(xiàn)象就是當為元素(不論之前是什么類型元素,display:none除外)設置以下2個句之一:
position:absolute
float:left或float:right
元素會自動變?yōu)橐詃isplay:inline-block的方式顯示,當然就可以設置元素的width和height了且默認寬度不占滿父元素。
如下面的代碼,小伙伴們都知道a標簽是行內(nèi)元素,所以設置它的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 區(qū)別
text-align 可以讓塊級元素里面的文字內(nèi)容居中對齊.
文字內(nèi)容==(圖片 input 行內(nèi)元素 行內(nèi)塊元素)
但是對于里面的塊級元素無效
讓一個塊級元素居中對齊 : 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{ /*行內(nèi)塊元素的居中方法 */
display:block;
width:600px;
margin:30px auto;
}
.img2{ /*行內(nèi)塊元素的居中方法 */
position:relative;
left:50%;
margin-left:-300px;
}
.form1 input{
width:200px; /*塊容器包裹下的行內(nèi)塊元素居中方法*/
margin:10px auto;
}
.img3{ /*塊容器包裹下的行內(nèi)塊元素居中方法*/
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布局水平居中實戰(zhàn)
方法一: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在表現(xiàn)上類似block元素,但是寬度為內(nèi)容寬。無需設置父元素樣式 (支持 IE 8 及其以上版本) 兼容 IE 8 一下版本需要調(diào)整為<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>
說明:絕對定位脫離文檔流, 不會對后續(xù)元素的布局造成影響。transform為 CSS3 屬性, 有兼容性問題
方法六:flex + justify-content
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。