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

所属分类: 网页制作 / CSS 阅读数: 1840
收藏 0 赞 0 分享

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

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

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

<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

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

通过合理的布局 DOM 结构,可以让不同设备的浏览效果完全不同。配合 flex 布局的 order 属性,DOM 间的位置交换变得更加简单。

REM

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

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

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

你说的我都懂,但这跟 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。

我们看下实际效果图:

 

将 @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
576px~1024px
大于1024px

总结,真实的项目中往往比这复杂的多,这个时候就需要把三端的设计稿拿过来仔细分析一下,哪些是可以抽象成一个 DOM 结构,清晰的 DOM 结构会让你的实现更加清晰。 附上本文的完整 Demo,也就是一开始的截图。

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

更多精彩内容其他人还在看

利用纯CSS3实现动态的自行车特效源码

这篇文章主要介绍了如何利用纯CSS3实现动态的自行车的方法,文中给出了完整的实例代码,实现后的效果非常不错,大家可以直接运行看看效果,需要的朋友下面来一起学习学习吧。
收藏 0 赞 0 分享

web前端开发规范文档(2014年版本)

这篇文章主要为大家介绍了前端开发团队遵循和约定的代码书写规范,意在提高代码的规范性和可维护性,需要的朋友可以参考下
收藏 0 赞 0 分享

前端编码规范(4)—— CSS 和 Sass (SCSS) 开发规范

这篇文章主要介绍了前端编码规范(4)—— CSS 和 Sass (SCSS) 开发规范,需要的朋友可以参考下
收藏 0 赞 0 分享

手把手教你用CSS实现带箭头的流程进度条

这篇文章主要给大家介绍了利用CSS实现带箭头的流程进度条大方法,文中给出了详细的示例代码,对大家具有一定的参考价值,有需要的朋友们一起来看看吧。
收藏 0 赞 0 分享

CSS实现三栏布局的四种方法示例

可能有人不理解三栏布局是什么,其实三栏布局页面分为左中右三部分,然后对中间一部分做自适应的一种布局方式,下面这篇文章就给大家详细介绍了CSS实现三栏布局的四种方法,需要的朋友可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享

利用css实现浮雕效果示例代码

这篇文章主要给大家介绍了利用css如何实现浮雕的效果,文中给出了详细的示例代码和解释,相信对大家有一定的参考价值,感兴趣的朋友们下面来一起看看吧。
收藏 0 赞 0 分享

浏览器默认样式(User Agent Stylesheet)的介绍与最佳处理方法

这篇文章主要给大家介绍了浏览器默认样式(User Agent Stylesheet)的相关资料,并给出了相对应的最佳解决方法。有需要的朋友可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享

css中px、em和rem的区别总结

相信每位前端工程师们都有这么一个体会,国内的设计师大都喜欢用px,而国外的网站大都喜欢用em和rem,那么三者有什么区别,又各自有什么优劣呢?下面这篇文章小编就来给大家详细介绍关于css中px、em和rem的区别,需要的朋友可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享

CSS3实现点击放大的动画实例代码

这篇文章主要给大家介绍了关于利用CSS3实现点击放大的动画效果,文中给出了完整的实例代码,相信对大家具有一定的参考价值,需要的朋友们可以一起来看看吧。
收藏 0 赞 0 分享

利用css代码实现纸飞机效果实例源码

这篇文章主要给大家介绍了如何利用css代码实现纸飞机的效果,实现后效果非常不错,文中给出了详细的实例代码,大家可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享
查看更多