基于媒体查询和 rem 的响应式布局实践

本文首发于 dawei.lvcss

媒体查询 @media

咱们开发一个网站的时候但愿在手机端、iPad 端、PC 端都有良好的体验,CSS 给咱们提供了一个强大的条件判断语法,能够根据设备的宽度来设置不一样的样式,从而实现不一样的设备应用不一样的布局。html

下图展现了利用 @media 实现的同一页面手机端 2 列、iPad 端 3 列、PC 端 4 列的布局。布局

layout

下面咱们来分析下如何实现上述 Demo。flex

<div class="grid">
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
</div>
复制代码
.grid {
  display: flex;
  flex-wrap: wrap;
}

.item {
  width: 50%;
}

@media (min-width: 576px) {
  .item {
    width: 33.333%;
  }
}

@media (min-width: 1024px) {
  .item {
    width: 25%;
  }
}
复制代码

咱们根据设备的宽度把设备分为三个区间,分别为:网站

  • 小于576px 移动端区间
  • 576px~1024px 平板区间
  • 大于1024px PC 端区间

默认样式针对移动端编写,减小匹配规则,加快移动端的解析。当设备宽度大于 576px 时,就匹配到了 @media (min-width: 576px),此时 width: 33.333%; 会将原来的 50% 覆盖掉,显示为 3 列。当设备宽度大于 1024px 时,就匹配到了 @media (min-width: 1024px),此时 width: 25%; 进一步覆盖掉原来的 33.333%,显示为 4 列。ui

经过合理的布局 DOM 结构,可让不一样设备的浏览效果彻底不一样。配合 flex 布局的 order 属性,DOM 间的位置交换变得更加简单。spa

REM

咱们使用三个断点解决了不一样端的布局问题,但这只是第一步。咱们如今仍是用的 px 作单位,设计师给咱们出的 iPhone6 的设计稿,一个按钮 80px 宽度,iPhone6 上能够这么写。iPhone5s 空间不足致使换行、iPhone6 Plus 留白怎么办?这时候就要召唤出咱们的大杀器 rem 了。设计

rem 是一个根据 html 根元素 font-size 计算的相对单位。元素实际尺寸 = 元素 rem 值 x html 的 font-size 值。也就是说当 html 的 font-size 设置为 50px 时,2rem 的元素实际尺寸就是 100px。code

我司设计师一般使用 2 倍的 iPhone6 做为设计稿。iPhone6 设计稿的宽度为750px,对应实际尺寸350px。为了方便换算,咱们将 html 的 font-size 设置为 50px,实际尺寸 100px = 2rem。而这 2rem 正好等于设计稿上的 200 向左移动两位小数点,换算起来很是方便。cdn

你说的我都懂,但这跟 5s、6p 适配有什么关系呢??

固然有关系啦,咱们可让 html 的 font-size 基于 iPhone6 等比例缩放,这样就能实现对 5s、6p 的适配。来看一段代码:

var clientWidth = document.documentElement.clientWidth;
document.documentElement.style.fontSize = (clientWidth / 750) * 100 + "px";
复制代码

计算出当前设备的宽度基于 750 的尺寸,按比例换算成 px,实现不一样尺寸的手机设置等比例的 html font-size。

咱们看下实际效果图:

layout2

将 @media rem 结合起来

将以前讲的两点结合起来,代码以下:

var clientWidth = document.documentElement.clientWidth;
if (clientWidth < 575) {
  document.documentElement.style.fontSize = (clientWidth / 750) * 100 + "px";
} else if (clientWidth < 1024) {
  // 竖版 iPad 的 2x 尺寸
  document.documentElement.style.fontSize = (clientWidth / 1536) * 100 + "px";
} else {
  document.documentElement.style.fontSize = "50px";
}
复制代码

最终实现了:

  • 小于576px 移动端区间,按 iPhone6 等比缩放,2 列布局
  • 576px~1024px 平板区间,按竖版 iPad 等比缩放,3 列布局
  • 大于1024px PC 端区间,不缩放。4 列布局

总结,真实的项目中每每比这复杂的多,这个时候就须要把三端的设计稿拿过来仔细分析一下,哪些是能够抽象成一个 DOM 结构,清晰的 DOM 结构会让你的实现更加清晰。 附上本文的完整 Demo,也就是一开始的截图。 另外更复杂的实现能够参考下我司官网 www.bstcine.com 。

相关文章
相关标签/搜索