调整大小和滚动问题(JS/HTML)

2024-03-29

有两个容器:第一个是小视口,第二个是巨大的工作区。因此,用户滚动视口以在工作区中移动。我想通过 CSS 属性实现放大/缩小功能tranform,但是在这个过程中我遇到了一个难题,并没有找到精确的解决方案。

问题是:当用户放大/缩小时,工作区中的元素会发生移动。实际上发生这种情况是因为工作区大小被调整,而不是它们。但是,如果我调整工作区中每个元素的大小,它们之间的距离(就top/leftCSS 值)将被更改,这不是首选。

我看到以下解决方案:调整大小后更改滚动值,但我不知道要使用什么比率或数字。有没有任何公式或其他解决方案可以克服这样的问题?

用于调整大小使用Alt + MouseWheel

let workspace = document.getElementsByClassName('workspace')[0];
workspace.onwheel = resize;

let current_scale = 1;

function resize(E) {
  E = E || window.event
  if (E.altKey) {
    E.preventDefault();
    let new_scale = Math.max(0.1, current_scale - E.deltaY / 360);
    workspace.style.setProperty('transform', 'scale(' + new_scale + ')');
    current_scale = new_scale;
  }
}
.viewport {
  width: 80vw;
  height: 80vh;
  box-sizing: border-box;
  overflow: scroll;
 
  transform: scale(1);
}

.workspace {
  position: relative;
  width: 1000px;
  height: 1000px;
  overflow: hidden;
}

.element {
  position: absolute;
  width: 10px;
  height: 10px;
}
<div class="viewport">
  <div class="workspace">
    <button class="element" style="top: 100px; left: 150px"></button>
    <button class="element" style="top 80px; left: 100px"></button>
    <button class="element" style="top: 230px; left: 130px"></button>
    <button class="element" style="top: 100px; left: 250px"></button>
  </div>
</div>

UPD:我附上了原始项目的一些照片以供澄清:

So, that's a look of the workspace with scale(1) Scale(1)

Then I resize it and get the following result: Resized

But desirable result looks like this: enter image description here

UPD2我插入了<svg>元素来显示如何绘制线条以及为什么调整每个按钮的大小对我来说在我的情况下似乎不是可行的解决方案

 let workspace = document.getElementsByClassName('workspace')[0];
    workspace.onwheel = resize;
    let current_scale = 1;
    function resize(E) {
        E = E || window.event;
        if (E.altKey) {
            E.preventDefault();
            let new_scale = Math.max(0.1, current_scale - E.deltaY / 360);
            var btns = workspace.getElementsByClassName('element');
            for(var i = 0; i <btns.length; i++) {
                btns[i].style.setProperty('transform', 'scale(' + new_scale + ')');
            }
            current_scale = new_scale;
        }
    }
.viewport {
            width: 80vw;
            height: 80vh;
            box-sizing: border-box;
            overflow: scroll;

            transform: scale(1);
            transform-origin: 0 0;
        }

        .workspace {
            position: relative;
            width: 1000px;
            height: 1000px;
            overflow: hidden;
        }

        .element {
            position: absolute;
            width: 10px;
            height: 10px;
        }
        .line-drawer
        {
            position:absolute;
            height:1000px;
            width:1000px;
        }
<div class="viewport">
    <div class="workspace">
        <svg class="line-drawer">
            <line x1="100px" x2="130px" y1="80px" y2="230px" style='stroke-width: 4px; stroke: black'></line>
        </svg>
        <button class="element" style="top: 100px; left: 150px"></button>
        <button class="element" style="top: 80px; left: 100px"></button>
        <button class="element" style="top: 230px; left: 130px"></button>
        <button class="element" style="top: 100px; left: 250px"></button>
    </div>
</div>

像这样缩放各个元素将使它们保持在原来的位置

let workspace = document.getElementsByClassName('workspace')[0];
workspace.onwheel = resize;

let current_scale = 1;

function resize(E) {
  E = E || window.event
  if (E.altKey) {
    E.preventDefault();
    let new_scale = Math.max(0.1, current_scale - E.deltaY / 360);
    var btns = workspace.getElementsByClassName('element');
    for(var i = 0; i <btns.length; i++) { 
        btns[i].style.setProperty('transform', 'scale(' + new_scale + ')');
    }
    current_scale = new_scale;
  }
}
.viewport {
  width: 80vw;
  height: 80vh;
  box-sizing: border-box;
  overflow: scroll;
 
  transform: scale(1);
}

