当前位置: 首页 > news >正文

【我不熟悉的css】03. 使用px、em、rem

每日鸡汤:你所有的烦恼都是做的太少,想的太多

目录

前言

一、px 最基本的单位

二、em

1. font-size

2. width 等其他属性

3. em的主要应用场景

三、rem 

1. rem的古老的应用方式

2. 使用rem,导致复制的字体很大

3. 使用postcss-pxtorem 插件

总结


前言

关于css单位的使用是很重要的知识,我之前所接触的项目中很少做适配,最近开始有一个项目使用了rem,现在很有必要总结一下。

一、px 最基本的单位

px 是像素单位,在完全是像素实现的项目中,所有的距离字号等,都是固定的,不会根据屏幕宽高,或者浏览器的缩放而产生变化,对于我们开发者,直接根据设计图写就行,几乎没有难度,不用思考。

二、em

mdn官方文档描述

在 font-size 中使用是相对于父元素的字体大小,在其他属性中使用是相对于自身的字体大小,如 width

1. font-size

也就是说,在font-size属性使用em的时侯,子元素是父元素字体的n倍

.box {
    font-size: 16px;
    .text {
        font-size: 2em
    }  
}  

2. width 等其他属性

在其他属性中使用是相对于自身的字体大小(这个例子字体大小是20px )、width的宽度为

20px * 6 = 6em,也就是6个自己的单个字符的宽度

.box {
    font-size: 20px;
}  
.text {
    font-size: 20px;
    width: 6em; 
    border: 1px solid red;
}  

3. em的主要应用场景

em的主要应用在,给一段文字增加缩进,比如在排版的时候,中文要求段首空两个字符即可。

.text {
    text-indent: 2em;
}

三、rem 

与em不同,无论是font-size还是其他属性,都是相对于根元素(html)的字体大小。所以,一般的适配使用的都是rem,因为只要修改根元素的大小,整个项目总所有用到rem的地方都会等比例同时缩放,很方便。

1. rem的古老的应用方式

在很久之前,使用jquery写项目的时候,使用rem,需要在html中加入这么一个脚本。

那么为什么分界线是375呢,因为我们的设计稿是按照375的宽度设计的!

(function (doc, win) {
    var docEl = doc.documentElement,
        resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
        recalc = function () {
            var clientWidth = docEl.clientWidth;
            if (!clientWidth) return;
            if (clientWidth >= 375) { // 宽度大于375固定设置根元素100px
                docEl.style.fontSize = '100px';
            } else { 
                // 宽度小于375,适配移动端,动态计算根元素的font-size
                // 这个计算表达式,得到了一个缩放比例 scale
                docEl.style.fontSize = (clientWidth / 375) * 100 + 'px';
            }
        };
    if (!doc.addEventListener) return;
    win.addEventListener(resizeEvt, recalc, false);
    doc.addEventListener('DOMContentLoaded', recalc, false);
})(document, window);

然后我们在使用的时候,假设设计稿是这样的:

.text {
    font-size: 10px;
    margin-top: 20px;
}

我们需要改成这样:

.text {
    font-size: 0.1rem; 
    margin-top: 0.2rem;
}

无论是font-size属性,还是其他属性,都按照设计稿的值,除100再使用,为什么除100呢,因为我们的根元素设置的font-size=100,这也是为什么我们选择100这样的整数了,因为好算。你当然可以设置99,98 等任何你喜欢的数字,但是我们在开发的过程中10/99此类的值太难算了,不要自己给自己找麻烦。

或者这样也可以,参考,给根元素设置font-size: 62.5%;

css: px转rem换算方法_wcc_chao@163.com的博客-CSDN博客_css px rem转换设计图一般采用画布宽度为375px/750px/1125px三种尺寸,分别对应iOS下的@1x/@2x/@3x屏幕分辨率。rem是根据html节点下的font-size定制的尺寸。如果html{font-size: 16px},则1rem = 16px,假如设计图上有一个长宽都是100px的图片,<img src='image.png' style={{width: 100px, height: 100px}}/>将这张图片展示到宽度为375px的手机屏幕下,如果设计图尺寸越大,转换后https://blog.csdn.net/w440149517/article/details/113528533

2. 使用rem,导致复制的字体很大

假设,我们使用的是上面的例子,给html的font-size:100px

在我们用光标选中文字复制,并粘贴到富文本编辑器,word  等带格式的编辑器的时候,字体会很大,因为复制的时候保留了字体的字号等属性。

所以对于有这种复制需求的情况,我们可以

  1. 这块 需要复制的地方不用rem,使用px,或者
  2. 在设置根元素的时候别设置100px这么大的值,或者
  3. 重写copy函数

3. 使用postcss-pxtorem 插件

有一个很好用的px转rem的插件,不用我们自己算了,只要配置一下就可以。

或者,使用postcss-px2rem-include使用,可以设置根像素大小,和应用的页面

总结

看过100遍文档,不如自己手动写一个项目,记忆的深刻。仅供自己学习记录使用,有问题欢迎指正。

相关文章:

  • 1.直流无刷电机BLDC转速计算推论
  • 猿创征文|小而巧的API文档生成工具之smart-doc
  • PyTorch错误定位系列之DDP训练中 double free or corruption (out)
  • Go template详解(中)- 变量使用、if语句、迭代(数组、切片、map)、内置函数(比较、逻辑判断、打印、索引、函数调用)
  • JavaScript(三):理解异步
  • JVM阶段(3)-OutOfMemoryError异常
  • 企业运维容器之 docker 网络
  • 【QML】 如何导入QML文档目录
  • 【前端】命令行基础,linux常用命令
  • 【ZYNQ-嵌入式】zynq学习笔记(二)—— GIPO的硬件配置和软件配置
  • vue echarts 镂空饼图配置
  • 项目二:《贪吃蛇》
  • 企业运维容器之 docker仓库
  • 快速排序sort 第k个数
  • uniapp开发微信小程序Error in onLoad hook: “SyntaxError: Unexpected end of JSON input“
  • C++入门教程(10):for 语句
  • Computed property XXX was assigned to but it has no setter
  • CSS中外联样式表代表的含义
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Laravel5.4 Queues队列学习
  • PermissionScope Swift4 兼容问题
  • Python_OOP
  • Spark RDD学习: aggregate函数
  • windows下使用nginx调试简介
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 安装python包到指定虚拟环境
  • 诡异!React stopPropagation失灵
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 前端学习笔记之观察者模式
  • 如何利用MongoDB打造TOP榜小程序
  • 微服务核心架构梳理
  • 学习HTTP相关知识笔记
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • ​ArcGIS Pro 如何批量删除字段
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (4) PIVOT 和 UPIVOT 的使用
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (LeetCode) T14. Longest Common Prefix
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (ZT)一个美国文科博士的YardLife
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (算法二)滑动窗口
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)shell调试方法
  • (转载)深入super,看Python如何解决钻石继承难题
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Project Open Day(2011.11.13)
  • .Net接口调试与案例