【學習筆記】 關於 iOS Safari 的那些坑:禁止選取 & 縮放設定

閱讀時間約 10 分鐘
這次專案開發是針對 iOS 系統,需要解決畫面縮放的問題,有些關鍵字來回搜尋好多遍,卻還是容易搞混,於是乎乾脆記錄下來,日後如果遇到這類型問題,也會直接更新在這篇。

A. 前言:進入 meta 元宇宙

meta tag 是網頁 HTML 架構中的一種描述標籤,提供網頁的內容資訊給瀏覽器或搜尋引擎,語法如下:
<meta name="參數" content="具體參數值">
在 android 系統與 iOS 10 以前的行動裝置,透過設定 HTML meta tag 的 viewport(可視區域),我們能控制畫面顯示的寬高、縮放比例以及是否允許縮放。

B. Zoom in/out on mobile device

B-0. user-scalable=no:禁止縮放畫面

一般而言,在行動裝置的瀏覽器中,使用者可透過以下手勢來達到縮放頁面(zoom-in/zoom-out)的效果:
  • pinch:兩指縮放
  • double-tap:雙擊縮放
若在網頁的 <head> 區塊加入以下屬性,即可達到「禁止使用者縮放畫面」的效果:
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">

// 等同於
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">
上述 content 屬性說明:
  • width=device-width:設定瀏覽器頁面的寬度同裝置的寬度,即自動符合不同手機螢幕預設的最佳解析度
  • initial-scale=1.0:設定畫面初始縮放比例為 100%,即不放大也不縮小
  • minimum-scale=1, maximum-scale=1:設定畫面最小和最大的縮放比例,均為 1 代表無法縮放
  • user-scalable=0:不允許使用者改變縮放比例
但到 iOS 10 之後的版本,為了提高 Safari 網頁的輔助功能,便忽略 meta 設定中的 user-scalable=no 屬性,使得「不允許使用者改變縮放比例」這項限制失效,以下是官網原文
To improve accessibility on websites in Safari, users can now pinch-to-zoom even when a website sets user-scalable=no in the viewport.
為了提高 Safari 網站中的輔助功能,即使在網站中的 viewport 設定 user-scalable=no,用戶仍可用手指進行縮放。
查了資料發現 meta viewport 特性原來最早就是由 Apple 公司引入,旨在解決不同行動裝置畫面顯示的問題;到現在選擇忽略 user-scalable=no,雖然本意是好的,讓使用者能夠自由縮放畫面至合適的大小,卻也因此失去開發網頁的彈性。
但山不轉人轉,我們還是能透過其他語法來達到想要的結果,以下舉幾個範例:
  • CSS 屬性 touch-action: manipulation:禁止 double-tap
  • 監聽 JS 事件 touchstart/touchend:禁止 pinch & double-tap
  • 監聽 JS 事件gesturestart:禁止 pinch

B-1. CSS 解法:以 touch-action: manipulation 禁止 double-tap

加上 touch-action: manipulation 屬性,讓元素只能使用滑動或兩指縮放,即忽略 double tap 手勢的縮放:
html, body {
touch-action: manipulation;
}

B-2. JS 解法:handle touchstart/touchend event

監聽這兩個 event 原理如下:
  • touchstart:透過偵測 e.touches.length(觸控點數目)handle pinch 手勢
document.addEventListener('touchstart', (event) => {
if (event.touches && event.touches.length > 1) { // 禁止多指觸控
event.preventDefault();
}
}, { passive: false });
由於 iOS 11.1 版本的變動,預設 passive: true 以提高使用性能,但也因此造成 e.preventDefault() 語法失效。因此需加上 { passive: false } 屬性,主動告訴瀏覽器這裡的監聽將使用 event.preventDefault(),即可阻止事件後面的動作。
  • touchend:透過偵測點擊時間差 handle double-tap 手勢
