移动端相关 BFC CSS原子化 ✅

移动端相关

设备宽度&视口

设备宽度是指设备屏幕的实际物理宽度,通常以像素(px)表示。它是固定的,取决于设备的硬件。不同设备(如手机、平板、桌面等)有不同的设备宽度。

常被提及的视口可被分为3种:布局视口、视觉视口和理想视口。

  • 布局视口是指网页布局计算和呈现的区域。在大移动端部分设备上,布局视口的宽度和设备宽度是相等的(如375px)。
  • 视觉视口是用户在屏幕上实际看到的网页区域,包括布局视口中可见的部分。通过缩放用户可以改变视觉视口的大小,但不会影响到布局视口。
  • 理想视口说这种视口其实并不存在都不过分 是设计师所期望的视口大小,它是设计时的一个目标,或者说他就是布局视口的目标。我们可以通过HTML文件里面的meta标签来设置布局视口的宽度,比如360px,然后让这个网页在不同的移动端设备上运行,此时360px宽度的布局视口就是我们的理想视口。

如下:

<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximun-scale=1.0, minimun-scale=1.0">

width=device-width即布局视口宽度和设备保持一致,user-scalable=no即不允许用户缩放,initial-scale=1.0即初始缩放比例为1,maximun-scale和minimun-scale分别为最大缩放比例和最小缩放比例。

<!-- 这里的demo也很容易实现: -->
<meta name="viewport" content="width=2000, initial-scale=1.0" />

此时你可以在控制台里观察到body的宽度被改为了2000px,但是这种方法和直接修改body的width不同。因为body的宽度默认是100%,应该说因为布局视口宽度的改变,才成功影响了body的宽度以及整个页面的布局。

物理像素比(DPR)

物理像素比是一个用来描述设备的物理像素(设备屏幕上实际的像素点,由硬件决定,即所谓的分辨率)与逻辑像素(你在CSS里面写的1px)之间关系的概念。假设你那部屏幕是正方形的手机的分辨率是200✖️200,而他的逻辑分辨率是100✖️100,他的物理像素比就是40000/10000=4,即你在CSS里写的1px映射到你的屏幕上占据的就是4个物理像素。假设一个设备的物理像素为 1920x1080,而其逻辑分辨率为 960x540。
与物理像素比相关的移动端优化方案有很多 (应该吧哈哈,感觉多数是为了解决图片在移动端设备屏幕上显示模糊的问题) ,比较经典的是「二倍图」。
二倍图的分辨率是常规图像的两倍,使用它是为了确保在高DPR设备上图像显示的清晰度和细腻度,减少锯齿和模糊现象。例如,如果一个标准图像的尺寸是100x100像素,那么其对应的二倍图将是200x200像素,然后我准备一个height和width都为100px的img,在高DPR的屏幕里加载200x200那张,在低DPR的屏幕里加载100x100那张,都能得到较清晰的效果。
还有一个相关的技术就是「SVG可缩放矢量图形」 (哥们用的也不多哈哈) ,使用SVG格式的图像不受分辨率限制,可以在任何分辨率下保持清晰,因为SVG的计算基于矢量而非像素。这使得SVG图像在不同DPR的设备上都能以最佳效果呈现。 (在不同的分辨率或DPR下,SVG的逻辑像素是不同的,我觉得是这样。)

屏幕宽度如何适配?

  • 给不同的设备开发不同的页面(组件),但成本较高。
  • 通过link标签引入样式表时,通过设置media属性给不同宽度的设备引入不同的样式表。如media=“(min-width: 768px)”
  • 通过CSS来实现响应式布局:Grid布局、流式布局、媒体查询、em、rem等单位的使用……

em是相对于当前元素的字体大小,rem是相对于根元素的字体大小
vmax 是视口宽高中的最大值,vmin 是视口宽高中的最小值
vh和vw懒得说

顺带一提,媒体查询还可以实现横竖屏切换样式的需求。

