移动端自己的总结

1: 独立像素:ios: 称为pt; 安卓称为dp;   

1pt = 1px(iphone 3)/ 2px(iphone4) /3px; 

获取独立像素: window.devicePixelRatio;  电脑100%时候 1px = 1px; 得到的是1,  50%时候,得到的是0.5    200%时候得到的是2

 

2: 物理像素:相当于设备的宽高,是固定的,比如电脑:一般是1920*1080 分辨率越低,物理像素越大,分辨率越高,物理像素越小,物理像素越小,屏幕渲染越精细,画质越好

获取物理像素:window.screen,width;   window.screen.height;  获取时可能会有误差

 

3: css像素:可以看到的像素大小; 

var width = document.documentElement.clientWidth;缩放会改变,相当于css像素
var height = document.documentElement.clientHeight;

var w = window.screen.width;缩放不会改变,相当于物理像素
var h = window.screen.height;

 

4: 二倍图在二倍设备上显示,三倍图在三倍设备上展示

 

5: 调试:https://www.cnblogs.com/liutao8888/p/10004499.html    /    ghostlab(移动设备和服务器的网络是一样的)第三方调试工具,收费,可以下载卸载一直点试用

 

6: 视口viewport,用来显示内容,pc端视口大小和浏览器大小一样,获取当前视口:

var width = document.documentElement.clientWidth;
var height = document.documentElement.clientHeight;

pc端:如果父元素设定固定宽高,缩小屏幕小于该宽度时,下面会出现滚动条,如果不想出现滚动条,可以父元素跟子元素都按百分比设置,父元素设置width: 100%;

移动端: viewport (layout viewport 布局视口即可视区的尺寸 )是开发人员自由设置的,为了能够正常显示那些专为pc设计的网页,一般这个值得大小会大于屏幕的尺寸

默认viewport大小: iphone: 980     ipad: 980    安卓: 980     chrome: 980    IE: 1024

ideal(理想)viewport:  window.screen.width + window.screen.height获取,默认ideal viewport苹果6,7,8是width: 375

前端开发中ideal  viewport和layout viewport并不一致,这时候需要把layout viewport设置成ideal  viewport大小;设置方法:<meta name="viewport" content="">,这个只在移动端有效

 移动web常见设置: 快捷键:meta:vp+tab

<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">

<meta name="viewport" content="width=device-width">和<meta name="viewport" content="initial-scale=1">这两个效果一样,为了避免兼容性问题,所以都写

a) width:

设置layout viewport 的宽度,为一个正整数,或字符串" device- width"

b) initial-scale:

设置页面的初始缩放值,为一个数字,可以带小数  initial-scale(初始缩放)= ideal  viewport /   layout viewport

c) minimum-scale:

默认状态下最小的缩放比例

d) maximum-scale:

允许用户的最大缩放值,为一个数字,可以带小数

e) height:

设置layout viewport 的高度,这个属性对我们并不重要,很少使用

f) user-scalable:

是否允许用户进行缩放,值为"no"或"yes", no 代表不允许,yes代表允许

解决横向滚动条的问题:即把宽度设置成百分比就行了

超小屏幕(移动设备) 768px以下 小屏设备 768px-992px 中等屏幕 992px-1200px 宽屏设备 1200px以上

 

7: 主流移动web站点:轮播图 → 导航栏 → 产品信息

 

8: 移动端的浏览器相对单纯些,基本都是基于webkit内核:QQ浏览器、百度浏览器、苹果浏览器、UC浏览器

操作平台:ios、安卓

浏览器:系统自带、内置应用(qq、微信、微博、淘宝等app会内置浏览器webView,实际开发中这个重要)、第三方: 自己安装的火狐,谷歌,360等

 

 9: 触屏事件:移动端添加事件一般用addEventListener("事件名称",function(){});

touchstart: 手指触摸屏幕时开始触发

touchmove: 手指在屏幕上移动时触发,是持续触发的

touchend:手指离开屏幕时触发, 这时候手指已经离开,事件获取e.clientX等事件中不能用targetTouches,而要用changedTouches

webkitTransitionEnd: 监听元素的过渡效果执行完毕之后,触发

touchcancel: 触摸时意外终断,比如打游戏来了个电话

touch事件(e)对象:

touches: 指屏幕上的所有手指对象

targetTouches: 当前元素上的手指对象、(常用)

