移动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.mzph.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…