@media (orientation: portrait) {body {background-color: lightblue;/* 其他竖屏样式 */}
}/* 横屏样式 */
@media (orientation: landscape) {body {background-color: lightgreen;/* 其他横屏样式 */}
}

通过JS来实现也可以,只要给window绑定一个resize事件,通过innerWidth和innerHeight的大小的比较来确定当前是横屏还是竖屏即可。


BFC

BFC(块格式化上下文)是 CSS 中的一个概念,用于控制块级盒子之间的布局和排列。它是一种独立的布局环境,可以影响元素的排版和相对位置。BFC中的元素会处理自己的布局、边距、浮动等,而不会受其外部区域的干扰。在 BFC 内的元素及其布局不会影响到外部的元素。
但说来说去,BFC 主要还是用于解决一些常见的布局问题(特别是在涉及到浮动和外边距合并的时候):

  1. 清除浮动:当一个元素使用浮动时,它不会在父元素的正常文档流中占据空间,这可能导致父元素的高度塌陷。通过创建 BFC,包含浮动元素的父元素可以“识别”这些浮动子元素,从而自适应高度,避免塌陷现象。
  2. 控制外边距重叠:在默认情况下,块级元素的上下外边距可能会合并,即相邻的块级元素的边距会计算为最大的边距,而不是简单的相加。当元素处于 BFC 中时,其外边距不会与外部元素的外边距进行合并。

以下是常用的开启BFC的方法:

  1. 设置 overflow 属性为 hidden、auto 或 scroll,非 visible 即可(最常用)
  2. 设置 position 属性为 absolute 或 fixed。
  3. 设置 float 属性为 left 或 right。
  4. 设置 display 属性为 inline-block 以及在父元素上明确设置宽度。

谈到BFC,顺便记录一下前端开发中很常见的一个Bug (我觉得不算bug,absolute用久了之后我觉得这是更符合正常逻辑的行为) ,即高度塌陷

  • 假设一个父级元素里嵌套一个子元素,然后他俩都设置了margin-top属性,但是父元素真正的margin-top在默认情况下会取这两个定义的margin-top的较大值,此时可能会呈现父元素跟随子元素一起“塌陷”的视觉效果。此时给父元素的box-sizing设置为border-box,或者添加padding或border都可以解决这个问题
  • 浮动和绝对定位都可能造成高度塌陷,因为浮动的元素或者绝对定位的元素不再占据父元素的布局(文档流),他们无法将父元素的高度给撑开。针对浮动带来的这种问题,可以通过给父元素设置clear属性为both来清除浮动元素对当前元素所产生的影响绝对定位造成的这种问题,老老实实给固定高度算了。

CSS原子化 (感觉难用的要命)

以Tailwindcss这个库为例子,一番体验下来感觉他的哲学就是减少对 CSS 的依赖,并直接在html里面的类名写样式。以下demo来自它的官网,效果是实现了一个花里胡哨的按钮,重点看一下他那坨又臭又长的类名。

<button class="px-4 py-1 text-sm text-purple-600 font-semibold rounded-full border border-purple-200 hover:text-white hover:bg-purple-600 hover:border-transparent focus:outline-none focus:ring-2focus:ring-purple-600 focus:ring-offset-2">Message
</button>

但存在即合理,不然我也不会在面试里被问到这玩意。可以“想象”到的是这东西的熟练使用可以让开发的时候效率提升,减少CSS的代码量和复杂性,而且可以确保在整个项目中样式的一致性,避免样式冲突。
不过最有意义的应该还是用这种技术来实现样式代码的复用,这种复用不仅是少写点CSS代码,还在于编译 (或者说打包产物) 的体积的见效。因为如果是了简单的逻辑复用,那Sass已经提供了很好的方案:

// 正方形
@mixin square($size) {height: $size * $base-unit;width: $size * $base-unit;
}
// 圆形
@mixin circle($size) {height: $size * $base-unit;width: $size * $base-unit;border-radius: 50%;
}

问题是,square或者circle没被多复用一次,编译出来的东西就会多一块css代码;但是Tailwindcss不会,他的css代码永远只有一份,通过类名就可以实现里面写好的样式。

最后可以聊一下这种技术可能存在的问题 (野猪吃不了细糠,这玩意我能喷一天)

  1. 学习成本:较高
  2. 性能问题:在某些情况下,类名的碰撞可能导致性能下降,尤其是在渲染方面,因为浏览器需要处理的类较多
  3. 维护成本:语义化不够清晰。如果项目中有大量的类名,那么维护起来会比较麻烦,需要花费更多的时间

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

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

相关文章

自定义协议

1. 问题引入 问题&#xff1a;TCP是面向字节流的&#xff08;TCP不关心发送的数据是消息、文件还是其他任何类型的数据。它简单地将所有数据视为一个字节序列&#xff0c;即字节流。这意味着TCP不会对发送的数据进行任何特定的边界划分&#xff0c;它只是确保数据的顺序和完整…

Spring Boot 3.4.0 发行:革新与突破的里程碑

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

android 11添加切换分屏功能

引言 自Android 7开始官方就支持分屏显示,但没有切换分屏的功能,即交换上下屏幕。直到Android 13开始才支持切换分屏,操作方式是:分屏模式下双击中间分割线就会交换上下屏位置。本文的目的就是在Android 11上实现切换分屏的功能。 下图是Android13切换分屏演示 切换分屏…

PyTorch基础05_模型的保存和加载

目录 一、模型定义组件——重构线性回归 二、模型的加载和保存 2、序列化保存对象和加载 3、保存模型参数 一、模型定义组件——重构线性回归 回顾之前的手动构建线性回归案例&#xff1a; 1.构建数据集&#xff1b;2.加载数据集(数据集转换为迭代器)&#xff1b;3.参数初…

JavaScript核心语法(3)

前两篇文章大概把JavaScript的基础语法讲了一下&#xff0c;这篇文章主要讲讲ES6的核心语法。ES6的核心语法说实话其实有点多&#xff0c;我重点挑一些经常在项目中用到的来讲&#xff0c;其他一些我没怎么见过的就不讲了。 目录 1.变量和常量 变量&#xff08;let 和 var&a…

爬虫开发(5)如何写一个CSDN热门榜爬虫小程序

笔者 綦枫Maple 的其他作品&#xff0c;欢迎点击查阅哦~&#xff1a; &#x1f4da;Jmeter性能测试大全&#xff1a;Jmeter性能测试大全系列教程&#xff01;持续更新中&#xff01; &#x1f4da;UI自动化测试系列&#xff1a; SeleniumJava自动化测试系列教程❤ &#x1f4da…

NIO三大组件

现在互联网环境下&#xff0c;分布式系统大相径庭&#xff0c;而分布式系统的根基在于网络编程&#xff0c;而netty恰恰是java领域的网络编程的王者&#xff0c;如果要致力于并发高性能的服务器程序、高性能的客户端程序&#xff0c;必须掌握netty网络编程。 NIO基础 NIO是从ja…

34 基于单片机的指纹打卡系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52RC&#xff0c;采用两个按键替代指纹&#xff0c;一个按键按下&#xff0c;LCD12864显示比对成功&#xff0c;则 采用ULN2003驱动步进电机转动&#xff0c;表示开门&#xff0c;另一个…

李宏毅机器学习课程知识点摘要(14-18集)

线性回归&#xff0c;逻辑回归&#xff08;线性回归sigmoid&#xff09;&#xff0c;神经网络 linear regression &#xff0c; logistic regression &#xff0c; neutral network 里面的偏导的相量有几百万维&#xff0c;这就是neutral network的不同&#xff0c;他是…

文件上传upload-labs-docker通关

&#xff08;图片加载不出&#xff0c;说明被和谐了&#xff09; 项目一&#xff1a; sqlsec/ggctf-upload - Docker Image | Docker Hub 学习过程中,可以对照源码进行白盒分析. 补充&#xff1a;环境搭建在Linux虚拟机上的同时&#xff0c;以另一台Windows虚拟机进行测试最…

