首頁 web前端 css教學 讓我們建立一個簡單的 React hook 來偵測瀏覽器及其功能

讓我們建立一個簡單的 React hook 來偵測瀏覽器及其功能

Sep 30, 2024 pm 10:18 PM

Let

用戶代理嗅探是最受歡迎的瀏覽器偵測方法。不幸的是,由於多種原因,前端開發不太容易使用它。瀏覽器供應商不斷嘗試讓嗅探變得不可能。因此,每個瀏覽器都有自己的使用者代理字串格式,解析起來非常複雜。

有一個更簡單的方法可以使用瀏覽器 CSS API 實現相同的目的,我將向您展示。因此,讓我們建立瀏覽器功能來檢測 React hook。

我們將使用 CSS.supports() 靜態方法。它會傳回一個布林值,指示瀏覽器是否支援給定的 CSS 功能。這是 @supports at-rule 的 javascript 模擬。它的工作原理與媒體查詢類似,但以 CSS 功能為主題。

用於檢測支援的功能的鉤子

在元件渲染週期中呼叫 CSS.supports() 最簡單的方法會在伺服器端渲染環境(例如 Next.js)中產生問題。因為伺服器端渲染器無法存取瀏覽器 API,所以它只是產生一串程式碼。

import type {FC} from 'react';

const Component: FC = () => {
    // ? Don't do this!
    const hasFeature = CSS.supports('your-css-declaration');
    // ...
}
登入後複製

我們將使用這個簡單的鉤子。這個鉤子接收一個包含 support condition 的字串,這是我們要驗證的 CSS 規則,例如顯示:柔性。

import {useState, useEffect} from 'react';

export const useSupports = (supportCondition: string) => {
    // Create a state to store declaration check result
    const [checkResult, setCheckResult] = useState<boolean | undefined>();

    useEffect(() => {
        // Run check as a side effect, on user side only
        setCheckResult(CSS.supports(supportCondition));
    }, [supportCondition]);


    return checkResult;
};
登入後複製

現在我們可以從 React 元件內部檢查不同的 CSS 功能支援。這是 MDN @supports 參考

import type {FC} from 'react';

const Component: FC = () => {

    // Check for native `transform-style: preserve` support
    const hasNativeTransformSupport = useSupports('
        (transform-style: preserve)
    ');

    // Check for vendor prefixed `transform-style: preserve` support
    const hasNativeTransformSupport = useSupports('
        (-moz-transform-style: preserve) or (-webkit-transform-style: preserve)
    ');
    // ...
}
登入後複製

使用CSS檢測用戶瀏覽器支援情況

為了偵測使用者瀏覽器,我們必須進行一些駭客攻擊。

瀏覽器駭客攻擊與違法行為無關。它只是一個特殊的 CSS 聲明或選擇器,在可用瀏覽器之一中的工作方式有所不同。

這是包含各種瀏覽器駭客的參考頁。在我的機器上進行徹底的實驗後,我選擇了這些:

const hacksMapping = {
    // anything -moz will work, I assume
    firefox: '-moz-appearance:none',
    safari: '-webkit-hyphens:none',
    // tough one because Webkit and Blink are relatives
    chrome: '
        not (-webkit-hyphens:none)) and (not (-moz-appearance:none)) and (list-style-type:"*"'
}
登入後複製

這是我們最終的鉤子:

export const useDetectBrowser = () => {
    const isFirefox = useSupports(hacksMapping.firefox);
    const isChrome = useSupports(hacksMapping.chrome);
    const isSafari = useSupports(hacksMapping.safari);

    return [
        {browser: 'firefox', condition: isFirefox},
        {browser: 'chromium based', condition: isChrome},
        {browser: 'safari', condition: isSafari},
    ].find(({condition}) => condition)?.browser as 
        'firefox' | 'chromium based' | 'safari' | undefined;
};
登入後複製

完整演示

這是該鉤子的完整工作演示。

最後的想法

我不能說這是一種萬無一失、穩定的方法。瀏覽器經常更新,供應商屬性經常被放棄或被標準取代。同時,我可以說一下用戶代理嗅探。兩種方式都有類似的問題。但 CSS.contains() 更容易維護,而且更細粒度。它歡迎開發人員使用優雅降級或漸進增強方法並精細地應用補丁。

以上是讓我們建立一個簡單的 React hook 來偵測瀏覽器及其功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
使Sass更快的概念證明 使Sass更快的概念證明 Apr 16, 2025 am 10:38 AM

在一個新項目開始時,Sass彙編發生在眼睛的眨眼中。感覺很棒,尤其是當它與browsersync配對時,它重新加載

靜態表單提供商的比較 靜態表單提供商的比較 Apr 16, 2025 am 11:20 AM

讓我們嘗試在這裡造成一個術語:“靜態表單提供商”。你帶上html

每周平台新聞:HTML加載屬性,主要的ARIA規格以及從iframe轉移到Shadow dom 每周平台新聞:HTML加載屬性,主要的ARIA規格以及從iframe轉移到Shadow dom Apr 17, 2025 am 10:55 AM

在本週的平台新聞綜述中,Chrome引入了一個用於加載的新屬性,Web開發人員的可訪問性規範以及BBC Move

與部分元素的交易 與部分元素的交易 Apr 12, 2025 am 11:39 AM

同一天發表了兩篇文章:

多腳步滑塊:一般案例 多腳步滑塊:一般案例 Apr 12, 2025 am 10:52 AM

這個兩部分系列的第一部分詳細介紹了我們如何獲得兩次跑步的滑塊。現在,我們&#039;

帶有HTML對話框元素的一些動手 帶有HTML對話框元素的一些動手 Apr 16, 2025 am 11:33 AM

這是我第一次查看HTML元素。我已經意識到了一段時間,但是尚未將其旋轉。它很酷,

我們如何標記Google字體並創建Goofonts.com 我們如何標記Google字體並創建Goofonts.com Apr 12, 2025 pm 12:02 PM

Goofonts是由開發人員和設計師丈夫簽名的附帶項目,它們都是版式的忠實擁護者。我們一直在標記Google

它全部都在頭上:管理帶有React頭盔的React Power Site的文檔頭 它全部都在頭上:管理帶有React頭盔的React Power Site的文檔頭 Apr 15, 2025 am 11:01 AM

該文檔負責人可能不是網站上最迷人的部分,但是其中所處的內容對於您的網站的成功也一樣重要

See all articles