首頁 web前端 H5教程 詳解H5 活動頁之行動端 REM 佈局適配方法

詳解H5 活動頁之行動端 REM 佈局適配方法

Dec 09, 2017 am 10:19 AM
html5 佈局 適配

拿到設計稿後,如何進行版面還原?如果只需要做非精確的響應式設計,那麼使用媒體查詢來實現就 OK 了。如果需要精確還原設計稿,則一般透過縮放來實現。常見方案有基於 viewport 和基於 rem 的縮放方案。本文主要介紹了詳解H5 活動頁之行動裝置 REM 版面適配方法的相關資料,希望能幫助大家。

1 viewport 縮放方案

在行動端,可以透過 viewport 縮放頁面大小比率達到目的。

簡單來說,即所有寬高像素與視覺稿輸出相同,然後透過頁面寬度與視覺稿的寬度比率,動態設定 viewport。縮放方案核心程式碼參考:


(function () {
    var docEl = document.documentElement;
    var isMobile = window.isMobile /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobi/i.test(navigator.userAgent);

    function setScale() {
        var pageScale = 1;

        if (window.top !== window) {
            return pageScale;
        }

        var width = docEl.clientWidth || 360;
        var height = docEl.clientHeight || 640;
        if (width / height >= 360 / 640) {
            // 高度优先
            pageScale = height / 640;
        } else {
            pageScale = width / 360;
        }

        var content = 'width=' + 360 + ', initial-scale=' + pageScale 
          + ', maximum-scale=' + pageScale + ', user-scalable=no';
        document.getElementById('viewport').setAttribute('content', content);
        window.pageScale = pageScale;
    }
    if (isMobile) {
        setScale();
    } else {
        docEl.className += ' pc';
    }
})()
登入後複製


#這個方案在我們去年的一次 H5 活動頁設計中進行了相關實作。

但如果希望 PC 上也能顯示,由於沒有 viewport 的縮放概念,只能以固定值來設定,這個效果就不太理想。

2 rem 佈局適配方案

rem 佈局適配方案被提及的比較多,在各大互聯網企業產品中都有較為廣泛的應用。

簡單來說其方法為:

  1. 依照設計稿與裝置寬度的比例,動態計算並設定html 根標籤的font-size 大小;

  2. css 中,設計稿元素的寬、高、相對位置等取值,依同等比例換算為rem 為單位的值;

  3. 設計稿中的字體使用px 為單位,透過媒體查詢稍作調整。

下面我們都舉個例子來說明。

2.1 動態設定 html 標籤 font-size 大小

第一個問題是 html 標籤的 font-size 動態計算。這取決於如何約定換算比例,以頁面寬度十等份為例,核心程式碼參考:


#
(function(WIN) {
    var  setFontSize = WIN.setFontSize = function (_width) {
        var  docEl = document.documentElement; 
        // 获取当前窗口的宽度
        var  width = _width || docEl.clientWidth; // docEl.getBoundingClientRect().width;
        // 大于 1080px 按 1080
        if (width > 1080) { 
            width = 1080;
        }
        var  rem = width / 10;
        console.log(rem);
        docEl.style.fontSize = rem + 'px';
       // 部分机型上的误差、兼容性处理
        var  actualSize = win.getComputedStyle && parseFloat(win.getComputedStyle(docEl)["font-size"]);
        if (actualSize !== rem && actualSize > 0 && Math.abs(actualSize - rem) > 1) {
            var remScaled = rem * rem / actualSize;
            docEl.style.fontSize = remScaled + 'px';
        }
    }
    var timer;
    //函数节流
    function dbcRefresh() {
        clearTimeout(timer);
        timer = setTimeout(setFontSize, 100);
    }
    //窗口更新动态改变 font-size
    WIN.addEventListener('resize', dbcRefresh, false);
    //页面显示时计算一次
    WIN.addEventListener('pageshow', function(e) {
        if (e.persisted) { 
            dbcRefresh() 
        }
    }, false);
    setFontSize();
})(window)
登入後複製


另外,對於全螢幕顯示的H5 活動頁,對寬高比例有所要求,此時應當做的調整。可以這麼來做:


function adjustWarp(warpId = '#warp') {
    // if (window.isMobile) return;
    const $win = $(window);
    const height = $win.height();
    let width = $win.width();
    // 考虑导航栏情况
    if (width / height < 360 / 600) {
        return;
    }
    width = Math.ceil(height * 360 / 640);
    $(warpId).css({
        height,
        width,
        postion: &#39;relative&#39;,
        top: 0,
        left: &#39;auto&#39;,
        margin: &#39;0 auto&#39;
    });
    // 重新计算 rem
    window.setFontSize(width);
}
登入後複製


