REM

Equal to the computed value of "font-size" on the root element

rem是CSS3新增的相对长度单位,是指相对于根元素htmlfont-size计算值的大小。简单可理解为屏幕宽度的百分比。

REM浏览器支持情况

em相同的是它们都是使用元素设定字体大小,不同的是em是根据父级元素设置大小。而rem在根据指定html根元素的字符大小而定的,从IE6到Chrome中,默认根元素的font-size都是16px的。如果想要设置12px的字体大小也就是12px/16px = 0.75rem

  • 由于px是相对固定单位,字号大写直接被定死,无法随着浏览器进行缩放。
  • emrem都是相对单位,em是相对于其父元素的font-size,页面层级越深,em换算越复杂,麻烦。
  • rem直接相对于根元素html,避开层级关系,移动端新型浏览器对其支持较好。
单位转换

使用em可改变HTML的默认font-size,如果设置为62.5%,则表示将默认字体大小从16px修改为10px,即10px / 16px = 62.5%

html{
  font-size:62.5%; 
}

前端适配是为了让设计稿在大部分设备上得到一致性的展示

  • 强制meta viewport宽度为设计稿宽度
    问题是某些浏览器的webview中会出现兼容问题,且对于1像素会无法渲染。

  • 使用rem自适应布局
    在背景和字体上存在某些问题

不同分辨率下的font-size

制作案例

设计稿与制作稿

备注说明

  • 设计稿尺寸为750x1180
  • 适配除了iPadPro上边距有些问题其他基本合格
  • 真机尚待测试

注意事项

  • JS代码在CSS之前加载
  • 换算方案使用JS后计算尺寸后,将对应的像素尺寸除以100得到rem单位。
  • CSS RESET添加设置了HTML字体初始值和Body字体的初始值,已避免JS无法接在等问题。

页面结构

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0, user-scalable=0"/>
    <meta name="apple-mobile-web-app-capable" content="yes"/>
    <meta name="format-detection" content="telephone=no"/>
    <meta http-equiv="X-UA-Compatible" content="ie=edge"/>
    <meta http-equiv="Cache-Control" content="no-cache" />
    <title>room</title>
    <script></script>
    <style></style>
</head>
<body>
    <div class="fixed-top bg bg-main"></div>
    <div class="contianer">
        <div class="bg title member"></div>
        <div class="userlist">
            <div class="useritem">
                <img src="./assets/img/room/avatar.png" class="avatar"/>
                <p>玩家昵称</p>
            </div>
            <div class="useritem">
                <img src="./assets/img/room/avatar.png" class="avatar"/>
                <p>玩家昵称</p>
            </div>
            <div class="useritem">
                <img src="./assets/img/room/avatar.png" class="avatar"/>
                <p>玩家昵称</p>
            </div>
            <div class="useritem">
                <img src="./assets/img/room/avatar.png" class="avatar"/>
                <p>玩家昵称</p>
            </div>
            <div class="useritem">
                <img src="./assets/img/room/avatar.png" class="avatar"/>
                <p>玩家昵称</p>
            </div>
            <div class="useritem">
                <img src="./assets/img/room/avatar.png" class="avatar"/>
                <p>玩家昵称</p>
            </div>
            <div class="useritem">
                <img src="./assets/img/room/nopic.png" class="avatar"/>
                <p>玩家昵称</p>
            </div>
            <div class="useritem">
                <img src="./assets/img/room/nopic.png" class="avatar"/>
                <p>玩家昵称</p>
            </div>
        </div>
        <div class="bg title info"></div>
        <div class="bg match"></div>
        <div class="fixed-bottom">
            <a href="javascript:;" class="bg btn-join" id="join">加入游戏</a>
            <a href="javascript:;" class="bg btn-download" id="download">下载游戏</a>
        </div>
    </div>
</body>
</html>

自适应脚本

/**
 * REM自适应
 * designWidth 设计稿实际宽度
 * maxWidth 制作稿的最大宽度
 * */
