移動(dòng)適配

移動(dòng)適配

rem :
1.媒體查詢
2.flexible.js
  • 網(wǎng)頁(yè)效果
    屏幕寬度不同,網(wǎng)頁(yè)元素尺寸不同等比縮放
  • px單位或百分比布局可以實(shí)現(xiàn)?
    px單位是絕對(duì)單位
    百分比布局特點(diǎn)寬度自適應(yīng),高度固定
  • 適配方案
    rem
    vw / vh
  • rem單位
    相對(duì)單位
    rem單位是相對(duì)于HTML標(biāo)簽的自豪計(jì)算結(jié)果
    1rem = 1HTML字號(hào)大小
  • rem移動(dòng)適配 - 媒體查詢
    目標(biāo):能夠使用媒體查詢設(shè)置差異化CSS樣式
  • 思考:
    手機(jī)屏幕不同,分辨率不同,如何設(shè)置不同的HTML標(biāo)簽字號(hào)?
    媒體查詢
    媒體查詢能夠檢測(cè)視口的寬度,然后編寫(xiě)差異化的CSS樣式
    *當(dāng)某個(gè)條件成立,執(zhí)行對(duì)應(yīng)的CSS樣式

寫(xiě)法

@media (媒體特性){
      選擇器 {
         CSS屬性
    }
}

如: 
 @media (width:320px) {
            html {
                font-size: 32px;
      }
}

案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body {
            line-height: 1;
        }
        /* 以視口寬度375px為例,適配屏幕 */
        @media (width:375.2px) {
            /* 1html 根字號(hào) 37.5px = 視口寬度的 1/10 */
            html {
                font-size: 37.5px;
            }
        }

        @media (width:414.4px) {
            html {
                font-size: 41.4px;
            }
        }

        .box {
            width: 5.33rem;
            height: 5.33rem;
            background-color: pink;
        }
    </style>
</head>
<body>
    <div class="box"></div>
</body>
</html>

使用rem單位設(shè)置網(wǎng)頁(yè)元素的尺寸

  • 思考
    手機(jī)屏幕大小不同,分辨率不同,如何設(shè)置不同的HTML標(biāo)簽字號(hào)?
    設(shè)備寬度不同,HTML標(biāo)簽字號(hào)設(shè)置多少合適?
    設(shè)備寬度大,元素尺寸大
    設(shè)備寬度小,元素尺寸小
  • 目前rem布局方案中,將網(wǎng)頁(yè)等分成10份,HTML標(biāo)簽的字號(hào)為視口寬度1/10
/* 視口寬度320px,根字號(hào)為32px */
@media (width: 320px) {
      html {
        font-size: 32px;
    }
}

/* 視口寬度375px,根字號(hào)為37.5px */
@media (width: 375px) {
      html {
        font-size: 37.5px;
    }
}

/* 視口寬度414px, 根字號(hào)為41.4px */
@media (width: 414px) {
      html {
          font-size: 414.4px;
    }
}

rem適配原理

  • rem單位尺寸
    1.根據(jù)視口寬度,設(shè)置不同的HTML標(biāo)簽字號(hào)
    2.書(shū)寫(xiě)代碼,尺寸是rem單位
    2.1確定設(shè)計(jì)稿對(duì)應(yīng)的設(shè)備HTML標(biāo)簽字號(hào)
    查看設(shè)計(jì)稿寬度 → 確定參考設(shè)備寬度(視口寬度) → 確定基準(zhǔn)根字號(hào)(1/10視口寬度)
    2.2 rem單位的尺寸
    N * 37.5 = 68 → N = 68 / 37.5
    rem單位的尺寸 = px單位數(shù)值 / 基準(zhǔn)根字號(hào)

flexible

  • 目標(biāo):使用flexible js配合rem實(shí)現(xiàn)在不同寬度的設(shè)備中,網(wǎng)頁(yè)元素尺寸等比縮放效果
    1.flexible.js是手淘開(kāi)發(fā)出的一個(gè)用來(lái)適配移動(dòng)端的js框架
    2.核心原理就是根據(jù)不同的視口寬度給網(wǎng)頁(yè)中html根節(jié)點(diǎn)設(shè)置不同的font-size。
<body>
      <div class="box"></div>
       /* 引入移動(dòng)適配的js文件 */
      <script src="./js/flexible.js"></script>
</body>

Less