chengedTouches: 当前屏幕上变化的的手指对象,从无到有,从有到无,在startend时使用

touches和targetTouches在测试中没有区别

e.targetTouches —— TouchList

TouchList里面相当于一个数组:

  1. screenX: 835
  2. screenY: 278  指手指的触摸点距离屏幕的距离
  1. clientX: 43
  2. clientY: 62         是基于视口的的移动距离(常用)
  1. pageX: 43
  2. pageY: 62    是基于当前内容的距离,如果有滚动条,则会大于clientX/Y

*** touch事件的触发必须保证元素有宽高值,如果宽高为0,则不会触发

上述事件执行过程中会bug, 如果客户拖动较快会出现白屏,是因为客户拖动之后,过渡效果没有执行完导致,这时候需要设置一个监听对象,flag = true; fiag为true时候,touchmove里面的代码才执行,touchend时,fiag为false, 并且以前的moveX,distanceX,startX都设置为0,下一次重新赋值,webkitTransitionEnd时候即动画效果完成之后再执行fiag为true,这时候需要清除定时器,然后再开启一个新的定时器,可以放在一个setTimeout(500毫秒)里执行,比较严谨.

 

10: Zepto.js   https://www.runoob.com/manual/zeptojs.html  移动端的jquery

Zepto是一个轻量级的针对现代高级浏览器的JavaScript库, 它与jquery有着类似的api。 如果你会用jquery,那么你也会用zepto。

分模块,不同的功能分装在不同的模块里面,默认的只有前5个,https://github.com/madrobby/zepto下载地址,用那一部分就引入哪一部分的js

 

11: fastclick.js      实现移动端的点击事件        https://github.com/ftlabs/fastclick

fastclick.js的用法,下载,然后把lib文件夹下的js文件放到我们的文件夹中,引入这个插件,然后写下面的内容

if ('addEventListener' in document) {
  document.addEventListener('DOMContentLoaded', function() {
    // document.body可以改成任意元素,如果直接写document.body,则表示,下面的所以的dom元素都会使用这个插件
    FastClick.attach(document.body);
  }, false);
}
// 下面的元素就正常写就行
btn.addEventListener("click",function(){
  btn.style.visibility="hidden";
});

 

12: iScroll.js   主要实现滚动滑动操作       参考地址:http://caibaojian.com/iscroll-5/versions.html               下载地址:https://github.com/cubiq/iscroll

build文件夹里面有5个Scroll的版本,一般iScroll.js就可以

 结构:

<div id="wrapper">
  <ul>
    <li>...</li>
    <li>...</li>
    ...
    </ul>
</div>


js:
<script type="text/javascript">

//元素名称可以变,根据自己设置,上下保持一致即可
  //var myScroll = new IScroll('#wrapper');   //基础设置,如果需要用到滚动条,则选择下面的

  var myScroll = new IScroll('#wrapper', {
    mouseWheel: true, //鼠标滚轮支持
    scrollbars: true       //滚动条支持  添加之后滚动条默认的位置是浏览器的右边,如果需要设置在盒子右边,直接给盒子加一个relative的样式
  });

</script> 

滚动的条件是子容器和父容器都要有高度 ,父容器的高度必须小于滚动的子容器的大小,所以设置父容器的高度是100%;

 

13: swipe.js   实现轮播图的效果插件      https://github.com/thebird/swipe/

html结构: 

<div id='slider' class='swipe'>
  <div class='swipe-wrap'>
  <div></div>
  <div></div>
  <div></div>
</div>
</div>

css样式: 

.swipe {
  overflow: hidden;
  visibility: hidden;//这个功能使banner刚开始默认不可见,加完js之后会显示出来
  position: relative;
}
.swipe-wrap {
  overflow: hidden;
  position: relative;
}
.swipe-wrap > div {
  float:left;
  width:100%;
  position: relative;
}

js使用: swipe 可以改成自己项目实际的标签

window.mySwipe = Swipe(document.querySelector(".swipe "),{

  // 配置选项

  startSlide: 2,  开始滚动的位置,默认是0,可以默认,不写
  speed: 400, 效果的时间,默认300,可以默认,不写
  auto: 2000, 自动轮播的时间,必须要加,不加不会自动轮播
  continuous: true,  (滑到最后直接到第一)即无限循环,默认是,可以不写
  disableScroll: false, 是不是不让做滑动,默认不是,即可以手动滑动,默认是false;可以默认,不写
  stopPropagation: false,  是不是阻止不让事件冒泡,默认是false;可以默认,不写
  callback: function(index, elem) {}, 轮播图运行中的回调函数  根据需求, 可以来加下面的小点函数
  transitionEnd: function(index, elem) {} 动画运行结束的回调函数  根据需求

});

