chrome控制台如何把vw显示成px_【CSS】rem,em,px的区别和使用场景

7f54f8cbebbcad06d8fc1120dd2a5991.png

前端潮咖

点击上面蓝字,关注我们!

关注

关注前端潮咖,每日精选好文

52922dec639d77cda4c210dae53fa070.png

作者:大前端小菜鸟

来源:cnblogs.com/hyns/p/12380944.html

作rem布局原理深度理解(以及em/vw/vh)

一、前言

我们h5项目终端适配采用的是淘宝那套《Flexible实现手淘H5页面的终端适配》方案。主要原理是rem布局。最近和别人谈弹性布局原理,发现虽然已经使用了那套方案很久,但是自己对rem的理解很含糊, 包括vw、vh等。所以打算写博客总结一下,以加深理解。

二、几个概念

这里就不讲那些,物理像素、设备像素比了,可以自己查阅。要去理解rem/em/vw/vh等,首先要直观的去理解他们到底是什么?理解好了,后面就好办了。其实这几个都是css单位,就像我们常用的px一样,只不过他们都是相对单位。我平时使用的百分比单位如:width:100%;就是相对单位。

2.1、em

em作为font-size的单位时,其代表父元素的字体大小,em作为其他属性单位时,代表自身字体大小——MDN

比如父元素font-size:12px;

自身元素如果写成:font-size:2em;则自身元素用px表示就是24px(相对父元素字体大小);

但是自身元素设置:width:2 em,那么自身元素用px表示就是48px(相对自身字体大小);

2.2、rem

rem作用于非根元素时,相对于根元素字体大小;rem作用于根元素字体大小时,相对于其出初始字体大小——MDN

比如根元素(html)设置font-size=12px; 非根元素设置width:2rem;则换成px表示就是24px;

如果根元素设置成font-size=1rem;则根元素换成px就是相对于初始字体大小,一般是12px;

2.3、vw/vh

vw :视口宽度的 1/100;vh :视口高度的 1/100 —— MDN

在pc端,视口宽高就是浏览器得宽高;

在移动端,这个还不太一样,不过一般设置:

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

代码以显示网页的屏幕宽度定义了视窗宽度。网页的比例和最大比例被设置为100%。

三、剖析rem布局原理

其实好好理解上面的概念,rem的原理也就很简单了。

假设我们将屏幕平局分为10份,每一份宽度用一个a表示,即a=屏幕宽度/10;那么:

div{width: 5a} /* 屏幕宽度的50% */

但是css中没有a这个单位啊?那怎么办呢?对,css不是有相对单位rem么?我们全可以实现借助rem代替上面的a。如:

html {font-size: 12px}
div {width: 2rem} /* 24px*/
 
html {font-size: 16px}
div {width: 2rem} /* 32px*/

那么问题来了?怎么让html元素字体大小恒等于屏幕的1/10呢?如ipone6宽是375px,font-size:37.5px;

html {fons-size: width / 10}
div {width: 5rem} /* 5rem = 5a = 屏幕宽度的50% */

我们用js很容易动态的设置html的font-size恒等屏幕的1/10;我们可以在页面dom ready、resize和屏幕旋转中设置:

document.documentElement.style.fontSize = document.documentElement.clientWidth / 10 + 'px';

如何把设计稿的像素单位换成以rem为单位呢?可以用一个比例来计算:如设计稿宽度为750px,某个元素量得75px,那么:

75px/750px = 计算所得rem/10rem,所以计算所得rem=75px;所以我们在样式中写width:1rem;实际宽度是75px;同理,如果设计稿总宽度是640px,则1rem=64px。

预处理函数可以简化:

$ue-width: 750; /* 设计稿图的宽度 */

@function px2rem($px) {
  @return #{$px/$ue-width*10}rem;
}
 
div {
  width: px2rem(100);/*编译后:  p{width:1.5625rem}*/
}

四、rem万能吗?

rem是一种弹性布局,它强调等比缩放,100%还原。它和响应式布局不一样,响应式布局强调不同屏幕要有不同的显示,比如媒体查询。

字体并不合适使用rem, 字体的大小和字体宽度,并不成线性关系,所以字体大小不能使用rem;由于设置了根元素字体的大小,会影响所有没有设置字体大小的元素,因为字体大小是会继承的,难道要每个元素都显示设置字体大小?

我们可以在body上做字体修正,比如把body字体大小设置为16px,但如果用户自己设置了更大的字体,此时用户的设置将失效,比如合理的方式是,将其设置为用户的默认字体大小:

html {fons-size: width / 10}
body {font-size: 16px}  

那字体咋整?我们可以用媒体查询和em来实现:


@media screen and (min-width: 320px) {
    body {font-size: 16px}
}
@media screen and (min-width: 481px) and (max-width:640px) {
    body {font-size: 18px}
}
@media screen and (min-width: 641px) {
    body {font-size: 20px}
}
 
div {font-size: 1.2em}

