CSS中的px与物理像素、逻辑像素、1px边框问题

一直不太清楚CSS中的1px与逻辑像素、物理像素是个什么关系(作为一名前端感觉很惭愧 -_-!),今天终于花时间彻底弄清楚了,其实弄清楚之后就觉得事情很简单,但也只有在弄清楚之后,才会觉得简单(语出《禅与摩托车维修艺术》,哈哈哈哈)。

两种像素

物理像素:设备屏幕实际拥有的像素点。比如iPhone 6的屏幕在宽度方向有750个像素点,高度方向有1334个像素点,所以iPhone 6 总共有750*1334个物理像素。

逻辑像素:也叫“设备独立像素”(Device Independent Pixel, DIP),可以理解为反映在CSS/JS代码里的像素点数。

设备像素比(Device Pixel Ratio, DPR):一个设备的物理像素与逻辑像素之比。

像素还分物理和逻辑?这两个玩意有啥区别?

其实在很久以前,的确是没区别的,CSS里写个1px,屏幕就给你渲染成1个实际的像素点,DPR=1,多么简单自然~

但是后来事情起了变化,搞事的就是Retina技术,这种技术使用4个乃至更多物理像素来渲染1个逻辑像素,这样一来,同样的CSS代码设置的尺寸,在Retina和非Retina屏幕上看起来大小是一样的,但在Retina屏幕上要精细得多。

技术分享图片

在Retian屏上,DPR不再是1,而是大于1,比如2(iPhone 5 6 7 8)或3(iPhone 6 Plus等一系列Plus)或者为非整数(一些Android机),说不定还会涨。

举个例子,iPhone 6的物理像素上面已经说了,是750*1334,那它的逻辑像素呢?我们只需在iPhone 6的Safari里打印一下screen.width和screen.height就知道了,结果是 375*667,这就是它的逻辑像素,据此很容易计算出DRP为2。当然,我们还可以直接通过window.devicePixelRatio这个值来获取DRP,打印结果是2,符合我们的预期。

奇葩的iPhone 6 Plus

这里不得不提一下iPhone 6 Plus(以及同尺寸的其他果机),它的实际物理像素点个数是1080*1920,但如果你截个屏,你会发现截屏图片的宽高是1242*2208;浏览器的screen对象会告诉你,6 Plus的逻辑像素是414*736,正好是截屏宽度的三分之一,window.devicePixelRatio值也为3。

所以现在我们有了3种不同的像素值?什么情况?

是这样的,iPhone 6 Plus系统定义的屏幕像素就是1242*2208,系统会自动把这些像素点塞进1080*1920个实际像素点来渲染,这个过程对于开发者是透明的,无需理会。

所以对于前端来说,可以直接把1242视为6 Plus的“物理像素”,包括UE小姐姐们出图也是以1242为标准的,因此不妨把1242*2208称为6 Plus的“设计像素”。

苹果这是要闹那样?

其实,当初苹果公司在确定6 Plus的DRP时,纠结了半天:选2吧,同样的字号在6 Plus上看起来比6更小,不好;选3吧,字又显得太大了,导致一屏能展示的内容还没有6多;最适合视觉的DRP值是2.46,但这样一个数字能把设计师和程序员们逼疯。最后就想出了引入“设计像素”这样一个两全其美的方案,既让开发者开心,又让用户爽,岂不美哉?

1px边框问题

在苹果的带动下,Retina技术在移动设备上已经成了标配,所以前端攻城狮必须直面如下事实:

  1. 你想画个1px的下边框,但屏幕硬是塞给你一条宽度为2—3个物理像素的线。
  2. 你没法像安卓或iOS的同事那样直接操纵物理像素点。

这就是初级前端面试必考题之“1px边框问题”的由来。

1px边框问题的解法千奇百怪,各显神通,但以我的实践经验,最推崇的方法还是利用CSS3的transform: scale,因为简单直接、适用性和兼容性好。

你不是给我两个物理像素点吗?加个transform: scale(0.5),只剩一个点了~