【Android】静态广播接收不到问题分析思路

参考资料&#xff1a; Android 静态广播注册流程(广播2)-CSDN博客 Android广播发送流程(广播3)_android 发送广播-CSDN博客 https://zhuanlan.zhihu.com/p/347227068 在Android中&#xff0c;静态广播如果静态广播不能接收&#xff0c;我们可以从整个流程中去分析&#xff…

2024 APMCM亚太数学建模C题 - 宠物行业及相关产业的发展分析和策略(详细解题思路)

在当下&#xff0c; 日益发展的时代&#xff0c;宠物的数量应该均为稳步上升&#xff0c;在美国出现了下降的趋势&#xff0c; 中国 2019-2020 年也下降&#xff0c;这部分变化可能与疫情相关。需要对该部分进行必要的解释说明。 问题 1: 基于附件 1 中的数据及您的团队收集的额…

Git简单介绍

一、 Git介绍与安装 1.1 Git简介 Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。 1.2集中式(SVN&#xff09; VS 分布式(git) 集中式版本控制系统&#xff0c;版本库是集中存放在中央服务器的&#xff0c;工作时要先从中央…

CSS之3D转换

三维坐标系 三维坐标系其实就是指立体空间&#xff0c;立体空间是由3个轴共同组成的。 x轴:水平向右注意:x右边是正值&#xff0c;左边是负值 y轴:垂直向下注意:y下面是正值&#xff0c;上面是负值 z轴:垂直屏幕注意:往外面是正值&#xff0c;往里面是负值 3D移动 translat…

kafka生产者和消费者命令的使用

kafka-console-producer.sh 生产数据 # 发送信息 指定topic即可 kafka-console-producer.sh \ --bootstrap-server bigdata01:9092 \ --topic topicA # 主题# 进程 29124 ConsoleProducer kafka-console-consumer.sh 消费数据 # 消费数据 kafka-console-consumer.sh \ --boo…

基于Springboot的心灵治愈交流平台系统的设计与实现

基于Springboot的心灵治愈交流平台系统 介绍 基于Springboot的心灵治愈交流平台系统&#xff0c;后端框架使用Springboot和mybatis&#xff0c;前端框架使用Vuehrml&#xff0c;数据库使用mysql&#xff0c;使用B/S架构实现前台用户系统和后台管理员系统&#xff0c;和不同级别…

【人工智能】Python常用库-Scikit-learn常用方法教程

Scikit-learn 是一个功能强大的机器学习库&#xff0c;支持数据预处理、分类、回归、聚类、降维等功能&#xff0c;广泛用于模型开发与评估。以下是 Scikit-learn 的常用方法及详细说明。 1. 安装与导入 安装 Scikit-learn&#xff1a; pip install scikit-learn导入基本模块…

Tcon技术和Tconless技术介绍

文章目录 TCON技术&#xff08;传统时序控制器&#xff09;定义&#xff1a;主要功能&#xff1a;优点&#xff1a;缺点&#xff1a; TCONless技术&#xff08;无独立时序控制器&#xff09;定义&#xff1a;工作原理&#xff1a;优点&#xff1a;缺点&#xff1a; TCON与TCONl…

计算机基础(下)

内存管理 内存管理主要做了什么&#xff1f; 操作系统的内存管理非常重要&#xff0c;主要负责下面这些事情&#xff1a; 内存的分配与回收&#xff1a;对进程所需的内存进行分配和释放&#xff0c;malloc 函数&#xff1a;申请内存&#xff0c;free 函数&#xff1a;释放内存…

【青牛科技】TS223 单触摸键检测IC

概 述 &#xff1a; TS223是 触 摸 键 检 测 IC&#xff0c; 提 供 1个 触 摸 键 。 触 摸 检 测 IC是 为 了用 可 变 面 积 的 键 取 代 传 统 的 按 钮 键 而 设 计 的 。低 功 耗 和 宽 工 作 电压是 触 摸 键 的 DC和 AC特 点 。TS223采 用 SSOP16、 SOT23-6的 封 装 形 式…