px、em 和 rem 的区别:深入理解 CSS 中的单位

文章目录

    • 前言
    • 一、`px` - 像素 (Pixel)
    • 二、`em` - 相对父元素字体大小 (Ems)
    • 三、`rem` - 相对于根元素字体大小 (Root Ems)
    • 四、综合比较
    • 结语


前言

在CSS中,pxemrem是三种用于定义尺寸(如宽度、高度、边距、填充等)的长度单位。它们各自有不同的特性,适用于不同的场景。接下来我们将更详细地探讨这三种单位。


一、px - 像素 (Pixel)

  • 定义
    • px代表像素,是一个绝对单位,它的大小固定且与设备无关,通常表示屏幕上一个点的大小。
  • 计算方式
    • 在大多数现代显示器上,1px等于屏幕上的一个物理像素点。然而,在高分辨率显示器(例如Retina显示屏)上,1px可能对应多个物理像素以保持视觉清晰度。
  • 适用场景
    • 当你需要精确控制元素的尺寸或位置时,比如设计图标或需要对齐的图形元素。
    • 对于需要保证一致性的布局部分,如导航栏的高度或按钮的尺寸。
  • 使用方法
    • 直接为属性赋值,无需考虑上下文环境的影响。
    /* 设置一个div的宽度为200像素 */
    div {
    	width: 200px;
    }
    
  • 注意事项
    • 使用px可能会限制页面的响应性和可访问性,因为用户无法通过浏览器设置轻松调整文本大小。
    • 在移动设备上,固定的px值可能不适合所有屏幕尺寸,影响用户体验。

二、em - 相对父元素字体大小 (Ems)

  • 定义
    • em是一种相对单位,其值基于当前元素的字体大小。如果未特别指定,则默认为继承自父元素的字体大小。1em等于当前元素的字体大小。
  • 计算方式
    • 如果一个元素没有明确指定字体大小,它会从最近的非静态定位的祖先元素继承字体大小。因此,em的值依赖于上下文环境中的字体大小设定。
  • 适用场景
    • 适合创建可以随着父元素变化而自动调整的灵活布局。
    • 可以用作字体大小的单位,使整个文档树能够根据根元素的比例缩放。
  • 使用方法
    • em的值是相对于直接父元素的字体大小。对于嵌套的元素,子元素的em值会累积,即子元素的尺寸是基于父元素的em值计算的。
    /* 如果html的字体大小是16px,默认情况下,下面的p标签将有32px的字体大小 */
    p {
    	font-size: 2em; /* 2 * 父元素的字体大小 */
    }
    
    /* 子元素的em值会累积 */
    .parent {
    	font-size: 2em;
    }
    .parent .child {
    	font-size: 1.5em; /* 1.5 * parent的字体大小 = 3em = 48px */
    }
    
  • 注意事项
    • 因为em是相对于父元素的字体大小,所以在嵌套结构中,每个子元素的em值都是基于其直接父元素的字体大小,这可能导致尺寸累积效应,增加计算复杂度。
    • 如果不注意,这种累积效应可能会导致难以预料的结果,特别是在深层次嵌套的情况下。

三、rem - 相对于根元素字体大小 (Root Ems)

  • 定义
    • rem也是一种相对单位,但它不是相对于父元素,而是相对于HTML文档的根元素(即<html>标签)的字体大小。这意味着无论元素位于DOM树的哪个位置,rem的值都是一致的。
  • 计算方式
    • 1rem等于HTML根元素的字体大小。如果未指定,则默认为浏览器的默认字体大小,通常是16px。
  • 使用场景
    • 创建完全独立于任何特定父元素的响应式设计,确保所有元素按照相同的基准进行缩放。
    • 简化了复杂的嵌套结构中的尺寸管理问题,因为不需要考虑父元素的影响。
  • 使用方法
    • rem的值是相对于根元素的字体大小。你可以通过改变根元素的字体大小来统一调整整个页面的尺寸。
    /* 设定根元素的字体大小 */
    html {
    	font-size: 62.5%; /* 默认16px -> 10px */
    }
    
    /* 根据根元素字体大小设定其他元素 */
    body {
    	font-size: 1.4rem; /* 1.4 * 10px = 14px */
    }
    
    h1 {
    	font-size: 2.4rem; /* 2.4 * 10px = 24px */
    }
    
    /* 修改根元素字体大小会影响所有rem单位 */
    @media (min-width: 768px) {
    	html {
        	font-size: 75%; /* 新的1rem = 12px */
    	}
    }
    
  • 注意事项
    • 要想让rem生效,最好是在全局样式表中设定根元素的字体大小。例如,可以通过html { font-size: 62.5%; }将默认字体大小设置为10px,使得后续的rem计算更加直观。
      在一些旧版本的浏览器中可能存在兼容性问题,但目前主流浏览器都已经支持rem

四、综合比较

特性/单位pxemrem
类型绝对单位相对单位相对单位
参考点屏幕像素父元素字体大小根元素字体大小
适用场景需要精确控制的元素深层次嵌套结构全局响应式设计
优点精确、易于预测灵活、适应性强易维护、一致性好
缺点不利于响应式设计计算复杂、易出错可能需要额外配置

结语

选择哪种单位取决于你的具体需求以及你希望给用户提供的体验。对于那些追求像素级精度的设计师来说,px可能是最好的选择;而对于想要创建更加灵活和响应式的网页,em和rem则是更好的选项。特别是rem,由于其简化了尺寸管理,并且提供了良好的可访问性支持,因此在现代Web开发中越来越受欢迎。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Open FPV VTX开源之ardupilot配置

Open FPV VTX开源之ardupilot配置 1. 源由2. 配置3. 总结4. 参考资料5. 补充5.1 飞控固件版本5.2 配置Ardupilot的BF OSD5.3 OSD偏左问题 1. 源由 飞控嵌入式OSD - ardupilot配置使用ardupliot配套OSD图片。 Choose correct font depending on Flight Controller SW. ──>…

Harmony NEXT开发ArkUI框架速成二基础语法

程序员Feri一名12年的程序员,做过开发带过团队创过业,擅长Java、嵌入式、鸿蒙、人工智能等,专注于程序员成长那点儿事,希望在成长的路上有你相伴&#xff01;君志所向,一往无前&#xff01; 1.ArkUI基础语法 1.1 ArkTS页面组成 在创建的时候&#xff0c;可以创建Page也可以直…

【树莓派3B】香瓜树莓派3B之语音识别机器人

本文最后修改时间&#xff1a;2018年04月03日 11:27 一、本节简介 本节用树莓派3代B型开发板做一个语音识别机器人&#xff0c;实现基础的语音对话功能。 注&#xff1a;转载原文路径 https://github.com/WhisperHear/Voice_Recognition_Control_Robot#userconsent# 上文个…

雷达流量监测系统:精准监控水流,确保水资源安全

水是生命之源&#xff0c;水资源的有效管理和保护直接关系到人类的生存与发展。随着全球气候变化和人口增加&#xff0c;水资源的短缺问题日益严重&#xff0c;如何高效监控和管理水资源&#xff0c;成为了水利、环保、农业等多个领域亟待解决的重要问题。而在这一过程中&#…

战场物联网:通信挑战与最新解决方案综述

论文标题 The Internet of Battle Things: A Survey on Communication Challenges and Recent Solutions 作者信息 Rachel Kufakunesu, Herman Myburgh, Allan De Freitas 论文出处 Discover Internet of Things (2025) 5:3 | The internet of battle things: a survey on…

GitLab 国际站中国大陆等地区停服,如何将数据快速迁移到云效

代码托管平台 GitLab 国际站&#xff08;GitLab.com&#xff09;近日发布公告&#xff0c;官宣即将停止对中国大陆、香港、澳门地区的用户账号提供服务&#xff0c;并提供 60 天过渡期自行迁移账户数据&#xff0c;超期未迁移的账号可能会被 GitLab 清除。这一重要决策引起了全…

React方向:react中5种Dom的操作方式

