web移動端屏幕適配方案


因為手機屏幕的分辨率大小不一 ,如果使用傳統的靜態布局,把每個元素的寬高樣式寫死,在不同的屏幕中就有各種各樣的顯示效果。這顯然不是我們想要的結果。我們需要的是根據屏幕分辨率的不同,來適配不同的樣式大小。使不同的手機分辨率下都有相同的樣式布局

1.rem適配

1rem就是html標簽font-size的大小,在rem適配方案中,我們以rem作為基值來設定元素的大小。1rem單位越大,元素的大小也就越大,1rem單位越小,元素的大小也就越小(1em是當前元素的文字大小)

實現方法:通過js獲取屏幕的分辨率來動態設置1rem的大小,即屏幕分辨率越大 => 1rem越大 => 元素也越大,這樣來適配不同分辨率的屏幕

缺點:需要手動轉換rem和px

注意:需要設置完美視口。另外1rem的值雖然可以自定義,但是谷歌瀏覽器有最小字體為12px,所以設置rem的時候要保證最小屏幕下的1rem不能小於12px

<!-- 設置完美視口 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">

方法一:設置html元素的內聯樣式

<script>
    var html = document.querySelector('html')
    // 照這種設置 375分辨率 (蘋果6)的1rem = 20px
    html.style.fontSize = document.documentElement.clientWidth/18.75 + 'px'
</script>

方法二:添加style標簽,為html標簽設定樣式,這種方法可以將樣式權重提升為最高

<script>
    var head = document.querySelector('head')
    // 在iphone6中 1rem=20px 移動端瀏覽器字體最小12px
    var w = document.documentElement.clientWidth/18.75
    // 創建style標簽
    var styleNode = document.createElement('style')
    // 在style標簽中寫入內容
    styleNode.innerHTML = "html{font-size:"+ w +"px !important}"
    // 將style節點插入到head中
    head.appendChild(styleNode)
</script>

2.viewport適配

viewport適配就是使用縮放,將固定大小的頁面縮放成與屏幕分辨率一樣的大小

優點:只需按設計圖1:1的大小來設定元素的大小即可,無需考慮數值轉換(數值轉換交給scale去做)

在meta標簽中,scale=1.0就相當於設定width=設備獨立像素的大小
以設計圖為640px為例,假設我們的手機屏幕寬度是375px,在scale=1時就會出現這種效果:

這種方案下我們需要破壞完美視口,修改scale的值來適配不同屏幕。只要將頁面縮小到手機屏幕的尺寸,這樣就不會再出現滾動條(375/640=0.5859375)

<meta name="viewport" content="initial-scale=0.5859375" />

實際開發中,手機的屏幕大小有很多種,並不是固定的。頁面也是一樣,並不是固定的640,所以需要 用js來動態設置scale的值

<script>
    // 設置設計圖的尺寸640 / 750 都行
    var targetW = 640
    // 設定縮放比例
    var scale = window.screen.width / targetW
    // 創建meta標簽
    var meta = document.createElement('meta')
    // 為meta標簽設定屬性值
    meta.name = "viewport"
    meta.content = "initial-scale="+scale+", minimum-scale="+scale+", maximum-scale="+scale+",user-scalable=no"
    // 將meta標簽插入到head標簽中
    document.head.appendChild(meta)
</script>

3.vw和vh

vw和vh是相對於視口的寬度/高度,即:
100vw = 視口的寬度
100vh = 視口的高度

<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1"> 
<style>
    #box{
        width: 50vw;
        height: 50vh;
        background-color: red;
    }
</style>
<body>
    <div id="box"></div>
</body>

效果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM