Web移动端页面 --响应式和动态REM
鄙人最近才刚刚开始学习一些关于移动端的知识,还只是个小白,文中可能有许多理解错误,望指出,请多多见谅。
响应式
什么是响应式页面呢?
顾名思义响应式页面就是能做出响应的页面,它的页面效果不是定死的,会随着用户的改变而改变。
如何着手响应式有以下几个思考的方向
- 找一份设计图
- 使用Media Query
- 隐藏元素
- 添加meta viewport
- 明白手机端交互方式的区别
Media Query
是什么
Media query 翻译过来就是媒介查询,媒介就是我们查看这个网页的设备。
媒介查询源于CSS3,它可以根据用户的设备所具有的某些特征,来提供不同的样式用于显示。
用法
引用方式
它的引用方式一共有两种
- 元素中媒介查询
- 样式表中媒介查询
<!-- link元素中的CSS媒体查询 -->
<link rel="stylesheet" media="(max-width: 800px)" href="example.css" />
<!-- 样式表中的CSS媒体查询 -->
<style>
@media (max-width: 600px) {
body{
background: red;
}
}
</style>
在link中使用媒介查询后,即使不满足样式条件,这个样式文件依然会被下载。
条件判断
媒介查询的条件判断的逻辑操作符只有and, only, not三种,多个判断条件用()包裹后操作符隔开。
//当媒介最大宽度为800px且是横屏时里面的样式生效
@media (max-width: 800px) and (orientation: landscape){
......
}
Mobile First
目前web前端开发项目类型可以分为两种方式,Mobile First 和 Desktop First。Mobile First就是优先开发移动端后开发PC端,后者反之。
不同的Fist中我们Media Query针对的也不同,Mobile First中,因为我们以移动端为主,所以我们的Media Query应该是针对PC的条件去控制,Desktop Fist则针对移动端设置条件样式。

这里就用到了一开始所说隐藏
meta viewport
现在,你已经写好了你的响应式网页,那么已经可以了吗?
别急,你离完成仅剩最后一步。
由于历史的原因,我们的手机在访问网页时,不管你是响应式网页还是非响应式,浏览器都会将你的宽度改为980px。
这是历史遗留的问题,因为最早的智能手机为了完整的显示一个网页,直接将PC上的网页缩放塞进手机浏览器中,经过调研,发现大部分的网页都是980px左右,所以当我们用手机访问网页时宽度都会被缩放到980px。
我们只需要加上这样一行代码就可以解决问题
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
width=device-width设置页面宽度为设备宽度。
user-scalable=no不允许用户缩放
initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0最大最小默认缩放比例都为1。
这样我们的响应式网页才完全生效了。
移动端特点
- 没有hover
- 有touch
- 没有滚动条
- 没有IE
- 没有resize
因为移动端是没有hover事件的所以当我们在需要兼容移动端的页面中应该尽量少用hover事件。
移动端一般很少监听click事件,都是以touch事件为主,JS没有滑动事件,但是可以通过touch事件模拟
没有IE意味着我们可以为所欲为放飞自我,使用最新的CSS和HTML。
为什么需要响应式?
当我们需要给不同的设备显示不同网页(样式)时,为什么不可以一开始就写好多个网页再由后端负责根据用户设备来跳转呢?
我们写响应式需要思考非常多的问题,在一个页面里html css需要考虑很多判断逻辑,这些多出来代码以及设计的时间可能已经能够写一个新的网页,那为什么不一开始就写两个网页就好了呢?
确实,现在大部分互联公司现在几乎都不会去使用响应式页面。
- 博客园:响应式
- 百度:非响应式
- 谷歌:非响应式
- 淘宝:非响应式
- 头条:非响应式
- 知乎:非响应式
国内大型公司可以说基本上都是非响应式网页,只有那些交互性较弱比如个人blog,小型企业站点以展示内容为主的网站还会应用响应式设计。
动态REM自适应
在了解rem之前需要先知道
- 浏览器的默认font-size是16px
- Font-size最优先用户在浏览器中设置的大小,chrome默认最小12px。
什么是rem?
rem是众多number单位中的其中一个,它的值为根元素font-size的值。
<style>
body{font-size: 40px;}
p{font-size: 2rem;}
</style>
<body>
<p>hello</p>
word
<div>!!</div>
</body>

