移动端的几个面试小问题

摘要:
1.Android上的大面积触摸将触发touchmove。判断touchstart的最后一个位置是否与当前位置相同,并使movereturn drop<body><divclass=“page”><div=“box”></div></div><scripttype=“text/javascript”>varpage=document。querySelector('.page');页面.添加
1. 安卓下大面积触摸会导致触发touchmove的问题
  判断一下touchstart的上一次位置和当前位置是否一样,一样就使move return掉
<body>
<div class="page">
    <div id="box"></div>
</div>
<script type="text/javascript">
var page = document.querySelector('.page');
page.addEventListener('touchstart', function(e) {
    e.preventDefault();
});
var lastPoint = {};
box.addEventListener('touchstart', function(e) {
    lastPoint = {
        x:e.changedTouches[0].pageX,
        y:e.changedTouches[0].pageY
    }
    this.innerHTML = "start";
    this.innerHTML += "<br/>x:"+e.changedTouches[0].pageX;
    this.innerHTML += "<br/>y:"+e.changedTouches[0].pageY;
});
box.addEventListener('touchmove', function(e) {
    if(e.changedTouches[0].pageX == lastPoint.x
    &&e.changedTouches[0].pageY == lastPoint.Y){
        return;
    }

    this.innerHTML += "<br/>move";
    this.innerHTML = "x:"+e.changedTouches[0].pageX;
    this.innerHTML += "<br/>y:"+e.changedTouches[0].pageY;
    lastPoint = {
        x:e.changedTouches[0].pageX,
        y:e.changedTouches[0].pageY
    }
});
</script>
 
2.移动端输入框被遮挡了怎么办
  在focus里去做:获取屏幕高度,比较输入框的底部是否超出了屏幕,超出就让外框向上移动超出的距离
  在blur里做:把外框回到原来位置
<div class="page">
    <div class="info"></div>
    <input type="text"   name="">
</div>
<script type="text/javascript" src="http://t.zoukankan.com/js/mTween.js"></script>
<script type="text/javascript">
(function(){
    var page = document.querySelector('.page');
    var text = document.querySelector('.text');
    var info = document.querySelector('.info');
    var old = 0;
    css(page,"translateY",0);
    /*
        移动端输入框被遮挡的问题
            1) 在软件盘弹出之后(在focus中加个延迟时间),获取input的坐标
            2) 判断input是否遮挡
                1. 判断 input 是否在 可视区的高度以下
            3) 如果被遮挡了 就向上移动整个页面
                1. 用被软件盘遮挡的距离     

    */
    text.addEventListener('focus', function(e) {
        setTimeout(function(){
            //延迟一段时间之后,才可以获取到软键盘弹出之后的坐标
            var rect = text.getBoundingClientRect();
            var h = document.documentElement.clientHeight; 
            old = css(page,"translateY");
            if(rect.bottom > h){
                //info.innerHTML = "被遮挡了";
                var dis = rect.bottom - h;
                css(page,"translateY", old - dis);
            }
        },1000);
    });
    text.addEventListener('blur', function(e) {
        old = css(page,"translateY",old);
    });
})();
</script>
 
3.移动端怎么固定横屏显示
  检测手机竖屏的时候,元素给元素添加90deg的旋转
  检测手机横屏的时候,元素给元素的旋转再改为0
 
4.事件点透
  
  pc端的鼠标事件在移动端也有效果,但是在移动端使用鼠标事件会有300毫秒的延迟,如果有两个元素是重叠的,点击之后上面那个元素消失了就会出现点透事件,如果下面元素有鼠标事件,就会被触发
  因为执行过程:手指按下之后,会先执行touch事件,然后记录点击的坐标,300ms之后,在该坐标上查找元素,如果该元素绑定了鼠标事件,就把事件执行了
  解决办法: e.preventDefault ( ),或者延迟三百毫秒以上来处理事件
  不推荐的解决方法:给单个空间添加阻止冒泡
5.解决安卓下点击了软键盘缩放之后,触发不了input的blur的问题
<body>
<input   type="text" name="">
<div id="info"></div>
<script type="text/javascript">
(function(){
    var text = document.querySelector('#text');
    var info = document.querySelector('#info');
    text.onfocus = function(){
        //软键盘的弹出 会影响窗口的大小发生改变
        // 展开是 改变一次,收缩起来又改变一次
        window.addEventListener('resize', toResize);
    };
    function toResize(){
        window.removeEventListener('resize', toResize);
        window.addEventListener('resize', toBlur);
    }
    function toBlur(){
        window.removeEventListener('resize', toBlur);
        text.blur();
    }
})();    
</script>
 
6.目前新版浏览器不支持viewport中的禁止缩放和最大缩放值限制
  阻止默认事件
 
7.多指操作的兼容
  安卓下没有gestures事件,需要利用e.touches自己去封装。
document.addEventListener('touchstart', function(e) {
    e.preventDefault();
});
/*
init:{
    el: 元素,
    start:fn,
    change:fn,
    end:fn
}
*/
(function(){
    var box = document.querySelector('#box');
    var startDeg = 0;
    var startScale = 0;
    css(box,"rotate",0);
    css(box,"scale",100);
    gesture({
        el:box,
        start: function(e){
            startScale = css(box,"scale")/100;
            startDeg = css(box,"rotate");
            this.style.background = "blue";
        },
        change: function(e){
            css(this,"scale",(e.scale * startScale)*100);
            this.innerHTML = e.rotation;
            css(box,"rotate",e.rotation + startDeg);
        },
        end: function(e){
            this.style.background = "red";
        }
    });
})();
function gesture(init){
    var el = init.el;
    var isGesture = false;
    var startDis = 0;
    var startDeg = 0;
    el.addEventListener('touchstart', function(e) {
         if(e.touches.length >= 2){
             startDis = getDis(e.touches[0],e.touches[1]);
             startDeg = getDeg(e.touches[0],e.touches[1]);
             isGesture = true;
             init.start&&init.start.call(el,e);
         }
    }); 
    el.addEventListener('touchmove', function(e) {
         if(isGesture&&e.touches.length >= 2){
             isGesture = true;
             var nowDis = getDis(e.touches[0],e.touches[1]);
             var nowDeg = getDeg(e.touches[0],e.touches[1]);
             e.scale = nowDis/startDis;//缩放值
             e.rotation = nowDeg - startDeg;
             init.change&&init.change.call(el,e);
         }
    }); 
    el.addEventListener('touchend', function(e) {
         if(isGesture){
             init.end&&init.end.call(el,e);
         }
         isGesture = false;
    }); 
}    
function getDis(Point,Point2){
    return Math.sqrt((Point.pageX - Point2.pageX)*(Point.pageX - Point2.pageX) + (Point.pageY - Point2.pageY)*(Point.pageY - Point2.pageY));
}
function getDeg(Point,Point2){
    var y = Point.pageY - Point2.pageY;
    var x = Point.pageX - Point2.pageX;
    return Math.atan2(y,x)/Math.PI*180;
}
 
8.滑屏时的卡顿问题
  阻止默认事件
 
9.transition移动端的闪屏问题
  把外框变成3D的,一般情况下不会遇到。
 
10.使用了3d做动画之后,3d元素下边的文字失真的问题
  给上面动画的幻灯片什么的外层加上绝对定位,定位里面一层加上相对定位。
 
11.部分安卓下调用file,只能调用到相册,不能调用摄像头
  在input上加上一个caption属性,但是如果是x5或者是ios浏览器下就会出现只能调到摄像头的问题,所以要加一个判断,判断浏览器的版本,如果是iso浏览器或者x5浏览器,就把加caption属性这个renturn掉不加
 
12.audio的不能自动播放问题
  给document加上.play()
 
13.如何判断网络环境是无线还是流量
  navigator里面有所有和网络相关的东西

免责声明:文章转载自《移动端的几个面试小问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇雷达方程分析GitHub 实现多人协同提交代码并且权限分组管理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android实现简单的检测手机自由落体关闭屏幕

实现功能如下:在背景运行app,检测到自由落体状态时,熄灭屏幕,可重复测试。 1. 检测自由落体动作  需要使用到加速度感应器 TYPE_ACCELEROMETER SensorManager mSensorManager; private float mLastX; private float mLastY; private float mLastZ;...

移动端 扫描枪输入不弹出键盘

目前有一个需求,用户可以手写输入 也可以 扫描枪输入,使用安卓的一个机器,进行扫描二维码 读取内容 并查找展示 扫描枪原理:模拟移动端输入键盘,从而将获取的内容赋值在获取焦点的input上  (扫到东西的话会自动在焦点处输出) 因为是模拟输入键盘 实际上 扫描枪输入完成以后,会自动吊起移动端小键盘,现在就如何在扫描的时候 不掉起小键盘 ,只进行赋值。 解决...

less一些用法整理

前提理解:第一个,less是单独的一种文件,可以理解为css的升级版,完全按照css写也没问题,不过它提供了很多便利的东西,可以省好多代码量。第二个,html只认css,所以需要配套一些软件将less解析成css,引用时候,直接引用css就好。gulp,koala 都是常用的,Koala好像简单且方便一点。 嵌套 less的优势有很多,最常用也是最让人舒坦...

在ASP.NET 2.0中使用样式、主题和皮肤

ASP.NET 2.0的主题和皮肤特性使你能够把样式和布局信息存放到一组独立的文件中,总称为主题(Theme)。接下来我们可以把这个主题应用到任何站点,用于改变该站点内的页面和控件的外观和感觉。通过改变主题的内容,而不用改变站点的单个页面,就可以轻易地改变站点的样式。主题也可以在开发者之间共享。 ASP.NET包含了大量的用于定制应用程序的页面和控件的外观...

css无图片圆角效果

不知为何,现在的美工都喜欢弄圆角。之前的网站也弄过圆角,当时做法现在感觉确实太笨了:1用图片;2用Table 背景色嵌套出来这两个做法不仅增加客户端下载数据量,而且改起来也很麻烦。所以综合网上的资料整了个不用图片的单纯css的圆角效果,个人感觉还不错:看下代码吧:  1<html> 2<head> 3<title>css...

IIS网站服务器性能优化指南(转载)

原文网址:http://www.phontol.com/20090507_419416_1.htmlWindows Server自带的互联网信息服务器(Internet Information Server,IIS)是架设网站服务器的常用工具,它是一个既简单而又麻烦的东西,新手都可以使用IIS架设一个像模像样的Web站点来,但配置、优化IIS的性能,使得网...