目標(biāo):使用Less語(yǔ)法快速編譯生成CSS代碼

  • Less是一個(gè)CSS預(yù)處理器,Less文件后綴是.Less
  • 擴(kuò)充了CSS語(yǔ)言,使CSS具備一定的邏輯性、計(jì)算能力
  • 注意:瀏覽器不識(shí)別Less代碼,目前階段,網(wǎng)頁(yè)要引入對(duì)應(yīng)的CSS文件
  • Less文件保存自動(dòng)生成css文件

Less語(yǔ)法

  • 注釋:
    單行注釋
    語(yǔ)法: //注釋內(nèi)容
    快捷鍵:ctrl + /
    塊注釋
    語(yǔ)法: /* 注釋內(nèi)容 /
    快捷鍵:
    * shift + alt + A **
  • 運(yùn)算:
    加、減、乘直接書(shū)寫(xiě)計(jì)算表達(dá)式
    除法需要添加 小括號(hào) 或 .
  • 注意:
    表達(dá)式存在多個(gè)單位以第一個(gè)單位為準(zhǔn)

實(shí)例

/*
    less計(jì)算:
    + - * 除法./或者()

    對(duì)less文件的解釋:
        less文件只是方便程序員寫(xiě)代碼,實(shí)際上在 HTML 中要引用的還是css文件

    注意點(diǎn):
    1.單位沒(méi)有順序之分,如果一個(gè)表達(dá)式之中有多個(gè)單位,以第一個(gè)單位為準(zhǔn)
    2.運(yùn)算符的前后,要么都加空格隔開(kāi),要么都不加
    3.將單位統(tǒng)一的方法:ctrl + A全選然后再按 alt + Z 可以將單位統(tǒng)一為 rem / px
*/

.box {
    width: 100 + 100px;
    height: 400px - 200 ;
    font-size: 5 * 6px;
    // 這個(gè)單位如果寫(xiě)在外面是會(huì)有空格,寫(xiě)在里面是沒(méi)有空格的美觀,寫(xiě)在外面不兼容
    width: (400 / 2px);
}

.box1 {
    // 單位沒(méi)有順序之分,如果一個(gè)表達(dá)式之中有多個(gè)單位,以第一個(gè)單位為
    width: 100px + 200deg + 300rem;
    // 這種情況是不能做運(yùn)算的,需要注意
    height: 20 +30px;
    // (./)這是個(gè)除法運(yùn)算,只是less不兼容,不建議用(./)這個(gè)除法表達(dá)式來(lái)做運(yùn)算
    // font-size: 60 ./ 3px;
}

  • 能夠使用Less嵌套寫(xiě)法生成后代選擇器
// 1.生成后代選擇器
.box {
    width: 200px;
    height: 200px;
    background-color: skyblue;

    .title {
        width: 100px;
        height: 100px;
        background-color: pink;

        // .left / .right 屬于同級(jí)選擇器
        .left {
            width: 50px ;
            height: 50px;
            background-color: green;
        }

        .right {
            width: 50px ;
            height: 50px;
            background-color: purple;
        }
    }
}

// 2.生成子代選擇器 >
.father {
    width: 400px ;
    height: 400px;
    background-color: skyblue;

    >.son{
        width: 200px;
        height: 200px ;
        background-color: pink;

        >.sun{
            width: 100px;
            height: 100px;
            background-color: orange;
        }
    }
}
// 3.交集選擇器 &符號(hào)指代的是直接上級(jí)
.box1{
    width: 100px;
    height: 100px;
    background-color: skyblue;

    &.box2 {
        width: 50px;
        height: 50px;
        background-color: pink;
    }

    span {
        &.box3 {
            background-color: blue;
        }
    }
}

// 4.并集選擇器
.box1,
.box2
 {
    width: 100px;
    height: 100px;
    background-color: green;
}

.box1 {
    width: 100px;
    height: 100px;
    background-color: skyblue;

    &,
    .box2 {
        width: 50px;
        height: 50px;
        background-color: pink;
    }
}

// 5.偽類選擇器  :hover
.box {
    a:hover {
        background-color: #333;
    }
}

.box {
    a {
        &:hover {
            background-color: #444;
        }
    }
}

.box {
    li:hover {
        a {
            background-color: pink;
        }
    }
}

.box {
    li {
        &:hover {
            a {
                background-color: #666;
            }
        }
    }
}

// 6.添加偽元素
.box {
    li {
        a::before {
            content:'';
            background-color: #555;
        }
    }
}

.box {
    li {
        a {
            &::before {
                content: '';
            }
        }
    }
}

