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

更新於 發佈於 閱讀時間約 10 分鐘
raw-image

這次專案開發是針對 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(),即可阻止事件後面的動作。

可參考這篇討論:scroll - Can't prevent touchmove from scrolling window on iOS - Stack Overflow

  • 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 支援
raw-image

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.

留言
avatar-img
留言分享你的想法!
avatar-img
Heidi Liu的沙龍
0會員
7內容數
Heidi Liu的沙龍的其他內容
2022/12/23
What is WebSocket? WebSocket 是 HTML5 提供的一種網路傳輸協定,是瀏覽器(Client)與伺服器(Server)交換資料的方式之一。 與我們較為熟知的 HTTP 或 HTTPS 協定,同樣位於 OSI 模型的應用層,且基於傳輸層的 TCP 協定。
Thumbnail
2022/12/23
What is WebSocket? WebSocket 是 HTML5 提供的一種網路傳輸協定,是瀏覽器(Client)與伺服器(Server)交換資料的方式之一。 與我們較為熟知的 HTTP 或 HTTPS 協定,同樣位於 OSI 模型的應用層,且基於傳輸層的 TCP 協定。
Thumbnail
2022/12/16
過去在程式導師實驗課程中,整理過這兩篇筆記探討「測試」是怎麼回事: [week 3] 初探 Jest:如何測試程式? [week 22] React:用 SPA 架構實作一個部落格(三)- 淺談測試 在轉職後的第一家公司,組內曾嘗試在既有專案中撰寫測試,卻因時程緊湊而不了了之。
Thumbnail
2022/12/16
過去在程式導師實驗課程中,整理過這兩篇筆記探討「測試」是怎麼回事: [week 3] 初探 Jest:如何測試程式? [week 22] React:用 SPA 架構實作一個部落格(三)- 淺談測試 在轉職後的第一家公司,組內曾嘗試在既有專案中撰寫測試,卻因時程緊湊而不了了之。
Thumbnail
2021/04/04
「平凡的我啊,哪有時間低頭回望?」 — — 《排球少年 264 話》 各位安安,我是 Heidi,從年前就一直思考,應該如何總結這一年來的學習心得,結果又拖到現在,不知不覺都已經入職快兩個月了XD 這篇是記錄我在 Lidemy 學習半年的結業心得,也會稍微帶到多人協作和求職總結。
Thumbnail
2021/04/04
「平凡的我啊,哪有時間低頭回望?」 — — 《排球少年 264 話》 各位安安,我是 Heidi,從年前就一直思考,應該如何總結這一年來的學習心得,結果又拖到現在,不知不覺都已經入職快兩個月了XD 這篇是記錄我在 Lidemy 學習半年的結業心得,也會稍微帶到多人協作和求職總結。
Thumbnail
看更多
你可能也想看
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
iPhone 最新作業系統 iOS 18 控制中心大更新,預設有常用功能、音樂播放器、連線控制三個頁面,並允許使用者自訂頁面,可以直接在控制中心管理所需的功能、調整位置和選擇尺寸。
Thumbnail
iPhone 最新作業系統 iOS 18 控制中心大更新,預設有常用功能、音樂播放器、連線控制三個頁面,並允許使用者自訂頁面,可以直接在控制中心管理所需的功能、調整位置和選擇尺寸。
Thumbnail
我們的日常生活中無法避免地與電腦互動,但有時候在Windows上查看內容可能會讓我們感到困惑或不便,特別是當我們面臨螢幕尺寸小、文字模糊、顏色不明顯等視覺設定不符合個人需求。因此,我們迫切需要一些技巧和工具,讓我們更容看到Windows上的內容,提高工作效率和使用體驗。
Thumbnail
我們的日常生活中無法避免地與電腦互動,但有時候在Windows上查看內容可能會讓我們感到困惑或不便,特別是當我們面臨螢幕尺寸小、文字模糊、顏色不明顯等視覺設定不符合個人需求。因此,我們迫切需要一些技巧和工具,讓我們更容看到Windows上的內容,提高工作效率和使用體驗。
Thumbnail
這次專案開發是針對 iOS 系統,需要解決畫面縮放的問題,有些關鍵字來回搜尋好多遍,卻還是容易搞混,於是乎乾脆記錄下來,日後如果遇到這類型問題,也會直接更新在這篇。
Thumbnail
這次專案開發是針對 iOS 系統,需要解決畫面縮放的問題,有些關鍵字來回搜尋好多遍,卻還是容易搞混,於是乎乾脆記錄下來,日後如果遇到這類型問題,也會直接更新在這篇。
Thumbnail
很多網站,都要求前端工程師要做出在手機跟電腦上都能順利顯示的介面。這種自動調整手機跟桌機的技術,叫做 Responsive web design (RWD)。
Thumbnail
很多網站,都要求前端工程師要做出在手機跟電腦上都能順利顯示的介面。這種自動調整手機跟桌機的技術,叫做 Responsive web design (RWD)。
Thumbnail
筆者今天有參與 10/18 Vocus Project V 的創作者工作坊,過程中有聽到一項關鍵數據以及一個痛點。 那就是目前有 70% 的讀者是透過手機版閱讀 Vocus 上的文章,但礙於這項功能其實多數創作者平台或是部落客並不擁有此項編輯功能,因此筆者想來提供一個解方。 第一步:開啟任一瀏覽器
Thumbnail
筆者今天有參與 10/18 Vocus Project V 的創作者工作坊,過程中有聽到一項關鍵數據以及一個痛點。 那就是目前有 70% 的讀者是透過手機版閱讀 Vocus 上的文章,但礙於這項功能其實多數創作者平台或是部落客並不擁有此項編輯功能,因此筆者想來提供一個解方。 第一步:開啟任一瀏覽器
Thumbnail
執行時開啟模式選取勾iPad桌面總是亂七八糟的?想常使用的幾個app在同一頁就好?那可以試試看這個方法,提升自己的專注力!
Thumbnail
執行時開啟模式選取勾iPad桌面總是亂七八糟的?想常使用的幾個app在同一頁就好?那可以試試看這個方法,提升自己的專注力!
Thumbnail
為什麼長輩習慣使用自然輸入法? 隨著年紀增長,長期使用電腦眼睛很容易疲勞,尤其在選字的時候,密密麻麻的候選字,眼睛找得好吃力呀👀 別擔心!自然輸入法可以自訂視窗大小,從今以後打字、選字不再吃力❤️
Thumbnail
為什麼長輩習慣使用自然輸入法? 隨著年紀增長,長期使用電腦眼睛很容易疲勞,尤其在選字的時候,密密麻麻的候選字,眼睛找得好吃力呀👀 別擔心!自然輸入法可以自訂視窗大小,從今以後打字、選字不再吃力❤️
Thumbnail
現今,響應式網頁設計已成為網站設計不可或缺的一部分,良好的設計可以為公司帶來豐厚的收益,現在也成為不少公司的首選方案,就讓我們看下去吧!
Thumbnail
現今,響應式網頁設計已成為網站設計不可或缺的一部分,良好的設計可以為公司帶來豐厚的收益,現在也成為不少公司的首選方案,就讓我們看下去吧!
Thumbnail
之前我們已經介紹兩個今年Google 新提出的網站性能基準, Largest Contentful Paint 最大內容繪製,和 First Input Delay 首次輸入延遲。這次就看看 Cumulative Layout Shift 累計版面配置轉移。
Thumbnail
之前我們已經介紹兩個今年Google 新提出的網站性能基準, Largest Contentful Paint 最大內容繪製,和 First Input Delay 首次輸入延遲。這次就看看 Cumulative Layout Shift 累計版面配置轉移。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News