H5页面适配所有iPhone和安卓机型的六个技巧
1、viewport 简单粗暴的方式:
<meta name="viewport" content="width=320,maximum-scale=1.3,user-scalable=no">
直接设置viewport为320px的1.3倍,将页面放大1.3倍。
为什么是1.3?
目前大部分页面都是以320px为基准的布局,而iphone6的宽度比是375/320 = 1.171875,iphone6+则是 414/320 = 1.29375那么以1.29倍也就约等于1.3了。
2、ip6+ 的CSS media query
@media (min-device-width : 375px) and (max-device-width : 667px) and (-webkit-min-device-pixel-ratio : 2){/*iphone 6*/ }@media (min-device-width : 414px) and (max-device-width : 736px) and (-webkit-min-device-pixel-ratio : 3){/*iphone 6 plus*/ }
PS: 也可以直接使用实际的device-width:如 device-width : 375px
在原有页面的基础上,再针对相应的屏幕大小单独写样式做适配。
3、REM布局
REM是CSS3新增的一种单位,并且移动端的支持度很高,android2.x+,ios5+ 都支持。REM是相对于dom结构的根元素来设置大小,也就是html这个元素。相较于em单位,rem使用上更容易理解及运用。
REM与PX的换算可以查看网址: https://offroadcode.com/prototypes/rem-calculator/
假设,html我们设置font-size:12px; 也就是说12px相对于1rem,那么18px也就是 18/12 = 1.5rem。
那么我们以320px的设计布局为基准,将html设置为font-size:100px,即100px = 1rem。(设置100px是为了方便计算)那么可以将大部分px单位除以100就可以直接改成rem单位了。
REM如何做响应式布局?
1、如果仅仅是适配ip6+设备,那么使用media query就行。
伪代码如下:
/*320px布局*/ html{font-size: 100px;} body{font-size: 0.14rem /*实际相当于14px*/}/* iphone 6 */ @media (min-device-width : 375px) and (max-device-width : 667px) and (-webkit-min-device-pixel-ratio : 2){html{font-size: 117.1875px;} } /* iphone6 plus */ @media (min-device-width : 414px) and (max-device-width : 736px) and (-webkit-min-device-pixel-ratio : 3){html{font-size: 129.375px;} }
这样,在ip6下,也就将页面内的元素放大了1.17倍,ip6+下也就是放大了1.29倍。
2、如果是完全自适应,那么可以通过JS来控制。
(function (doc, win) {var docEl = doc.documentElement,resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',recalc = function () {var clientWidth = docEl.clientWidth;if (!clientWidth) return;docEl.style.fontSize = 100 * (clientWidth / 320) + 'px';};// Abort if browser does not support addEventListenerif (!doc.addEventListener) return;win.addEventListener(resizeEvt, recalc, false);doc.addEventListener('DOMContentLoaded', recalc, false); })(document, window);
页面初始化的时候计算font-size,然后再绑定resize事件。这种效果就和百分比布局一样了。
那么用REM做单位与百分比做单位有什么优势?
主要优势在于能更好的控制元素大小。(一般百分比应用在布局层,一般常见设置为50%,33.3%,25%之类的整数居多,难以运用在复杂的页面小部件内)。但是相比百分比布局,需要借助JS或media query实现,略有一点瑕疵。
4、图片自适应
刚说完REM布局,那么用百分比布局也能实现一样的效果,但是用百分比布局,必须要面临一个问题:图片宽度100%,页面加载时会存在高度塌陷的问题。.
如图:页面加载时图片高度默认不存在。
那么可以用padding-top设置百分比值来实现自适应。
公式如下:
padding-top = (Image Height / Image Width) * 100%
原理:padding-top值为百分比时,取值是是相对于宽度的。
相关代码实现:
<div class="cover"><img src="http://g.ald.alicdn.com/bao/uploaded/i1/TB1d6QqGpXXXXbKXXXXXXXXXXXX_!!0-item_pic.jpg_160x160q90.jpg" alt=""/> </div>
.cover{position: relative; padding-top: 100%; height: 0; overflow: hidden;} .cover img{position: absolute; top: 0; width: 100%;}
5、图片高清化
大家都知道,iphone6 plus 是3倍高清图了,它的devicePixelRatio = 3。
关于DPR的介绍可以查看这篇文章《 设备像素比devicePixelRatio简单介绍 》
在ios8下,已经开始支持img的 srcset
属性了(目前移动端也就ios8开始支持),也就是说,可以对一张图片设置2个URL,浏览器自动加载对应的图片。
黄色表示仅支持旧的srcset规范,绿色表示支持全新的srcset规范,包括sizes属性,w描述符。 这里不展开,详细了解可自行google。
如下DEMO,请切换devicePixelRatio值进行查看:
不过目前前端这边图片的实现基本都用lazyload的方式实现。srcset的图片加载方式在实际项目中运用还比较少。
6、背景图高清化
media query 实现高清化
img标签的高清化,可以通过JS判断devicePixelRatio的值来加载不同尺寸的图片,但是对于背景图,写在CSS中的,用JS来判断就略麻烦了,还好CSS通过media query也能判断dpr。
目前兼容性最好的背景图高清化实现方式,使用media query的 -webkit-min-device-pixel-ratio
做判断:
/* 普通显示屏(设备像素比例小于等于1)使用1倍的图 */.css{background-image: url(img_1x.png);}/* 高清显示屏(设备像素比例大于等于2)使用2倍图 */@media only screen and (-webkit-min-device-pixel-ratio:2){.css{background-image: url(img_2x.png);}}/* 高清显示屏(设备像素比例大于等于3)使用3倍图 */@media only screen and (-webkit-min-device-pixel-ratio:3){.css{background-image: url(img_3x.png);}}
进一步,可以通过工具生成相应的3x,2x,1x的图片及css,在使用时直接引用即可。谁搞一个?
关于移动设备的 -webkit-min-device-pixel-ratio
值,可以查看该网页的整理: http://bjango.com/articles/min-device-pixel-ratio/
image-set 实现高清化
image-set,它是Webkit的私有属性,也是Css4的一个属性,它是为了解决Retina屏幕下的图像显示而生。
使用方式也很简单。伪代码如下:
.css {background-image: url(1x.png); /*不支持image-set的情况下显示*/background: -webkit-image-set(url(1x.png) 1x,/* 支持image-set的浏览器的[普通屏幕]下 */url(2x.png) 2x,/* 支持image-set的浏览器的[2倍Retina屏幕] */url(3x.png) 3x/* 支持image-set的浏览器的[3倍Retina屏幕] */);}
目前移动端的支持程度来看,ios7+,android 4.4+ 下已经支持了。如果仅仅是做ip6+的高清适配方案。 image-set
也是一种实现方案。
使用image-set 与 media query 实现有什么区别及好处?
这篇文章里面做了很详细的阐述,大家可以看看:http://blog.cloudfour.com/safari-6-and-chrome-21-add-image-set-to-support-retina-images/
大体的意思是:image-set不需要告诉浏览器使用什么图像,而是直接提供了图像让浏览器选择。这就意味着,如果在低网速下,浏览器可以选择加载低分辨率的图片。(PS:好智能的样子)
但是相比如media query的实现,image-set仅支持单个图片的高清化,不适合在css sprite下使用。 并且兼容性也是一大硬伤。
一般来说,用在LOGO区域,单个图片图标的区域下,也是个不错的选择。
关于图片列表适配,也就是要让布局更灵活,在电商网站里面,商品列表是一个非常常见的结构。一种比较智能的列表方式是:两端对齐,间距自适应。
那么可以使用FLEXBOX布局来实现两端对齐的效果,也可以使用 text-align:justify
的方式实现。
具体实现办法:http://www.ghugo.com/inline-block-justify/
转载于:https://www.cnblogs.com/wcn123456/p/7838175.html
H5页面适配所有iPhone和安卓机型的六个技巧相关推荐
- H5 页面适配所有 iPhone 和安卓机型的六个技巧
目前,很多APP设计师小伙伴已经开始转向H5前端开发啦,但是解决所有iPhone和安卓机型的适配问题是我们的重中之重.无论是设计APP还是写前端H5.都是要考虑移动端的兼容性. 25学堂今天跟大家来回 ...
- h5页面适配iPhone X的方法
项目接近尾声,测试时突然想起还有iphoneX需要适配,虽然页面都是自适应,但是由于iPhone X的特殊性,还是需要特殊对待.因为这个h5项目嵌入在原生项目中,适配就会有有种方式:1.在原生中用原生 ...
- 教你如何用 lib-flexible 实现移动端H5页面适配
前话 好久没写教程了(可能会误导新手的菜鸟教程( ̄▽ ̄)"). 这是我的github,欢迎前端大大们和我一起学习交流 https://github.com/pwcong 最近入职公司做前端实 ...
- 移动端 H5页面适配
一.基础概念 在了解如何做H5页面适配前,大家都应该把移动端涉及的一些概念搞明白,比如:dpr 是什么意思? 移动端H5解惑-概念术语(一) 二.为什么要做页面适配 2.1 PC端为什么要解决浏览器兼 ...
- 【原】让H5页面适配移动设备全家 - 设计师篇 - PPT
上一篇文章<pageResponse - 让H5适配移动设备全家>中分享了一个小插件让一套H5页面适配几乎所有移动设备,得到了一些同学的推荐和认可,这里感谢大家的支持. 在此之前也在部门前 ...
- 需求:在微信h5页面中下载第三方app —— 安卓, 直接下载apk文件包;iphone,跳转AppStore
分析:微信不支持,在微信中屏蔽了apk文件的下载以及AppStore的跳转(且除非和TX有合作的应用,否则也不支持通过scheme跳转第三方app) 点击查看案例地址 变通方法: 一.借助TX的应用市 ...
- h5适配华为手机_手机端H5页面适配 踩坑
这两天在公司做手机端H5页面,第一次开发没什么经验,对rem, pt, ppi, dpr这些概念完全不懂,看了很多博客,现总结如下. 对于不同像素宽度的手机,如何做到每一个元素自动缩放? rem: f ...
- 关于H5页面适配的问题
1.问题描述 适配的目标:在不同尺寸的手机设备上,页面"相对性的达到合理的展示(自适应)"或者"保持统一效果的等比缩放(看起来差不多,但不是完全等比例,对于字体我们并不喜 ...
- H5 页面适配几种展现形式
1.contain 模式:以内容中心为基点按照视觉稿的宽高比缩放以适配窗口显示全页面内容,窗口与内容的宽度比或高度比之间较小者缩放填满窗口,当窗口宽高比和视觉稿不同时,另一方向的两侧出现留空部分. 2 ...
最新文章
- pytorch one-hot转数组
- linux mysql库看不见,linux下Mysql找不到mysqlclient库!谢谢大家
- 可恶的.NET FRAME,将一切变得更简单,还是更复杂?
- 提高你的Java代码质量吧:使用valueof前必须进行校验
- 双向链表的增、删、查、改、python实现,超详细讲解
- 字符编码、常见字符集解析(ASCII、Unicode、UTF-8、GB2312等)
- 群英论道聚北京,共话PostgreSQL
- luogu P1702 突击考试
- 【运维安全】-HTTP协议
- 计科1高雨妍作业(2)
- linux 访问ntfs分区
- HTML中浮动的特性,浅谈CSS浮动的特性
- epoch、 iteration和batchsize的区别
- 全网最细JAVA窗口背景图片设置
- unreal4怎么设置游戏模式_怎么使用虚幻4开发游戏?
- matlab双线性插值图像处理,数字图像处理:双线性插值
- 2021 ICPC Gran Premio de Mexico 2da Fecha - F.Flipped Factorization(PN筛)
- 物流设施布局方法——CRAFT
- python 仪表盘 ppt_Python之pyecharts数据可视化,词云图,仪表盘!
- 2014年互联网IT公司产品、技术类人员工资待遇汇总 2015部分补充
热门文章
- abnf java实现_详细讲解如何利用Java实现组合式解析器?
- 2016 server sql 错误53_MS SQL Server 错误53 错误17是什么?如何解决
- MySQL服务迁移到opt_mysql文件*.opt *.frm *.MYI *.MYD的迁移
- Python清屏小结
- 浅谈Vue之双向绑定
- offline .net3.5
- DPDK helloworld 源码阅读
- bzoj千题计划213:bzoj2660: [Beijing wc2012]最多的方案
- 关于Unity中NGUI的Pivot和锚点
- 仿照vue实现简易的MVVM框架(一)