浏览器窗口缩放后用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

DPABI安装教程

DPABI是是中科院心理研究所严超赣老师团队开发的一款磁共振脑影像数据分析工具包。基于SPM,在安装DPABI之前需要安装好SPM,才能正常使用。SPM的安装方法见文matlab2021a版本条件下安装spm_kidllll的博客-优快云博客 1、下载安装包 下载地址:DPABI: a toolbox for Data Processing & Analysis for Brain Imaging | The R-fMRI Network 2、将下载好的dpabi文件夹移动到matl..

qq_42356925的博客 1万+

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

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

shouOvO的博客 1534

如何浏览与下载全球免费的地图高分辨率(亚米级)的遥感影像?

前言 如果你想使用商业卫星的高分辨遥感影像,一般价格昂贵。我们可以使用地图平台上免费的高分辨率数据。目前数据源很多,比如说google earth、天地图、四维地球、必应地图等等。这些影像统一有一个共同点就是:RGB三波段;Web地图瓦片服务。这意味着我们可以通过瓦片服务下载影像,但下载的影像只有三个波段,分别是 一.引言 二、可使用高分辨率的地图数据源 1.Google Earth影像 2.Esri World Image 3.天地图 4.必...

锐多宝的地理空间 2万+

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

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

yfc888z888的博客 2767

Java后端实战:钉钉互动卡片消息从配置到生产级对接

在企业级消息推送场景中,机器人通知已从简单的文本向富交互演进。其核心原理在于通过可交互的卡片模板,将传统单向通知升级为双向、有状态的微型应用界面,实现了用户无需跳转即可完成操作的技术价值。这广泛应用于审批、任务确认、数据填报等需要即时反馈的业务流程。本文聚焦于钉钉平台,深入剖析其互动卡片消息机制,并基于Java后端,系统讲解如何实现包括安全验签、异步回调与卡片动态更新在内的生产级对接方案,涵盖配置管理、服务降级等工程实践关键点,助力构建稳定高效的企业消息交互服务。

weixin_30617737的博客 439

微信小程序使用ucharts折线图,有负数显示0刻度线

当数据有负数和正数的时候默认不会显示0刻度线,不方便看出正负对比。

欢迎来到我的博客!在这里,我将分享我在前端开发方面的知识和经验。让我们一起探索前端开发的无限可能! 1582

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

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

weixin_33857679的博客 763

Nvidia Isaac Sim安装与配置 入门教程 2024(2)

Isaac Sim 安装和配置教程将指导用户完成从下载软件到设置和运行仿真的全过程。教程内容包括安装必要的依赖项、配置系统环境、配置Omniverse环境以及调试和优化仿真环境的步骤。通过详细的操作步骤和图文并茂的说明,用户可以快速上手 Isaac Sim,构建出高质量的机器人仿真环境,实现其研究和应用目标。

m0_56661101的博客 2万+

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

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

weixin_34320724的博客 345

C#上位机与西门子PLC全链路通信实战教程:数据采集+SQL存储+数据库报表查询+报警历史完整实现

在工业自动化领域,西门子PLC(S7-200Smart/1200/1500)凭借稳定的性能、强大的功能、完善的生态,稳居工业控制器的主流地位;而凭借开发效率高、界面美观、兼容性强、数据库操作便捷的优势,成为工业上位机开发的首选编程语言。二者的组合,是目前制造业、自动化产线、智能仓储、暖通自控等场景的绝对主流方案,也是工业上位机工程师必须吃透的核心技术栈。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1867

MATLAB应用实战系列(四十三)-基于MATLAB的光伏并网系统仿真设计

在Matlab中建立光伏电站接入系统模型,包括光伏发电逆变器及负荷模型等,仿真分析接入点处的电能质量,实现高品质并网运行。 壹 构建太阳能电池模型。 初始化参数如下图所示。 贰 构建MPPT控制模型。 具体封装如下所示: 通过PWM算法实现DC-DC稳步输出最大点。 叁 三、构建直流短距离输电线路。 仿真模型如下图: 通过电容来均衡线路电压,使得线路电压保持可靠性。 肆 通过逆变器变换,使得直流线路转换成...

wenyusuran的专栏 3172

css缩放部分网页元素

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

sunday2018的博客 1259

[SaaS] 阿里妈妈-万相营造

有controlnet的介入,我们是默认controlnet会介入,在inapinting时会把带有商品的画布做一点扩充,然后走inapinting和controlnet,其实也做了一点outpainting的工作。基于阿里妈妈营销平台,提供从图文到视频再到落地页的素材级智能化创意支持,是您营销创意数字资产累积和升值的阵地,最大化提升营销的效率和效果。目前看来抠图基本都是sam了,现在weshop也是,都有一个预扣好的主体,但是一点进去也会重新sam。atomovideo->图生视频。

liguandong 524

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

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

weixin_42230607的博客 334

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

gitblog_00007的博客 184

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

gitblog_00092的博客 91

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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、付费专栏及课程。

余额充值