;(function(designWidth, maxWidth){
    var docEle = document.documentElement;
    //设置viewport
    var meta;
    var viewportContent = "width=device-width,initial-scale=1,maximum-scale=1.0,user-scalable=no,viewport-fit=cover";//viewport-fit=cover用于适配iphoneX
    meta = document.querySelector("meta[name=viewport]");
    if(meta){
        meta.setAttribute("content", viewportContent);
    }else{
        meta = document.createElement("meta");
        meta.setAttribute("name","viewport");
        meta.setAttribute("content", viewportContent);
        if(docEle.firstElementChild){
            docEle.firstElementChild.appendChild(meta);
        }else{
            var div = document.createElement("div");
            div.appendChild(meta);
            document.write(div.innerHTML);
            div = null;
        }
    }

    //创建REM样式
    var styleEle = document.createElement("style");
    if(docEle.firstElementChild){
        docEle.firstElementChild.appendChild(styleEle);
    }else{
        var div = document.createElement("div");
        div.appendChild(styleEle);
        document.write(div.innerHTML);
        div = null;
    }

    //等待viewport设置好后执行refreshRem
    var refreshRem = function(){
        var width = docEle.getBoundingClientRect().width;
        maxWidth = maxWidth || 540;//限制在540的屏幕下,这样100%就跟10rem不一样了
        width > maxWidth && (width = maxWidth);

        var rem = width * 100 / designWidth;
        styleEle.innerHTML = "html{font-size:"+rem+"px !important;}";
    };
    refreshRem();

    //事件监听
    var timeID;
    window.addEventListener("resize", function(){
        clearTimeout(timeID);//防止执行两次
        timeID = setTimeout(refreshRem, 300);
    },false);
    window.addEventListener("pageshow", function(evt){
        //浏览器后退时重新计算
        if(evt.persisted){
            clearTimeout(timeID);
            timeID = setTimeout(refresh, 300);
        }
    },false);

    //事件监听
    var defaultFontSize = "16px";
    if(document.readState === "complete"){
        document.body.style.fontSize = defaultFontSize;
    }else{
        document.addEventListener("DOMContentLoaded", function(evt){
            document.body.style.fontSize = defaultFontSize;
        }, false);
    }
})(720, 750);

重置样式

/*reset css*/
body,dl,dd,ul,ol,h1,h2,h3,h4,h5,h6,pre,form,input,textarea,p,hr,thead,tbody,tfoot,th,td{margin:0;padding:0;}
ul,ol{list-style:none;}
a{text-decoration:none;}
html{-ms-text-size-adjust:none;-webkit-text-size-adjust:none;text-size-adjust:none;font-size:50px;}
body{line-height:1.5;font-size:16px;}
body,button,input,select,textarea{font-family:'helvetica neue',tahoma,'hiragino sans gb',stheiti,'wenquanyi micro hei',5FAE8F6F96C59ED1,5B8B4F53,sans-serif;}
b,strong{font-weight:bold;}
i,em{font-style:normal;}
table{border-collapse:collapse;border-spacing:0;}
table th,table td{border:1px solid #ddd;padding:5px;}
table th{font-weight:inherit;border-bottom-width:2px;border-bottom-color:#ccc;}
img{border:0 none;width:auto;max-width:100%;vertical-align:top;}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0;vertical-align:baseline;}
button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;}
button[disabled],input[disabled]{cursor:default;}
input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;}
input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;}
input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;}
@media screen and (-webkit-min-device-pixel-ratio:0){
    input{line-height:normal!important;}
}
select[size],select[multiple],select[size][multiple]{border:1px solid #AAA;padding:0;}
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block;}
audio,canvas,video,progress{display:inline-block;}

页面样式

/*page css*/
body{
    background-color:#6A3B27;
}
.fixed-top{
    position:fixed;
    top:0;
    left:0;
    z-index:-10;
    zoom:1;
}
.bg{
    background-repeat:no-repeat;
    background-size:cover;
    background-position:center 0; 
}
.bg-main{
    width:100%;
    min-width:7.2rem;
    height:100%;
    max-height:11.8rem;
    overflow:hidden;
    background-image:url("./assets/img/room/bg.jpg");
}
.fixed-bottom{
    position:fixed;
    bottom:0;
    left:0;
    right:0;
    z-index:20;
}
.fixed-bottom>a{
    width: 50%;
    height:100%;
    min-height:1.1rem;
    line-height: 1.1rem;
    overflow:hidden;
    cursor:pointer;
    display:block;
    text-indent:-99rem;
    text-align:center;
    float: left;
}
.fixed-bottom>.bg.btn-download{
    background-image:url("./assets/img/room/download.png");
}
.fixed-bottom>.bg.btn-join{
    background-image:url("./assets/img/room/join.png");
}
.title{
    position:absolute;
    width:3.54rem;
    height:0.67rem;
    left: 50%;
    margin-left:-1.77rem;
    z-index:10;
}
.title.member{
    top:2.42rem;
    background-image:url("./assets/img/room/room_member.png");
}
.title.info{
    top:6.98rem;
    background-image:url("./assets/img/room/room_info.png");
}
.userlist{
    z-index:10;
    position:absolute;
    top: 3.25rem;
    width:6.4rem;
    left: 50%;
    margin-left:-3.2rem;
    display:block;
}
.userlist .useritem{
    width:1.6rem;
    float:left;    
    text-align: center;
}
.userlist .useritem p{
    color:#EEDF9C;
    margin:0 auto;
    text-align:center;
    font-size:0.22rem;
}
.userlist .useritem .avatar{
    width:1.37rem;
    margin: 0 auto;
}
.match{
    z-index: 10;
    position: absolute;
    top: 7.74rem;
    height: 2.77rem;
    width: 6.42rem;
    left:50%;
    margin-left:-3.21rem;
    background-image:url("./assets/img/room/room_table.png");
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容