// 7.結(jié)構(gòu)偽類選擇器 直接寫(xiě)在選擇器的后面是沒(méi)有提示的
.box {
    li:first-child {
        background-color: #fff;
    }
}

.box {
    li {
        &:nth-child(2) {
            background-color: #fff;
        }
    }
}

嵌套

  • 作用:快速生成后代選擇器
    語(yǔ)法:
.父級(jí)選擇器 {
    // 父級(jí)選擇器 
    .子級(jí)選擇器 {
       // 子級(jí)樣式
    }
}
// 示例
.father {
   color: red;
  .son {
    width: 100px;
  }
}
// 生成
.father {
  color: red;
}
.father .son {
  width: 100px;
}
  • 注意:&生成后代選擇器,表示當(dāng)前選擇器,通常配合偽類或偽元素使用
.father {
  color: red;
  &:hover {
    color: green;
  }
}

// 保存為
.father {
  color: red;
}
.father:hover {
  color: green;
}

變量

  • 方法二: 把顏色提前存儲(chǔ)到一個(gè)容器,設(shè)置屬性值為這個(gè)容器名 l 變量:存儲(chǔ)數(shù)據(jù),方便使用和修改。
    語(yǔ)法:
    定義變量:@變量名: 值; **
    使用變量:CSS屬性:@變量名;

  • 開(kāi)發(fā)網(wǎng)站時(shí),網(wǎng)頁(yè)如何引入公共樣式?
    CSS:書(shū)寫(xiě)link標(biāo)簽
    Less:導(dǎo)入

  • 導(dǎo)入:@import "文件路徑";

// 如果是less文件,可以省略后綴.less
@import 'base.less';
@import '01-體驗(yàn)less';
// @import "你要導(dǎo)入的文件路徑";
// 注意:分號(hào)結(jié)尾
// 寫(xiě)法一:
@import "./03-計(jì)算.less";
// 寫(xiě)法二:
@import url(./04-嵌套.less);

@import "./05-變量.less";

Less:導(dǎo)出

  • 方法一:
    配置EasyLess插件, 實(shí)現(xiàn)所有Less有相同的導(dǎo)出路徑
    配置插件: 設(shè)置 → 搜索EasyLess → 在setting.json中編輯 → 添加代碼(注意,必須是雙引號(hào))
  • 方法二:控制當(dāng)前Less文件導(dǎo)出路徑
    Less文件第一行添加如下代碼,注意文件夾名稱后面添加
// out: ./css/
// out: ./css/common.css