let lastTouchEndTime = 0;
document.addEventListener('touchend', (event) => {
const now = new Date().getTime();
if((now - lastTouchEndTime) <= 300) { // 偵測時間差是否小於 300ms
event.preventDefault();
}
lastTouchEndTime = now;
}, false);
之所以 touchend 會取 300ms 時間差,是因為每一次在使用者 touch 螢幕時,都會產生 300ms 的延遲去監聽是否觸發 double-tap。在兩次 touch 之間的時間差小於 300ms 的情況下執行 event.preventDefault(),即可取消 double-tap 動作所觸發的縮放效果。

B-3. JS 解法:gesturestart event 兩指以上事件觸發

可參考 MDN 文件 Element: gesturestart event - Web APIs | MDN (mozilla.org),和 touchEvent 類似,但僅適用於 iOS 系統。
gesturestart 會在兩指以上觸碰螢幕時觸發,即可忽略 pinch tap 手勢的兩指縮放:
// [Safari only] gesturestart event: multi finger gestures touching 
document.addEventListener('gesturestart', function(event) {
// 阻止兩指縮放畫面
event.preventDefault();
});

C. 其他想記錄的

C-1. mouseEvent vs touchEvent vs gesturestart

  • mouseEvent 一次只能有一個觸擊點
  • touchEvent 支援多點觸控
  • gesturestart 兩指以上觸碰時觸發,僅 iOS 支援

C-2. user-select: none:禁止區塊反白選取

即雙點擊不會選取到文字區塊:
* {
user-select: none;
-webkit-user-select: none; /* Chrome Safari */
-moz-user-select: none; /* Firefox */
}

D. 小結

如果被問到工作上曾遇過什麼樣的困難,除了溝通技巧,我想「跨平台開發」肯定能名列前茅。
畢竟光是不同作業系統(如:Windows、Mac、Android、iOS)、不同行動裝置(如:Pixel、Samsung、iPhone、iPad)、不同版本(如:Android 10-14、iOS 10-16.3),甚至是不同瀏覽器(如:Safari、Chrome、Firefox、Edge)等,都可能出現非預期的結果,有時不一定是程式碼有錯誤,而是版本不支援導致,必須仰賴多方測試,才能確定是否能夠兼容各個平台系統。
想當然耳,一名工程師哪可能同時擁有這麼多種裝置,要面面俱到尤其困難,更多的情況是「遇到問題再說」,或盡可能吸收前人的智慧,避免再踩到類似的坑。

E. Reference

