移動web開發DRP問題

DPR

dpr問題是移動端web開發上需要注意的問題,用大白話說就是,代碼中所設置的像素值實際上是虛擬像素,手機屏幕上的像素實際為物理像素,原始的手機,虛擬像素與物理像素是1:1覆蓋的,但隨著移動端屏幕的技術發展,屏幕尺寸不變的情況下,密度卻增大了,就會出現邏輯1像素覆蓋了多個物理像素,就造成了不清晰的問題。
dpr(devicePixelRatio)就是即物理像素/邏輯像素
在美工切圖的時候需要切1倍、2倍、3倍圖,也是因為這個問題。而在移動web開發中,也需要根據不同屏幕做不同的處理,目的是盡可能讓邏輯像素與物理像素一一對應,這樣才能達到最清晰的狀態。

在js中可以獲取dpr的值

window.devicePixelRatio

在css中解決dpr問題應使用媒體查詢

border 1像素問題

css中設置的1px,是虛擬像素,在移動屏上,drp是1的情況下,邊框是正好1:1覆蓋的,但在大于1的情況下,比如iPhone 6s上的drp是2,css的1像素實際上在屏幕上要覆蓋兩倍的物理像素,于是看上去就比較粗,如果拿原生APP去比,web就明顯粗一些,就是因為實際在物理屏上覆蓋了2像素的高度。
解決這個問題的思路是,根據媒體查詢,在不同dpr下,利用transform中的縮放,將Y軸縮放一定比例,盡量使虛擬像素與物理像素吻合。比如dpr是1.5,則Y軸縮放0.7(因為沒辦法設0.75),2的情況下縮放0.5,3的情況下縮放0.3。

html

   <div id="vTabs" class="vTabs border-1px"></div>

stylus

border-1px($color)position relative&::afterdisplay blockwidth 100%position absoluteleft 0bottom 0border-top 1px solid $colorcontent ' '@media (-webkit-min-device-pixel-ratio: 1.5),(min-device-pixel-ratio: 1.5).border-1px&::aftertransform scaleY(0.7)-webkit-transform scaleY(0.7)@media (-webkit-min-device-pixel-ratio: 2),(min-device-pixel-ratio: 2).border-1px&::aftertransform scaleY(0.5)-webkit-transform scaleY(0.5)@media (-webkit-min-device-pixel-ratio: 3),(min-device-pixel-ratio: 3).border-1px&::aftertransform scaleY(0.3)-webkit-transform scaleY(0.3).vTabswidth 100%height 40pxline-height 40pxbackground #ffffffdisplay flexborder-1px(rgba(7,17,27,0.1))

圖片適應

目前移動端屏的dpr基本都是2以上,我們一般考慮2和3的情況即可。
思路也是一樣的,利用媒體查詢不同屏幕上使用不同尺寸圖片,盡量使虛擬像素與物理像素吻合。
stylus mixin

background-img($url)background-image url($url+"@2x.png")@media (-webkit-min-device-pixel-ratio: 3),(min-device-pixel-ratio: 3)background-image url($url+"@3x.png")

意思是,如果dpr大于等于3(3以上),則用3倍圖,否則均用2倍圖。當然這里要約定好圖片的命名。

css中應用

      .icondisplay inline-blockvertical-align topwidth 30pxheight 18pxbackground-img('./img/brand')background-size 100% 100%background-repeat no-repeat

張鑫旭大神的dpr解釋:
http://www.zhangxinxu.com/wordpress/2012/08/window-devicepixelratio/

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

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

相關文章

HTML元素title里面如何換行

在調試代碼的時候我就遇到一個問題&#xff0c;HTML元素title里面通常只顯示一行&#xff0c;那我想要他換行&#xff0c;就是多行顯示&#xff0c;如何實現&#xff1f;JS代碼里面比如Alert里面又該如何換行&#xff1f; 經過我的一番實驗 要實現這種效果有幾種方法&#xff0…

A20 GPIO中斷類型差別結果迥異的問題思考

A20GPIO中斷類型差別結果迥異的問題思考 最近在使用全志A20做開發時&#xff0c;發現在處理中斷的時候&#xff0c;用電平觸發模式&#xff0c;報中斷比較亂&#xff0c;用邊沿觸發則很穩定&#xff0c;不會亂報。筆者感到比較困惑&#xff0c;筆者用電平觸發寫的code如下&…

div內圖片和文字水平垂直居中

大小不固定的圖片、多行文字的水平垂直居中 本文綜述 想必寫css的都知道如何讓單行文字在高度固定的容器內垂直居中&#xff0c;但是您知道或者想過讓行數不固定的文字在高度固定的容器內垂直居中呢&#xff1f;本文將會告訴你如何實現多行文字的垂直居中顯示。 關于圖片垂直居…

sticky-footer實現記錄

sticky-footer是css中的一個經典問題&#xff1a; 當頁面內容超出屏幕&#xff0c;頁腳模塊會像正常頁面一樣&#xff0c;被推到內容下方&#xff0c;需要拖動滾動條才能看到。 而當頁面內容小于屏幕高度&#xff0c;頁腳模塊會固定在屏幕底部&#xff0c;就像是底邊距為零的…

敏友的【敏捷個人】有感(3): 有感于“敏捷個人”討論與練習