三个物理像素点?那就scale(0.33)!

使用CSS的-webkit-min-device-pixel-ratio媒体查询可以针对不同的DPR做出处理 ,下面以Less代码为例:

@media (-webkit-min-device-pixel-ratio:2),(min-device-pixel-ratio:2){.border-bt-1px(@color) {position: relative;&::after {position: absolute;bottom: 0;width: 100%;height: 1px;background-color: @color;transform: scaleY(0.5);}}
}

上面介绍的是只有一边的情景,如果是四面都要有框,咋办?

那就画个DPR倍大小的矩形框,再scale一下,完事~

 

至此,本文的关于像素的知识,应是足够应对一般前端的工作需要了。

CSS中的px与物理像素、逻辑像素、1px边框问题

标签:面试   物理   宽高   两种   艺术   代码   直接   end   scale   

原文地址:https://www.cnblogs.com/leegent/p/9404572.html

转载于:https://www.cnblogs.com/xiaocaiyuxiaoniao/p/10156680.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450299.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

平滑数据迁移,不影响服务

为什么80%的码农都做不了架构师?>>> 转自:http://www.10tiao.com/html/249/201703/2651959992/1.html 转载于:https://my.oschina.net/jzgycq/blog/2872104

spring cache相关注解介绍 @Cacheable、@CachePut、@CacheEvict

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 Cacheable是用来声明方法是可缓存的。将结果存储到缓存中以便后续使用相同参数调用时不需执行实际的方法。直接从缓存中取值。最简单的格…

layui 渲染select下拉选项 ,日期控件的用法

最近项目中用到关于layui的前端技术&#xff0c;在使用layui 渲染select option下拉复选框时出现了没有值渲染的问题&#xff0c;还有使用layui日期的过程 &#xff0c;接下来就一起看看吧。 /** *从后台渲染字段民族数据/<div class"layui-inline"><labe…

CF1082G Petya and Graph(最小割,最大权闭合子图)

QWQ嘤嘤嘤 感觉是最水的一道\(G\)题了 顺便记录一下第一次在考场上做出来G qwqqq 题目大意就是说&#xff1a; 给你n个点&#xff0c;m条边&#xff0c;让你选出来一些边&#xff0c;最大化边权减点权 \(n\le 1000\) QWQ 看完这个题和数据范围&#xff0c;第一感觉就是网络流啊…

NET Core微服务之路:让我们对上一个Demo通讯进行修改,完成RPC通讯

最近一段时间有些事情耽搁了更新&#xff0c;抱歉各位了。上一篇我们简单的介绍了DotNetty通信框架&#xff0c;并简单的介绍了基于DotNetty实现了回路&#xff08;Echo&#xff09;通信过程。我们来回忆一下上一个项目的整个流程&#xff1a;当服务端启动后&#xff0c;绑定并…

Centos7防火墙设置

查看防火墙状态 or rootlocalhost ~]# systemctl status firewalld / firewall-cmd --state 启动防火墙 [rootlocalhost ~]# systemctl start firewalld 关闭防火墙 [rootlocalhost ~]# systemctl stop firewalld 设置开机启动 [rootlocalhost ~]# systemctl enable fi…

HTTP协议中POST、GET、HEAD、PUT等请求方法及相应值得含义

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 请求方法是请求一定的Web页面的程序或用于特定的URL。可选用下列几种&#xff1a; GET&#xff1a; 请求指定的页面信息&#xff0c;并…

java面试题文档(QA)

– 基础篇 1、 Java语言有哪些特点2、面向对象和面向过程的区别3 、八种基本数据类型的大小&#xff0c;以及他们的封装类4、标识符的命名规则。5、instanceof 关键字的作用6、Java自动装箱与拆箱7、 重载和重写的区别8、 equals与的区别9、 Hashcode的作用10、String、String …

第四次软件工程作业

关于 石墨文档客户端 的案例分析 作业地址&#xff1a; https://edu.cnblogs.com/campus/nenu/2016CS/homework/2505 第一部分 调研&#xff0c; 评测 1.下载并使用&#xff0c;按照描述的bug定义&#xff0c;找3~5个功能性的比较严重的bug。请用专业的语言描述&#xff08;每个…

深入剖析C++中的string类

一&#xff0c;C语言的字符串 在C语言里&#xff0c;对字符串的处理一项都是一件比较痛苦的事情&#xff0c;因为通常在实现字符串的操作的时候都会用到最不容易驾驭的类型——指针。 比如下面这个例子&#xff1a; //example 1: char str[12] "Hello"; char *…

Apple System: Error: ENFILE: file table overflow

2019独角兽企业重金招聘Python工程师标准>>> 在MAC上跑nodejs&#xff0c;遇到了一个问题&#xff1a;file table overflow 主要意思就是说文件打开太多了&#xff0c;超过了限制&#xff0c;产生这个问题主要是苹果操作系统的限制。 echo kern.maxfiles65536 | sud…

springboot的缓存技术

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 我门知道一个程序的瓶颈在于数据库&#xff0c;我门也知道内存的速度是大大快于硬盘的速度的。当我门需要重复的获取相同的数据的时候&a…

深度优先遍历解决连通域求解问题-python实现

问题描述 在一个矩形网格中每一个格子的颜色或者为白色或者为黑色。任意或上、或下、或左、或右相邻同为黑色的格子组成一个家族。家族中所有格子的数量反映家族的大小。要求找出最大家族的家族大小&#xff08;组成最大家族的格子的数量&#xff09;并统计出哪些点属于哪一族。…

字符串进阶

C风格字符串 1、字符串是用字符型数组存储的&#xff0c;字符串要求其尾部以’\0’作为结束标志。如&#xff1a; char string[ ]”C programming language”; 用sizeof来测string长度为25个字节&#xff0c;而实际串本身长度(含空格)为24个字节&#xff0c;多出来的一个就是…

flask上传excel文件,无须存储,直接读取内容

运行环境python3.6 import xlrd from flask import Flask, requestapp Flask(__name__)app.route("/", methods[POST, GET]) def filelist1():print(request.files)file request.files[file]print(file, type(file), file)print(file.filename) # 打印文件名f …

分布式 ID的 9 种生成方式

一、为什么要用分布式 ID&#xff1f; 在说分布式 ID 的具体实现之前&#xff0c;我们来简单分析一下为什么用分布式 ID&#xff1f;分布式 ID 应该满足哪些特征&#xff1f; 1、什么是分布式 ID&#xff1f; 拿 MySQL 数据库举个栗子&#xff1a; 在我们业务数据量不大的时…

spring boot Redis集成—RedisTemplate

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Spring boot 基于Spring, Redis集成与Spring大同小异。 文章示例代码均以前篇笔记为基础增加修改&#xff0c;直接上代码&#xff1a;…

QtCreator无法编辑源文件

在Qt Creator中新建工程&#xff0c;添加现有C源文件&#xff0c;有的源文件可以编辑&#xff0c;有的源文件编辑不了&#xff0c;发现无法编辑的源文件有一个共同特点&#xff0c;即其中都包含中文&#xff0c;且中文出现乱码&#xff0c;于是&#xff0c;点击Qt Creator菜单栏…

Unicode简介和使用

一、Unicode简介 在第一章中&#xff0c;我已经预告&#xff0c;C语言中在Microsoft Windows程序设计中扮演着重要角色的任何部分都会讲述到&#xff0c;您也许在传统文字模式程序设计中还尚未遇到过这些问题。宽字符集和Unicode差不多就是这样的问题。 简单地说&#xff0c;…

webpack4.x 模块化浅析-CommonJS

先看下webpack官方文档中对模块的描述&#xff1a; 在模块化编程中&#xff0c;开发者将程序分解成离散功能块(discrete chunks of functionality)&#xff0c;并称之为模块。每个模块具有比完整程序更小的接触面&#xff0c;使得校验、调试、测试轻而易举。 精心编写的模块提供…