1、通过原生JS获取Dom去操作 通过document.querySelector(#title)原生js的方式去拿到dom节点&#xff0c;然后去进行操作。 import {Component} from "react";class App extends Component {//定义获取Dom的函数handleGetDom(){let title document.querySelector(#t…

更灵活的对象之间的联动 - 观察者模式(Observer Pattern)

观察者模式&#xff08;Observer Pattern&#xff09; 观察者模式&#xff08;Observer Pattern&#xff09;观察者模式&#xff08;Observer Pattern&#xff09;概述观察者模式&#xff08;Observer Pattern&#xff09; 结构图观察者模式&#xff08;Observer Pattern&#…

Webpack 5 混淆插件terser-webpack-plugin生命周期作用时机和使用注意事项

参考案例代码 海南酷森科技有限公司/webpack-simple-demo Terser&#xff08;简要的/简短的&#xff09; 混淆依据 混淆是发生在代码已经 bundle 之后的事情 变量或者函数在被引用或赋值时才能被混淆 孤立的函数或者变量可能会被移除&#xff0c;但不会被混淆&#xff0c;要…

‌OCP英文全称是什么

在数据库领域&#xff0c;OCP全称为Oracle Certified Professional&#xff0c;是Oracle公司提供的Oracle数据库中级认证&#xff0c;专门针对数据库管理员(Database Administrator&#xff0c;简称DBA)和数据库开发人员。以下是关于OCP认证的详细介绍&#xff1a; 认证领域与…

MyBatis实现数据库的CRUD

本文主要讲解使用MyBatis框架快速实现数据库中最常用的操作——CRUD。本文讲解的SQL语句都是MyBatis基于注解的方式定义的&#xff0c;相对简单。 Mybatis中#占位符和$拼接符的区别 “#”占位符 在使用MyBatis操作数据库的时候&#xff0c;可以直接使用如下SQL语句删除一条数…

微调神经机器翻译模型全流程

MBART: Multilingual Denoising Pre-training for Neural Machine Translation 模型下载 mBART 是一个基于序列到序列的去噪自编码器&#xff0c;使用 BART 目标在多种语言的大规模单语语料库上进行预训练。mBART 是首批通过去噪完整文本在多种语言上预训练序列到序列模型的方…

RTX 5090 加持,科研服务器如何颠覆 AI 深度学习构架?

RTX 5090作为英伟达旗舰级GPU&#xff0c;凭借Ada Lovelace架构&#xff0c;融合创新的SM多单元流处理器、第三代RT Core与第四代Tensor Core&#xff0c;打造出极为强劲的计算体系。其24GB GDDR6X显存搭配1TB/s带宽&#xff0c;能以极低延迟和超高吞吐量处理大规模张量数据&am…

【2025最新】机器学习类计算机毕设选题80套,适合大数据,人工智能

【2025最新】机器学习类型计算机毕设选题 1-10套 基于Spring Boot的物流管理系统的设计与实现 基于机器学习的虚假招聘信息的分析与预测 基于机器学习的影响数据科学家职业变动因素的分析与预测 基于Spring Boot的历史文物交流平台的设计与实现 基于机器学习的肥胖影响因素的分…

【PPTist】幻灯片放映

放映功能的代码都在 src/hooks/useScreening.ts&#xff0c;我们看一下 从当前页开始 放映的功能。 // 进入放映状态&#xff08;从当前页开始&#xff09; const enterScreening () > {enterFullscreen()screenStore.setScreening(true) }首先是 enterFullscreen()&#…

MySQL 16 章——变量、流程控制和游标

一、变量 在MySQL数据库的存储过程和存储函数中&#xff0c;可以使用变量来存储查询或计算的中间结果数据&#xff0c;或者输出最终的结果数据 在MySQL数据库中&#xff0c;变量分为系统变量和用户自定义变量 &#xff08;1&#xff09;系统变量 1.1.1系统变量分类 变量由…

T-SQL编程

目录 1、T-SQL的元素 1.1 标识符 1. 常规标识符 2. 分隔标识符 1.2 变量 1. 全局变量 2. 局部变量 1.3 运算符 1. 算数运算符 2. 赋值运算符 3. 位运算符 4. 比较运算符 5. 逻辑运算符 6. 字符串连接运算符 7. 一元运算符 8. 运算符的优先级和结合性 1.4 批处…

2024 China Collegiate Programming Contest (CCPC) Zhengzhou Onsite 基础题题解

L. Z-order Curve 思路&#xff1a;这题目说了&#xff0c;上面那一行&#xff0c;只有在偶数位才有可能存在1&#xff0c;那么一定存在这样的数&#xff0c;0 ,1,100, 10000,那么反之&#xff0c;我们的数列是行的二倍&#xff0c;因此会出现10,1000,100000这样的数&#xff0…

Unity2D初级背包设计后篇 拓展举例与不足分析

Unity2D初级背包设计中篇 MVC分层撰写(万字详解)-CSDN博客、 如果你已经搞懂了中篇&#xff0c;那么对这个背包的拓展将极为简单&#xff0c;我就在这里举个例子吧 目录 1.添加物品描述信息 2.拓展思路与不足分析 1.没有删除只有丢弃功能&#xff0c;所以可以添加垃圾桶 2.格…

vue(七) vue进阶

目录 第一课&#xff1a;Vue方法、计算机属性及侦听器 一、数组变化侦测 方法1&#xff1a;变更方法 方法2&#xff1a;替换一个数组 例子&#xff1a;小Demo:合并两个数组 二、计算属性 1.基础&#xff08;不推荐&#xff09; 2.使用计算属性来完成案例 3.使用函数的方…