移动端概念、视口、标准盒子和怪异盒子

本文详细介绍了移动端开发中的设备像素比、设备独立像素、布局视口、视觉视口和理想视口的概念,以及它们在实际开发中的应用。同时,讨论了盒子模型的两种类型——标准盒子和怪异盒子,及其对CSS布局的影响。此外,还提及了字体图标在设计中的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

移动端概念

常用设备机型
	iPhone5---真实大小(320)-----设计稿(640px)----2倍
	iPhone678---真实大小(375)-----设计稿(750px)----2倍
	iPhoneplus---真实大小(414)-----设计稿(1242px)----2倍
	iPhoneX---真实大小(375)-----设计稿(1125px)----2倍
	
	设备像素比=设备像素/设备独立像素

	设备像素(物理像素),设计稿大小,ps量出来的大小
	设备独立像素(逻辑像素,虚拟像素,css像素),设备的大小、开发人员要写的css像素
	
	开发人员写的css像素=ps量出来/dpr

视口

	布局视口:一般写出来的代码都放在布局视口上,布局视口一般比较大
	视觉视口:设备真实能看见的区域 
		因为将来要把布局视口的东西放在视觉视口上,但是我们已知
	理想视口:要求布局视口呈现1:1的关系,不要放大也不要缩小
		<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
	字体图标的使用
		字体图标,文字,拥有文字相关样式

盒子模型

	组成部分
		内间距
		内容区
		边框线
		外间距
	总宽计算规则:内容区+左右内间距+左右边框线
	分类:
		标准盒子(w3c盒子)box-sizing:content-box(默认值)
			自己定义的width指的是内容区的宽度
			所以写了内间距和边框线之后会导致把盒子撑大
		怪异盒子(IE盒子)box-sizing:border-box
			自己定义的width指的是盒子总宽度
			 写了内间距和边框线之后不会导致盒子撑大(而是把内容区自动变小)
<think>嗯,用户问的是关于getBoundingClientRect方法返回值不准确的原因解决方案。我需要先回忆一下这个方法的用途常见问题。首先,getBoundingClientRect返回元素的大小及其相对于的位置,这个数据会受到多种因素影响。比如CSS变换、滚动位置、缩放或者浏览器兼容性问题。 记得以前遇到过类似的问题,可能是因为元素应用了transform属性,这会导致位置计算不准确,因为transform后的元素位置可能相对于原位置有偏移。另外,滚动条的存在也会影响,因为返回的是相对于的坐标,如果页面滚动过,可能需要加上滚动偏移量。 还有浏览器兼容性的问题,比如旧版IE可能返回的值其他浏览器不同,或者某些移动端浏览器的处理方式不一致。这时候可能需要通过创建临时元素来检测并调整坐标,像引用[1]提到的技巧那样。 解决方案方面,首先应该检查是否有CSS属性影响了布局,比如transform、position等。然后确保在计算时考虑滚动偏移,可能需要用到window.scrollXwindow.scrollY。另外,针对浏览器差异,可以写一些兼容性代码,比如用临时元素来获取基准值,然后进行调整。 用户可能需要具体的代码示例,所以应该提供一个函数来正确获取元素的位置,并处理滚动浏览器差异。另外,测试不同浏览器环境也是关键,避免某些怪异模式或缩放导致的误差。最后,提醒用户注意盒子模型的影响,比如怪异盒模型可能会影响元素的实际尺寸,引用[3]提到的盒子模型相关知识可能相关。</think>### getBoundingClientRect 返回值不准确的原因及解决方案 #### 一、常见原因分析 1. **CSS变换影响** 元素应用了$transform: translate()$或$scale()$等属性时,返回值是基于变换后的坐标系计算的,可能不符合开发者预期[^1]。 2. **滚动偏移未修正** getBoundingClientRect返回的是**相对于**的坐标,未包含页面滚动量$window.scrollX/Y$时会出现误差。 3. **浏览器兼容性问题** - IE浏览器对边界的四舍五入处理(如$12.4px$显示为$12px$) - 移动端浏览器缩放导致的精度损失 4. **渲染时序问题** 在DOM更新后未触发重排(reflow)直接调用,可能获取到未更新的旧值: ```javascript element.style.left = "100px"; console.log(element.getBoundingClientRect().left); // 可能仍是旧值 ``` #### 二、解决方案 1. **兼容性修正方案** 通过创建临时元素检测坐标系基准值: ```javascript function getAdjustedRect(el) { const temp = document.createElement('div'); document.body.appendChild(temp); const baseRect = temp.getBoundingClientRect(); document.body.removeChild(temp); const rect = el.getBoundingClientRect(); return { left: rect.left - baseRect.left, top: rect.top - baseRect.top }; } ``` 2. **滚动量修正公式** $$x = rect.left + window.scrollX$$ $$y = rect.top + window.scrollY$$ 3. **强制触发重排** 在读取值前强制浏览器重新计算布局: ```javascript element.offsetHeight; // 触发重排 const rect = element.getBoundingClientRect(); ``` 4. **缩放场景处理** 使用$window.devicePixelRatio$校准移动端缩放: ```javascript const scale = 1 / window.devicePixelRatio; const scaledLeft = rect.left * scale; ``` #### 三、验证示例 ```javascript // 正确获取绝对坐标 function getAbsolutePosition(el) { const rect = el.getBoundingClientRect(); return { x: rect.left + window.scrollX, y: rect.top + window.scrollY, width: rect.width, height: rect.height }; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值