浏览器窗口缩放后用css的zoom来保持比例(现在推荐transform)

大屏适配新解法:用 CSS transform scale 替代 rem 大屏适配本质是保障视觉一致性,而非像素级等比缩放。传统 rem 方案依赖根字体动态计算,易引发布局抖动、嵌套错乱与性能瓶颈;而基于 CSS transform: scale 的方案通过全局画布缩放,实现 O(1) 复杂度的无损适配。其核心原理是依据视口与设计稿宽高的最小比值确定缩放因子,并锁定 top left 为变换原点,兼顾内容完整性与可读性。该技术显著提升 Vue3 大屏项目开发效率与运行时稳定性,适用于指挥中心、智慧园区等对实时性与显示精度要求严苛的工业级场景。 阅读详情
AI摘要

本文介绍了一种使用JavaScript和CSS transform实现自适应网页缩放的方法,通过计算浏览器窗口与预设屏幕尺寸的比例,调整页面缩放级别,确保不同设备上的显示效果一致。同时,文章还分享了在Vue中监听屏幕尺寸变化并更新缩放比例的技巧。

方法很简单:

1.以下代码就能实现zoom的计算通过实际浏览器大小与默认屏幕大小的比例获取

// 高度计算zoom
var percentage, appHeight = 768;//设置默认屏幕大小
percentage = window.innerHeight * 100 / appHeight;
percentage = Math.floor(percentage) / 100;
document.documentElement.style.zoom= percentage;

现在就搞定了,下面说下transform的方案

首先用transform需要transform-origin:0 0;来指定原点0,0为原点位置根据需要设置

// 高度计算zoom
var percentage, appHeight = 768;//设置默认屏幕大小
percentage = window.innerHeight * 100 / appHeight;
percentage = Math.floor(percentage) / 100;
document.getElementById("POSCashRegisterDetaildiv").style.transform=`scale(${percentage>1.4?1.4:percentage})`;

上面实现以浏览器左上为原点缩放,左上的位置不会变

我是通过obj.getBoundingClientRect().width来获取的transform缩放后的盒子的宽高,(不能用document.body.clientWidth,这样获取永远是设置的原始大小)

通过obj.getBoundingClientRect().width来获取要设置了transform缩放后获取才有效,否则获取的值都是0

var w=document.getElementById("POSCashRegisterDetaildiv").getBoundingClientRect().width||document.getElementById("POSCashRegisterDetaildiv").getBoundingClientRect().width
var clientWidths=((document.body.clientWidth-w)/2)
if (clientWidths<0||w==0) {//如果margin值小于o或者获取到的盒子宽高为0则让margin为0,否则左边就会看不见
clientWidths=0
}
document.getElementById("POSCashRegisterDetaildiv").style.margin="10px "+clientWidths+"px";

 

监听屏幕以下是vue的示例和transform缩放,我做了宽高监听:

  1. data中设置默认值(重要)

screenHeight:window.innerHeight,
screenWidth: document.body.clientWidth,

   2.mounted里面监听