因为给body标签设置了40px,所以body里面的内容应该都是40px。但是由于p在后面优先设置了2rem,浏览器的默认font-size为16px,也就是html标签的font-size就是16px,所以现在的hello是32px。
也就是说rem的根元素的值指的就是html 的font-size的值。
rem有什么用?
上面扯了那么多介绍rem,那肯定是有用的。
别急,让我细细道来。
当我们拿到设计稿,需要写一个手机用的网页时。
我们是希望在所有的手机上看到的页面都是一个样子的,页面内每个元素在固定的位置。但是按照常规方法,一个样式能做到让所有手机完美(90%)还原设计稿的样子吗?
答曰:可以,用media写响应式,针对不同的设备宽度,展现不同的样式。
好的,那让我们打开开发者工具模拟手机看看。
- iPhone X : 375 x 812
- iPhone 6/7/8 Plus : 414 x 736
- iPhone 6/7/8 : 375 x 667
- iPhone 5/SE : 320 x 568
- Galaxy S5 : 360 x 640
- Pixel 2 : 411 x 731
看到这些你还想用media吗?你要写多少个media?光是一个iPhone就可以搞死你更别说还有一堆的国产机等着你适配。
那怎么办呢,有没有办法可以让一个CSS适应“所有”的手机呢?
办法肯定有,那就是自适应,我们不需要知道用户的手机的长宽是多少,我们让网页自己匹配用户的手机长宽就好了啊。
自适应布局
自适应布局有下面两种常规方法
- 百分比布局:宽度百分比。
- 缩放布局:按比例设置网页宽高。
这两个布局一个百分一个比例看上去意思是一样,其实不然。百分比布局中的宽度样式不是一个具体的值,而缩放是在已知宽度的情况下定死的值。
/*device-width = 320*/
body{
width: 50% /*160px*/
}
body{
width: 160px /*160px*/
}
如果我们的目的是在手机上展现body占据屏幕一半的效果的话,上面两种写法在宽度为320px的手机上效果是一样的,都是将body的宽度设置为手机的一半长。
现在只是在宽度为320px的手机上展现了1/2的效果,那么当我们的手机是宽度300px的时候呢?
/*device-width = 300*/
body{
width: 50% /*150px*/
}
body{
width: 150px /*150px*/
}
如果是百分比布局是不是不需要改动,而按比例布局需要改动。
那么百分比布局能解决问题吗?
不行,百分比布局有个缺陷,高度是未知的,因为高度没有办法百分比,如果定死了高度那么就没有办法与宽度适应了。一旦我们的页面一复杂,未知的高度会带来更多的问题。
总的来说我们的页面需要靠宽度适配,再用这个宽度来决定自身的高度以达到宽高都成比例,在不同的手机上都可以按同样的比例展现。
那有什么方法可以准确获取手机的宽度吗?
这时我们的英雄登场了,rem。
上面说到rem是根元素font-size的值,那么我们只需要将根元素html的font-size为手机的宽度,这时不就可以通过rem来设置有比例的宽高样式了吗。
rem怎么用?

