全目錄
本系列文章,主要是圍繞css3屬性,實現我們常見的各種效果,這些效果都是我們實戰開發中經常可以用到的效果:
- css揭祕實戰技巧- 背景與邊框 [一]
- css揭祕實戰技巧- 形狀 [二]
- css揭祕實戰技巧 - 視覺效果[三]
- css揭祕實戰技巧 - 字型排印[四]
- css揭祕實戰技巧 - 使用者體驗[五]
- css揭祕實戰技巧 - 結構與佈局[六]
- css揭祕實戰技巧 - 過渡與動畫[七]
前言
- 自適應內部元素
- 精確控制表格列寬
- 根據兄弟元素的數量來設定樣式
- 滿幅的背景,定寬的內容
- 緊貼底部的頁尾
一:自適應內部元素
首先,我們看一下想要得到的效果:
基本的html結構如下:
<div>
<img src="./img/kobe3.png" alt="">
<p>科比布萊恩特,一個偉大的時代,一個偉大的球員,還有一群偉大的球迷</p>
</div>
複製程式碼
如果沒有設定任何樣式時,效果如下:
如何讓文字去自適應圖片的寬度呢?這就是問題的關鍵點了,如何讓元素去自適應內部元素?而不是去自適應它的父元素呢?答案就是width: min-content: 表示該元素的寬度將被解析為它內部最大的不可斷行的元素的寬度(例如:最寬的單詞,圖片,或者具有固定寬度的盒元素)
程式碼如下:
div {
width: min-content;//表示該div的寬度是由內部最大的不可斷行元素的寬度所決定
}
複製程式碼
由於min-content是css3特性,部分瀏覽器可能不支援,所以我們需要一個平穩的回退方案,那就是提供一個固定的max-width值
div {
max-width: 300px;
max-width: min-content;
}
div img{
max-width: inherit;
}
複製程式碼
二:精確控制表格列寬
大家在實際開發的過程中,尤其是後臺管理系統,表格的使用會非常頻繁,但是對於,表格的寬的控制,可能有時候並沒有達到我們想要的效果,原因可能還是我們對於表格的相關屬性不是很清楚,尤其是table-layout:auto/fixed;
- auto為預設值,表示自適應單元格中的內容,此時設定寬度無效。
- fixed表示均等分割,即寬度是等分均分的,當然,我們也可以設定寬度。
首先,我們看一下auto的效果:
程式碼如下:
//html
<table>
<tr>
<th>序號</th>
<th>文案1</th>
<th class="third">文案2</th>
<th>操作</th>
</tr>
<tr>
<td>1</td>
<td>科比布萊恩特,一個偉大的時代,一個偉大的球員,還有一群偉大的球迷</td>
<td class="third">科比布萊恩特,一個偉大的時代,一個偉大的球員,還有一群偉大的球迷科比布萊恩特,一個偉大的時代,一個偉大的球員,還有一群偉大的球迷科比布萊恩特,一個偉大的時代,一個偉大的球員,還有一群偉大的球迷</td>
<td>
<a href="">編輯</a>
</td>
</tr>
</table>
複製程式碼
//css
table{
width: 800px;
border-collapse: collapse;
width: 100px;// 此時設定了寬度也不會生效,因為此時table-layout為auto。
}
table tr td, table tr th {
border: 1px solid #ddd;
}
複製程式碼
那我們在上面的基礎上,給table加一個table-layout:fixed,效果如下:
此時,我們看到部分單元格文字較多,如何隱藏呢?這時,我們可以用text-overflow:ellipsis , 該屬性要同時配合:overflow:hidden;white-space:nowrap;以及一個指定的寬度才可以生效。 程式碼如下:
table{
width: 800px;
border-collapse: collapse;
table-layout: fixed;
}
table tr td, table tr th {
border: 1px solid #ddd;
}
table tr th:nth-child(3) {
width: 100px;
}
table tr td:nth-child(3) {
width: 100px;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
複製程式碼
最終的效果如下:
此時,有個細節要注意:我們直接設定td的寬度為100px,效果是沒有生效的,必須設定th的寬度為100px,單元格的寬度才生效。
這是因為table渲染的時候,一般是根據第一行的樣式去渲染,此時第一行是th構成的,所以此時th沒有設定寬度,即使td設定了寬度,渲染的時候同一列的其他單元格還是根據th去渲染,所以此處,我們直接設定td的寬度是無效的,當然大家也可以把th構成的這一行刪掉,然後再設定td的寬度,這時就可以生效了,因為此時第一行就是td構成的
三:根據兄弟元素的數量來設定樣式
我們在實際開發過程中,也會遇到下面這種場景:我們需要根據兄弟元素的數量去設定不同的樣式。
那麼我們就來看看這種效果到底該如何通過css去實現呢?html結構如下:
<ul>
<li></li>
<li></li>
<li></li>
//可能有更多或者更少
</ul>
複製程式碼
- 首先我們看一下:only-child
li:only-child {
//表示只有一個子元素的時候的樣式
}
複製程式碼
- :first-child:last-child
li:first-chlid:last-chlid {
//表示元素是第一個元素,同時又是最後一個元素,說明此時只有一個子元素
}
複製程式碼
- 接著上面的思路:
li:first-child:nth-last-child(4){
//表示第一個元素又是倒數第四個元素,說明此時有四個子元素。
}
複製程式碼
好啦,這個時候,我們就知道了,怎麼樣在css判斷兄弟元素的數量。
- 接下來,我們實現一個效果: 有四個或者四個以上元素,且第一個為綠色,從第二個開始其他為紅色
ul li {
display: inline-block;
width: 50px;
height: 60px;
background: green;
margin: 10px;
}
ul li:first-child:nth-last-child(n + 4) ~ li{
background: red;
}
複製程式碼
實現的效果如下:
- 再進一步,指定一下範圍,有2個到4個子元素的時候,設定為紅色 程式碼如下:
ul li {
display: inline-block;
width: 50px;
height: 60px;
background: green;
margin: 10px;
}
ul li:first-child:nth-last-child(n + 2):nth-last-child(-n + 4) ~ li{
background: red;
}
複製程式碼
此時,如果ul下面有2到4個li時,就會應用我們的樣式,否則不會。
四:滿幅的背景,定寬的內容
首先,我們看一下一個最常見的頁尾的效果:背景鋪滿整個寬度,內容居中
上面的效果就是我們標題所說的:滿幅的背景,定寬的內容,通常遇到這種效果,我們最直接的解決方案可能就是:外面一層div設定背景,裡面再巢狀一個div顯示內容,然後設定裡面的div居中顯示,就這樣實現了,這可能也是大多數人的思路,那麼,如果只是用一層div去實現呢? 程式碼如下:
div {
backgroud: #333;
padding: 10px;//部分瀏覽器不支援calc回退方案
padding: 10px calc(50% - 450px); // 此時,我們設定的中間內容區域定寬是900px
}
複製程式碼
五:緊貼底部的頁尾
首先,html結構如下:
<header>
<p>頭部1</p>
<p>頭部2</p>
</header>
<main>
內容
</main>
<footer>
<p>尾部1</p>
<p>尾部3</p>
</footer>
複製程式碼
1. 固定高度的頁尾
header {
height: 60px;
background: green;
}
main {
min-height: calc(100% - 60px - 100px);
background: #ddd;
}
footer {
height: 100px;
background: cornflowerblue;
}
複製程式碼
2. 高度不固定,根據內容自適應高度的頁尾
body {
display: flex;
flex-direction: column;
min-height: 100vh;
}
header{
background: green;
}
main {
background: #ddd;
flex: 1;
}
footer{
background: cornflowerblue;
}
複製程式碼