在制作H5的页面中,rem并不适合用到段落文本上。所以在Flexible整个适配方案中,考虑文本还是使用px作为单位。只不过使用[data-dpr]属性来区分不同dpr下的文本字号大小。

.selector {
    width: 2rem;
    border: 1px solid #ddd;
}
[data-dpr="1"] .selector {
    font-size: 14px;
}
[data-dpr="2"] .selector {
    font-size: 28px;
}
[data-dpr="3"] .selector {
    font-size: 42px;
}

当然你也可以给非根元素设置合适的字体。

五、rem布局方案

从上可以看出最好的弹性布局方案就是rem+js的方案,《Flexible实现手淘H5页面的终端适配》就是采用rem+js实现的。flexible主要做了几点。

动态改写标签给元素添加data-dpr属性,并且动态改写data-dpr的值。给元素添加font-size属性,并且动态改写font-size的值

六、em可以用来做弹性布局吗?

上面知道,一旦某个节点的字体大小发生变化,其他节点也随之变化,所以不合适,但是用来处理字体还是绝妙的。

七、vw/wh用来做弹性布局怎么样?

根据上面说,vw —— 视口宽度的 1/100;vh —— 视口高度的 1/100;感觉已经不用多说了。

/* rem方案 */

html {font-size: width / 10}
p {width: 1.5625rem}
 
/* vw方案 */
p {width: 15.625vw}

如果rem方案中使用设置font-size=width/100就和vm意思一样, 但是比如font-size:640px/100;浏览器不会识别6.4px这么小的字体的。

如果不考虑兼容性问题,可以大胆使用vw/vh做弹性的布局。


》声明:文章著作权归作者所有,如有侵权,请联系小编删除。

关注公众号「前端潮咖」,公众号后台回复「加群欢迎关注讨论前端知识,每日分享最新前端文章进入公众号教程章节60fd0b6e2308f6d4369ad5cb553f3719.gif213a486377247a5402e58f6a62b9bada.png

前端潮咖

一个专注技术学习与分享的公众号

长按识别二维码关注我们

轻点“在看”支持作者

be815d0d04aedc46493085cf2295d2e1.png

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

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

相关文章

php7对象转换成数组,php 如何把对象转换成数组对象

php把对象转换成数组对象的方法&#xff1a;首先打开相应的PHP代码文件&#xff1b;然后通过“function array_to_object($arr){...}”方法把对象转换成数组即可。本文操作环境&#xff1a;windows7系统、PHP7.1版&#xff0c;DELL G3电脑php-对象(object) 与 数组(array) 的转…

python中的线程之semaphore信号量

semaphore是一个内置的计数器 每当调用acquire()时&#xff0c;内置计数器-1 每当调用release()时&#xff0c;内置计数器1 计数器不能小于0&#xff0c;当计数器为0时&#xff0c;acquire()将阻塞线程直到其他线程调用release()。 来看下面的代码&#xff1a; import time imp…

用什么代码可以改变键盘_为什么我改变了对代码质量的看法

用什么代码可以改变键盘by John Cobb约翰科布(John Cobb) 为什么我改变了对代码质量的看法 (Why I changed the way I think about Code Quality) What do you think about when you think about code quality?当您考虑代码质量时&#xff0c;您会怎么看&#xff1f; Is it …

建模:建模清单

ylbtech-建模&#xff1a;建模清单1.返回顶部 2.返回顶部3.返回顶部4.返回顶部5.返回顶部 6.返回顶部作者&#xff1a;ylbtech出处&#xff1a;http://ylbtech.cnblogs.com/本文版权归作者和博客园共有&#xff0c;欢迎转载&#xff0c;但未经作者同意必须保留此段声明&#xf…

获得picker选项的当前年月值_如果你用OPPO手机!千万记得开启开发者选项,手机性能大幅度提升...

如果你用OPPO手机&#xff01;千万记得开启开发者选项&#xff0c;手机性能大幅度提升用过OPPO手机的用户都知道&#xff0c;手机使用1-2年都会出现卡顿的情况。这也是安卓手机的通病&#xff0c;但也有很多朋友手机使用3年也不会出现卡顿的现象&#xff0c;都是因为打开了手机…

imageset matlab,如何以imageSet或imageDataStore的形式向MATLAB中的BagOfFeatures()函數提供輸入?...

我想使用MATLAB的bagOfFeatures()函數。但它需要以imageSet或imageDataStore的形式輸入。我想運行的代碼如下&#xff1a;如何以imageSet或imageDataStore的形式向MATLAB中的BagOfFeatures()函數提供輸入&#xff1f;Dataset D:\dsktop\kinect_leap_dataset\acquisitions;thre…

Django运维后台的搭建之四:用bootstrap模板让运维前台变得更漂亮

我对于PHP和ajax是属于二把刀的水平&#xff0c;所以做网页前端肯定是比上天还难&#xff0c;但是我又想把网页做的漂亮可爱&#xff0c;怎么办呢&#xff1f;我就只好去download别人的模板&#xff0c;在这里我使用了bootstrap框架做的模板。各位可以去https://wrapbootstrap.…

