关于手机端适配的问题(rem,页面缩放)

相信很多和会和我碰到一样的情况,就是你用rem去写移动端的时候,如果想引用别的UI库的时候,自己页面写的是rem单位,而ui库的css里面写的是px,大家都知道,rem是在html上设置font-size 字体大小。然后,,然后ui库的里面的px 会和 rem冲突,很麻烦,搜了很多办法都没找到好的解决办法!!!

rem的做法

(function() {
    var doc = document,
        win = window;
    var docEl = doc.documentElement,
        resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
        recalc = function() {
            var clientWidth = docEl.clientWidth;
            if(!clientWidth) return;
            //如果屏幕大于750(750是根据我效果图设置的,具体数值参考效果图),就设置clientWidth=750,防止font-size会超过100px
            if(clientWidth > 750) { clientWidth = 750 }
            //设置根元素font-size大小
            docEl.style.fontSize = 100 * (clientWidth / 750) + 'px';
        };
    //屏幕大小改变,或者横竖屏切换时,触发函数
    win.addEventListener(resizeEvt, recalc, false);
    //文档加载完成时,触发函数
    doc.addEventListener('DOMContentLoaded', recalc, false);
})();

本人在看帖子的时候,看到一个淘宝缩放页面的方法,亲测,效果不错,直接用px单位写,根据meta标签进行缩放。这样如果想引用ui库的css 就不会冲突了,嗯不错不错。

附上缩放代码

<script type="text/javascript">
            var phoneWidth = parseInt(window.screen.width);
            var phoneHeight = parseInt(window.screen.height);
            var phoneScale = phoneWidth / 750;  /*除以的值按手机的物理分辨率,就是设计图宽度*/
            //获取head标签
            var $head = document.getElementsByTagName("head")[0];   
            var ua = navigator.userAgent;
            if(/Android (\d+\.\d+)/.test(ua)) {
                var version = parseFloat(RegExp.$1);
                // andriod 2.3
                if(version > 2.3) {
                    $head.innerHTML+=('<meta name="viewport" content="width=device-width,initial-scale=' + phoneScale + ',minimum-scale=' + phoneScale + ',maximum-scale=' + phoneScale + ',user-scalable=no">');
                    // andriod 2.3以上
                } else {
                    $head.innerHTML+=('<meta name="viewport" content="width=device-width,user-scalable=no">');
                }
                // 其他系统
            } else {
                $head.innerHTML+=('<meta name="viewport" content="width=device-width, initial-scale=' + phoneScale + ',minimum-scale=' + phoneScale + ',maximum-scale =' + phoneScale + ',user-scalable=no,">');
            }
</script>

但是。。。但是。如果做app套浏览器壳的话,是不允许你使用meta标签缩放的。
网易的做法是用css进行缩放。具体做法如下:
html

<div id="app">
        <div id="getHeight"></div>
        <div id="content">
                123
        </div>
  </div>

css

/* css reset from normalize*/

        html {
            
            /* 1 */
            -ms-text-size-adjust: 100%;
            /* 2 */
            -webkit-text-size-adjust: 100%;
            /* 2 */
        }

        body {
            margin: 0;
        }

        /* 上下拉动滚动条时卡顿、慢 */

        body {
            -webkit-overflow-scrolling: touch;
            overflow-scrolling: touch;
        }

        /* ios和android下触摸元素时出现半透明灰色遮罩 */

        a {
            -webkit-tap-highlight-color: rgba(255, 255, 255, 0);
        }

        #getHeight {
            height: 100vh;
            width: 100vw;
            position: absolute;
            top: 0;
            left: 0;
            z-index: -10;
        }

        #content {
            width: 750px;
            transform-origin: 0 0;
            font-size: 36px;
        }

        #content {
            height: 100%;
        }
        

js

<script>
        this.widthBox = window.screen.width
        this.heightBox = window.screen.height
        if (this.widthBox > document.getElementById('getHeight').clientWidth) {
            this.widthBox = document.getElementById('getHeight').clientWidth
        }
        this.showWindowSize()

        function reHeight() {
            console.log(this.heightBox)
            sessionStorage.removeItem('daicanfenappheight')
        }
        function showWindowSize() { // 更改变形
            if (sessionStorage.daicanfenappheight && sessionStorage.daicanfenappheight !== 0) {
                this.heightBox = parseFloat(sessionStorage.daicanfenappheight)
            } else {
                this.heightBox = parseFloat(document.getElementById('getHeight').clientHeight)
                sessionStorage.daicanfenappheight = this.heightBox
            }
            let slace = this.widthBox / 750
            // body
            let BigBox = document.getElementsByTagName('body')[0]
            BigBox.style.width = this.widthBox + 'px'
            BigBox.style.height = this.heightBox + 'px'
            BigBox.style.overflow = 'hidden'
            BigBox.style.maxWidth = '750px'
            // #app
            let AppBox = document.getElementById('app')
            AppBox.style.width = this.widthBox + 'px'
            AppBox.style.height = this.heightBox + 'px'
            AppBox.style.overflow = 'hidden'
            // #content
            let ContentBox = document.getElementById('content')
            let ListArr = [ContentBox]
            // 循环添加属性
            for (let i = 0; i < ListArr.length; i++) {
                ListArr[i].style['transform'] = 'scale(' + slace + ')'
                ListArr[i].style['-ms-transform'] = 'scale(' + slace + ')'
                ListArr[i].style['-moz-transform'] = 'scale(' + slace + ')'
                ListArr[i].style['-webkit-transform'] = 'scale(' + slace + ')'
                ListArr[i].style['-o-transform'] = 'scale(' + slace + ')'
            }
            ContentBox.style['overflow-x'] = 'hidden'
            ContentBox.style['overflow-y'] = 'auto'
            ContentBox.style['height'] = (parseFloat(this.heightBox) / slace) + 'px'
        }
    </script>

这样方法的好处就是用css进行缩放,在做app的时候也是没有问题的,缺点,就是代码比较多。
不喜勿喷。谢谢!!!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容