2010年我對個人管理進行了自己的一些思考&#xff0c;在2011年提出敏捷個人概念&#xff0c;并且在線上、線下進行了多次交流&#xff0c;在一些大會上也做過分享。現在&#xff0c;已經有很 多IT和非IT的敏友們知道并在踐行敏捷個人&#xff0c;幫助自己更快的成長。我收到大家…

jQuery編寫插件

引言&#xff1a; 在項目中不同頁面經常要用到已經寫好的交互&#xff0c;比如彈窗&#xff0c;比如下拉菜單&#xff0c;比如選項卡&#xff0c;比如刪除... 此時如果每次都把代碼copy一份無疑是一件比較麻煩并且無趣的事情&#xff0c;而且個人認為有些low了&#xff0c;我們…

webstorm中nodejs代碼提示

preferences->languages&frameworks->Node.js and Npm中選擇一個本地的node版本 preferences->languages&frameworks->JavaScript->Libraries 勾選node.js Core 回到代碼

9012教你如何使用gulp4開發項目腳手架

本文將會介紹如何使用gulp4來搭建項目腳手架&#xff0c;如果您還在使用gulp3或更老的版本&#xff0c;您也以通過本文的一些思想將之前的項目進行完善&#xff0c;更新。如果gulp不是你們團隊的重點&#xff0c;也可以移步我的另一篇文章:用 webpack 4.0 擼單頁/多頁腳手架 (j…

nodejs模塊

nodejs模塊遵循commonJS規范&#xff0c;但并不是完全實現規范&#xff0c;主要使用require引入模塊、使用exports導出模塊。 導出屬性或方法 使用exports mouduleA.js&#xff1a; var say function(world){console.info("say: "world); }var sing function(wo…

Array.prototype.slice.call(arguments)

Array.prototype.slice.call(arguments)能將具有length屬性的對象轉成數組&#xff0c;除了IE下的節點集合&#xff08;因為ie下的dom對象是以com對象的形式實現的&#xff0c;js對象與com對象不能進行轉換&#xff09;如&#xff1a;1 var a{length:2,0:first,1:second}; 2 Ar…

動態內存分配導致內存泄漏之處

摘要&#xff1a;舉了幾個動態內存分配過程中&#xff0c;發生內存泄漏的例子 1. 分配了內存&#xff0c;卻沒有及時刪除,導致泄漏 1: void doSomething() 2: { 3: int *pnValue new int; 4: } 2. 為指針變量分配了一個內存&#xff0c;然后又讓指針變量指向其他的值,導致…

nodejs常用模塊-url

URL nodejs中針對url的常用方法。 node下打印url&#xff0c;結果&#xff1a; 引入url模塊 var url require(url) 1、parse方法 將url解析成對象&#xff0c;parse方法原型&#xff1a; url.parse(urlStr[, parseQueryString][, slashesDenoteHost]) 可傳遞三個參數…

常用的javascript設計模式

請堅持 什么是設計模式 百度百科&#xff1a; 設計模式&#xff08;Design pattern&#xff09;是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。 使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 毫無疑問&#xff0c;設計模式…

express項目創建

1、安裝項目生成器 cnpm i express-generator -g express4.0以后&#xff0c;express與express-generator包分離&#xff0c;全局使用express命令生成項目骨架時應該安裝express-generator包。 2、生成項目骨架 express server 默認使用的是jade模板&#xff0c;使用ejs模…

設置Jexus開機啟動

把jexus做成系統服務&#xff0c;就像windows服務一樣&#xff0c;可以設置開機啟動就可以了。 第一、進入目錄 /lib/systemd/system/ 第二、新建文件 vi jexus.service 文件內容 [Unit] Descriptionjexus Afternetwork.target[Service] Typeforking ExecStart/usr/jexus/jw…

iOS警告-This block declaration is not a prototype

關于警告 我們定義一個不帶參數的block,通常是如下的方式 1typedefvoid (^UpdateSwichBtnBlock)();在xcode9中會提示一個警告 12This block declaration is not a prototypeInsert ‘void解決方式可以是如下的幾種 1typedefvoid (^UpdateSwichBtnBlock)(void);但是這樣,很多第三…

mac環境mongodb安裝與配置

一、安裝 MAC環境安裝mongodb有兩種方式&#xff0c;一種方式是通過下載安裝包&#xff0c;另一種方式是通過homebrew。 1、安裝包方式 從mongodb官網可以下載MAC安裝包&#xff1a;https://www.mongodb.com/download-center#community 或者使用curl下載 # 進入 /usr/loca…

用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素為int類型...

以下為借鑒 var stack1 [], stack2[]; function push(node){stack1.push(node);}function pop(){if(stack2.length){return stack2.pop();}else{if(stack1.length){var len stack1.length;for(var i0;i<len;i){stack2.push(stack1.pop());}return stack2.pop()}else{retur…

使用CocoaPods導入百度地圖SDK所遇到的坑

執行pod install遇到的問題:解決方安:百度了下,發現pod install命令被墻了,換成pod install --verbose --no-repo-update

NSTimer不準確與GCDTimer詳解

NSTimer不準&#xff0c;scheduleTimer放在runloop里面&#xff0c;受runloop模式影響會不準// [NSTimer scheduledTimerWithTimeInterval:<#(NSTimeInterval)#> target:<#(nonnull id)#> selector:<#(nonnull SEL)#> userInfo:<#(nullable id)#> r…