.workspace {
  position: relative;
  width: 1000px;
  height: 1000px;
  overflow: hidden;
}

.element {
  position: absolute;
  width: 10px;
  height: 10px;
}
<div class="viewport">
  <div class="workspace">
    <button class="element" style="top: 100px; left: 150px"></button>
    <button class="element" style="top 80px; left: 100px"></button>
    <button class="element" style="top: 230px; left: 130px"></button>
    <button class="element" style="top: 100px; left: 250px"></button>
  </div>
</div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调整大小和滚动问题(JS/HTML) 的相关文章

  • “Backbone.js 视图”中的单击事件不起作用

    我尝试开始使用backbone js 但我发现当我不使用 body 作为视图的el时 该事件不起作用 这是代码 您可以将其另存为 html 文件并运行
  • 使用 CORS 进行 React 中的 Fetch 时出现问题

    我对 CORS 完全陌生 并且遇到以下问题 我正在使用 create react app 端口 3000 调用 spring boot 端口 8080 中创建的一些 REST 服务 我将 JWT 身份验证添加到我的 REST API 中 因
  • 使用 JavaScript 访问 Jekyll 变量并通过 DOM 操作传递它

    我很可能有错误逻辑 但我刚刚学习 JavaScript 和 Jekyll 我的目标是通过 JavaScript 操作 HTML 元素 并将一些 Jekyll 变量放置在该元素的内部 HTML 中 一切都从本地开发目录加载jekyll ser
  • 有没有办法覆盖 Google 路线服务缩放值?

    我使用下面的代码来获取两点之间的路线 directionsService route request function response status if status google maps DirectionsStatus OK di
  • 如何获得日期为 yyyy-mm-dd 的年份差异?

    我想得到以 yyyy mm dd 格式给出的两个日期之间的差异 差异应该是年份 var ds 2002 09 23 var today date new Date alert today date Date prototype yyyymm
  • 使用 BeautifulSoup 在 python 中抓取多个页面

    我已经设法编写代码来从第一页中抓取数据 现在我不得不在这段代码中编写一个循环来抓取接下来的 n 页 下面是代码 如果有人可以指导 帮助我编写从剩余页面中抓取数据的代码 我将不胜感激 Thanks from bs4 import Beauti
  • 滚动内容上的 CSS 框阴影

    我想要一个带有插入框阴影的 div 其中包含滚动的内容 不幸的是 盒阴影不会投射在内容中的元素上 而是投射在背景上 但我希望它也覆盖内容元素 我偶然发现了这个解决方案 http jsfiddle net HPkd3 http jsfiddl
  • Javascript Replace() 仅替换第一个匹配项[重复]

    这个问题已经存在了 你好 请参阅这里的 jsfiddle http jsfiddle net moolood jU9QY http jsfiddle net moolood jU9QY var toto bien address 1 bie
  • 在我自己的文件夹结构中的 Sequelize 中的迁移

    我是新来的Sequelize我当前的项目要求我将它与迁移一起使用 我熟悉迁移的内容和方式 我来自Django背景 每个子应用程序在同一文件夹中都有模态 视图 api url 和迁移 我喜欢这个结构 并希望在我的 Nodejs 应用程序中保持
  • 将颜色渐变应用于网格上的材质 - Three.js

    我有一个 STL 文件加载到我的场景中 并将单一颜色应用于 phong 材质 我想要一种方法 将两种颜色应用于该网格物体的材质 并在 Z 轴上应用渐变效果 如下例所示 渐变花瓶 https i stack imgur com Ty9gq j
  • 样式的顺序重要吗?

    下面是我的标记 当我将鼠标移到超链接上时 它们会带有下划线并变成红色 但如果我交换最后两条规则的顺序 超链接仍然会带有下划线 但它们的颜色会变为黑色而不是红色 这是设计使然吗 如果是这样 规则是如何应用的 谢谢 康斯坦丁
  • AJV自定义关键字验证

    我正在使用 AJV 库来验证我的 JSON 架构 我希望能够验证Startdate成为一个字符串 如果不是字符串 则应将其转换为N A 目前 它仅转换undefined to N A 但是 在这些情况下 它不会按预期工作 null gt 空
  • Javascript 子字符串方法帮助

    长话短说 我正在开发一个 Web 应用程序并在其中使用 AJAX 我试图禁用点击时链接的默认操作 将哈希值附加到链接 然后从网址中删除 我遇到的问题是 虽然哈希值被相应地附加 但子字符串方法并没有提取 而是提取了它后面的字母 这是我的代码
  • 如何在android中使用webview明智地显示Html内容页面?

    您好 我创建了一个简单的应用程序来在 webview 中显示 html 页面 我使用 webview 并显示页面加载时间 如下所示 此后禁用滚动并使用下一个和上一个按钮来后退和前进包含 所以我的代码如下 首先onCreate显示添加webv
  • 使用 arrayRemove() 从 firestore 9 数组中删除对象?

    我正在尝试从 firestore 中的数组中删除一个对象 但遇到了障碍 执行删除的要求或参考是什么 对象中的一个键值是否足以执行删除操作 或者该对象是否应该与要删除的对象相同 const deleteWeek async gt const
  • facebook graph api 确定用户是否喜欢 url

    如果用户当前登录 Facebook 并喜欢当前页面 我想显示不同的消息 我明白 FB Event subscribe edge create function response you like this 当用户喜欢该页面时 它将触发 但是
  • `[$injector:nomod] 模块“google-maps”不可用`

    我正在使用 angular google maps 在角度应用程序中处理谷歌地图 为此 我必须添加angular google maps js到项目 如果我按以下方式添加脚本 该页面可以正常工作 不会出现任何错误 但如果我使用本地副本 它将
  • 使用 Excel 从 Lotus Notes 发送电子邮件并具有附件和 HTML 正文

    是的 我正在尝试通过 Lotus Notes 发送 Excel 电子表格的电子邮件 它有一个附件 并且正文需要采用 HTML 格式 从我读过的所有代码来看 我有一些代码应该允许我这样做 但事实并非如此 如果没有 HTML 正文 附件将发送
  • jquery/javascript: function(e){.... e 是什么?为什么需要它?它实际上做了什么/完成了什么?

    myTable click function e var clicked e target clicked css background red 有人可以向我解释一下这一点 并解释为什么需要 e 以及它实际上做了什么 Using e只是一个
  • 在 Firefox 中单击桌面通知时如何将焦点移至选项卡?

    我正在一个网站中实现桌面通知 该网站会在新消息到达时显示通知 我希望当用户单击通知时 打开网站的浏览器选项卡能够获得焦点 我可以使用以下代码在 Chrome 中实现此功能 var n new Notification Title body

随机推荐

  • 面向对象的程序员如何了解数据库驱动的编程?

    我已经使用 C 和 Java 编程一年多了 并且对面向对象编程有了很好的掌握 但是我的新副项目需要数据库驱动的模型 我正在使用 C 和 Linq 这似乎是一个非常强大的工具 但我在围绕面向对象的方法设计数据库时遇到了麻烦 我的两个主要问题是
  • 引导导航栏崩溃在计算机上工作而不是在iPhone上工作

    当我将计算机屏幕大小调整到 980 像素以下时 我的固定导航栏工作正常 一旦我的屏幕达到 979 像素或更小 导航栏折叠就会启动并完美运行 然而 当我将代码推送到 Heroku 并在 iPhone 4S 上加载该网站时 我的导航栏不仅没有折
  • 在 aws 微实例上安装 redis

    我需要在亚马逊云中安装redis 我需要它作为我的 npm 模块 kue 部署 的一部分 考虑到我对 Linux 和管理的了解并不好 任何人都可以链接我的逐步教程或解释如何做到这一点 如果您启用 Amazon Linux 上存在的 Extr
  • 通过按同一个按钮来打开/关闭 MapKit 叠加?

    我有一个带有工具栏按钮的 MapView 按下该按钮时会向 MapView 添加叠加层 我想要的是按钮 IBAction 检查地图上是否已经有覆盖物 如果有 则删除 如果没有 则添加它们 我当前添加叠加层的代码如下 IBAction wat
  • JacksonFeature 破坏了 JsonIgnoreProperties

    我有这样的 pojo JsonIgnoreProperties ignoreUnknown true public class SNAPIResponse public String status public String message
  • Keras:从 ImageDataGenerator 或 Predict_generator 获取真实标签 (y_test)

    我在用ImageDataGenerator flow from directory 从目录生成批量数据 模型成功构建后 我想获得真实和预测类标签的两列数组 和model predict generator validation genera
  • 在mawk中使用strftime函数

    我正在尝试创建 AWK 脚本 该脚本将根据某种模式过滤输入文件 并使用 strftime 函数进行一些计算 2 HB 2 n print strftime Y 使用的解释器是mawk 使用此命令触发此脚本时 awk f script3 in
  • 使用curl将文件推送到GitHub存储库

    我想在 GitHub 存储库上创建 推送 新文件 而不需要git工具 因为git我的工具不可用PHP主持人 所以我做了一些研究 发现GitHub REST API https docs github com en rest 我尝试使用cur
  • 电池的最佳使用

    作为一名程序员 我可以采取哪些措施来确保我的应用程序不会占用大量资源并耗尽电池 根据您正在编写的应用程序 其中一些可能适用于您 不要使用过多的网络调用 尝试维护不经常更改的数据缓存 并且仅在上次刷新 10 秒后运行完全刷新 阻止它们向服务器
  • SQLite Swift 中有多少种方式进行 CRUD 操作?

    当我在 SQLite 中进行 CRUD 操作时 我很困惑 因为有人对我说你可以使用 FMDB 库进行 CRUD 操作 有人说 GRDB 所以 我的问题是 在 SQLite 中有多少种方法可以进行 CRUD 操作 哪种方法是正确的 我认为 G
  • 如何在 Jquery 验证中处理 html 元素 id/name 中的特殊字符?

    我有一个 HTML 表单 它在 ids 中使用特殊字符 该表单使用 JQuery 验证插件来验证用户输入 具体来说 id 包括 GUID 以下是示例代码
  • 在 Eclipse 中,Source -> Format 在“Maven Pom Editor”中被禁用

    当打开pom xml在 Eclipse 中使用 Maven Pom Editor 并切换到选项卡pom xml我无法格式化该文件 Hitting Ctrl Shift F在完全未格式化的文件中不会执行任何操作 通过上下文菜单时Source
  • Python 中的递归、记忆和可变默认参数

    Base 的意思是不只使用lru cache 所有这些都 足够快 我并不是在寻找最快的算法 但时间安排让我感到惊讶 所以我希望我能了解一些有关 Python 如何 工作 的知识 简单循环 尾递归 def fibonacci n a b 0
  • Flask 应用偶尔挂起

    我一直在开发一个 Flask 应用程序 它使用 Twilio 处理 SMS 消息 将它们存储在数据库中 并通过 JSONP GET 请求提供对前端的访问 我已经使用supervisord对其进行了守护进程 这似乎工作得很好 但每隔几天它就会
  • Erlang / Golang 端口示例中的缓冲区大小

    我有一个粗略的 Erlang to Golang 端口示例 将数据从 Erlang 传递到 Golang 并回显响应 问题是我可以传输的数据量似乎仅限于 2 8 字节 见下文 我认为问题可能出在 Golang 方面 没有创建足够大的缓冲区
  • JavaScript 中的继承和 Super

    我正在学习 JavaScript 的第三天 我遇到了这段代码 class B constructor name this name name printn return this name class A extends B constru
  • ajaxForm 错误回调内的表单对象

    我试图在 ajaxForm 的错误方法中访问我的表单对象 foo ajaxForm error function where s my foo object error 可以接受 3 个参数 但它们都不是表单对象 这也返回 url 但同样没
  • 为什么 CSS Grid 的自动填充属性在列方向上不起作用

    我正在练习用行自动填充属性 但是 它并没有按照我的意愿进行 我想创建具有高度的行minmax 140px 200px 而是获取一行高度为 200px 的行 其余行为 18px 为什么会发生这种情况 body html height 100
  • 使用ajax上传文件到远程服务器

    我对服务器端没有任何控制权 是否可以在 Iframe 中上传并加载远程服务器给出的结果 请分享一些代码 谢谢 使用名称声明 iframe 并在表单元素中定位该名称
  • 调整大小和滚动问题(JS/HTML)

    有两个容器 第一个是小视口 第二个是巨大的工作区 因此 用户滚动视口以在工作区中移动 我想通过 CSS 属性实现放大 缩小功能tranform 但是在这个过程中我遇到了一个难题 并没有找到精确的解决方案 问题是 当用户放大 缩小时 工作区中