var width=document.documentElement.clientWidth;
document.write(`<style>html{font-size:${width / 10}px}</style>`)
JS代码就两行,将rem设置为手机宽度的的10%,虽然设置width / 100可以完全模拟vw(自适应不用vw是因为vw兼容性太差了),但是当em为1%时,一但宽度小于120px时,font-size就会小于12px,低于chrome默认的最小font-size就会出现bug,所以我们设置rem为10%。
还需要注意的是虽然width和height是用rem使用,但是不代表别的大小也需要用rem(如果字体的font-size也用rem,那当宽度很小时,字会小的看不清),我们应该搭配别的单位以获得更美观的效果。
使用SCSS自动转换px
为了减少我们计算量,我们可以直接使用scss写一个function帮我们解决转换的问题。
@function px( $px ){
@return $px/$designWidth*10 + rem;
}
$designWidth : 640。
.box{
background: grey;
width: px(256);
height: px(128);
margin: px(32) px(32);
float: left;
}
Web移动端页面 --响应式和动态REM的更多相关文章
- [移动端WEB] 移动端网站响应式布局之"rem",CSS3 rem使用方式
(function(doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? ' ...
- CSS5:移动端页面(响应式)
CSS5:移动端页面(响应式) 如果手机端和PC端页面差别很大,就不要写响应式,不要写@media 就直接将两个页面拆开成两个文件就可以了.关于判断是手机端你还是PC端,就交给后端来做只有一些新闻站点 ...
- 超棒的HTML5/CSS3单页面响应式模板(支持Bootstrap)
在线演示 使用Bootstrap实现的响应式单页面模板. 桌面效果: 移动设备效果: 阅读全文:超棒的HTML5/CSS3单页面响应式模板(支持Bootstrap)
- 从零开始学 Web 之 移动Web(六)响应式布局
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- 移动端和pc端,响应式设计布局
1.什么是响应式 Web 设计? 响应式 Web 设计让你的网页能在所有设备上有好显示. 响应式 Web 设计只使用 HTML 和 CSS. 响应式 Web 设计不是一个程序或Javascript脚本 ...
- 九、响应式发:rem和less(适配移动端)
一.响应式开发 响应式开发优先适配移动端又兼容到pc端 官网:https://less.bootcss.com/usage/ 教程:https://www.w3cschool.cn/less/ rem ...
- 浅谈pc和移动端的响应式
身为一个前端攻城狮,是不是经常遇到各种各样的响应式问题?下面我们来说一下: 1.响应式跟自适应有什么区别? 有些人可能还不知道响应式跟自适应的区别,甚至认为他们是同一个东西,其实不是的. 自适应是最早 ...
- 如何做好移动端的响应式设计:Viewport控制
新人翻译,欢迎转载~ 英文原文地址:http://bitsofco.de/2015/respove-design-viewport/ 原文例程地址:https://github.com/ireade/ ...
- Bootstrap页面响应式设计
关键词:viewport.栅格布局.媒体查询(Media Queries) 一.关于栅格布局的说明: 1.基本图解 extra small devices phones 超小型设备手机small d ...
随机推荐
- JSP编译成Servlet(一)语法树的生成——语法解析
一般来说,语句按一定规则进行推导后会形成一个语法树,这种树状结构有利于对语句结构层次的描述.同样Jasper对JSP语法解析后也会生成一棵树,这棵树各个节点包含了不同的信息,但对于JSP来说解析后的语 ...
- Unity UGUI图文混排源码(一)
Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...
- IE11开发人员工具 js脚本debugger调试
微软在浏览器IE11中对F12开发人员工具的UI进行了彻底的换脸,虽然有诸多的不习惯但也是有方便之处的,比如我们用到的最多的断点调试,在F12调试状态下会加载出页面的js脚本文件,而需要对某个文件中的 ...
- 文件I/O实践(1) --基础API
什么是I/O 输入/输出是内存和外设之间拷贝数据的过程: 设备->内存: 输入操作 内存->设备: 输出操作 高级I/O: ANSI C提供的标准I/O库函数成为高级I/O, 也称为带缓冲 ...
- 在Windows下搭建Gitlab服务器
一.GitLab简介 GitLab 是一个用于仓库管理系统的开源项目.使用Git作为代码管理工具,并在此基础上搭建起来的web服务. 可通过Web界面进行访问公开的或者私人项目.它拥有与Github类 ...
- [加密]C#实现维吉尼亚加密与解密(解密前提为已知密匙)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- LayoutInflater和inflate的用法,有图有真相
1.概述 有时候在我们的Activity中用到别的layout,并且要对其组件进行操作,比如: A.acyivity是获取网络数据的,对应布局文件为A.xml,然后需要把这个数据设置到B.xml的组件 ...
- 【测试】Gunicorn , uWSGI同步异步测试以及应用场景总结
最近使用uwsgi出了一些问题,于是测试下Gunicorn测试对比下 环境 一颗cpu 1g内存 Centos系统 Django作为后端应用,Gunicorn默认模式和异步模式,响应基本是无阻塞类型 ...
- 菜鸟玩云计算之廿二: saltstack 配置
菜鸟玩云计算之廿二: saltstack 配置 要求环境: RHEL6.4+ >=Python2.6.6, < Python 3.0 关闭salt-master/minion服务: # ...
- ffdshow 源代码分析 6: 对解码器的dll的封装(libavcodec)
===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...