前端面試題:CSS實現水平垂直居中


這是一個挺常見的前端面試題,但是沒有做過總結。有的時候可能會使用完了,很長一段時間不去使用,會慢慢忘記。所以,溫故而知新,還是很有必要的。

一、絕對定位元素的居中實現

這一種工作中用的應該是最多的,兼容性也是很好。

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <title>絕對定位元素的居中實現margin</title>
 8     <style>
 9         .center-vertical{
10             width: 100px;
11             height: 100px;
12             background: orange;
13             position: absolute;
14             top: 50%;
15             left: 50%;
16             margin-top: -50px; /*高度的一半*/
17             margin-left: -50px; /寬度的一半*/
18         }
19     </style>
20 </head>
21 <body>
22     <div class="center-vertical"></div>
23 </body>
24 </html>

效果:

缺點:需要提前知道元素的尺寸。如果不知道元素尺寸,這個時候就需要JS獲取了。

CSS3.0的興起,使這個問題有了更好的解決方法,就是使用 transform 代替 margin 。

transform 中 translate 偏移的百分比是相對於自身大小而說的。

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <title>未知寬高的元素水平垂直居中transform</title>
 8     <style>
 9     .content{
10         background: orange;
11         position: absolute;
12         top: 50%;
13         left: 50%;
14         transform: translate( -50%, -50%);
15     }
16     </style>
17 </head>
18 <body>
19     <div class="content">你復合1233肥反反復復</div>
20 </body>
21 </html>

效果:

優點:無論絕對定位元素的尺寸是多少,它都是水平垂直居中顯示的。

缺點:就是兼容性問題。

 二、margin: auto;實現絕對定位元素的居中

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <title>margin:auto實現絕對定位元素的居中</title>
 8     <style>
 9     .center-vertical{
10         width: 100px;
11         height: 100px;
12         background: orange;
13         position: absolute;
14         top: 0;
15         left: 0;
16         right: 0;
17         bottom: 0;
18         margin: auto;
19     }
20     </style>
21 </head>
22 <body>
23     <div class="center-vertical"></div>
24 </body>
25 </html>

效果:

注意:

上下左右均為 0 位置絕對定位。

margin: auto;

三、CSS3.0彈性布局

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <title>水平垂直居中==彈性布局</title>
 8     <style>
 9     html,body{
10         width: 100%;
11         height: 100%;
12         margin: 0;
13         padding: 0;
14     }
15     body{
16         display: flex;
17         align-items: center;/*定義body的元素垂直居中*/
18         justify-content: center;/*定義body的元素水平居中*/
19     }
20     .content{
21         width: 300px;
22         height: 300px;
23         background: orange;
24     }
25     </style>
26 </head>
27 <body>
28     <div class="content"></div>
29 </body>
30 </html>

效果:

 四、vertical-align:middle;垂直方向居中

verical-align 定義行內元素的基線相對於該元素所在行的基線的垂直對齊。

允許指定負長度值和百分比值。這會是元素降低而不是升高。

在表單元格中,這個屬性會設置單元格框中的單元格內容的對齊方式。

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <title>vertical-align:middle;</title>
 8     <style>
 9     .big-box{
10         width: 500px;
11         height: 400px;
12         background: green;
13         text-align: center;
14     }
15     .box{
16         line-height: 400px;
17     }
18     img{
19         vertical-align: middle;
20     }
21     </style>
22 </head>
23 <body>
24     <div class="big-box">
25         <span class="box">
26             <img src="ermao.jpg"/>
27         </span>
28     </div>
29 </body>
30 </html>

效果:

五、display:table實現

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <title>display: table-cell;</title>
 8     <style>
 9     .parent{
10         width: 300px;
11         height: 300px;
12         background: orange;
13         text-align: center;
14         display: table;
15     }
16     .son{
17         display: table-cell;
18         background-color: yellow;
19         vertical-align: middle;
20     }
21     </style>
22 </head>
23 <body>
24     <div class="parent">
25         <div class="son">nihaosssss</div>
26     </div>
27 </body>
28 </html>

效果:

六、相對定位

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <title>實現水平垂直居中==相對定位實現</title>
 8     <style>
 9     html,body{
10         width: 100%;
11         height: 100%;
12         margin: 0;
13         padding: 0;
14     }
15     .content{
16         width: 300px;
17         height: 300px;
18         background: orange;
19         margin: 0 auto;/*水平居中*/
20         position: relative;/*設置position*/
21         top: 50%; /*偏移*/
22         /*margin-top: -150px;*/    /*第一種:margin-top*/
23         transform: translateY(-50%);/*第二種:transform:轉換*/
24     }
25     </style>
26 </head>
27 <body>
28     <div class="content"></div>
29 </body>
30 </html>

效果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM