兩年移動端前端開發問題吐血彙總

来源:https://www.cnblogs.com/iovec/archive/2018/09/30/9729316.html
-Advertisement-
Play Games

某些手機上 fixed 元素在頁面滾動時會消失,某些 IOS 設備上觸發不了點擊事件,IOS 設備上點擊事件有 300ms 延遲,IOS 設備上 fixed 元素在鍵盤彈起時位置會變幻不定,在彈窗上滑動時底部頁面也跟著動,兩年移動端前端開發,我TM都經歷了什麼 ...


手機固有 bug

  • 某些手機上 fixed 元素在頁面滾動時會消失

使用局部滾動,而不是整頁滾動

  • 某些 IOS 設備上觸發不了點擊事件

在元素上加 pointer:cursor

  • IOS 設備上點擊事件有 300ms 延遲

兩種方法,一是使用 fastclick.js(推薦)。二是不綁 click 事件,綁在 tap 事件上(此方法會導致開發時調試困難,模擬設備模式下觸發 tap 有 bug)

  • IOS 設備上 fixed 元素在鍵盤彈起時位置會變幻不定

沒有很好的解決方案,應從產品設計層面避免這種情況(比如說做轉場頁面等)

  • 在彈窗上滑動時底部頁面也跟著動

在彈窗上需要滾動的地方使用 Swiper,不需要滾動的地方加 ontouchmove="event.preventDefault()"

  • 某些 IOS 設備上頁面滾動時不會連續觸發 scroll 事件

綁在 touchmove 事件上,但手指離開屏幕慣性滑動這段時間還是無法觸發,如果確實需要精細控制,可考慮 IScroll.js

  • 瀏覽器刷新頁面後會記憶之前的滾動條位置

這通常可以提升用戶體驗,但有時我們需要禁止這種記憶,加上下麵兩行

history.scrollRestoration = 'manual'
window.onunload = () => window.scrollTo(0, 0)
  • h5 video 無法自動播放

無法實現,無法實現,無法實現。這是廠商為避免偷取流量強制規定的。兩個方法,一是從產品設計層面規避,二是降級為用戶觸屏播放,沒有第三種可能

相容性部分

  • Array.prototype.sort 方法在某些手機上會不起作用

sort 方法傳入的比較函數應該返回一個數值,而不是布爾值。也就是應該使用 - 號,而不是 ><

  • Object.assign 方法在某些手機上會不起作用

參考 jQuery 的 $.extend 實現自己的對象合併方法。註意,Babel 僅轉譯語法,而不轉譯 API,所以使用這些 ES6+ 的 API 都存在不相容的風險,如果引入了 Babel 的 polyfill,那就不用擔心,否則就需要自己 polyfill

  • CSS3 特性(flex 佈局,transform 等)不支持

加上首碼,加上首碼,加上首碼。加完首碼不敢說 100% 支持吧,90% 還是有保證的,尤其是移動端。手動加是不可能手動加的,可使用 autoprefixer 配合構建工具處理

  • 1 像素問題

這裡的1像素並非1邏輯像素(也就是CSS像素),而是1物理像素,可以採用縮放的方法實現,首先設置 width: 1px,然後使用媒體查詢根據不同的dpr縮放不同的比例,貼一下 less 的實現

.one-x { height: 1px;}
.one-y { width: 1px; }

@dpr: 1.5, 2, 3;
@len: length(@dpr) + 1;
.genScale(@n: 1) when (@n < @len) {
  @val: extract(@dpr, @n);
  @media (min-device-pixel-ratio: @val) {
    .one-x {
      transform: scaleY(1/@val);
    }

    .one-y {
      transform: scaleX(1/@val);
    }
  }
  .-fix-less-compiler-bug- {
    display: block;
  }
  .genScale(@n + 1);
}

.genScale();
  • 吸頂問題

IOS 直接使用 position: sticky,安卓機型綁 scroll 事件。(需要提一句的是,IOS 的 scroll 事件觸發不連續,安卓對 sticky 的支持不太好。所以上面的方法是比較科學地)附上機型判斷代碼

const ua = window.navigator.userAgent.toLowerCase()
const isAndroid = /android/.test(ua)
const isIOS = /iphone|ipad|ipod/.test(ua)

庫 & 框架

  • jQuery 的 ajax 方法傳參 data 項問題

data 的 key/value 鍵值對的 value 為 undefined 時 jQuery 會直接不傳這一條,為 null 時傳空字元串

  • Vue 修改了數據對象視圖不更新

就是不更新,就是不更新,就是不更新。這個官網還有寫了。這個和 Vue 監測數據變化的機制有關。Vue 無法檢測到對象的新增屬性和 vm.arr[index] = newVal 這種方式更新的數組變化。可用以下方法觸發

vm.arr = [ ...vm.arr ]
vm.obj = { ...vm.obj }

細節

  • IOS 區域滾動卡頓不絲滑

加上 -webkit-overflow-scrolling: touch

  • 某些手機上點擊時元素高亮閃一下

加上 -webkit-tap-highlight-color: rgba(0, 0, 0, 0)

  • 隱藏滾動條

加上 ::-webkit-scrollbar{ display: none }

---------------------------- 我是結束線 ----------------------------

暫時就這些了,更多的以後更新


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

-Advertisement-
Play Games
更多相關文章
  • 一、準備工作 1安裝vue-cli npm install vue-cli -g 2檢查是否安裝成功 vue -V(大寫V) 3初始化一個新的項目 vue init webpack vue-demo 進入項目目錄 npm install npm run dev 二、配置路由 1我們可以看到生成的ro ...
  • 向上遍歷 DOM 樹(祖先) 這些 jQuery 方法很有用,它們用於向上遍歷 DOM 樹: parent() 方法返回被選元素的直接父元素。親自試一試 parents() 方法返回被選元素的所有祖先元素,它一路向上直到文檔的根元素 親自試一試 您也可以使用可選參數來過濾對祖先元素的搜索。 親自試一 ...
  • 組件入口函數1: onLoad: 組件載入的時候調用, 保證了你可以獲取到場景中的其他節點,以及節點關聯的資源數據;2: start: 也就是第一次執行 update 之前觸發;3: update(dt):組件每次刷新的時候調用,距離上一次刷新的時間(會在所有畫面更新前執行);4: lateUpda ...
  • 先來看看position: fixed;的定義:生成絕對定位的元素,相對於瀏覽器視窗進行定位; 但是在iframe中使用fixed定位,實際上是相對於iframe視窗進行定位,原因在於iframe類似於創建了一個瀏覽器視窗,在使用一些獲取滑鼠位置以及元素位置等方法的時候把iframe當作瀏覽器視窗來 ...
  • 以下介紹的兩種屬性是為後面的屬性支持左鋪墊,大概一看就OK了。 事件屬性 ...
  • 大概是CSS3吧,出了一個叫CSS變數的東西,也叫自定義屬性,還是比較有用的東東,可以用JavaScript靈活控制,變數作用 我們來實現一個div跟隨滑鼠滾動的小東西用來說明如何自定義變數 HTML代碼如下: JavaScript代碼,我們來寫一段監聽,處理變數值 這樣就實現了我們想要的效果,當然 ...
  • 3d建築,3d消防,消防演習模擬,3d庫房,3d檔案室,3d密集架,webGL,threejs,3d機房,bim管理系統 ...
  • 不同公司和組織之間的測試效率迥異。在這個富交互和響應式處理隨處可見的時代,很多組織都使用敏捷的方式來開發應用,因此測試自動化也成為軟體項目的必備部分。測試自動化意味著使用軟體工具來反覆運行項目中的測試,併為回歸測試提供反饋。 端到端測試又簡稱E2E(End-To-End test)測試,它不同於單元 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...