最近開始上手一些前端的專案,最難受的就是CSS的各種定位,把其中遇到的一些問題記錄下來,方便自己查閱,也希望能幫到像我一樣的CSS初學者。
bottom一定是從底部計算嗎?
考慮這樣的一種場景,有兩個div,我們希望下面的div能夠固定到底部,一開始我是這麼寫的
<html> <head> <meta charset="UTF-8"> <title>CSS TEST</title> <style type="text/css"> .haha{ width: auto; background: red; height: 100px; } .inner { height: 700px; background: blue; width: auto; margin:10px; } .hehe{ bottom: 0; height: 40px; width: 100%; background: black; box-sizing:border-box; } </style> </head> <body> <div class="haha"> </div> <div class="hehe"> </div> </body> </html>複製程式碼
執行一下會發現,實際上,hehe這個div貼著haah的div,而不是我們想要的貼到底部。仔細查閱了w3c的文件,其實是由於對於top,left,bottom之類的定位是需要先給出定位方式是absolute/fixed/relative中的一種,才有意義。否則它就是依然是正常排列的。
width 100%?到底有多寬?
還是剛才那個例子,對hehe加上postion:absolute我們會發現左右拖動的話,瀏覽器會有水平的滾動條,這說明了有內容溢位,這又是為什麼呢?原來,對於預設的width只是content的寬度,實際上再加上瀏覽器預設的padding,那麼就會把元素往右邊擠,導致超出螢幕。當然怎麼解決這個問題呢,需要自己去思考了。
更深入理解請參考:CSS“width:100%”和寬度繼承的淺薄認識width 7em?內聯元素的寬度問題
考慮下面一種情況,列表內部內部我們向插入3個width為7em的li標籤。
<html>
<head>
<style type="text/css">
ul
{
float:left;
width:100%;
padding:0;
margin:0;
list-style-type:none;
}
a
{
width:7em;
text-decoration:none;
color:white;
background-color:purple;
padding:0.2em 0.6em;
border-right:1px solid white;
}
a:hover {background-color:#ff3300}
li {display:inline}
</style>
</head>
<body>
<ul>
<li><a href="#">Link one</a></li>
<li><a href="#">Link two</a></li>
<li><a href="#">Link three</a></li>
</ul>
<p>
在上面的例子中,我們把 ul 元素和 a 元素浮向左浮動。li 元素顯示為行內元素(元素前後沒有換行)。這樣就可以使列表排列成一行。ul 元素的寬度是 100%,列表中的每個超連結的寬度是 7em(當前字型尺寸的 7 倍)。我們新增了顏色和邊框,以使其更漂亮。但是實際上卻沒顯示7em,這是為什麼?
</p>
</body>
</html>複製程式碼
但是實際上呢,每個li標籤顯示的背景色寬度不到7em,這是為什麼呢?因為li標籤display:inline之後變成行內元素,行內元素的寬度只是由裡面的文字內容實際寬度決定的。所以我們只需要加一個float:left給a標籤(能讓他變成塊級元素),就能正常顯示了。
clear right?
如果說我們有兩個元素,我希望第一個元素float:left後不影響第二個,第二個元素也會另起一行。那是不是可以這樣做?
<html>
<head>
<style type="text/css">
p{
float:left;
clear:right;
}
</style>
</head>
<body>
<p>This is text 1</p>
<p>This is text 2</p>
</body>
</html>複製程式碼
實際試驗後,第一個p標籤發現並沒有把右邊p標籤給清掉啊!實際上對clear而言,只會對文件之前的float進行清除,位於該文件後面的是影響不了的,所以在這裡我們使用clear:left或者clear:both才可以。
auto 50%?文字如何居中?
怎樣才能讓div中的文字居中呢?
<html>
<head>
<style type="text/css">
#child{
margin-left: 50%;
margin-right:50%;
text-align:center;
}
</style>
</head>
<body>
<div id="root">
<div id="child" style="width:100px">make me center</div>
</div>
</body>
</html>複製程式碼
當我們採取這種寫法的時候,我們會發現實際上child所控制的整個區域呢已經超出了100px,這是因為margin-right被div內部的內容向右擠出了,並且實際上文字也不再中間,顯示起來偏右。這該怎麼解決呢?其實很簡單,把margin設定成auto即可。當然也有其他方法讀者可以自己思考。
好了,那麼如何使一個div垂直水平居中呢?
<style type="text/css">
.root{
width:300px;
height:300px;
margin:0;
padding:0;
background:yellow;
/*父元素必須是非static,否則子元素的定位參照就不是root*/
position: relative;
}
.child{
width: 100px;
height: 100px;
background: red;
position:absolute;
/*把上下左右的值都置空,否則會有預設值*/
top:0;
left:0;
bottom:0;
right:0;
margin:auto;
}
</style>
<body>
<div class="root">
<div class="child"></div>
</div>
</body>複製程式碼