// out: ./css/
/*
注意點(diǎn):
 1.路徑如果表示文件夾,最后一定要有/
    注意:如果路徑在最后那里沒(méi)有添加"/"那么它僅僅表示的是文件名
    導(dǎo)出文件夾:// out: ./css/
 2.屬于less配置信息,一定要寫(xiě)在第一行,如果寫(xiě)在第二行,那么第一行不能再寫(xiě)任何內(nèi)容
*/
  • 禁止導(dǎo)出
    在less文件第一行添加:( // out: false )
// out: false
// 禁止導(dǎo)出

綜合案例(HTML)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>游樂(lè)園</title>
    <!-- 引入網(wǎng)頁(yè)主題圖標(biāo) -->
    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
    <!-- 引入第三方文件 -->
    <link rel="stylesheet" href="./lib/iconfont/iconfont.css">
    <!-- 引入由 less 生成的 css 文件 -->
    <link rel="stylesheet" href="./css/index.css">
</head>
<body>
    <!-- 輪播圖 banner -->
    <div class="banner">
        <img src="./uploads/banner_1.png" alt="">
    </div>
    <!-- 輪播圖 banner -->

    <!-- 樂(lè)園活動(dòng) -->
    <h3>樂(lè)園活動(dòng)</h3>
    <!-- 樂(lè)園活動(dòng) -->

    <!-- 活動(dòng)卡片 -->
    <div class="card">
        <ul>

            <li>

                <!-- 添加兩個(gè)定位元素 -->
                <!-- 1.進(jìn)行中 -->
                <div class="run">
                    進(jìn)行中
                </div>
                <i class="iconfont icon-shoucang1 collcet"></i>

                <a href="#">
                    <img src="./uploads/item_1.png" alt="">
                <div class="desc">

                    <div class="title">
                        <p class="twoLines">
                            瘋狂的紅包 不一樣的撕名牌 大型家庭親子戶外活動(dòng)
                            瘋狂的紅包 不一樣的撕名牌 大型家庭親子戶外活動(dòng)
                            瘋狂的紅包 不一樣的撕名牌 大型家庭親子戶外活動(dòng)
                        </p>
                        <span>免費(fèi)</span>
                    </div>

                    <div class="total">
                        <i class="iconfont icon-qizhi qizhi"></i>
                        200人已報(bào)名
                        <i class="iconfont icon-shizhong shizhong"></i>
                        本周六開(kāi)始
                    </div>
                </div>
                </a>
            </li>

            <li>
                <!-- 添加兩個(gè)定位元素 -->
                <!-- 1.進(jìn)行中 -->
                <div class="end">
                    已截止
                </div>
                <i class="iconfont icon-shoucang1 collcet"></i>

                <a href="#">
                    <img src="./uploads/item_2.png" alt="">
                <div class="desc">

                    <div class="title">
                        <p class="twoLines">
                            瘋狂的紅包 不一樣的撕名牌 大型家庭親子戶外活動(dòng)
                            瘋狂的紅包 不一樣的撕名牌 大型家庭親子戶外活動(dòng)
                            瘋狂的紅包 不一樣的撕名牌 大型家庭親子戶外活動(dòng)
                        </p>
                        <span>免費(fèi)</span>
                    </div>

                    <div class="total">
                        <i class="iconfont icon-qizhi qizhi"></i>
                        200人已報(bào)名
                        <i class="iconfont icon-shizhong shizhong"></i>
                        本周六開(kāi)始
                    </div>
                </div>
                </a>
            </li>

            <li>

                <!-- 添加兩個(gè)定位元素 -->
                <!-- 1.進(jìn)行中 -->
                <div class="end">
                    已結(jié)束
                </div>
                <i class="iconfont icon-shoucang collcet1"></i>

                <a href="#">
                    <img src="./uploads/item_3.png" alt="">
                <div class="desc">

                    <div class="title">
                        <p class="twoLines">
                            瘋狂的紅包 不一樣的撕名牌 大型家庭親子戶外活動(dòng)
                            瘋狂的紅包 不一樣的撕名牌 大型家庭親子戶外活動(dòng)
                            瘋狂的紅包 不一樣的撕名牌 大型家庭親子戶外活動(dòng)
                        </p>
                        <span>免費(fèi)</span>
                    </div>

                    <div class="total">
                        <i class="iconfont icon-qizhi qizhi"></i>
                        200人已報(bào)名
                        <i class="iconfont icon-shizhong shizhong"></i>
                        本周六開(kāi)始
                    </div>
                </div>
                </a>
            </li>
            
        </ul>
    </div>
    <!-- 活動(dòng)卡片 -->

    <!-- 底部 -->
    <footer>
        <a href="#">
            <i class="iconfont icon-index-copy icon1"></i>
            首頁(yè)
        </a>

        <a href="#">
            <i class="iconfont icon-youhuiquan icon2"></i>
            卡券
        </a>

        <a href="#">
            <i class="iconfont icon-iconfront- icon3"></i>
            我的
        </a>
    </footer>
    <!-- 底部 -->

    <!-- 引入移動(dòng)適配js文件 -->
    <script src="./js/flexible.js"></script>
    <!-- 引入移動(dòng)適配js文件 -->
</body>
</html>

綜合案例(Less** 保存自動(dòng)生成CSS文件 **)

@import url(./base.less);

body {
    background-color: #F0F0F0;

    // 預(yù)留底部高度
    padding-bottom: 1.3067rem;
}

// 存放主題文字顏色
@themeColor: #3C3C3C;

// 讓圖片大小適配任何移動(dòng)端屏幕
img {
    width: 100%;
}

// 存放超出兩行以省略號(hào)顯示
.twoLines {
    text-overflow: -o-ellipsis-lastline;
    overflow: hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    line-clamp: 2;
    -webkit-box-orient: vertical;
  }

// 樂(lè)園活動(dòng) 
h3 {
    // 設(shè)置標(biāo)題的字號(hào)大小
    font-size: 0.3733rem;
    // 標(biāo)題四周的邊距
    margin: 0.2667rem 0 0.2667rem 0.4rem;
}

// 活動(dòng)卡片 
.card {

    li {
        // 給每個(gè) li 標(biāo)簽都添加一個(gè)下邊距
        // a 設(shè)置為塊級(jí)元素,給 a 標(biāo)簽設(shè)置尺寸直接撐開(kāi) li 標(biāo)簽的大小
        margin-bottom: 0.2667rem;
        // 父相
        position: relative;

        // 遮罩層
        &:last-child::after {
            content: '';
            position: absolute;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            background-color: rgba(0,0,0,.3);
        }

        a {
            // 將 a 設(shè)置為塊級(jí)元素,擴(kuò)大點(diǎn)擊范圍
            display: block;
            height: 6.6667rem;
            background-color: #fff;

            // 將圖片以下的空間用一個(gè)盒子包裹
            .desc {
                padding: 0 0.4rem;

                // 將文本上部分用一個(gè)盒子包裹布局
                .title {
                    font-size: 0.4rem;
                    // 添加彈性容器
                    display: flex;
                    // 主軸一左一右排列
                    justify-content: space-between;
                    margin: 0.2133rem 0 0.4rem;

                    // 用 p 標(biāo)簽來(lái)填充左邊的內(nèi)容
                    p {
                        // 添加固定的寬度,防止擠壓到右邊的內(nèi)容
                        width: 6.9067rem;
                        // 存放主題文字顏色(設(shè)置默認(rèn)的字體顏色)
                        color: @themeColor;
                    }

                    span {
                        color: #FE6249;
                    }
                }

                .total {
                    font-size: 0.2933rem;
                    color: #b4b4b4;

                    i {
                        // 文字垂直中部對(duì)齊
                        vertical-align: middle;
                    }

                    .qizhi {
                        margin-right: 0.1867rem;
                        font-size: 0.2667rem;
                    }

                    .shizhong {
                        margin-left: 0.4rem;
                        margin-right: 0.1333rem;
                        font-size: 0.2667rem;
                    }
                }
            }

        }

        .run {
            position: absolute;
            left: 0.3733rem;
            top: -0.1067rem;
            width: 1.8133rem;
            height: 0.7733rem;
            background: url(../images/status_active.png);
            background-size: 1.8133rem 0.7733rem;
            font-size: 0.32rem;
            color: #fff;
            padding-left: 0.3733rem;
            padding-top: 0.1333rem;
        }

        // li 標(biāo)簽的第二個(gè)定位元素,樣式都是一樣的,就是字體圖標(biāo)用到的有所區(qū)別而已
        .collcet {
            position: absolute;
            right: 0.48rem;
            top: 0.4rem;
            font-size: 0.64rem;
            color: #fff;
        }

        // 第二第三個(gè) li 標(biāo)簽的定位的第一個(gè)元素
        .end {
            position: absolute;
            left: 0.3733rem;
            top: -0.1067rem;
            width: 1.8133rem;
            height: 0.7733rem;
            background: url(../images/status_default.png);
            background-size: 1.8133rem 0.7733rem;
            font-size: 0.32rem;
            color: #fff;
            padding-left: 0.3733rem;
            padding-top: 0.1333rem;
        }

        // 第三個(gè) li 標(biāo)簽定位的第二個(gè)元素
        .collcet1 {
            // 子絕
            position: absolute;
            right: 0.48rem;
            top: 0.4rem;
            font-size: 0.64rem;
            color: #FECA49;
            // 設(shè)置權(quán)重的級(jí)別
            z-index: 2;
        }
    }
}

// 底部 
footer {
    // 添加彈性容器
    display: flex;
    // 固定定位:脫標(biāo)(設(shè)置寬高)
    position: fixed;
    left: 0;
    bottom: 0;
    width: 10rem;
    height: 1.3067rem;
    background-color: #FECA49;

    a {
        // 均分父容器的尺寸
        flex: 1;

        // 添加彈性容器,將內(nèi)容垂直布局
        display: flex;

        // 改變主軸方向
        flex-direction: column;
        // 主軸垂直居中 jcc
        justify-content: center;
        // 側(cè)軸水平居中 aic
        align-items: center;
        // 設(shè)置字體大小
        font-size: 0.2933rem;
        // 內(nèi)容水平居中
        text-align: center;
        color: #D78B09;

        // 字體圖標(biāo)的大小(用法跟字體的樣式是一樣的)
        .icon1 {
            font-size: 0.5653rem;
        }
        .icon2 {
            font-size: 0.4533rem;
        }
        .icon3 {
            font-size: 0.5973rem;
        }

        // :active 模仿 hover 效果,鼠標(biāo)按下未抬起
        &:active {
            color: #fff;
        }
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容