1. 程式人生 > 實用技巧 >第9天, 滑動門技術, 兩欄 三欄自適應佈局(聖盃,雙飛翼), 登高佈局, 文字溢位處理 ,單行,多行溢位

第9天, 滑動門技術, 兩欄 三欄自適應佈局(聖盃,雙飛翼), 登高佈局, 文字溢位處理 ,單行,多行溢位

day 09

一、滑動門技術

1、什麼是滑動門?

不管文字多少都能夠適應特殊背景的這種效果,就需要用到滑動門技術

2、滑動門技術的原理

使用精靈技術以及padding撐開盒子的特點來製作滑動門

  • 使用a標籤包裹span標籤,因為很多的導航都是可以點選的
  • a標籤來控制左門,a標籤設定高度、轉行快、新增背景(顯示背景的左半邊部分)
  • span標籤來控制右門,span設定高度、轉行快、新增背景(顯示背景的右半邊部分)
<a href="#"><span>首頁首頁首頁首頁</span></a>
 <style>
    a {
        display: inline-block;
        height: 33px;
        line-height: 33px;
        background: url("images/lTcb_ve.png") no-repeat;
        padding-left: 15px;
        text-decoration: none;
        color: #fff;
    }
    span {
        display: inline-block;
        height: 33px;
        padding-right: 15px;
        background: url("images/lTcb_ve.png") no-repeat right;
    }
</style>

二、多欄佈局解決方案

寬度自適應佈局,讓同一個頁面自動適應不同的裝置大小,從而解決為不同裝置提供不同版本的頁面問題

1、兩欄自適應佈局

左側固定寬度,右側寬度自適應

右側固定寬度,左側的寬度自適

以左側固定寬,右側寬度自適應為例,原理:

  • 結構上,左右兩個盒子,左側盒子設定固定寬度,右側盒子width:100%;
  • 給左側盒子設定絕對定位(position:absolute)
  • 給右側盒子新增一個子盒,並子盒設定padding-left:左側盒子的寬度
<div class="wrap">
    <div class="left">左側盒子</div>
    <div class="right">
        <div class="son">右側盒子</div>
    </div>
</div>
<style>
    /* - 
      結構上,左右兩個盒子,左側盒子設定固定寬度,右側盒子width:100%;
    - 給左側盒子設定絕對定位(position:absolute)
    - 給右側盒子新增一個子盒,並子盒設定padding-left:左側盒子的寬度 */
    .wrap>div {
        min-height: 200px;
    }
    .left {
        position: absolute;
        width: 300px;
        background-color: aqua;
    }
    .right {
        width: 100%;
        background-color: pink;
    }
    .son {
        padding-left: 300px;
    }
</style>

2、三欄自適應佈局

三欄自適應佈局是指左右兩側固定寬度,中間盒子寬度自適應

聖盃佈局和雙飛翼佈局都可以實現三欄自適應,但是實現思路不同

(1)聖盃佈局

實現思路:

  • 結構上,需要有左側盒子,右側盒子,中間盒子。結構中放置時先放中間盒子,再放左右兩側盒子
  • 左側盒子和右側盒子設定固定寬度,中間盒子width:100%;
  • 給左側盒子,右側盒子和中間盒子設定浮動(注意給父元素清浮動)
  • 將左側盒子拉到最左邊(margin-left:-100%),將右側盒子拉到最右邊(margin-left:-右側盒子的寬度)
  • 將中間盒子露出來(給三個盒子的包裹盒設定padding: 0 右側盒子的寬度 0 左側盒子的寬度)
  • 將左側盒子的位置還原(相對定位,left:-左側盒子的寬度),將右側盒子的位置還原(相對定位,right:-右側盒子的寬度)
 <div class="wrap">
    <div class="center">中間盒子</div>
    <div class="left">左側盒子</div>
    <div class="right">右側盒子</div>