const that = this
that.windowOnresizeInnerHeight()
= () => {
return (() => {
window.screenHeight = window.innerHeight
that.screenHeight = window.screenHeight;
that.screenWidth= document.body.clientWidth;
console.log(111)
that.windowOnresizeInnerHeight()
})()

windowOnresizeInnerHeight(){//此方法写在methods里面
    // 高度计算
    var percentage, appHeight = 768;
    percentage = window.innerHeight * 100 / appHeight;
    percentage = Math.floor(percentage) / 100;
    document.documentElement.style.overflow= "hidden";
    
    // 宽度计算
    var percentageWidth, clientWidth = 1024;
    percentageWidth = document.body.clientWidth * 100 / clientWidth;
    percentageWidth = Math.floor(percentageWidth) / 100;
    if (percentage<percentageWidth) {
            document.getElementById("POSCashRegisterDetail").style.display= "block";
            document.getElementById("POSCashRegisterDetaildiv").style.transform=`scale(${percentage>1.4?1.4:percentage})`;
            var w=document.getElementById("POSCashRegisterDetaildiv").getBoundingClientRect().width||document.getElementById("POSCashRegisterDetaildiv").getBoundingClientRect().width
            var clientWidths=((document.body.clientWidth-w)/2)
            if (clientWidths<0||w==0) {
            clientWidths=0
            }
            document.getElementById("POSCashRegisterDetail").style.overflow= "scroll";
            document.getElementById("POSCashRegisterDetaildiv").style.left="0px";
            document.getElementById("POSCashRegisterDetaildiv").style.top="0px";
            document.getElementById("POSCashRegisterDetaildiv").style.margin="10px "+clientWidths+"px";
            }else{
            document.getElementById("POSCashRegisterDetail").style.display= "block";
            document.getElementById("POSCashRegisterDetaildiv").style.transform=`scale(${percentageWidth>1.4?1.4:percentageWidth})`;
            var w=document.getElementById("POSCashRegisterDetaildiv").getBoundingClientRect().width||document.getElementById("POSCashRegisterDetaildiv").getBoundingClientRect().width
            var clientWidths=((document.body.clientWidth-w)/2)
            if (clientWidths<0||w==0) {
            clientWidths=0
            }
            document.getElementById("POSCashRegisterDetail").style.overflow= "scroll";
            document.getElementById("POSCashRegisterDetaildiv").style.left="0px";
            document.getElementById("POSCashRegisterDetaildiv").style.top="0px";
            document.getElementById("POSCashRegisterDetaildiv").style.margin="10px "+clientWidths+"px";
        }
},

 

在vue中直接用window.onresize 监听时灵时不灵,所以用了以下方式监听搞定了,然而我并不知道问题出在哪儿:

const _that=this;
window.addEventListener('resize', function() {
        //要执行的动作
})

这样能解决在vue中监听有些时候监听不到的问题

 

 

 

CSS transform实现按钮点击反馈:从按下缩小到回弹动画全解析 在Web交互设计中,视觉反馈直接影响用户对操作确定性的判断。CSS动画是构建反馈体系的低成本手段,而transform属性凭借其不触发重排、不改变文档流的特性,成为实现按钮按压反馈的首选方案。理解transform scale的底层渲染原理,有助于开发者避开布局抖动与性能陷阱。在真实工程中,结合transition缓动函数、:active伪类以及prefers-reduced-motion无障碍适配,即可用极简代码打造流畅的点击反馈闭环。从单纯的缩小回弹,到叠加阴影、涟漪甚至loading状态,transf 阅读详情

相关推荐

笔记本电脑屏幕缩放125%导致字体变大?3步搞定前端适配(附代码)

本文详细解析了笔记本电脑屏幕缩放125%导致前端字体变大的问题,并提供了3种实用的适配解决方案,包括视口单位适配法、CSS transform缩放法和完整实战方案。特别针对数据可视化大屏的特殊需求,给出了Canvas/WebGL渲染适配和字体清晰度优化的具体代码实现,帮助开发者轻松应对跨设备显示差异。

weixin_29014939的博客 554

transform:scale不缩小实际空间的问题

首先声明一点,transform: scale对行内元素无效,而对块级元素和原子行内级元素生效等。 在开发中,有时会因满足设计需要而对元素进行整体缩放,transform: scale是现代浏览器都支持的css元素,应该是首选,但它会引发一个问题,虽然可以缩小整体显示的内容,但是并没有引起重排,所以占据的实际空间没有缩小,具体看下面的代码以及图片。 <!DOCTYPE html>...

line233的博客 1万+

v-scale-screen手把手指南:从零实现页面等比缩放

用v-scale-screen轻松搞定响应式页面的等比缩放,无需手动计算视口比例。通过指令式调用、自动监听窗口变化、支持动态宽高比配置,让大屏展示和多端适配变得简单可靠。尤其适合数据可视化大屏、后台管理系统等需要精准缩放的场景。

weixin_42471823的博客 793

前端日常记录

在app.vue里直接粘贴即可使用。

a443892091的博客 615

Vue项目如何适配不同尺寸的手机屏幕

根据实际需求选择合适的方法,并根据屏幕尺寸动态调整布局和样式,以提供更好的用户体验。Flexible方案是基于rem单位实现的,它可以根据设备的像素比动态计算出页面的根元素字体大小,从而实现页面的自适应。移动端适配方案是一种常用的方法,可以根据设备的屏幕尺寸和分辨率来动态调整页面的布局和样式。在Vue项目中,你可以使用CSS媒体查询来定义不同屏幕尺寸下的样式。移动设备的屏幕尺寸和分辨率多种多样,因此在Vue项目中实现适配不同尺寸的手机屏幕是非常重要的。根据屏幕尺寸的不同,你可以在组件中动态调整布局和样式。

ByteNinja的博客 903

三极管高频响应问题及其在放大设计中的优化

深入解析三极管工作原理及详解其在高频下的响应特性,针对放大电路设计中的性能瓶颈,提出有效的优化策略,提升电路稳定性和频率响应能力。

weixin_42497762的博客 773

在vue框架中,通过Zoom将页面固定大小,不受缩放影响

当用户缩放浏览器时,网页的布局和元素大小往往会发生变化。这会导致用户体验不一致,特别是在一些需要精确布局的应用中。我们需要一种方法,使页面在任何缩放级别下都保持固定大小。

shouOvO的博客 1534

STM32版CCD线性摄像头寻线寻迹小车_stm32接ccd

目前大多数的小车寻线寻迹都是用红外对管寻线,这是比较简单也比较成熟的技术方案,且成本也低。本文将介绍使用CCD线性摄像头寻线寻迹。TSL1401 线性传感器由一个 1x128 的光电二极管阵列、相关的电荷放大电路以及一个内部像素数据保功能组成。内部像素数据保功能可以为所有像素点提供同时积分的开始和停止时间。该阵列由 128 个像素组成,每个像素的感光面积为 3,524.3 平方微米。像素之间的间隔为 8μm。内部控制逻辑简化了操作,该模块需要串行输入(SI)信号和时钟信号(CLK)。

2401_87557129的博客 3229

VUE页面屏幕自适应等比例缩放

/获取当前分辨率下的可是区域宽度。//放大缩小相应倍数。// 分母——设计稿的尺寸。// 监听页面的窗口的变化,每次窗口变化调用等比例缩放方法。// 页面等比例缩放的方法。

yfc888z888的博客 2767

【信息系统项目管理师】第1章:信息化发展 考点梳理

本文主要详细梳理高项:信息化、新型基础设施建设、两化融合、数字中国、数字化转型与元宇宙等内容。

数据知道的博客 8591

OD图 arcgis曲线制作插件 od图曲线 路径图曲线制作插件 航线图曲线制作插件

在ArcGIS 10.2 中导入节点数据,打开插件,选择输入起始节点和目标节点的节点文件Point,以Name字段(地名)为连接线的起始字段和目标字段,(Input Table File)选择连接关系表格SDLine.csv,(Origin Column 和 Destination Column)为起始节点和目标节点,(Output Path)为输出路径,应选择.gdb数据库路径,否则容易报错,(Chord Coefficient)为连线的曲率,数值越大,曲率越高。运行环境:ArcGIS10.2。...

JData_Engineer的博客 2670

PC固定宽度页面移动端适配:transform缩放方案全解析

移动端适配是前端开发中的高频难题,尤其面对锁定固定宽度的老后台项目,重写响应式布局成本高昂。利用CSS的transform:scale()对页面进行等比缩放,可以不改动原有布局和代码,仅通过外壳容器将PC页面整体缩小嵌入手机视口。其原理在于transform只改变视觉呈现,不触发文档流重排,因此能最大化复用已有样式;配合滚动容器高度补偿、事件坐标换算、弹层挂载等工程化处理,即可解决缩放后的交互错位与滚动问题。该方案适用于内部管理系统、数据大屏等低频移动访问场景,提供了一种高性价比的适配思路。文章基于实战整理

weixin_33857679的博客 763

uv pip install时出现error: Request failed after 3 retries 解决方案

本文主要介绍了uv pip install时出现error: Request failed after 3 retries解决方案,希望能对使用Python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 方法一 2.2 方法二

weixin_43178406的博客 12万+

Vue项目125%缩放适配:rem与transform scale方案详解

在 Windows 系统缩放与浏览器 CSS 像素之间,devicePixelRatio 会把 1920×1080 的物理分辨率换算成约 1536 的 CSS 视口宽度,媒体查询、固定宽度和弹性布局都可能因此失效。理解物理像素、CSS 像素和视口的关系,是实现高 DPR 与多分辨率适配的基础。对 Vue 后台管理、数据大屏和监控看板而言,合理选择 rem 动态根字号或 transform scale 整体缩放,既能保持设计稿比例,又能避免横向滚动、元素重叠和图表错位。围绕 1920×1080 搭配 125%

weixin_34320724的博客 345

Python内置函数zip()——《Python内置函数手册》Python老吕编著

zip()函数是 Python 中的一个内置函数,用于将多个可迭代对象(如列表、元组、字符串等)中对应的元素打包成一个个元组,然后返回由这些元组组成的迭代器。zip()函数常用于将多个序列并行迭代,或者用于数据对齐。zip()它返回一个迭代器,这意味着你可以逐个获取打包后的元素,而不是一次性将所有元素加载到内存中。如果输入的可迭代对象长度不一致,zip()会以最短的可迭代对象为准,只打包到最短对象的末尾。它可以用来并行迭代多个序列,使得代码更加简洁和高效。在接下来的章节中,我们将详细介绍。

Python老吕的博客 683

毕设-MobileNetV4:给YOLOv8装上轻量化“引擎”——通用瓶颈与C2f融合的实战教程

本文介绍了一种将MobileNetV4与YOLOv8结合的目标检测模型轻量化方案。MobileNetV4通过通用瓶颈(UB)结构实现多任务适配,其核心改进包括动态卷积核、注意力机制和多路径特征聚合,显著提升特征提取能力。作者详细阐述了如何在YOLOv8框架中实现MobileNetV4的通用瓶颈模块,包括"膨胀-卷积-注意力-压缩"的流程设计,并构建完整的backbone网络。该方案通过融合MobileNetV4的轻量化优势与YOLOv8的高效检测架构,在移动设备上实现了精度与速度的良好平

FJN110的博客 505

css缩放部分网页元素

如果想用代码控制页面的缩放,同时只缩放部分元素而不是缩放整个窗口,该用什么方法?建议使用transformscale,因为zoom不是标准属性。人为操作浏览器窗口缩放可以使用ctrl+鼠标滚轮。这两个元素来控制页面中的部分元素缩放。...

sunday2018的博客 1259

华为OD面试手撕真题目录

2026最新华为OD面试手撕真题 , 提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解.

qq_45776114的博客 1万+

鼠标滚轮缩放功能开启方法(部分浏览器)

本文介绍了如何在星图GPU平台上自动化部署fft npainting lama重绘修复图片移除图片物品 二次开发构建by科哥镜像,实现图像智能修复功能。用户可在WebUI中通过鼠标滚轮缩放画布,精准标注水印、瑕疵等目标区域,高效完成图片内容移除与重绘,适用于电商修图、版权清理等典型场景。

weixin_42230607的博客 334

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

构建高精度响应式布局系统:基于CSS变换与补偿机制的自适应架构设计

在现代前端开发中,响应式布局面临的核心技术挑战在于如何在保持视觉比例一致性的同时,实现对不同屏幕尺寸的精确适配。传统CSS媒体查询方案在处理复杂大屏可视化场景时存在布局断裂、元素变形等固有缺陷。autofit.js通过创新的CSS变换与元素补偿双重机制,构建了一套完整的自适应布局系统架构,为数据可视化、管理后台等高精度布局场景提供了专业级解决方案。 ## 系统架构设计与核心算法原理 autof

gitblog_00007的博客 184

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

autofit.js技术剖析:智能自适应布局的核心实现机制

**autofit.js自适应工具、响应式网页设计、等比缩放算法**在现代前端开发中扮演着关键角色,为数据大屏、管理后台等场景提供专业级自适应解决方案。本文深入解析autofit.js的技术架构,揭示其如何通过创新的等比缩放与元素补偿机制实现精准的跨设备适配。 ## 设计理念与架构解析 autofit.js的核心设计理念围绕"一次配置,全端适配"展开,通过**容器尺寸动态计算**和**CSS变

gitblog_00092的博客 91

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

autofit.js多轴缩放控制:从ignore到scaleX/scaleY的深度技术演进

autofit.js作为迄今为止最易用的自适应工具,在PC端项目响应式适配领域持续演进。从最初的简单缩放到现在支持多轴独立控制的复杂场景,它经历了一次次重要的技术升级。 ## 🎯 核心功能演进历程 ### 早期版本:基础等比例缩放 在autofit.js的早期版本中,主要采用简单的等比例缩放机制。通过计算设计稿尺寸与当前视口尺寸的比例关系,实现整体页面的自适应适配。 ### v1.1.2

gitblog_01009的博客 295

html页面适应屏幕计算

【代码】html页面适应屏幕计算。

weixin_42517226的博客 171

Penpot 画布坐标到浏览器视口坐标映射:用 Playwright 精确定位并操作画布对象

Penpot 的前端画布(Workspace 视口)运行在可平移、可缩放的 SVG/Canvas 渲染环境中,直接拿一套"Penpot 画布坐标"去驱动浏览器层的鼠标事件(点击、拖拽、悬停)注定会失之毫厘、谬以千里。本文基于仓库内的技术备忘 [penpot-to-browser-coords.md](https://link.gitcode.com/i/1b12142682ca7805521e99

gitblog_00792的博客 441

OpenMontage HyperFrames 虚拟相机技法:viewport-change 单包裹层缩放/平移/焦点锁定实现指南

在 OpenMontage 的 HyperFrames 动画技能库中,`viewport-change` 是一条"虚拟相机"原子规则:它不真的移动摄像机,而是通过变换包裹全部场景内容的单个 `.world` 层,来模拟 zoom(推拉)、pan(平移)与 focus-lock(焦点锁定)三类镜头效果。本文以 [.agents/skills/hyperframes-animation/rules/v

gitblog_00297的博客 336

前端大屏可视化自适应怎么做,零基础入门到精通,收藏这篇就够了

在前端数据大屏的开发中,自适应设计是关键环节,它能确保大屏在不同设备和屏幕尺寸上都能呈现出良好的视觉效果和交互体验。除了常见的rem/vwFlex/Grid等方案外,还有其他有效的方法可以实现自适应。下面为您详细介绍这些方案及其优缺点,以便您根据项目需求做出合适的选择。

Python_0011的博客 1510
上一篇: vue+vscode eslint配置自动修复
下一篇: 金额保留n位小数,及保留方式
起风了咦
博客等级 码龄7年 2粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值