如何使用瀏覽器媒體查詢偵測觸控設備
本文探討了在 Web 開發中偵測使用者輸入裝置(觸控、滑鼠、觸控筆)的可靠方法,超越了螢幕尺寸檢查或使用者代理嗅探等不可靠的技術。 重點是利用 CSS 媒體查詢,特別是 pointer、hover 和 any-pointer 來進行準確的設備功能檢測。 這些查詢提供有關輸入模式的精確信息,從而實現更易於訪問和響應更快的 Web 應用程式。
雖然更簡單的方法可能看起來很方便,但它們通常會產生不準確的結果。例如,使用者將滑鼠連接到智慧型手機會使基於尺寸的假設失效。 CSS 媒體查詢提供了卓越的解決方案,根據實際設備特性提供精確的資料。
CSS 媒體查詢:可靠的方法
本文深入研究了 pointer 和 hover 媒體查詢,示範了它們作為 React hooks 的實作。
pointer媒體查詢
pointer 媒體查詢決定定點設備的存在與精確度。它會傳回三個值之一:
-
none:沒有可用的指點設備(例如語音控制設備)。 -
coarse:存在指點設備,但缺乏精確度(例如,手指放在觸控螢幕上)。 -
fine:可以使用高精度的指點設備(例如滑鼠)。
window.matchMedia 方法提供了在程式碼中方便地存取媒體查詢結果。
useMatchMedia鉤子
為了避免程式碼冗餘,建立了一個自訂的 useMatchMedia 掛鉤來檢索和追蹤媒體查詢結果。 此掛鉤利用 window.matchMedia 並新增事件偵聽器來偵測查詢匹配狀態的變化。 清理函數可確保在元件卸載或查詢變更時刪除偵聽器。
export const useMatchMedia = (query: string) => {
const [matches, setMatches] = useState(false);
useEffect(() => {
const media = window.matchMedia(query);
if (media.matches !== matches) {
setMatches(media.matches);
}
const listener = () => setMatches(media.matches);
media.addEventListener('change', listener);
return () => media.removeEventListener('change', listener);
}, [matches, query]);
return matches;
};
偵測主要指標功能
usePrimaryPointerQuery 鉤子決定主指標類型。它呼叫 useMatchMedia 並查詢 none、coarse 和 fine 指標類型,從 Pointers 枚舉傳回適當的值。
import { useMatchMedia } from './useMatchMedia.ts';
import { Pointers } from './types.ts';
export const usePrimaryPointerQuery = () => {
const isNone = useMatchMedia('(pointer: none)');
const isCoarse = useMatchMedia('(pointer: coarse)');
const isFine = useMatchMedia('(pointer: fine)');
if (isNone) {
return Pointers.none;
} else if (isCoarse) {
return Pointers.coarse;
} else if (isFine) {
return Pointers.fine;
}
};

偵測額外的指標功能
雖然只有一個主指針存在,但設備可以有輔助指針(例如藍牙鍵盤、操縱桿)。 any-pointer 媒體查詢檢查任何可用指標的精確度。 useAnyPointerQuery 掛鉤接受指標類型,並將 useMatchMedia 與動態產生的查詢字串一起使用。
export const useMatchMedia = (query: string) => {
const [matches, setMatches] = useState(false);
useEffect(() => {
const media = window.matchMedia(query);
if (media.matches !== matches) {
setMatches(media.matches);
}
const listener = () => setMatches(media.matches);
media.addEventListener('change', listener);
return () => media.removeEventListener('change', listener);
}, [matches, query]);
return matches;
};

工作展示
展示鉤子的完整示範現已推出:
進階偵測:hover 和 any-hover
hover 和 any-hover 媒體查詢透過檢查懸停功能進一步完善偵測。 將這些與 pointer 查詢結合可以實現更精確的設備識別。
| Pointer value | Hover value | Device |
|---|---|---|
| coarse | none | Modern touch screens |
| fine | none | Stylus-based devices |
| coarse | hover | Joystick or TV remote |
| fine | hover | Mouse |
例如,偵測手寫筆作為主要輸入:
import { useMatchMedia } from './useMatchMedia.ts';
import { Pointers } from './types.ts';
export const usePrimaryPointerQuery = () => {
const isNone = useMatchMedia('(pointer: none)');
const isCoarse = useMatchMedia('(pointer: coarse)');
const isFine = useMatchMedia('(pointer: fine)');
if (isNone) {
return Pointers.none;
} else if (isCoarse) {
return Pointers.coarse;
} else if (isFine) {
return Pointers.fine;
}
};
這種方法可確保更強大、更準確地偵測使用者輸入設備,從而帶來更好的使用者體驗和可訪問性。
以上是如何使用瀏覽器媒體查詢偵測觸控設備的詳細內容。更多資訊請關注PHP中文網其他相關文章!
熱AI工具
Undress AI Tool
免費脫衣圖片
Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片
AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。
Clothoff.io
AI脫衣器
Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!
熱門文章
熱工具
記事本++7.3.1
好用且免費的程式碼編輯器
SublimeText3漢化版
中文版,非常好用
禪工作室 13.0.1
強大的PHP整合開發環境
Dreamweaver CS6
視覺化網頁開發工具
SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)
什麼是'渲染障礙CSS”?
Jun 24, 2025 am 12:42 AM
CSS會阻塞頁面渲染是因為瀏覽器默認將內聯和外部CSS視為關鍵資源,尤其是使用引入的樣式表、頭部大量內聯CSS以及未優化的媒體查詢樣式。 1.提取關鍵CSS並內嵌至HTML;2.延遲加載非關鍵CSS通過JavaScript;3.使用media屬性優化加載如打印樣式;4.壓縮合併CSS減少請求。建議使用工具提取關鍵CSS,結合rel="preload"異步加載,合理使用media延遲加載,避免過度拆分與復雜腳本控制。
什麼是AutoPrefixer,它如何工作?
Jul 02, 2025 am 01:15 AM
Autoprefixer是一個根據目標瀏覽器範圍自動為CSS屬性添加廠商前綴的工具。 1.它解決了手動維護前綴易出錯的問題;2.通過PostCSS插件形式工作,解析CSS、分析需加前綴的屬性、依配置生成代碼;3.使用步驟包括安裝插件、設置browserslist、在構建流程中啟用;4.注意事項有不手動加前綴、保持配置更新、非所有屬性都加前綴、建議配合預處理器使用。
什麼是圓錐級函數?
Jul 01, 2025 am 01:16 AM
theconic-Gradient()functionIncsscreatesCircularGradientsThatRotateColorStopSaroundAcentralPoint.1.IsidealForPieCharts,ProgressIndicators,colordichers,colorwheels和decorativeBackgrounds.2.itworksbysbysbysbydefindefingincolordefingincolorstopsatspecificains off.
CSS教程,用於創建粘性標頭或頁腳
Jul 02, 2025 am 01:04 AM
TocreatestickyheadersandfooterswithCSS,useposition:stickyforheaderswithtopvalueandz-index,ensuringparentcontainersdon’trestrictit.1.Forstickyheaders:setposition:sticky,top:0,z-index,andbackgroundcolor.2.Forstickyfooters,betteruseposition:fixedwithbot
CSS自定義屬性的範圍是什麼?
Jun 25, 2025 am 12:16 AM
CSS自定義屬性的作用域取決於其聲明的上下文,全局變量通常定義在:root中,而局部變量則定義在特定選擇器內,以便組件化和隔離樣式。例如,定義在.card類中的變量僅對匹配該類的元素及其子元素可用。最佳實踐包括:1.使用:root定義全局變量如主題色;2.在組件內部定義局部變量以實現封裝;3.避免重複聲明同一變量;4.注意選擇器特異性可能引發的覆蓋問題。此外,CSS變量區分大小寫,且應在使用前定義以避免錯誤。若變量未定義或引用失敗,則會採用回退值或默認值initial。調試時可通過瀏覽器開發者工
CSS網格中的FR單元是什麼?
Jun 22, 2025 am 12:46 AM
ThefrunitinCSSGriddistributesavailablespaceproportionally.1.Itworksbydividingspacebasedonthesumoffrvalues,e.g.,1fr2frgivesone-thirdandtwo-thirds.2.Itenablesflexiblelayouts,avoidsmanualcalculations,andsupportsresponsivedesign.3.Commonusesincludeequal-
您可以在CSS網格項目中嵌套Flexbox容器嗎?
Jun 22, 2025 am 12:40 AM
是的,可以在CSSGrid項中使用Flexbox。具體做法是先用Grid劃分頁面結構,在某個Grid單元格內設置子容器為Flex容器,以實現更精細的對齊和排列;例如,在HTML中嵌套一個帶有display:flex樣式的div;這樣做的好處包括分層佈局、響應式設計更容易、組件化開發更友好;需要注意display屬性僅影響直接子元素、避免過度嵌套、考慮舊版瀏覽器兼容性問題。
CSS教程專注於移動優先設計
Jul 02, 2025 am 12:52 AM
Mobile-firstCSSdesignrequiressettingtheviewportmetatag,usingrelativeunits,stylingfromsmallscreensup,optimizingtypographyandtouchtargets.First,addtocontrolscaling.Second,use%,em,orreminsteadofpixelsforflexiblelayouts.Third,writebasestylesformobile,the