Originally published at https://heidiliu2020.github.io on February 9, 2023.
0會員
7內容數
留言0
查看全部
發表第一個留言支持創作者!
Heidi Liu的沙龍 的其他內容
What is WebSocket? WebSocket 是 HTML5 提供的一種網路傳輸協定,是瀏覽器(Client)與伺服器(Server)交換資料的方式之一。 與我們較為熟知的 HTTP 或 HTTPS 協定,同樣位於 OSI 模型的應用層,且基於傳輸層的 TCP 協定。
過去在程式導師實驗課程中,整理過這兩篇筆記探討「測試」是怎麼回事: [week 3] 初探 Jest:如何測試程式? [week 22] React:用 SPA 架構實作一個部落格(三)- 淺談測試 在轉職後的第一家公司,組內曾嘗試在既有專案中撰寫測試,卻因時程緊湊而不了了之。
「平凡的我啊,哪有時間低頭回望?」 — — 《排球少年 264 話》 各位安安,我是 Heidi,從年前就一直思考,應該如何總結這一年來的學習心得,結果又拖到現在,不知不覺都已經入職快兩個月了XD 這篇是記錄我在 Lidemy 學習半年的結業心得,也會稍微帶到多人協作和求職總結。
“Do not, for one repulse, give up the purpose that you resolved to effect.” — William Shakespeare. 幾天前分享的上篇心得有稍微提到,前半段會偏向描寫過去的個人經驗,是有關於在開始學習程式之前的自己
“Never regret. If it’s good, it’s wonderful. If it’s bad, it’s experience. “ — Victoria Holt. 前言 從六月初開始,參加第四期程式導師計畫以來,這段日子過得飛快,轉眼間一個禮拜又過去,自己也迎來了課程中場。
“If you wish to reach the highest, begin at the lowest.” — Publilius Syrus.
What is WebSocket? WebSocket 是 HTML5 提供的一種網路傳輸協定,是瀏覽器(Client)與伺服器(Server)交換資料的方式之一。 與我們較為熟知的 HTTP 或 HTTPS 協定,同樣位於 OSI 模型的應用層,且基於傳輸層的 TCP 協定。
過去在程式導師實驗課程中,整理過這兩篇筆記探討「測試」是怎麼回事: [week 3] 初探 Jest:如何測試程式? [week 22] React:用 SPA 架構實作一個部落格(三)- 淺談測試 在轉職後的第一家公司,組內曾嘗試在既有專案中撰寫測試,卻因時程緊湊而不了了之。
「平凡的我啊,哪有時間低頭回望?」 — — 《排球少年 264 話》 各位安安,我是 Heidi,從年前就一直思考,應該如何總結這一年來的學習心得,結果又拖到現在,不知不覺都已經入職快兩個月了XD 這篇是記錄我在 Lidemy 學習半年的結業心得,也會稍微帶到多人協作和求職總結。
“Do not, for one repulse, give up the purpose that you resolved to effect.” — William Shakespeare. 幾天前分享的上篇心得有稍微提到,前半段會偏向描寫過去的個人經驗,是有關於在開始學習程式之前的自己
“Never regret. If it’s good, it’s wonderful. If it’s bad, it’s experience. “ — Victoria Holt. 前言 從六月初開始,參加第四期程式導師計畫以來,這段日子過得飛快,轉眼間一個禮拜又過去,自己也迎來了課程中場。
“If you wish to reach the highest, begin at the lowest.” — Publilius Syrus.
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
預言機Oracle Machine原本指的是一種可以藉由計算得到特定答案的抽象電腦(也被稱為黑盒子、黑箱),而區塊鏈的預言機則是將真實世界資料與區塊鏈連結的可信任第三方。
Thumbnail
之前討論過基於Ordinals協議的BRC-20,意旨將比特幣最小單位的SATS聰(以中本聰Satoshis命名)進行編號排序,使得可以在比特鏈上發行同質化代幣FT。
近期熱度很高的TON生態源自於2018年Telegram Messenger的創始人Pavel和Nikolai Durov兄弟,因為當時沒有適合Telegram發展的Layer 1鏈,因此他們決定自己設計新的Layer 1鏈,即是Telegram Open Network;同時透過發售Gram代幣
Thumbnail
現實世界資產Real World Assets,簡稱為RWA。大方向的定義為,將真實世界的資產轉為代幣化、證券化,用於抵押、貸款等投資工具。
Thumbnail
延續先前的筆記,「網路請求」是瀏覽器和伺服器的溝通橋梁,目的是為了取得資料庫內的資源,除了 CORS 這種瀏覽器本身的阻擋機制,伺服器也會需要進行「身分驗證或授權」這道阻擋,並不是使用者有帶上 header 告知身分,就一定可以把資料 response 回來的。
Thumbnail
三個對話可以讓員工有更好的表現 “表達期待”對話 定義清楚工作完成的樣貌 告知為什麼要做這件事情 讓員工有所依循 “發展潛能”對話 你覺得自己目前的才能獲技巧,能夠在我們目前最重要的項目中提供那些貢獻 你認為針對目前進行中的項目,你有可能使用不同於他人的技巧來完成任務嗎 讓員工勇於嘗試 “得到認可”
Thumbnail
今天的筆記來自於「一場關於積極的練習」這本書,本書匯集了15本振奮人心力量的書籍,有點像是每本書籍的重點整理。我把這本書二次整理後,分享給各位讀者。這篇文章主要介紹的是卷二—「人際交往的學問」,原作者為美國的戴爾.卡內基。
Thumbnail
這個世代的開會人才需要什麼能力呢?如何讓會議更有效率進行? 若身為會議主持人的你,不知道如何面對情緒發言的與會者,或想避免會議上眾人雞同鴨講、把會議變成常跑馬拉松,歡迎參考以《唐鳳的破框思考力: 關於工作、學習與行動的方法》一書中唐鳳開會藝術所結晶出的本文。
Thumbnail
一袋15公斤的米、學習金、鴨蛋、牛奶及學習用品等,是學生持續學習的重要支持,疫情嚴峻時也不曾停止。 兒童的成長不曾停止,生活的挑戰也不曾停止。藉著每月的助學物資發放日,蒐集了助學生與家人們的話語,有對學習的渴望、對未來的期待、對生活的承擔,對貧窮的回應… 「我喜歡學習,但家裡很窮…」助學生D 她是家
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
預言機Oracle Machine原本指的是一種可以藉由計算得到特定答案的抽象電腦(也被稱為黑盒子、黑箱),而區塊鏈的預言機則是將真實世界資料與區塊鏈連結的可信任第三方。
Thumbnail
之前討論過基於Ordinals協議的BRC-20,意旨將比特幣最小單位的SATS聰(以中本聰Satoshis命名)進行編號排序,使得可以在比特鏈上發行同質化代幣FT。
近期熱度很高的TON生態源自於2018年Telegram Messenger的創始人Pavel和Nikolai Durov兄弟,因為當時沒有適合Telegram發展的Layer 1鏈,因此他們決定自己設計新的Layer 1鏈,即是Telegram Open Network;同時透過發售Gram代幣
Thumbnail
現實世界資產Real World Assets,簡稱為RWA。大方向的定義為,將真實世界的資產轉為代幣化、證券化,用於抵押、貸款等投資工具。
Thumbnail
延續先前的筆記,「網路請求」是瀏覽器和伺服器的溝通橋梁,目的是為了取得資料庫內的資源,除了 CORS 這種瀏覽器本身的阻擋機制,伺服器也會需要進行「身分驗證或授權」這道阻擋,並不是使用者有帶上 header 告知身分,就一定可以把資料 response 回來的。
Thumbnail
三個對話可以讓員工有更好的表現 “表達期待”對話 定義清楚工作完成的樣貌 告知為什麼要做這件事情 讓員工有所依循 “發展潛能”對話 你覺得自己目前的才能獲技巧,能夠在我們目前最重要的項目中提供那些貢獻 你認為針對目前進行中的項目,你有可能使用不同於他人的技巧來完成任務嗎 讓員工勇於嘗試 “得到認可”
Thumbnail
今天的筆記來自於「一場關於積極的練習」這本書,本書匯集了15本振奮人心力量的書籍,有點像是每本書籍的重點整理。我把這本書二次整理後,分享給各位讀者。這篇文章主要介紹的是卷二—「人際交往的學問」,原作者為美國的戴爾.卡內基。
Thumbnail
這個世代的開會人才需要什麼能力呢?如何讓會議更有效率進行? 若身為會議主持人的你,不知道如何面對情緒發言的與會者,或想避免會議上眾人雞同鴨講、把會議變成常跑馬拉松,歡迎參考以《唐鳳的破框思考力: 關於工作、學習與行動的方法》一書中唐鳳開會藝術所結晶出的本文。
Thumbnail
一袋15公斤的米、學習金、鴨蛋、牛奶及學習用品等,是學生持續學習的重要支持,疫情嚴峻時也不曾停止。 兒童的成長不曾停止,生活的挑戰也不曾停止。藉著每月的助學物資發放日,蒐集了助學生與家人們的話語,有對學習的渴望、對未來的期待、對生活的承擔,對貧窮的回應… 「我喜歡學習,但家裡很窮…」助學生D 她是家