移动端特性
手机端的web页(H5)
跨平台(手机端、PC端)
基于webview
-webkit- 常用属性
http://ued.ctrip.com/webkitcss/ 整理的webkit属性集合
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalabel=no">
1、-webkit-appearance: none; // 用于移IOS下移除原生样式
2、text-size-adjust: 100%; // webkit内核浏览器可以让终端字体小于12px
iPhone 和 Android 的浏览器纵向和橫向时自动调整字体大小的功能。通过 text-size-adjust 设为 none 或者 100% 关闭字体大小自动调整功能.
html {
font-family: "Helvetica Neue", Helvetica, STHeiTi, Arial, sans-serif;
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
}
3、overflow-scrolling 硬件加速, 在body中设置
body {
/*height: 100%;*/
overflow-x: hidden;
-webkit-overflow-scrolling: touch;
}
4、tap-highlight-color 用户点击iOS的Safari浏览器中的链接或JavaScript的可点击的元素时,覆盖显示的高亮颜色
a {
-webkit-tap-highlight-color: transparent;
}
5、touch-callout 当触摸并长按住的时候,禁止或显示系统默认菜单
a {
-webkit-touch-callout: none
}
window.ontouchstart = function(e) {
if (e.target.tagName === 'img')
e.preventDefault();
}
6、pointer-events:none;
viewport 视图
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
width - 设置viewport宽度,为一个正整数,或字符串‘device-width’
height - 设置viewport高度,一般设置了宽度,会自动解析出高度,可以不用设置
initial-scale - 默认缩放比例,为一个数字,可以带小数
minimum-scale - 允许用户最小缩放比例,为一个数字,可以带小数
maximum-scale - 允许用户最大缩放比例,为一个数字,可以带小数
user-scalable - 是否允许手动缩放
不同屏幕的适配方案
通过响应式技术,在不同设备上使用同一套代码来展示
1、设置@media 2、rem 3、vw/vh
一、@media 媒体查询
@media screen and(min-width: 500px){ // 大于500px执行下面代码
...
}
二、rem
rem会根据根元素<html>的fontSize的大小来变化,需要运用js来计算根据屏幕宽度或来计算html的赋值
1、普通CSS写法
html { font-size: 16px; }
div { width: 2rem; }
2、Sass的工程:
前端构建中,完全可以利用scss来解决这个问题,例如我们可以写一个scss的function px2rem即:
@function px2rem($px){
$rem : 37.5px;
@return ($px/$rem) + rem;
}
调用
height: px2rem(90px);
width: px2rem(90px);
三、vw、vh
上面两种不是特别完美,媒体查询不能做到等比例响应,rem需要js与css耦合在一起,而且vw/vh就不需要
计算vm方法: 16 / 750 * 100 = 2.13vw; // 16是px转rem的值,750
html {
font-size: 2.13vw;
}
vw: 视窗的宽度,视窗的宽度是100vw
vh: 视窗的高度,视窗的高度是100vh
vmin: 选取vw和vh中最小的那个
vmax: 选取vw和vh中最大的那个
https://zhuanlan.zhihu.com/p/23968868
https://juejin.im/entry/59b00e46f265da2491513bcc
移动端概念
一、物理像素: 物理像素是屏幕的实际尺寸
二、设备独立像素: 设备像素与CSS像素之间的关系
三、设备像素比 dpr: 设备像素比 = 物理像素 / 设备独立像素;
js获取设备像素比: window.devicePixelRatio // devicePixelRatio = 物理像素 / 实际像素;
iphoneX是3倍屏,其它都是2倍屏
retina屏是超高像素密度屏,同样大小的屏幕上显示的像素点由1个变为多个,同样苹果设备的retina屏中,像素点1个变为4个
1、根据不同的设备像素比来加载不同的图片
// 例如图片宽高为: 200px*200px,那么写法如下
.css{ width:100px;height:100px;background-size:100px 100px; }
// 其它元素的取值为原来的1/2,例如视觉稿40px的字体,使用样式的写法为20px
.css{ font-size:20px }
// image-set设计Rentina背景图
image-set,webkit私有属性,也是CSS4的属性,为解决Rentina屏幕下的图像而生。
.css {
background: url(images/bg.jpg) no-repeat center;
background: -webkit-image-set(
url(images/bg.jpg) 1x, //支持image-set普通屏
url(images/bg-2x.jpg) 2x); //支持image-set的Rentinan
}
// javscript的解决方案
$(document).ready(function(){
if (window.devicePixelRatio > 1) {
var lowresImages = $('img');
images.each(function(i) {
var lowres = $(this).attr('src');
var highres = lowres.replace(".", "@2x.");
$(this).attr('src', highres);
});
}
});
https://www.jianshu.com/p/c88e9489b583
四、设置不同像素比的响应样式
/* 2倍屏 */
@media only screen and (-webkit-min-device-pixel-ratio: 2.0){
.bor-querymidea::after{
-webkit-transform: scaleY(0.5);
transform: scaleY(0.5);
}
}
/* 3倍屏 */
@media only screen and (-webkit-min-device-pixel-ratio: 3.0){
.bor-querymidea::after{
-webkit-transform: scaleY(0.33);
transform: scaleY(0.33);
}
}
Meta
1、空白页基本meta标签
<!-- 设置缩放 -->
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no, minimal-ui" />
<!-- 可隐藏地址栏,仅针对IOS的Safari(注: IOS7.0版本以后,safari上已看不到效果) -->
<meta name="apple-mobile-web-app-capable" content="yes" />
<!-- 仅针对IOS的Safari顶端状态条的样式(可选default/black/black-translucent ) -->
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<!-- IOS中禁用将数字识别为电话号码/忽略Android平台中对邮箱地址的识别 -->
<meta name="format-detection"content="telephone=no, email=no" />
2、其他meta标签
<!-- 启用360浏览器的极速模式(webkit) -->
<meta name="renderer" content="webkit">
<!-- 避免IE使用兼容模式 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- 针对手持设备优化,主要是针对一些老的不识别viewport的浏览器,比如黑莓 -->
<meta name="HandheldFriendly" content="true">
<!-- 微软的老式浏览器 -->
<meta name="MobileOptimized" content="320">
<!-- uc强制竖屏 -->
<meta name="screen-orientation" content="portrait">
<!-- QQ强制竖屏 -->
<meta name="x5-orientation" content="portrait">
<!-- UC强制全屏 -->
<meta name="full-screen" content="yes">
<!-- QQ强制全屏 -->
<meta name="x5-fullscreen" content="true">
<!-- UC应用模式 -->
<meta name="browsermode" content="application">
<!-- QQ应用模式 -->
<meta name="x5-page-mode" content="app">
<!-- windows phone 点击无高光 -->
<meta name="msapplication-tap-highlight" content="no">
预加载技术
一、dns-prefetch 预加载
<link rel="dns-prefetch" href="http://g.alicdn.com">
dns-prefetch, DNS解析往往导致了网站加载速度慢。现代浏览器针对这个问题开发了处理方式,它将域名缓存后,当用户点击其它页面地址后自动的获取
二、prefetch 连接网页预先加载
当能确定网页在未来一定会使用到某个资源时,开发者可以让浏览器提前请求并且缓存好以供后续使用。prefetch支持预拉取图片、脚本或者任何可以被浏览器缓存的资源。
<link rel="prefetch" href="image.png">
三、preconnect
和DNS prefetch类似,preconnect不光会解析DNS,还会建立TCP握手连接和TLS协议(如果需要)
<link rel="preconnect" href="http://css-tricks.com">
http://www.alloyteam.com/2015/10/prefetching-preloading-prebrowsing/
打电话发短信写邮件怎么实现
一、打电话
<a href="tel:0755-10086">打电话给:0755-10086</a>
二、发短信,winphone系统无效
<a href="sms:10086">发短信给: 10086</a>
三、写邮件
// 注: 在添加这些功能时,第一个功能以"?"开头,后面的以"&"开头
1.普通邮件
<a href="mailto:863139978@qq.com">点击我发邮件</a>
2.收件地址后添加?cc=开头,可添加抄送地址(Android存在兼容问题)
<a href="mailto:863139978@qq.com?cc=zhangqian0406@yeah.net">点击我发邮件</a>
3.跟着抄送地址后,写上&bcc=,可添加密件抄送地址(Android存在兼容问题)
<a href="mailto:863139978@qq.com?cc=zhangqian0406@yeah.net&bcc=384900096@qq.com">点击我发邮件</a>
4.包含多个收件人、抄送、密件抄送人,用分号(;)隔开多个邮件人的地址
<a href="mailto:863139978@qq.com;384900096@qq.com">点击我发邮件</a>
5.包含主题,用?subject=
<a href="mailto:863139978@qq.com?subject=邮件主题">点击我发邮件</a>
6.包含内容,用?body=;如内容包含文本,使用%0A给文本换行
<a href="mailto:863139978@qq.com?body=邮件主题内容%0A腾讯诚信%0A期待您的到来">点击我发邮件</a>
7.内容包含链接,含http(s)://等的文本自动转化为链接
<a href="mailto:863139978@qq.com?body=http://www.baidu.com">点击我发邮件</a>
8.内容包含图片(PC不支持)
<a href="mailto:863139978@qq.com?body=<img src='images/1.jpg' />">点击我发邮件</a>
9.完整示例
<a href="mailto:863139978@qq.com;384900096@qq.com?cc=zhangqian0406@yeah.net&bcc=993233461@qq.com&subject=[邮件主题]&body=腾讯诚邀您参与%0A%0Ahttp://www.baidu.com%0A%0A<img src='images/1.jpg' />">点击我发邮件</a>
CSS样式
一、美化表单元素
// 使用appearance改变webkit浏览器的默认外观
input,select { -webkit-appearance:none; appearance: none; }
// winphone下,使用伪元素改变表单元素默认外观
1、禁用select默认箭头,::-ms-expand修改表单控件下拉箭头,设置隐藏并使用背景图片来修饰
select::-ms-expand { display:none; }
2、禁用radio和checkbox默认样式,::-ms-check修改表单复选框或单选框默认图标,设置隐藏并使用背景图片来修饰
input[type=radio]::-ms-check,
input[type=checkbox]::-ms-check { display:none; }
3、禁用pc端表单输入框默认清除按钮,::-ms-clear修改清除按钮,设置隐藏并使用背景图片来修饰
input[type=text]::-ms-clear,
input[type=tel]::-ms-clear,
input[type=number]::-ms-clear { display:none; }
二、其它实用的css
1、去掉webkit的滚动条——display: none;
// 其他参数
::-webkit-scrollba //滚动条整体部分
::-webkit-scrollbar-thumb //滚动条内的小方块
::-webkit-scrollbar-track //滚动条轨道
::-webkit-scrollbar-button //滚动条轨道两端按钮
::-webkit-scrollbar-track-piece //滚动条中间部分,内置轨道
::-webkit-scrollbar-corner //边角,两个滚动条交汇处
::-webkit-resizer //两个滚动条的交汇处上用于通过拖动调整元素大小的小控件
2、禁止长按链接与图片弹出菜单
a,img { -webkit-touch-callout: none }
3、禁止文字复制
html,body {-webkit-user-select:none; user-select: none; }
4、改变输入框placeholder的颜色值
::-webkit-input-placeholder { /* WebKit browsers */color: #999; }
:-moz-placeholder { /* Mozilla Firefox 4 to 18 */color: #999; }
::-moz-placeholder { /* Mozilla Firefox 19+ */color: #999; }
:-ms-input-placeholder { /* Internet Explorer 10+ */color: #999; }
input:focus::-webkit-input-placeholder{ color:#999; }
5、android上去掉语音输入按钮
input::-webkit-input-speech-button {display: none}
6、阻止windows Phone的默认触摸事件
/*说明: winphone下默认触摸事件事件使用e.preventDefault是无效的,可通过样式来禁用,如: */
html { -ms-touch-action:none; } //禁止winphone默认触摸事件
取消input在ios下,输入的时候英文首字母的默认大写
<input autocapitalize="off" autocorrect="off" />
7、手机拍照和上传图片
// IOS有拍照、录像、选取本地图片功能,部分Android只有选择本地图片功能。Winphone不支持
<input type="file" accept="images/*" />
<input type="file" accept="video/*" />
播放视频不全屏
<!--
1.ios7+支持自动播放
2.支持Airplay的设备(如: 音箱、Apple TV)播放
x-webkit-airplay="true"
3.播放视频不全屏
webkit-playsinline="true"
-->
<video x-webkit-airplay="true" webkit-playsinline="true" preload="auto" autoplay src="http://"></video>
bug修改
android 2.3 bug
// 1.@-webkit-keyframes 需要以0%开始100%结束,0%的百分号不能去掉
// 2.after和before伪类无法使用动画animation
// 3.border-radius不支持%单位,如要兼容,可以给radius设置一下较大的值
// 4.translate百分比的写法和scale在一起会导致失效,例如:
-webkit-transform: translate(-50%,-50%) scale(-0.5, 1)
android 4.x bug
// 1.三星 Galaxy S4中自带浏览器不支持border-radius缩写
// 2.同时设置border-radius和背景色的时候,背景色会溢出到圆角以外部分
// 3.部分手机(如三星),a链接支持鼠标:visited事件,也就是说链接访问后文字变为紫色
// 4.android无法同时播放多音频audio
一、消除transition闪屏
.css {
-webkit-transform-style: preserve-3d;
-webkit-backface-visibility: hidden;
-webkit-perspective: 1000;
}
二、开启硬件加速
//目前,像Chrome/Filefox/Safari/IE9+以及最新版本Opera都支持硬件加速,当检测到某个DOM元素应用了某些CSS规则时就会自动开启,从而解决页面闪白,保证动画流畅。
.css {
-webkit-transform: translate3d(0,0,0);
-moz-transform: translate3d(0,0,0);
-ms-transform: translate3d(0,0,0);
transform: translate3d(0,0,0);
}
三、渲染优化
1、禁止使用iframe(阻塞父文档onload事件)
2、禁止使用gif图片实现loading效果(降低CPU消耗,提升渲染性能)
3、使用CSS3代码代替JS动画
4、开启GPU加速
5、使用base64位编码图片(不小图而言,大图不建议使用),以减少网络请求。比较耗费CPU。小图标优势在于: 减少HTTP请求、避免文件跨域、修改及时生效
—————————– 移动端的JS ——————————–
移动端touch事件(区分webkit和winphone)
一、当用户手指放在移动设备在屏幕上滑动会触发的touch事件
1、以下支持webkit
touchstart: 当手指触碰屏幕时候发生。不管当前有多少只手指
touchmove: 当手指在屏幕上滑动时连续触发。通常我们再滑屏页面,会调用event的preventDefault()可以阻止默认情况的发生: 阻止页面滚动
touchend: 当手指离开屏幕时触发
touchcancel: 系统停止跟踪触摸时候会触发。例如在触摸过程中突然页面alert()一个提示框,此时会触发该事件,这个事件比较少用
2、TouchEvent对象 :
touches: 屏幕上所有手指的信息
targetTouches: 手指在目标区域的手指信息
changedTouches: 最近一次触发该事件的手指信息
touchend时,touches与targetTouches信息会被删除,changedTouches保存的最后一次的信息,最好用于计算手指信息
event.changedTouches[0].clientX 获取移动端事件
3、参数信息(changedTouches[0])
clientX、clientY在显示区的坐标
target: 当前元素
4、事件响应顺序
ontouchstart > ontouchmove > ontouchend > onclick
5、以下支持winphone 8
MSPointerDown: 当手指触碰屏幕时候发生。不管当前有多少只手指
MSPointerMove: 当手指在屏幕上滑动时连续触发。通常我们再滑屏页面,会调用css的html{-ms-touch-action: none;}可以阻止默认情况的发生: 阻止页面滚动
MSPointerUp: 当手指离开屏幕时触发
二、移动端的web页面click事件会产生200-300ms的延时响应
移动设备上的web网页是有300ms延迟的,往往会造成按钮点击延迟甚至是点击失效。
原因: 双击缩放是指用手指在屏幕上快速点击两次,iOS 自带的 Safari 浏览器会将网页缩放至原始比例。
比如在点击一个<a href="#"></a>时,浏览器先捕获是单击还是双击缩放,所以捕获一次单击后,浏览器会hold一段时间来看是否有下一次点击,这个时间间隔就是300ms,这就是延时的由来,所以使用click来触发事件需要延时300ms后才生效
解决方案:
fastclick可以解决在手机上点击事件的300ms延迟
zepto的touch模块,tap事件也是为了解决在click的延迟问题
屏幕旋转的事件orientationchange
JS处理
function orientInit(){
var orientChk = document.documentElement.clientWidth > document.documentElement.clientHeight ? 'landscape' : 'portrait';
if(orientChk =='lapdscape'){
//这里是横屏下需要执行的事件
}
else{
//这里是竖屏下需要执行的事件
}
}
orientInit();
window.addEventListener('onorientationchange' in window?'orientationchange':'resize', function(){
setTimeout(orientInit, 100);
},false)
CSS处理
// 竖屏时样式
@media all and (orientation:portrait){ }
// 横屏时样式
@media all and (orientation:landscape){ }
audio元素和video元素在ios和andriod中无法自动播放
// 音频,写法一
<audio src="music/bg.mp3" autoplay loop controls>你的浏览器还不支持哦</audio>
// 音频,写法二
<audio controls="controls">
<source src="music/bg.ogg" type="audio/ogg"></source>
<source src="music/bg.mp3" type="audio/mpeg"></source>
优先播放音乐bg.ogg,不支持在播放bg.mp3
</audio>
// JS绑定自动播放(操作window时,播放音乐)
$(window).one('touchstart', function(){
music.play();
})
// 微信下兼容处理
document.addEventListener("WeixinJSBridgeReady", function () {
music.play();
}, false);
// 小结
// 1.audio元素的autoplay属性在IOS及Android上无法使用,在PC端正常
// 2.audio元素没有设置controls时,在IOS及Android会占据空间大小,而在PC端Chrome是不会占据任何空间
重力感应事件
// 运用HTML5的deviceMotion,调用重力感应事件
if(window.DeviceMotionEvent){
document.addEventListener('devicemotion', deviceMotionHandler, false)
}
var speed = 30;
var x = y = z = lastX = lastY = lastZ = 0;
function deviceMotionHandler(event){
var acceleration = event.accelerationIncludingGravity;
x = acceleration.x;
y = acceleration.y;
z = acceleration.z;
if(Math.abs(x-lastX)>speed || Math.abs(y-lastY)>speed || Math.abs(z-lastZ)>speed ){
//这里是摇动后要执行的方法
yaoAfter();
}
lastX = x;
lastY = y;
lastZ = z;
}
function yaoAfter(){
//do something
}
设备判断
一、JS判断设备
function deviceType(){
var ua = navigator.userAgent;
var agent = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];
for(var i=0; i<len,len = agent.length; i++){
if(ua.indexOf(agent[i])>0){
return agent[i];
break;
}
}
}
deviceType();
window.addEventListener('resize', function(){
deviceType();
})
二、JS判断微信浏览器
function isWeixin(){
var ua = navigator.userAgent.toLowerCase();
if(ua.match(/MicroMessenger/i)=='micromessenger'){
return true;
}else{
return false;
}
}
前端动画的几种方式
一、动画方式
1、css3的transition 和 animattion
2、定时器, 最原始的“window.setTimout()”或者“window.setInterval()” 不断更新元素的状态位置等来实现动画
3、requestAnimationFrame方法
4、canvas上作图来实现动画,也可以借助jQuery动画相关的API方便地实现
5、SVG、WebGL
二、requestAnimationFrame 注意 Android不支持此方法
requestAnimationFrame是浏览器用于定时循环操作的一个接口,类似于setTimeout,主要用途是按帧对网页进行重绘。
设置这个API的目的是为了让各种网页动画效果(DOM动画、Canvas动画、SVG动画、WebGL动画)能够有一个统一的刷新机制,从而节省系统资源,提高系统性能,改善视觉效果。
1、对requestAnimationFrame方法处理兼容:
window.requestAnimFrame = (function(){
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(/* function FrameRequestCallback */ callback, /* DOMElement Element */ element){
window.setTimeout(callback, 1000 / 60);
};
})();
2、Example
<div id="demo" style="position:absolute; width:100px; height:100px; background:#ccc; left:0; top:0;"></div>
<script>
var demo = document.getElementById('demo');
function render(){
demo.style.left = parseInt(demo.style.left) + 1 + 'px'; //每一帧向右移动1px
}
var requestID = requestAnimationFrame(function(){
render();
//当超过300px后才停止
if(parseInt(demo.style.left) <= 300) {
requestAnimationFrame(arguments.callee); // arguments.callee调用函数本身,或者给函数一个名,参数传个名
}
});
// cancelAnimationFrame(requestID); // 停止动画重绘
</script>
三、常用动画库
Ani.js -- 基于CSS动画的生命处理库
Dynamics.js -- 创建具有物理运动效果动画的js库
Animate.css -- 齐全的CSS3动画库
Three.js -- 让用户通过javascript入手进入搭建webgl项目的类库
http://www.tuicool.com/articles/uUfYry
http://www.jianshu.com/p/280e0ef90b96
其它API
一、querySelector()、querySelectorAll()
获取元素 document.querySelector('#app');
二、window.devicePixelRatio 获取设备像素比,也叫做dpr
这个属性是系统自动算出来的值返回给window.devicePixelRatio,公式就是
// 比如ipone6 750px物理像素 / 375px设备像素,所以dpr为2,有这个属性不用我们就不用去算
window.devicePixelRatio = 物理像素 / 设备独立像素;
三、getBoundingClientRect js判断可视区域
var htmlWidth = document.documentElement.getBoundingClientRect().width; // html文档的宽度
var top = document.documentElement.getBoundingClientRect().top; // 元素顶端到可见区域顶端的距离
var se = document.documentElement.clientHeight; // 浏览器可见区域高度。
四、document.documentElement、document.body
document.body 获取body文档
document.documentElement 获取HTML整个文档,从<!DOCTYPE html>开始
五、document.documentElement.getBoundingClientRect().width 获取html文档宽度
获取文档可视区宽度
问题
document.body.clientWidth; // 这里取的是body的宽度,如果body的宽度被改变
window.innerWidth; // 这里获取的是整个宽口的宽度,包括滚动条
解决方法: document.documentElement.getBoundingClientRect().width
fetch 新一代ajax
一、fetch的请求设置与响应
fetch('/some/url', {
method: 'get'
})
.then(function(response) {
// 成功
})
.catch(function(err) {
// 出错了;等价于 then 的第二个参数,但这样更好用更直观 :(
});
二、设置Header头
fetch('https://www.baidu.com/search/error.html', {
method: 'POST',
headers: new Headers({
'Content-Type': 'application/x-www-form-urlencoded' // 指定提交方式为表单提交
}),
body: new URLSearchParams([["foo", 1],["bar", 2]]).toString()
})
.then((res)=>{
return res.text()
})
.then((res)=>{
console.log(res)
})
fetch没有拦截请求和响应数据的功能,在单页面路由跳转时会需要提前去查看用户的一些登录信息,这时候需要使用Axios插件
问题收集
一、keydown侦听输入个数时,中文输入法输入个数的问题
let username = document.querySelector('#username');
// 如果输入中文,输入法比如输 "物品" 五笔需要输入 "trkk",这样size为4,这样对中文判断长度会有问题
$('#username').on('keydown', function(){
let size = $(this).val().length;
console.log(size);
})
// 解决方法,侦听compositionend事件,返回的size正常
$('#username').on('compositionend', function(){
let size = $(this).val().length;
console.log(size);
})
http://www.alloyteam.com/2017/03/moves-the-input-box-fill-series-a/
http://www.alloyteam.com/2016/12/alloytouch-full-screen-scroll-plugin-released-30-seconds-to-get-smooth-page-h5/
二、Retina屏1px边框处理
高清屏,1px实际是2x2个像素来渲染,有的还是3x3,所以border: 1px 移动端会渲染为2px或3px
<div class="bor-box">
<div class="bor-querymidea">通过伪类创建边框,在通过媒体查询来适配</div>
</div>
解决方法
1、通过-webkit-min-device-pixel-ratio 来确定两倍屏来修改边框大小
.bor-querymidea{
border: 1px #ccc solid;
}
/* 2倍屏 */
@media only screen and (-webkit-min-device-pixel-ratio: 2.0){
.bor-querymidea{
/* border: 0.5 #ccc solid; retina屏是不识别0.5px,会解释为0 */
-webkit-transform: scaleY(0.5);
transform: scaleY(0.5);
}
}
/* 3倍屏 */
@media only screen and (-webkit-min-device-pixel-ratio: 3.0){
.bor-querymidea{
-webkit-transform: scaleY(0.33);
transform: scaleY(0.33);
}
}
2、js判断如果devicePixelRation的值
devicePixelRation = 2; 输出viewport: <meta name="viewport" content="initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no">
devicePixelRatio = 3; 输出 <meta name="viewport" content="initial-scale=0.333, maximum-scale=0.333, minimum-scale=0.333, user-scalable=no">
https://www.jianshu.com/p/7e63f5a32636 // 7咱方法
三、设置viewport 缩放比例
(function(doc, win) {
var scale = 1.0;
if (win.devicePixelRatio === 2) {
scale *= 0.5;
}
if (win.devicePixelRatio === 3) {
scale *= 0.333333;
}
var text = '<meta name="viewport" content="initial-scale=' + scale + ', maximum-scale=' + scale +', minimum-scale=' + scale + ', width=device-width, user-scalable=no" />';
doc.write(text);
})(document, window);
https://www.cnblogs.com/stella1024/p/7199832.html
收集工具
1、browsersync 多端浏览器同步测试工具 http://www.browsersync.cn/
2、lib-flexible 处理根据屏幕的尺寸将Html中的font-size的值自动转换 https://github.com/amfe/lib-flexible
3、sublime的px转rem的插件 https://github.com/flashlizi/cssrem
| http://www.uigreat.com/page/guifan // 移动端屏幕尺寸集合
| http://cubic-bezier.com/#.55,.01,.38,.99 // 调节css3动画效果并导出代码
| https://segmentfault.com/a/1190000007075834 // Retina屏
| http://mp.weixin.qq.com/s?__biz=MzAwNjI5MTYyMw==&mid=404009356&idx=1&sn=e3218b95b78a5f043e7b0e3df49703d3&scene=4#wechat_redirect
| http://www.w3cplus.com/mobile/lib-flexible-for-html5-layout.html
| http://www.alloyteam.com/2016/03/mobile-web-adaptation-tool-rem/#prettyPhoto rem
| https://github.com/amfe/article/issues/17 // 淘宝H5终端适配