扩展函数:使用的时候直接调用就行

prev() 上一页
next() 下一页
getPos() 返回当前div(class='wrap'的div)的索引
getNumSlides() 返回滑块总数
slide(index, duration) 设置滑到的索引 (duration: 转化的速度,单位毫秒)

document.getElementById("prev").onclick=function(){
  window.mySwipe.prev();
}

 

14: swiper.js  轮播图,滑动插件,功能强大    

https://www.swiper.com.cn/中文网     

https://github.com/nolimits4web/Swiper/下载地址  

https://www.swiper.com.cn/usage/index.html使用方法

API(Application Program Interface): https://www.swiper.com.cn/usage/index.html

下载之后,解压,打开package文件夹,里面的js和css文件夹里面有js和css文件

css的类名要用框架的名字,js的名字可以自定义  

 

移动端会出现的问题

1: 元素点击时会出现一个淡蓝色的背景高亮显示,去除背景高亮显示: -webkit-tap-highlight-color: transparent;

2: 如果盒子用了position: fixed;这时候他的宽度是根据默认视口走的,会超过父元素的最大宽度,这时候,宽度需要加max-width: 640px;

.top_search{
width: 100%;
height: 40px;
position: fixed;
max-width: 640px;

}

3: 静态图片放在images里面,动态图片放在uploads里面

4: 轮播图banner部分的偏移,默认应该显示索引为1的图片,这时候需要让父容器偏移

a:父容器偏移,用transform: translateX(-10%);

b:图片的父容器定位,这时候要用position: relative; 不能用position: absolute;因为父容器的高度是子元素撑开的,用absolute;高度会出现问题。

5: 如果变量中有的值获取的时候是固定的,那么设置完之后,屏幕变化,值会出现错误,这时候需要window.onresize =function(){};把之前写的变化,放在这个里面再写一遍;

6: 轮播图手指移动的时候,除了第一张比较快之外,其他都比较慢,是因为有过渡效果,这时候需要把元素的过渡效果设置为none;

bannerImg.style.transition = "none";

7: 移动端的click事件有延迟(移动端需要判断是单击还是双击,所以会延迟单击事件的触发),很少用

单击操作特点:

a:只有一个手指

b:手指开始触摸和松开的事件差异不能大于特定值,比如300毫秒,超过就相当于长按

c:保证没有滑动距离,或者滑动距离不能超过特定值,比如5px;

自己封装tap事件:

function tap(obj, callback){
  if (!obj || typeof obj != "object") {
  return;
};
var startX,startY,endX,endY,startTime,endTIme;
obj.addEventListener("touchstart", function(e){
  if(e.targetTouches.length > 1){
    return;
  }
  startTime=Date.now();
  startX = e.targetTouches[0].clientX;
  startY = e.targetTouches[0].clientY;
});
obj.addEventListener("touchend", function(e){
  if(e.changedTouches.length > 1){
    return;
  }
  endTIme = Date.now();
  endX = e.changedTouches[0].clientX;
  endY = e.changedTouches[0].clientY;
  if (endTIme - startTime > 300) {
    return;
  };
  if ((Math.abs(endX - startX) < 5) && (Math.abs(endY - startY) < 5)) {
    callback && callback();
  };
});
}

自己封装tap事件,或者zepto中的tap事件,但是都会有类似于事件冒泡(点透)的bug,touch事件只能在移动端使用,如果想在移动端和pc端都可以使用的话,

为了解决所有的问题,可以使用fastclick.js的插件

8: 加了setInterval(fn, 500);的盒子,最好先请清除定时器,然后再打开定时器,否则会触发多个定时器.

9: 页面DOM里的每个节点上都有一个classList对象,程序员可以使用里面的方法新增、删除、修改节点上的CSS类。使用classList,程序员还可以用它来判断某个节点是否被赋予了某个CSS类。 

10: 移动app里面的页面,Navigation bar(导航条)不用自己弄,系统会自带,我们只需要做中间的h5页面就行

 

 

posted @ 2020-04-13 17:36  花木兰r  阅读(248)  评论(0编辑  收藏  举报