#依照這個縮放方法,幾乎可以在任何裝置上實現等比縮放的精確佈局。

2.2 元素大小取值方法

第二個問題是元素大小的取值。

以設計稿寬度 1080px 為例,我們將寬度分成 10 等份以便於換算,那麼 1rem = 1080 / 10 = 108px 。其換算方法為:


const px2rem = function(px, rem = 108) {
    let remVal = parseFloat(px) / rem;
    if (typeof px === "string" && px.match(/px$/)) { 
        remVal += &#39;rem&#39;;
    }

    return remVal;
}
登入後複製


例如,設計稿中有一個圖片大小為460x210 ,相對頁面位置top: 321px; left : 70; 。依照如上換算方式,得到該元素最終的css 樣式應為:


.img_demo {
    position: absolute;
    background-size: cover;
    background-image: url(&#39;demo.png&#39;);
    top: 2.97222rem;
    left: 0.64814rem;
    width: 4.25926rem;
    height: 1.94444rem;
}
登入後複製


2.3 rem 佈局方案的開發方式

透過以上方法,rem 佈局方案就實現了。但是手動計算 rem 的取值顯然不切實際。

透過 less/sass 預處理工具,我們只需要設定 mixins 方法,然後依照設計稿的實際大小來取值。以less 為例,mixins 參考如下:


// px 转 rem
.px2rem(@px, @attr: &#39;width&#39;, @rem: 108rem) {
    @{attr}: (@px / @rem);
}

.px2remTLWH(@top, @left, @width, @height, @rem: 108rem) {
    .px2rem(@top, top, @rem);
    .px2rem(@left, left, @rem);
    .px2rem(@width, width, @rem);
    .px2rem(@height, height, @rem);
}
登入後複製


針對前文的範例元素,css 樣式可以這樣來寫:


.img_demo {
    position: absolute;
    background-size: cover;
    background-image: url(&#39;demo.png&#39;);
    .px2remTLWH(321, 70, 460, 210);
}
登入後複製


這裡,寬和高可以直接透過設計稿輸出的圖片元素大小讀取到;top/left 的取值,可以透過在Photoshop 中移動參考線定位元素快速取得。

2.4 字體使用px 為單位

字體使用rem 等比縮放會出現顯示上的問題,只需要針對性使用媒體查詢設定幾種大小即可。

範例參考:


// 字体响应式
@media screen and (max-width: 321px) {
    body {
        font-size: 13px;
    }
}

@media screen and (min-width: 321px) and (max-width: 400px) {
    body {
        font-size: 14px;
    }
}

@media screen and (min-width: 400px) {
    body {
        font-size: 16px;
    }
}
登入後複製

相關推薦:

CSS網格佈局的範例程式碼

CSS佈局有哪些技巧

html中佈局標記與清單標記的圖文詳解

#

以上是詳解H5 活動頁之行動端 REM 佈局適配方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

HTML 中的表格邊框 HTML 中的表格邊框 Sep 04, 2024 pm 04:49 PM

HTML 表格邊框指南。在這裡,我們以 HTML 中的表格邊框為例,討論定義表格邊框的多種方法。

HTML 中的巢狀表 HTML 中的巢狀表 Sep 04, 2024 pm 04:49 PM

這是 HTML 中巢狀表的指南。這裡我們討論如何在表中建立表格以及對應的範例。

HTML 左邊距 HTML 左邊距 Sep 04, 2024 pm 04:48 PM

HTML 左邊距指南。在這裡,我們討論 HTML margin-left 的簡要概述及其範例及其程式碼實作。

HTML 表格佈局 HTML 表格佈局 Sep 04, 2024 pm 04:54 PM

HTML 表格佈局指南。在這裡,我們詳細討論 HTML 表格佈局的值以及範例和輸出。

HTML 輸入佔位符 HTML 輸入佔位符 Sep 04, 2024 pm 04:54 PM

HTML 輸入佔位符指南。在這裡,我們討論 HTML 輸入佔位符的範例以及程式碼和輸出。

HTML 有序列表 HTML 有序列表 Sep 04, 2024 pm 04:43 PM

HTML 有序列表指南。在這裡我們也分別討論了 HTML 有序列表和類型的介紹以及它們的範例

在 HTML 中移動文字 在 HTML 中移動文字 Sep 04, 2024 pm 04:45 PM

HTML 中的文字移動指南。在這裡我們討論一下marquee標籤如何使用語法和實作範例。

HTML onclick 按鈕 HTML onclick 按鈕 Sep 04, 2024 pm 04:49 PM

HTML onclick 按鈕指南。這裡我們分別討論它們的介紹、工作原理、範例以及各個事件中的onclick事件。

See all articles