css揭祕實戰技巧 - 結構與佈局[六]

沉默抒懷者發表於2019-05-05

全目錄

本系列文章,主要是圍繞css3屬性,實現我們常見的各種效果,這些效果都是我們實戰開發中經常可以用到的效果:

  1. css揭祕實戰技巧- 背景與邊框 [一]
  2. css揭祕實戰技巧- 形狀 [二]
  3. css揭祕實戰技巧 - 視覺效果[三]
  4. css揭祕實戰技巧 - 字型排印[四]
  5. css揭祕實戰技巧 - 使用者體驗[五]
  6. css揭祕實戰技巧 - 結構與佈局[六]
  7. css揭祕實戰技巧 - 過渡與動畫[七]

前言

  1. 自適應內部元素
  2. 精確控制表格列寬
  3. 根據兄弟元素的數量來設定樣式
  4. 滿幅的背景,定寬的內容
  5. 緊貼底部的頁尾

一:自適應內部元素

首先,我們看一下想要得到的效果:

css揭祕實戰技巧 - 結構與佈局[六]

基本的html結構如下:

<div>
    <img src="./img/kobe3.png" alt="">
    <p>科比布萊恩特,一個偉大的時代,一個偉大的球員,還有一群偉大的球迷</p>
</div>
複製程式碼

如果沒有設定任何樣式時,效果如下:

css揭祕實戰技巧 - 結構與佈局[六]

如何讓文字去自適應圖片的寬度呢?這就是問題的關鍵點了,如何讓元素去自適應內部元素?而不是去自適應它的父元素呢?答案就是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;

  1. auto為預設值,表示自適應單元格中的內容,此時設定寬度無效。
  2. fixed表示均等分割,即寬度是等分均分的,當然,我們也可以設定寬度。

首先,我們看一下auto的效果:

css揭祕實戰技巧 - 結構與佈局[六]

程式碼如下:

//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,效果如下:

css揭祕實戰技巧 - 結構與佈局[六]

此時,我們看到部分單元格文字較多,如何隱藏呢?這時,我們可以用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;
}
複製程式碼

最終的效果如下:

css揭祕實戰技巧 - 結構與佈局[六]

此時,有個細節要注意:我們直接設定td的寬度為100px,效果是沒有生效的,必須設定th的寬度為100px,單元格的寬度才生效。

這是因為table渲染的時候,一般是根據第一行的樣式去渲染,此時第一行是th構成的,所以此時th沒有設定寬度,即使td設定了寬度,渲染的時候同一列的其他單元格還是根據th去渲染,所以此處,我們直接設定td的寬度是無效的,當然大家也可以把th構成的這一行刪掉,然後再設定td的寬度,這時就可以生效了,因為此時第一行就是td構成的

三:根據兄弟元素的數量來設定樣式

我們在實際開發過程中,也會遇到下面這種場景:我們需要根據兄弟元素的數量去設定不同的樣式。

css揭祕實戰技巧 - 結構與佈局[六]
那麼我們就來看看這種效果到底該如何通過css去實現呢?

html結構如下:

<ul>
    <li></li>
    <li></li>
    <li></li>
    //可能有更多或者更少
</ul>
複製程式碼
  1. 首先我們看一下:only-child
li:only-child {
    //表示只有一個子元素的時候的樣式
}
複製程式碼
  1. :first-child:last-child
li:first-chlid:last-chlid {
    //表示元素是第一個元素,同時又是最後一個元素,說明此時只有一個子元素
}
複製程式碼
  1. 接著上面的思路:
li:first-child:nth-last-child(4){
    //表示第一個元素又是倒數第四個元素,說明此時有四個子元素。
}
複製程式碼

好啦,這個時候,我們就知道了,怎麼樣在css判斷兄弟元素的數量。

  1. 接下來,我們實現一個效果: 有四個或者四個以上元素,且第一個為綠色,從第二個開始其他為紅色
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;
}
複製程式碼

實現的效果如下:

css揭祕實戰技巧 - 結構與佈局[六]

  1. 再進一步,指定一下範圍,有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時,就會應用我們的樣式,否則不會。

四:滿幅的背景,定寬的內容

首先,我們看一下一個最常見的頁尾的效果:背景鋪滿整個寬度,內容居中

css揭祕實戰技巧 - 結構與佈局[六]

上面的效果就是我們標題所說的:滿幅的背景,定寬的內容,通常遇到這種效果,我們最直接的解決方案可能就是:外面一層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;
}
複製程式碼

相關文章