前端学习之——h5适配
记得第一次写移动端页面时,本以为就按着效果图就好了,没想到出了很多问题,后来看了网上的一些文章,就试着将尺寸除以2,但是还是有好多地方不对,然后又学会用媒体查询去各种写样式,但是,总的感觉就是太累,太浪费时间,主要最后出来的效果还不太理想,所以,这种“凭眼神”的方式写页面不是长久之计,决定彻底总结一次,把在各处学到的,自己领悟到的全部清晰罗列,理清思路,这样以后就会越来越专业啦。。。
ps:这是一篇很绕很绕的博客。。
首先,还是要先认识移动端和浏览器端有什么不同?
我们只需要了解:
1、在pc端,css布局窗口尺寸=pc窗口的尺寸,只要效果图设计得好,就按照效果图来就可以了。
需要考虑的是各个浏览器以及浏览器不同版本的兼容。
2、在移动端,由于手机屏幕很窄,如果也让css布局窗口尺寸=手机屏幕窗口尺寸,则在pc端设计的网页,在手机端看起来会很丑。
所以,在移动端,css布局窗口尺寸比手机屏幕尺寸大得多。这样一来,也能避免pc端网页在手机端不会被压扁。(比如:你写的pc端页面用手机打开来看,会出现横向滚动条,需要左右滑动才能看到整个网页。)
但是,如果手机端的页面如果都要左右滑动看的话,并不理想,手机端更适合窄的页面,所以,出现了一个概念——理想视口。
理想视口定义了不同移动端设备的理想css布局尺寸。
那理想在哪?举个例子:iPhone6的理想视口尺寸为375*667 。也就是css布局就会依据这个尺寸。
在代码中head标签内加上下面的语句,可以将布局尺寸设为理想尺寸:
<meta name="viewport" content="width=device-width"/>
device-width就是理想视口宽度。
关于meta标签,之后的这篇会详细介绍。
解决设备像素比带来的问题
将布局视口改为理想视口之后,设计师会设计针对移动端的效果图,我们也不用左右滑动来看完整页面了。
但是,问题又出现了:设备的物理像素个数和理想视口的像素个数不总是一致的。
因为现在手机大部分都是视网膜屏幕,简单来说,视网膜屏幕就是在相同尺寸的屏幕上压缩更多的像素个数。
这就出现了新的概念——设备像素比。
设备像素比(DPR)=设备物理像素个数 / 理想视口像素个数
比如,早期的iPhone的设备物理像素是320px,理想视口也是320px,所以设备像素比为1。
而iPhone5的设备物理像素是640px,理想视口是320px,所以设备像素比为2。
当然,以上的计算都是基于没有缩放的情况下 ,缩放是一个改变css像素的过程。所以当你用手指缩放页面的时候就是在放大或缩小css像素。
也就是,如果想要让理想视口尺寸在我们的控制之内,还得控制它的缩放。
在head标签中写下面的代码,可以设置初始缩放和最大缩放都为1,且不允许用户对页面进行缩放:
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
>设备像素比,会带来什么问题?
因为设计稿一般是按照设备物理像素尺寸设计的,而且大部分都是按照iPhone6的尺寸:750px。
但是css布局是依据理想视口尺寸。
所以当设备像素比不为1的时候,依据设计稿尺寸写代码就会出错。
就拿iPhone6举个例子:
如果依据750px的尺寸设计了效果图,里面有个宽为375px的盒子,在效果图中它占了一半,但是如果css也写了375px,由于iPhone6的设备像素比为2,即它的理想视口尺寸为375px,所以此时展现出来的效果是占满全屏的。
如下图所示:
可能你会说:那将效果图的尺寸除以2,那不就可以了吗?
重要的是:设计师一般只会提供一个效果图给我们,而且并不是所有手机的设备像素比都是2,设备物理像素和理想视口尺寸都各有不同,所以即使将iPhone6的效果图正确展现,也不适配别的手机。
>解决设备像素比带来的问题:
在一开始的时候,我们在meta标签中用width=device-width,将css布局尺寸设置成为了理想布局尺寸,对于iPhone6来说,就相当于将布局尺寸设置成了375px。
那么,怎样让设计图上375px的尺寸,在css中也写375px,还能在iPhone6上显示375px的物理像素尺寸呢?
此时,我们就想到了之前提到的缩放,meta标签中initial-scale=1.0, maximum-scale=1.0可以设置缩放比例。
那么,在iPhone6的例子中,如果把缩放比例设置为设备像素比的倒数,即0.5,这样,不就可以直接按照设计图来写代码,还能正确显示了。
实验一下:
成功了!!
接着,我们又想了:有没有一种方法可以自动知道每种设备的设备像素比呢?答案是:有的。
window.devicePixelRatio可以得到设备像素比。所以只要在js中将meta标签里的缩放比例动态设置为window.devicePixelRatio的倒数就可以了。
如下:
var scale = 1 / window.devicePixelRatio; $("[name='viewport']").attr('content', 'width=device-width,initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');
这样,不仅可以直接使用设计图尺寸写代码,而且还能在不同的机型上看到同样大小的尺寸。
实验一下:
这样真的完美了吗?
折腾半天,终于完美了!??
从上面的图,我们也看到了:确实是不同尺寸手机上都展现了同一个尺寸的红色长方形盒子,但这真的是我们想要的吗?
我们更希望看到的应该是:同一个盒子在不同尺寸的手机上所占比例都是一样的,那样才完美!
用rem解决比例问题:
rem和em:(对比一下~)
rem是相对于html标签字体大小的相对尺寸单位。例如:html的font-size=12px; 则1rem=12px。
em是相对于父元素标签字体大小的相对尺寸单位。例如:<div style="font-size:12px;"><span class="font-size:2em;"></span></div>; 则span标签中字体大小就为24px。
那怎样用rem解决比例问题呢?
试想:如果页面中的尺寸单位都用rem代替,也就是不再用px为单位。然后html的字体大小如果可以设置一个动态生成的值(每个机型不同)。
这样,比例问题不就解决了吗?
索性,我们就将html的字体大小设为设备像素大小的 1 / 10(iPhone6上就是75px),此刻1rem就相当于75px,5rem就相当于375px。
也就是:
$('html').css('font-size', document.documentElement.clientWidth / 10 + 'px');
来看最后的效果:
我们通俗理解一下上面这种方法:
就相当于将不同机型尺寸都等分为10份,而那个红盒子在里面都占5份,所以用这种方法可以让盒子在不同机型中所占比例相同。
麻烦在于:就拿iPhone6的设计图来说,html的字体大小算出来是75px,所以效果图上量到的尺寸都要除以75,这样会花费很多计算的时间。
都分析到这份上了,那就应该把更好的方法也总结出来:
如果是计算麻烦,那我们就从后往前推:怎样计算比较简单,或者说不用计算器,口算也行呢?
上面的除数是75,比较困难,你就想:如果是100,那就不困难了!
那怎样可以让除数为100呢?(其实,也就是html的字体大小为100px就行了,不是吗?)
一般,效果图都是iPhone6尺寸的,所以如果将其等分为7.5份,每份就是100px。
还有很重要的一点是:document.documentElement.clientWidth得到的是css布局宽度,那在改进方法中,还需要知道设备像素比,然后再控制缩放比吗?
其实,此刻我们只需要知道等分成几份的时候计算较方便而已,不是吗?
所以此刻缩放比也不用根据设备像素比来动态设置了,就按原来1:1就可以了。
改进方法的总代码为:
<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title><style>* {margin: 0;padding: 0;}</style> </head><body><div style="width:3.75rem; height:1rem;background:red;"></div> </body> <script src="js/jquery.js"></script> <script>$('html').css('font-size', document.documentElement.clientWidth / 7.5 + 'px');console.log(document.documentElement.clientWidth / 7.5); </script></html>
之前的代码为:
<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content=""><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title><style>* {margin: 0;padding: 0;}</style> </head><body><div style="width:5rem; height:1.333333rem;background:red;"></div> </body> <script src="js/jquery.js"></script> <script>var scale = 1 / window.devicePixelRatio;$("[name='viewport']").attr('content', 'width=device-width,initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');$('html').css('font-size', document.documentElement.clientWidth / 10 + 'px'); </script></html>
所以,改进之后,计算方便了(此处讲的是基于iPhone6效果图的情况)。
那字号也要全部用rem控制吗?
单独把字号拿出来说的原因是:对文字来说,在页面中所占比例不是最重要的,字儿看得清才最重要。
此刻咱们就借鉴一下大公司是怎么做的吧!
淘宝、网易等都是用媒体查询的方式来控制字体大小:
@media screen and (max-width: 321px) {body {font-size:16px} }@media screen and (min-width: 321px) and (max-width:400px) {body {font-size:17px} }@media screen and (min-width: 400px) {body {font-size:19px} }
可以由上面的代码总结出:
1、将尺寸分为三个区间:321px以下,321px~400px,400px以上;
2、第一个区间与第二个区间之间字体大小相差1px,第二个区间与第三个区间之间相差2px;
3、具体每个区间字体设为多少像素,要看效果图。
举例:如果使用iPhone6的效果图,且效果图中字体大小为20px。
由于iPhone6尺寸为375px,在321px~400px区间,所以媒体查询应该写为:
@media screen and (max-width: 321px) {
body {
font-size:19px
}
}
@media screen and (min-width: 321px) and (max-width:400px) {
body {
font-size:20px
}
}
@media screen and (min-width: 400px) {
body {
font-size:22px
}
}
终于总结完了,这下脑子清晰多了,再也不用“凭眼神”了。
转载于:https://www.cnblogs.com/zhaoyingzhen/p/8310918.html
前端学习之——h5适配相关推荐
- 前端学习总结——H5
前端知识点总结--H5 1.html5新特性 (1)新的语义标签 (2)增强型表单* (3)音频和视频 (4)Canvas绘图 (5)SVG绘图 (6)地理定位 (7)拖动API (8)Web Wor ...
- 前端H5怎么切换语言_「自学系列一」HTML5大前端学习路线+视频教程完整版
全新Java.HTML5前端.大数据.Python爬虫.全链UI设计.软件测试.Unity 3D.Go语言等多个技术方向的全套视频. 面对这么多的知识点,有的盆友就麻爪了-- 我是谁? 我该从哪里开始 ...
- 2016最新前端学习计划
一.前端学习路线图 二.前端学习路线图--视频篇 六大 阶段 学完后目标 知识点 视频资源(附笔记+PPT+模板 +源码) 密码 准备篇 学习周期:15天 学完后目标: 1.熟悉媒体查询和响应式设计, ...
- 史上最全的前端学习路线图,干货满满
史上最全的前端学习路线图,干货满满 前端很火,想自学前端的人也多.作为过来人,知道自学的辛苦.所以小编精心制作这份学习路线图,就是让想自学前端的小伙伴们有一份系统专业的学习资源和学习指导. 此学习路线 ...
- 2021年web前端开发视频教程,自学web前端开发技术,全套web前端学习路线笔记
2021年web前端开发视频教程,自学web前端开发技术,全套web前端学习路线笔记 [导读]:初学web前端的小伙伴经常会遇到的问题,1.没方法 2.没资源 3.没经验,不知道从何开始 ,代码哥(D ...
- 前端学习六——html5+CSS3
前端学习六--html5+CSS3 HTML5 H5新增语义标签 多媒体标签 audio音频标签 audio音频标签常见属性 音频标签语法 视频标签video 视频标签语法 H5新增input表单.表 ...
- H5方面(H5适配手机屏幕等)
一个html页,其文本包含三个方面的信息,逻辑,内容,样式.其中逻辑部分决定页面和用户交互的行为,样式部分决定用户界面的视觉表现,内容部分是结构化的文本信息.对于一个以内容为主的页面(区别于富交互应用 ...
- 【FE前端学习】第二阶段任务-基础
技能学习部分: 1.需要熟练掌握HTML标签以及CSS各个常用属性. 2.掌握CSS3 常用属性 3.掌握jquery的基本用法,对于JS基本逻辑语句需要熟练掌握 上文 [FE前端学习]第二阶段任务- ...
- 前端学习路线_前端学习路线图
2020年全新前端学习路线图分享给大家! 学习是一个循序渐进的过程,是一件非常难得坚持的事情.如果真的想学习前端开发,一定要下决心! 我这里分享给你的前端学习路线图,希望对你有帮助,以下为2020年更 ...
最新文章
- Swift的控制转移语句-- fallthrough语句
- (转载)conflicting types for xx各种错误的总结
- 博士申请 | 香港浸会大学万人杰教授招收计算机视觉全奖博士生/研究助理
- java学习笔记2021.1.10
- mysql查询09软件技术1班_MySQL查询语句的45道练习(2019.09最新版)
- 【模板】快速排序(洛谷-P1177)
- 用 Maven 做项目构建
- Kotlin-Note
- Python time strftime() 方法
- 大数据处理系统有哪些
- unix系统安装及应用
- 网站性能工具-YSlow的23个规则-网站性能优化
- C++实现PCA变换
- 未雨绸缪,数据保护之NBU介质备份
- 饭客网络(基础教程)
- 【实习记录】pytorch学习(持续更新)
- 【肝帝一周总结:全网最全最细】☀️Mysql 索引数据结构详解与索引优化☀️《❤️记得收藏❤️》
- 数据库范式讲解(1NF、2NF、3NF、BCNF)
- Python:SM4
- JVM成神之路(二)-- JDK,JER与JVM的关系