详解html5页面 rem 布局适配方法


Posted in HTML / CSS onJanuary 12, 2018

rem 布局适配方案

主要方法为:

  1. 按照设计稿与设备宽度的比例,动态计算并设置 html 根标签的 font-size 大小;
  2. css 中,设计稿元素的宽、高、相对位置等取值,按照同等比例换算为 rem 为单位的值;
  3. 设计稿中的字体使用 px 为单位,通过媒体查询稍作调整。

1 动态设置 html 标签 font-size 大小

精简通用版本:

!(function(win, doc){
  function setFontSize() {
    // 获取window 宽度
    // zepto实现 $(window).width()就是这么干的
    var winWidth =  window.innerWidth;
    // doc.documentElement.style.fontSize = (winWidth / 640) * 100 + 'px' ;
    
    // 640宽度以上进行限制 需要css进行配合
    var size = (winWidth / 640) * 100;
    doc.documentElement.style.fontSize = (size < 100 ? size : 100) + 'px' ;
  }

  var evt = 'onorientationchange' in win ? 'orientationchange' : 'resize';

  var timer = null;

  win.addEventListener(evt, function () {
    clearTimeout(timer);

    timer = setTimeout(setFontSize, 300);
  }, false);

  win.addEventListener("pageshow", function(e) {
    if (e.persisted) {
      clearTimeout(timer);

      timer = setTimeout(setFontSize, 300);
    }
  }, false);
  // 初始化
  setFontSize();

}(window, document));

高配精确版本:

(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') {

    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: 'relative',
        top: 0,
        left: 'auto',
        margin: '0 auto'
    });

    // 重新计算 rem
    window.setFontSize(width);
}

2 通过 CSS3媒体查询设置 rem

简单易用 缺乏灵活度 请看demo 你懂的

@media screen and ( min-width: 320px){html{font-size:50px}}
@media screen and ( min-width: 360px){html{font-size:56.25px}}
@media screen and ( min-width: 375px){html{font-size:58.59375px}}
@media screen and ( min-width: 384px){html{font-size:60px}}
@media screen and ( min-width: 400px){html{font-size:62.5px}}
@media screen and ( min-width: 414px){html{font-size:64.6875px}}
@media screen and ( min-width: 424px){html{font-size:66.25px}}
@media screen and ( min-width: 480px){html{font-size:75px}}
@media screen and ( min-width: 540px){html{font-size:84.375px}}
@media screen and ( min-width: 640px){html{font-size:100px}}

根据个人项目需求和产品设计可适当修改,以上demo写法并不唯一固定。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS3中文字镂空、透明值、阴影效果设置示例小结
Mar 07 HTML / CSS
详解CSS3 弹性布局快速入门
Jun 06 HTML / CSS
解决margin 外边距合并问题
Jul 03 HTML / CSS
Html5中的桌面通知Notification的实现
Sep 25 HTML / CSS
html5之Canvas路径绘图、坐标变换应用实例
Dec 26 HTML / CSS
html5基础标签(html5视频标签 html5新标签用法)
Dec 30 HTML / CSS
HTML5实现无刷新修改URL的方法
Nov 14 HTML / CSS
HTML5页面嵌入小程序没有返回按钮及返回页面空白的问题
May 28 HTML / CSS
CSS3 菱形拼图实现只旋转div 背景图片不旋转功能
Mar 30 HTML / CSS
HTML5简单实现添加背景音乐的几种方法
May 12 HTML / CSS
html中显示特殊符号(附带特殊字符对应表)
Jun 21 HTML / CSS
小程序实现悬浮按钮的全过程记录
Oct 16 HTML / CSS
详解html5 canvas 微信海报分享(个人爬坑)
Jan 12 #HTML / CSS
利用三角函数在canvas上画虚线的方法
Jan 11 #HTML / CSS
HTML5 Web缓存和运用程序缓存(cookie,session)
Jan 11 #HTML / CSS
canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动
Jan 10 #HTML / CSS
基于canvas使用贝塞尔曲线平滑拟合折线段的方法
Jan 10 #HTML / CSS
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
Jan 10 #HTML / CSS
H5混合开发app如何升级的方法
Jan 10 #HTML / CSS
You might like
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
php数组函数序列之array_intersect() 返回两个或多个数组的交集数组
2011/11/10 PHP
初识通用数据库操作类――前端easyui-datagrid,form(php)
2015/07/31 PHP
Convert Seconds To Hours
2007/06/16 Javascript
JavaScript Title、alt提示(Tips)实现源码解读
2010/12/12 Javascript
js静态方法与实例方法分析
2011/07/04 Javascript
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
2012/06/18 Javascript
jquery购物车实时结算特效实现思路
2013/09/23 Javascript
JS代码随机生成姓名、手机号、身份证号、银行卡号
2016/04/27 Javascript
微信小程序页面传值实例分析
2017/04/19 Javascript
详解Angular的8个主要构造块
2017/06/20 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
2020/08/09 Javascript
animate.css在vue项目中的使用教程
2018/08/05 Javascript
Node.js Buffer模块功能及常用方法实例分析
2019/01/05 Javascript
基于jQuery实现可编辑的表格
2019/12/11 jQuery
JavaScript实现简单计算器功能
2019/12/19 Javascript
JavaScript实现通讯录功能
2020/12/27 Javascript
[02:20]2014DOTA2西雅图邀请赛 MVP外卡赛首胜采访
2014/07/09 DOTA
[03:20]2015国际邀请赛全明星表演赛
2015/08/08 DOTA
使用Python编写简单网络爬虫抓取视频下载资源
2014/11/04 Python
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
2015/04/09 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
2017/07/04 Python
python3中类的继承以及self和super的区别详解
2019/06/26 Python
python动态进度条的实现代码
2019/07/03 Python
Pytest参数化parametrize使用代码实例
2020/02/22 Python
python为QT程序添加图标的方法详解
2020/03/09 Python
在Keras中实现保存和加载权重及模型结构
2020/06/15 Python
django项目中使用云片网发送短信验证码的实现
2021/01/19 Python
HTML5注册页面示例代码
2014/03/27 HTML / CSS
100%羊绒:NakedCashmere
2020/08/26 全球购物
JDK安装目录下有哪些内容
2014/08/25 面试题
资料员的岗位职责
2013/11/20 职场文书
2014年党员自我评议对照检查材料
2014/09/20 职场文书
2014年领班工作总结
2014/11/25 职场文书
2014年监理个人工作总结
2014/12/11 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP