CSS中如何解決 1px 問題?

1px 問題指的是:在一些?Retina屏幕?的機型上,移動端頁面的 1px 會變得很粗,呈現出不止 1px 的效果。原因很簡單——CSS 中的 1px 并不能和移動設備上的 1px 劃等號。它們之間的比例關系有一個專門的屬性來描述:

window.devicePixelRatio = 設備的物理像素 / CSS像素。

打開 Chrome 瀏覽器,啟動移動端調試模式,在控制臺去輸出這個?devicePixelRatio?的值。這里選中 iPhone6/7/8 這系列的機型,輸出的結果就是2:?

?這就意味著設置的 1px CSS 像素,在這個設備上實際會用 2 個物理像素單元來進行渲染,所以實際看到的一定會比 1px 粗一些。?

解決1px 問題的三種思路:

思路一:直接寫 0.5px

如果之前 1px 的樣式這樣寫:

border:1px solid #333

可以先在 JS 中拿到 window.devicePixelRatio 的值,然后把這個值通過 JSX 或者模板語法給到 CSS 的 data 里,達到這樣的效果(這里用 JSX 語法做示范):

<div id="container" data-device={{window.devicePixelRatio}}></div>

然后就可以在 CSS 中用屬性選擇器來命中 devicePixelRatio 為某一值的情況,比如說這里嘗試命中 devicePixelRatio 為2的情況:

#container[data-device="2"] {border:0.5px solid #333
}

直接把 1px 改成 1/devicePixelRatio 后的值,這是目前為止最簡單的一種方法。這種方法的缺陷在于兼容性不行,IOS 系統需要8及以上的版本,安卓系統則直接不兼容。

思路二:偽元素先放大后縮小

這個方法的可行性會更高,兼容性也更好。唯一的缺點是代碼會變多。

思路是先放大、后縮小:在目標元素的后面追加一個 ::after 偽元素,讓這個元素布局為 absolute 之后、整個伸展開鋪在目標元素上,然后把它的寬和高都設置為目標元素的兩倍,border值設為 1px。接著借助 CSS 動畫特效中的放縮能力,把整個偽元素縮小為原來的 50%。此時,偽元素的寬高剛好可以和原有的目標元素對齊,而 border 也縮小為了 1px 的二分之一,間接地實現了 0.5px 的效果。

代碼如下:

#container[data-device="2"] {position: relative;
}
#container[data-device="2"]::after{position:absolute;top: 0;left: 0;width: 200%;height: 200%;content:"";transform: scale(0.5);transform-origin: left top;box-sizing: border-box;border: 1px solid #333;}
}
思路三:viewport 縮放來解決

這個思路就是對 meta 標簽里幾個關鍵屬性下手:

<meta name="viewport" content="initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no">

這里針對像素比為2的頁面,把整個頁面縮放為了原來的1/2大小。這樣,本來占用2個物理像素的 1px 樣式,現在占用的就是標準的一個物理像素。根據像素比的不同,這個縮放比例可以被計算為不同的值,用 js 代碼實現如下:

const scale = 1 / window.devicePixelRatio;
// 這里 metaEl 指的是 meta 標簽對應的 Dom
metaEl.setAttribute('content', `width=device-width,user-scalable=no,initial-scale=${scale},maximum-scale=${scale},minimum-scale=${scale}`);

這樣解決了,但這樣做的副作用也很大,整個頁面被縮放了。這時 1px 已經被處理成物理像素大小,這樣的大小在手機上顯示邊框很合適。但是,一些原本不需要被縮小的內容,比如文字、圖片等,也被無差別縮小掉了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/718301.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718301.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718301.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

重構筆記系統:Docker Compose在微服務架構中的應用與優化

雖然我的筆記系統的開發是基于微服務的思想&#xff0c;但是在服務的配置和編排上感覺還是不太合理&#xff0c;具體來說&#xff0c;在開發上的配置和在生產上的配置差別太大。現在規模小&#xff0c;后面規模變大&#xff0c;估計這一塊會成為系統生長的瓶頸。 因此&#xff…

【Web】速談FastJson反序列化中BasicDataSource的利用

目錄 關于BCEL BCEL的惡意利用demo FastJson配合BCEL初始化任意類 parse情況下后天精心構造彌補先天之不足 exp 參考文章&#xff1a; BCEL ClassLoader去哪了 Java動態類加載&#xff0c;當FastJson遇到內網 關于BCEL BCEL(Byte Code Engineering Library)的全名是Apa…

跨時鐘信號處理方法

1. 背景 現在的芯片&#xff08;比如SOC&#xff0c;片上系統&#xff09;集成度和復雜度越來越高&#xff0c;通常一顆芯片上會有許多不同的信號工作在不同的時鐘頻率下。比如SOC芯片中的CPU通常會工作在一個頻率上&#xff0c;總線信號&#xff08;比如DRAM BUS&#xff09;會…

python+Django+Neo4j中醫藥知識圖譜與智能問答平臺

文章目錄 項目地址基礎準備正式運行 項目地址 https://github.com/ZhChessOvO/ZeLanChao_KGQA 基礎準備 請確保您的電腦有以下環境&#xff1a;python3&#xff0c;neo4j 在安裝目錄下進入cmd&#xff0c;輸入指令“pip install -r requirement.txt”,安裝需要的python庫 打…

貓為什么挑食?可以改善、預防貓咪挑食的主食凍干分享

現在的貓咪主人都把自家的小貓當成了心頭的寶貝&#xff0c;呵護備至。最令人頭疼的就是貓咪挑食不吃貓糧&#xff0c;貓為什么挑食&#xff1f;遇到這類情況怎么辦呢&#xff1f;今天&#xff0c;我要分享一個既能確保貓咪不受苦&#xff0c;又能有效改善挑食問題的方法。 一、…

vue api封裝

api封裝 由于一個項目里api是很多的&#xff0c;隨處都在調&#xff0c;如果按照之前的寫法&#xff0c;在每個組件中去調api&#xff0c;一旦api有改動&#xff0c;遍地都要去改&#xff0c;所以api應該也要封裝一下&#xff0c;將api的調用封裝在函數中&#xff0c;將函數集…

C++實現簡易版http server

mini服務器簡介 mini服務器功能 1.實現了GET和POST方法的HTTP request和HTTP respond的構建和發送&#xff0c;使服務器可以完成基本通信功能。 2.使用了線程池技術&#xff0c;使服務器可以一次接收更多的鏈接和加快了服務器處理數據的速度。 3.實現了簡易的CGI&#xff0…

【MATLAB源碼-第155期】基于matlab的OFDM系統多徑信道LS,LMMSE,SVD三種估計算法的比較誤碼率對比仿真。

操作環境&#xff1a; MATLAB 2022a 1、算法描述 OFDM&#xff08;Orthogonal Frequency Division Multiplexing&#xff0c;正交頻分復用&#xff09;是一種高效的無線信號傳輸技術&#xff0c;廣泛應用于現代通信系統&#xff0c;如Wi-Fi、LTE和5G。OFDM通過將寬帶信道劃分…

jmeter 按流量階梯式壓測數據庫

當前版本&#xff1a; jmeter 5.6.3mysql 5.7.39 簡介 JMeter 通過 BZM - Arrivals Thread Group 來模擬并發到達的用戶流量、按時間加壓&#xff0c;可以有效地幫助測試人員評估系統在高壓力和高并發情況下的性能表現。 文章目錄如下 1. 下載插件 2. 界面說明 3. 測試步驟…

C#在并發編程使用Frozen來確保線程安全性

在C#中&#xff0c;Frozen方法通常用于通過不可變對象來確保線程安全性。這通常在并發編程中很有用&#xff0c;特別是在共享狀態的多線程環境中。Frozen方法是Caliburn Micro框架中的一個方法&#xff0c;它用于將對象標記為不可變。 當你調用Frozen方法時&#xff0c;它返回…

云計算 2月26號 (進程管理和常用命令)

一、權限擴展 文件權限管理之&#xff1a; 隱藏權限防止root誤刪除 文件屬性添加與查看 [rootlinux-server ~]# touch file1 file2 file3 1.查看文件屬性 [rootlinux-server ~]# lsattr file1 file2 file3 ---------------- file1 ---------------- file2 ---------------- f…

【FAQ】HarmonyOS SDK 閉源開放能力 —Account Kit

1.問題描述 實時驗證和非實時驗證的區別是什么&#xff1f; 解決方案 相同點&#xff1a; “手機號快速驗證”和“實時驗證”都是為了向用戶發起獲取手機號信息的請求。最終目的都是為了獲取到手機號。這兩種獲取方式都需要完成“獲取您的手機號”的Scope權限申請。 區別&…

UDP協議和TCP協議詳解

文章目錄 應用層自定義協議 傳輸層udp協議TCP協議1.確認應答2.超時重傳3.連接管理建立連接, 三次握手斷開連接, 四次揮手tcp的狀態 4.滑動窗口5.流量控制6.擁塞控制7.延時應答8.攜帶應答9.面向字節流10.異常情況 應用層 自定義協議 客戶端和服務器之間往往要進行交互的是“結構…

Eigen-約簡,訪問和廣播

約簡化&#xff0c;訪客和廣播 一、約簡化1. 標準計算2. 布爾約減 二、訪問三、部分約簡1. 將部分約減與其他業務相結合 四、廣播1. 將廣播與其他業務相結合 一、約簡化 在Eigen中&#xff0c;約簡化是一個接受矩陣或數組并返回單個標量值的函數。最常用的約簡方法之一是.sum(…

心法利器[108] | 微調與RAG的優缺點分析

心法利器 本欄目主要和大家一起討論近期自己學習的心得和體會。具體介紹&#xff1a;倉頡專項&#xff1a;飛機大炮我都會&#xff0c;利器心法我還有。 2023年新的文章合集已經發布&#xff0c;獲取方式看這里&#xff1a;又添十萬字-CS的陋室2023年文章合集來襲&#xff0c;更…

修復通達OA 百度ueditor 文件上傳漏動

前些日子&#xff0c;服務器阿里云監控報警&#xff0c;有文件木馬文件&#xff0c;因為非常忙&#xff0c;就沒及時處理&#xff0c;直接刪除了木馬文件了事。 誰知&#xff0c;這幾天對方又上傳了木馬文件。好家伙&#xff0c;今天不花點時間修復下&#xff0c;你都傳上癮了…

PHP【swoole】

前言 Swoole官方文檔&#xff1a;Swoole 文檔 Swoole 使 PHP 開發人員可以編寫高性能高并發的 TCP、UDP、Unix Socket、HTTP、 WebSocket 等服務&#xff0c;讓 PHP 不再局限于 Web 領域。Swoole4 協程的成熟將 PHP 帶入了前所未有的時期&#xff0c; 為性能的提升提供了獨一無…

Dynamo初學嘗試梳理

學習Dynamo有一段時間了&#xff0c;最近整理了下自己的筆記&#xff0c;分享一些給初學者&#xff0c;做個備忘吧&#xff01;&#xff08;PS&#xff1a;很多資料網上都能搜到&#xff0c;我僅僅是收集整理下筆記&#xff0c;分享給大家&#xff09; 今天先簡單介紹下Dynamo…

展廳設計中多媒體的常用技術

1、互動投影 可以大大提高展廳和觀眾之間的互動體驗&#xff0c;使觀眾不僅可以享受觀看&#xff0c;還可以在輕松娛樂的氛圍中娛樂的氛圍中享受每個展覽的背景故事和內涵&#xff0c;使整個參觀過程非常輕松愉快。 2、幻影成像 可以全面展示企業產品的生產過程&#xff0c;讓觀…

STM32 (4) GPIO(1)

1.芯片的引腳分布 2.普通IO引腳的命名規則 3.IO復用 IO引腳身兼數職的現象叫做IO復用&#xff0c;可以使芯片擁有更多的功能&#xff0c;例如&#xff1a; PA9和PA10既可以用于GPIO的引腳&#xff0c;也可以用于串口或定時器的引腳 通用&#xff1a;CPU直接控制IO引腳的輸入輸…