移动端不同分辨率手机的适配问题

来源:互联网 发布:鬼泣3 但丁觉醒 mac版 编辑:程序博客网 时间:2024/06/05 07:49

移动端的适配真是一件让人头疼的事情,本小白一直在摸索前进,因为最近在做移动端的H5页面,为了响应领导的号召,尽量适配各种手机抓狂,抓狂一段时间后,参考前辈经验,总结出以下3套方案。

一:固定宽度,让显示内容根据设备的大小缩放,不考虑苹果设备的高清显示。

代码如下:

<span style="font-family:Times New Roman;font-size:18px;">if(/Android (\d+\.\d+)/.test(navigator.userAgent)){       var version = parseFloat(RegExp.$1);      if(version>2.3){          var phoneScale = parseInt(window.screen.width)/640;          document.write('<meta name="viewport" content="width=640, minimum-scale = '+ phoneScale +', maximum-scale = '+ phoneScale +', target-densitydpi=device-dpi">');          }else{                 document.write('<meta name="viewport" content="width=640, target-densitydpi=device-dpi">');              }    }else{    document.write('<meta name="viewport" content="width=640, user-scalable=no, target-densitydpi=device-dpi">');    }​</span>

这是比较常见的一种做法,简单粗暴,最大的好处就是设置元素大小的时候可以直接根据设计稿的大小进行设置,不同屏幕自动实现缩放,很多人在用,包括公司的前任前端。缺点嘛,可能就是Retina屏幕下不能高清显示,不过对于750的设计稿来说,用户体验也差不到哪里去咧。

二:rem方式

rem是CSS3的新属性,rem和em单位一样,都是一个相对单位,不同的是em是相对于元素的父元素的font-size进行计算,rem是相对于根元素html的font-size进行计算,根据这个特性可以根据设备屏幕的大小动态添加html元素的font-size大小。

 <span style="font-size:18px;">(function (doc, win) {        var docEl = doc.documentElement,            resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',            recalc = function () {                var clientWidth = docEl.clientWidth;                if (!clientWidth) return;                if(clientWidth>=640){                    docEl.style.fontSize = '100px';                }else{                    docEl.style.fontSize = 100 * (clientWidth / 640) + 'px';                }            };        if (!doc.addEventListener) return;        win.addEventListener(resizeEvt, recalc, false);        doc.addEventListener('DOMContentLoaded', recalc, false);    })(document, window);​</span>
三:终极版本

手淘团队开发的flexible.js,本人做了微调,对于750px的设计图,把原本的基准font-size:75px调成了100px;更便于计算。

(function(win, lib) {    var doc=win.document;    var docEl = doc.documentElement;    var metaEl = doc.querySelector('meta[name="viewport"]');    var flexibleEl = doc.querySelector('meta[name="flexible"]');    var dpr = 0;    var scale = 0;    var tid;    var flexible = lib.flexible || (lib.flexible = {});    if (metaEl) {        console.warn('将根据已有的meta标签来设置缩放比例');        var match = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/);        if (match) {            scale = parseFloat(match[1]);            dpr = parseInt(1 / scale);        }    } else if (flexibleEl) {        var content = flexibleEl.getAttribute('content');        if (content) {            var initialDpr = content.match(/initial\-dpr=([\d\.]+)/);            var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/);            if (initialDpr) {                dpr = parseFloat(initialDpr[1]);                scale = parseFloat((1 / dpr).toFixed(2));            }            if (maximumDpr) {                dpr = parseFloat(maximumDpr[1]);                scale = parseFloat((1 / dpr).toFixed(2));            }        }    }    if (!dpr && !scale) {        var isAndroid = win.navigator.appVersion.match(/android/gi);        var isIPhone = win.navigator.appVersion.match(/iphone/gi);        var devicePixelRatio = win.devicePixelRatio;        if (isIPhone) {            // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案            if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {                dpr = 3;            } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){                dpr = 2;            } else {                dpr = 1;            }        } else {            // 其他设备下,仍旧使用1倍的方案            dpr = 1;        }        scale = 1 / dpr;    }    docEl.setAttribute('data-dpr', dpr);    if (!metaEl) {        metaEl = doc.createElement('meta');        metaEl.setAttribute('name', 'viewport');        metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');        if (docEl.firstElementChild) {            docEl.firstElementChild.appendChild(metaEl);        } else {            var wrap = doc.createElement('div');            wrap.appendChild(metaEl);            doc.write(wrap.innerHTML);        }    }    function refreshRem(){        var width = docEl.getBoundingClientRect().width;        if (width / dpr > 540) {            width = 540 * dpr;        }
<span style="white-space:pre"></span>//<span style="font-family: Arial, Helvetica, sans-serif;"> var rem = width / 10;   原来的代码</span>        var rem = width / 7.5;<span style="white-space:pre"></span>//自己的改动        docEl.style.fontSize = rem + 'px';        flexible.rem = win.rem = rem;    }    win.addEventListener('resize', function() {        clearTimeout(tid);        tid = setTimeout(refreshRem, 300);    }, false);    win.addEventListener('pageshow', function(e) {        if (e.persisted) {            clearTimeout(tid);            tid = setTimeout(refreshRem, 300);        }    }, false);    if (doc.readyState === 'complete') {        doc.body.style.fontSize = 12 * dpr + 'px';    } else {        doc.addEventListener('DOMContentLoaded', function(e) {            doc.body.style.fontSize = 12 * dpr + 'px';        }, false);    }    refreshRem();    flexible.dpr = win.dpr = dpr;    flexible.refreshRem = refreshRem;    flexible.rem2px = function(d) {        var val = parseFloat(d) * this.rem;        if (typeof d === 'string' && d.match(/rem$/)) {            val += 'px';        }        return val;    };    flexible.px2rem = function(d) {        var val = parseFloat(d) / this.rem;        if (typeof d === 'string' && d.match(/px$/)) {            val += 'rem';        }        return val;    }})(window, window['lib'] || (window['lib'] = {}));

0 0