</div>
<style>
    /* - 
    - 結構上,需要有左側盒子,右側盒子,中間盒子。結構中放置時先放中間盒子,再放左右兩側盒子
    - 左側盒子和右側盒子設定固定寬度,中間盒子width:100%;
    - 給左側盒子,右側盒子和中間盒子設定浮動(注意給父元素清浮動)
    - 將左側盒子拉到最左邊(margin-left:-100%),將右側盒子拉到最右邊(margin-left:-右側盒子的寬度)
    - 將中間盒子露出來(給三個盒子的包裹盒設定padding: 0 右側盒子的寬度 0 左側盒子的寬度)
    - 將左側盒子的位置還原(相對定位,left:-左側盒子的寬度),將右側盒子的位置還原(相對定位,right:-右側盒子的寬度) 
*/
    .wrap {
        padding: 0 200px 0 300px;
    }
    .wrap>div {
        float: left;
        min-height: 300px;
    }
    .left {
        position: relative;
        left: -300px;
        width: 300px;
        background-color: aqua;
        margin-left: -100%;
    }
    .right {
        position: relative;
        right: -200px;
        width: 200px;
        background-color: tomato;
        margin-left: -200px;
    }
    .center {
        width: 100%;
        background-color: yellow;
    }
</style>

(2)雙飛翼佈局

始於淘寶UED

將佈局比作一隻鳥,先將鳥的身體放好,再放置翅膀

實現思路:

  • 結構上,先放中間盒子,中間盒子需要有子盒,再放左側盒子和右側盒子
  • 給左側盒子和右側盒子設定固定寬度,中間盒子width:100%
  • 給左側盒子,右側盒子和中間盒子設定左浮動(注意給父元素清浮動)
  • 將左側盒子拉到最左邊(margin-left:-100%),將右側盒子拉到最右邊(margin-left:-右側盒子的寬度)
  • 將中間盒子露出來(給中間的子盒設定margin:0 右側盒子的寬度 0 左側盒子的寬度)
 <div class="wrap">
    <div class="center">
        <div class="son">中間盒子的內容</div>
    </div>
    <div class="left">左側盒子</div>
    <div class="right">右側盒子</div>
</div>
<style>
    /* 
    - 結構上,先放中間盒子,中間盒子需要有子盒,再放左側盒子和右側盒子
    - 給左側盒子和右側盒子設定固定寬度,中間盒子width:100%
    - 給左側盒子,右側盒子和中間盒子設定左浮動(注意給父元素清浮動)
    - 將左側盒子拉到最左邊(margin-left:-100%),將右側盒子拉到最右邊(margin-left:-右側盒子的寬度)
    - 將中間盒子露出來(給中間的子盒設定margin:0 右側盒子的寬度 0 左側盒子的寬度)
     */
     .wrap>div {
        float: left;
         min-height: 300px;
     }
    .left {
        width: 200px;
        background-color: tomato;
        margin-left: -100%;
    }
    .right {
        width: 300px;
        background-color: yellowgreen;
        margin-left: -300px;
    }
    .center {
        width: 100%;
        background-color: violet;
    }
    .center>.son {
        margin: 0 300px 0 200px;
    }
</style>

3、等高佈局

等高佈局是指多列子元素在父元素中實現視覺等高的效果

(1)利用內外間距相抵消實現等高

核心點:

  • 給子元素水平排列,分別給子元素設定padding-bottom,margin-bottom(內外間距相抵消)

  • 給父元素溢位隱藏

     <div class="wrap">
        <div class="left">左側盒子</div>
        <div class="center">中間盒子</div>
        <div class="right">右側盒子</div>
    </div>
    
    <style>
        .wrap {
            width: 1000px;
            margin: 0 auto;
            overflow: hidden;
        }
        .left {
            float:left;
            width: 200px;
            background-color: violet;
            min-height: 200px;
            padding-bottom: 9999px;
            margin-bottom: -9999px;
        }
        .center {
            float:left;
            width: 500px;
            background-color: turquoise;
            min-height: 200px;
            padding-bottom: 9999px;
            margin-bottom: -9999px;
        }
        .right {
            float:left;
            width: 300px;
            background-color: yellow;
            min-height: 200px;
            padding-bottom: 9999px;
            margin-bottom: -9999px;
        }
    </style>
    

    優缺點:

    • 結構簡單,相容所有的瀏覽器
    • 實現的是偽等高,合理控制內外間距

(2)利用內容撐開父元素的特點實現等高

  • 有幾列就需要巢狀幾層容器,每層容器需要單獨設定背景顏色
<div class="wrap">
    <!-- 需要幾列就需要巢狀幾層 -->
    <!-- 第一列的背景 -->
    <div class="col1">
        <!-- 第二列的背景 -->
        <div class="col2">
            <!-- 第三列的背景 -->
            <div class="col3 clearfix">
                <div class="left">左側盒子</div>
                <div class="center">中間盒子</div>
                <div class="right">右側盒子</div>
            </div>
        </div>
    </div>
</div>
<style>
    .clearfix::after {
        content: "";
        display: block;
        clear: both;
    }
    .clearfix {
        *zoom: 1;
    }
    .wrap {
        width: 1000px;
        margin: 0 auto;
        overflow: hidden;
    }
    .col1 {
        width: 100%;
        background-color: tomato;
    }
    .col2 {
        /* 露出第一列盒子的背景 */
        position: relative;
        left: 300px;
        width: 100%;
        background-color: yellow;
    }
    .col3 {
        /* 露出第二列盒子的背景顏色 */
        position: relative;
        left: 500px;
        width: 100%;
        background-color: pink;
    }
    .left {
        float: left;
        width: 300px;
        min-height: 300px;
        margin-left: -800px;

    }
    .center {
        float: left;
        width: 500px;
        min-height: 300px;
        margin-left: -500px;
    }
    .right {
        float: left;
        width: 200px;
        min-height: 300px;
    }
</style>

三、文字溢位處理

1、單行文字溢位處理

  • 限定容器的寬度

  • 文字強制在一行顯示

  • 給盒子設定溢位隱藏

  • 給超出文字如何處理

    • clip 直接裁剪
    • ellipsis 溢位顯示省略號
     <p>0817web班0817web班0817web班0817web班0817web班0817web班0817web班0817web班0817web班</p>
    
     <style>
        p {
            width: 200px;
            border: 1px solid red;
            /* 文字強制在一行顯示 */
            white-space: nowrap;
            /* 溢位隱藏 */
            overflow: hidden;
            /* 文字超出後如何處理   
            clip    直接裁剪
            ellipsis    溢位顯示省略號
             */
             /* text-overflow: clip; */
             text-overflow: ellipsis;
        }
    </style>
    

2、多行文字溢位處理

注意: 這一塊只能用中文,不能用英文.

(1)使用webkit私有屬性進行處理(只適用於webkit核心的瀏覽器)

 p {
    width: 200px;
    border: 1px solid red;
    overflow: hidden;
    /* 這個屬性不能單獨使用,必須配合下面兩個屬性來使用 */
    -webkit-line-clamp: 3;
    display: -webkit-box;
    -webkit-box-orient: vertical;
}
  • -webkit-line-clamp屬性 限制顯示的行數

    這個屬性不能單獨設定,設定後不生效,需要配合以下兩個屬性才可以生效】

    • display: -webkit-box; 將容器轉化為webkit盒子(彈性伸縮盒)
    • -webkit-box-orient: vertical; 容器內的子元素的排列方式

(2)利用偽元素模擬溢位顯示省略號的效果(相容性比較好)

  • 需要限制盒子的寬度
  • 行高與盒子的高度設定成倍數關係
  • 利用偽元素建立一個省略號
  • 子絕父相(偽元素絕對定位)
  • 調整偏移屬性到盒子的右下角
  • 給偽元素設定一個跟大背景相同的背景顏色,再通過padding左右微調偽元素的顯示位置
    <p>2013年參加湖南衛視《快樂男聲》獲年度總冠軍出道 [1]  。2014年1月首登央視春晚舞臺;同年4月參加戶外真人秀節目《花兒與少年》;9月6日-7日在北京萬事達中心連開兩場“火星”演唱會 [2]  ,隨後發行首張個人專輯《卡西莫多的禮物》 [3]  ,並憑此專輯獲2015QQ音樂年度最佳內地男歌手及第15屆音樂風雲榜年度最受歡迎男歌手等獎項。2015年7月31日-8月2日在上海大舞臺連開三場個人演唱 [4]  ;同年12月發行第二張專輯《異類》,獲2016酷音樂亞洲盛典年度最佳專輯等獎項。</p>
 <style>
    p {
        position: relative;
        width: 200px;
        border: 1px solid red;
        /* 行高跟盒子的高度成倍數關係 */
        line-height: 30px;
        height: 90px;
    }
    p::after {
        position: absolute;
        bottom: 2px;
        right: 5px;
        content: "...";
        background: #fff;
        padding: 0 2px;
    }
</style>