/rem

移动web开发适配Rem,Media Query

Primary LanguageHTML

移动web开发与适配

1、移动web网页的特点

  • 跑在手机端的web页面(H5页面)
  • 跨平台
  • 基于webview
  • 告别IE,拥抱webkit
  • 更高的适配和性能要求

2、常见移动web的适配方法

  • PC:

    • 960px/1000px 居中
    • 盒子模型,定高定宽
    • display:inline=block
  • 移动web:

    • 定高,宽度百分比
    • flex
    • Media query(媒体查询)

3、关于媒体查询

@media 媒体类型 and (媒体特性) {
  /* css样式 */
}
/* 媒体类型:screen,print */
/* 媒体特性: max-width,max-height */

4、移动端适配的方案

  • 简单的宽度百分比
  • 媒体查询的使用
.box {
  width: 100%;
}

.inner:nth-child(1){
  background: red;
}

.inner:nth-child(2){
  background: blue;
}

.inner:nth-child(3){
  background: red;
}

.inner:nth-child(4){
  background: blue;
}

@media screen and (max-width:320px) {
  .inner {
    width: 25%;
    height: 100px;
    float: left;
  }
}

@media screen and (min-width:321px) {
  .inner {
    width: 100%;
    height: 100px;
  }
}
<div class="box">
  <div class="inner"></div>
  <div class="inner"></div>
  <div class="inner"></div>
  <div class="inner"></div>
</div>

5、rem(font size of the root element)

Equal to the computed value of 'font-size' on the root element.When specified on the 'font-size' property of the root element,the 'rem' units refer to the property's initial value.

  • 字体单位
    • 值根据html根元素大小而定,同样可以作为宽度,高度等单位
  • 适配原理
    • 将px替换成rem,动态修改html的font-size适配
  • 兼容性
    • ios6/android2.1以上,基本覆盖所有流行的手机系统

6、动态修改font-size

  • media-query

下面的例子就是在不同屏幕宽度下设置不同的font-size

@media screen and (max-width:360px) and (min-width:321px){
  html {
    font-size: 20px;
  }
}

@media screen and (max-width:320px) {
  html {
    font-size: 24px;
  }
} 
  • js动态修改

我们可以在页面打开的时候,获取到屏幕的宽度,然后设置根元素的font-size:

let htmlWidth = document.documentElement.clientWidth || document.body.clientWidth;
let htmlDom = document.getElementsByTagName('html')[0];
htmlDom.style.fontSize = htmlWidth / 10 + 'px';

7、在scss中进行简单的适配

@function px2rem($px) {
  $rem: 37.5px;
  @return ($px / $rem) + rem;
}

在这里,37.5是一个基准值,相对于主流iPhone的宽度来的。例如,设计图上给你一个75px宽度的div(一般设计图都是二倍图),也就是说,我们需要把这个div宽度设置成37.5px。但是,这里的37.5px指的是在375px屏幕下的宽度。如果屏幕宽度变成320px,那么我们要显示的宽度就不是37.5px了。

div {
  width: px2rem(37.5px); /* 代码中的显示 */
  width: 1rem; /* 375屏幕浏览器中的显示 */
  width: 37.5px; /* 375屏幕下,div的实际宽度 */
  width: 1rem; /* 320屏幕浏览器中的显示*/
  width: 32px; /* 375屏幕下,div的实际宽度 */
}

实际css代码只有一句:width: px2rem(37.5px);但是,这种做法得到的div,宽度都是10%,并且这个宽度不依赖于父元素。

有时候我们要去开发自己的UI库,这个时候不适合使用rem来写样式。因为每个项目的根元素的font-size可能都是不一样的。