移動端的幾個面試小問題

来源:http://www.cnblogs.com/hjj2ldq/archive/2017/09/06/7487356.html
-Advertisement-
Play Games

1. 安卓下大面積觸摸會導致觸發touchmove的問題 判斷一下touchstart的上一次位置和當前位置是否一樣,一樣就使move return掉 <body> <div class="page"> <div id="box"></div> </div> <script type="text/j ...


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" class="text" name="">
</div>
<script type="text/javascript" src="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 id="text" 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裡面有所有和網路相關的東西


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • *{ margin: 0; padding: 0; } ul,li{ list-style: none; } .ui-slide-box{ width: 300px; ... ...
  • html代碼: js代碼: $("#store_img").on("change",function(){ var objUrl = getObjectURL(this.files[0]) ; //獲取圖片的路徑,該路徑不是圖片在本地的路徑 if (objUrl) { $(".hide_img im ...
  • JavaScript 有一套完全不同於其它語言的對 this 的處理機制。 在五種不同的情況下 ,this 指向的各不相同。 1。全局範圍內 當在全部範圍內使用 this,它將會指向全局對象。 2。函數調用 這裡 this 也會指向全局對象,可以這麼理解 在這裡,我們可以這麼理解沒有明確的調用對象的 ...
  • 最近學習態度比較積極,打算用react做一個小個人應用網站...所以從阿裡雲上買了些免費的介面,什麼QQ音樂排行查詢介面、IP地址查詢、天氣預報等等。調用時,發現身份校驗可以通過簡單修改頭部信息的方式,即向頭部加入APPCODE的key,以及相應的值。 但是之前沒有用過請求頭添加 so 記錄學習下. ...
  • 1,首先從官方網站下載安裝Node.js,建議使用6.x版本,同時也會一併安裝npm工具,npm>3.10以上。 2,npm安裝很慢(國外伺服器),所以一般推薦使用npm淘寶鏡像cnpm,先安裝下cnpm: 安裝好cnpm後,以後使用npm的地方就可以使用cnpm替代了 3、全局安裝vue-cli ...
  • 2 ...
  • 最近學習angular2,於是從官網的hero例子開始學習。經過幾番周折終於完成了這個例子。收益匪淺。個人建議在開始學習例子前可以先瞭解一些概念,模塊,組件,裝飾器.....,有助於寫代碼時候的邏輯。說一下我在學習時遇到的問題: 1.首先附上中文的官方教程鏈接:https://www.angular ...
  • ##字元串## 字元串: 由0個或多個字元組成,被成對的英文單引號或雙引號包含起來的。 字元編碼: 每一個字元在電腦存儲的編號。 電腦會保存有一套或幾套用於標註編號與字元對應關係的字典。(字元集) 電腦存儲單位 位:bit->0/1能存2個字 位元組:byte->8bit可存256個不同的字。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...