codeigniter_如何在浏览器中查看CodeIgniter日志文件

codeigniterby Seun Matt通过Seun Matt 如何在浏览器中查看CodeIgniter日志文件 (How to View CodeIgniter Log Files in the Browser) Just like any other page, it is now possible to read CodeIgniter log files in the browser. My Sweet Goodness!与其他页面一样&#…

小程序强制自动更新

(3)强制更新官方版 微信团队2018-03-2315987浏览背景 此前有开发者反馈小程序发布新版本后&#xff0c;新版本覆盖率比较慢&#xff0c;因为小程序的更新机制是异步的&#xff0c;部分用户不会马上应用上新版本。 小程序启动会有两种情况&#xff0c;一种是「冷启动」&#xff…

联想m7400pro更换墨粉盒怎么清零_佳能打印机怎么换墨水 佳能打印机换墨水注意事项【详解】...

佳能打印机是我们办公室用品中比较常见的一个品牌&#xff0c;作为国际知名品牌&#xff0c;其质量也是非常有保障的。在使用的时候打印机没有墨是经常会遇见的。这时候我们就需要更换墨水盒了。但很多不知道具体步骤&#xff0c;或者没有注意相关细节&#xff0c;导致换墨水盒…

oracle数据库连接数超了,oracle数据库当前和最大连接数

1、查询oracle的连接数select count(*) from v$session;2、查询oracle的并发连接数select count(*) from v$session where statusACTIVE;3、查看不同用户的连接数select username,count(username) from v$session where username is not null group by username;4、查看所有用户…

MySQL Workbench导出数据库

步骤&#xff1a; 1. 打开mysql workbench&#xff0c;进入需要导出的数据库&#xff0c;点击左侧栏的【Management】tab键。 2. 点选要输出的数据库 点击【Data Export】选在要输出的数据库选择是否输出存储过程和函数&#xff0c;事件&#xff0c;触发器 点击Start Export3. …

django 传递中文_如何在Django中建立消息传递状态

django 传递中文by Ogundipe Samuel由Ogundipe Samuel 如何在Django中建立消息传递状态 (How to Build a Message Delivery Status in Django) Today, we will make a real-time message delivery status framework with Django and Pusher.今天&#xff0c;我们将使用Django和…

软链接与硬链接

文件引用模型 在linux中&#xff0c;一切皆文件&#xff0c;而文件包含元数据&#xff08;metedata&#xff09;和用户数据&#xff08;user data&#xff09;。元数据中的inode号是系统标识和获取用户数据的唯一凭证&#xff0c;而文件名仅是为了方便用户记忆和使用。为了管理…

c++ 数组的输入遇到特定字符停止输入_C语言 第4章-字符串和格式化输入/输出

#include 用数组name储存字符串&#xff0c;name数组有40个字节&#xff0c;每个字节储存一个字符值。在scanf()函数中&#xff0c;输入字符串name没有&前缀。C预处理器把字符常量DENSITY定义为62.4。strlen()获取字符串长度。1. 字符串1.1. char类型数组双引号标记字符串&…

vue3+typescript引入外部文件

vue3typescript中引入外部文件有几种方法 &#xff08;eg:引入echarts&#xff09; 第一种方法&#xff1a; 1 indext.html中用script引入 <div id"app"></div><script src"https://cdn.bootcss.com/echarts/4.2.1-rc1/echarts-en.common.min.js…

在哪能找到陌生人聊骚_如何说服陌生人帮助您找到工作

在哪能找到陌生人聊骚by Alex Lacey通过亚历克斯莱西 找工作吗&#xff1f; 这是说服陌生人帮助您找到一个人的方法 (Looking for a job? Here’s how to convince strangers to help you find one) 我过去获得40个推荐的7个步骤 (The 7-step process that I used to get 40 …

Python基础 day2

Python基础 一、Python的数据类型 1、int(整型) 在32位机器上&#xff0c;整数的位数为32位&#xff0c;取值范围为-2**31&#xff5e;2**31-1&#xff0c;即-2147483648&#xff5e;2147483647&#xff0c;而.在64位系统上&#xff0c;整数的位数为64位&#xff0c;取值范围为…

matlab 文件指针回到开头,[c/c++] 文件指针位置回到文件开头(rewind)及行开头(ftell+fseek)...

待读入文件1.greenteemo2.csdn3.blog代码&#xff0c;详细说明见注释#include #define LENGTH_OF_LINE 1024int main(){FILE *fp fopen("file.txt", "r"); // 打开文件char line[LENGTH_OF_LINE];while( fgets(line, LENGTH_OF_LINE, fp) ){printf("…

python全栈开发优势_Python全栈开发多少钱?学Python价格贵吗?

Python全栈开发培训多少钱?学习Python是大家进入编程世界的理想之选&#xff0c;而且Python也是一门非常受欢迎的编程&#xff0c;可以从事的领域有很多。 从目前市场上的行情来说&#xff0c;一般情况下Python培训的费用在一万五到两万元之间的&#xff0c;以后可能会更高&am…