gpt4 book ai didi

Javascript 放大/缩小到鼠标 x/y 坐标

转载 作者:太空宇宙 更新时间:2023-11-04 06:01:26 26 4
gpt4 key购买 nike

我设法让鼠标拖动来滚动div,但是用鼠标放大/缩小不完整。

它有效,但我希望鼠标指针将图像保持在该位置并同时缩放它,如下所示:

Screenshot

我需要使用 scrollBy() 将滚动返回到缩放前的前一点。有人知道怎么做吗?

这是某人制作的 fiddle https://jsfiddle.net/xta2ccdt/13/这正是我所需要的,但代码使用了 translate() 和其他在这里不适用的东西,因为我也有滚动/拖动。

这是我的 jsfiddle 代码 https://jsfiddle.net/catalinu/1f6e0jna/

这是 stackoverflow 中的代码:

请帮忙。我为此苦苦挣扎了好几天。

for (const divMain of document.getElementsByClassName('main')) {
// drag the section
for (const divSection of divMain.getElementsByClassName('section')) {
// when mouse is pressed store the current mouse x,y
let previousX, previousY
divSection.addEventListener('mousedown', (event) => {
previousX = event.pageX
previousY = event.pageY
})

// when mouse is moved, scrollBy() the mouse movement x,y
divSection.addEventListener('mousemove', (event) => {
// only do this when the primary mouse button is pressed (event.buttons = 1)
if (event.buttons) {
let dragX = 0
let dragY = 0
// skip the drag when the x position was not changed
if (event.pageX - previousX !== 0) {
dragX = previousX - event.pageX
previousX = event.pageX
}
// skip the drag when the y position was not changed
if (event.pageY - previousY !== 0) {
dragY = previousY - event.pageY
previousY = event.pageY
}
// scrollBy x and y
if (dragX !== 0 || dragY !== 0) {
divMain.scrollBy(dragX, dragY)
}
}
})
}

// zoom in/out on the section
let scale = 1
const scaleFactor = 0.05
divMain.addEventListener('wheel', (event) => {
// preventDefault to stop the onselectionstart event logic
event.preventDefault()
for (const divSection of divMain.getElementsByClassName('section')) {
// set the scale change value
const scaleChange = (event.deltaY < 0) ? scaleFactor : -scaleFactor
// don't allow the scale to go outside of [0,5 - 2]
if (scale + scaleChange < 0.5 || scale + scaleChange > 2) {
return
}
// round the value when using high dpi monitors
scale = Math.round((scale + scaleChange) * 100) / 100

// apply the css scale
divSection.style.transform = `scale(${scale}, ${scale})`

// re-adjust the scrollbars
const x = Math.round(divMain.scrollLeft * scaleChange)
const y = Math.round(divMain.scrollTop * scaleChange)
divMain.scrollBy(x, y)
}
})
}
body {
margin: 0;
}

.main {
width: 100%; /* percentage fixes the X axis white space when zoom out */
height: 100vh; /* this is still an issue where you see white space when zoom out in the Y axis */
overflow: scroll; /* needed for safari to show the x axis scrollbar */
}

.main .section {
width: 200%;
height: 200vh;
background-image: url('https://iso.500px.com/wp-content/uploads/2014/07/big-one.jpg');
transform-origin: 0 0;
}
<main class="main">
<section class="section"></section>
</main>

最佳答案

您的问题主要围绕以下几行

const x = Math.round(divMain.scrollLeft * scaleChange)
const y = Math.round(divMain.scrollTop * scaleChange)

缩放滚动的方式如下所示

  • 计算发生缩放的未缩放的x, y 坐标
  • 计算新的比例 x, y 坐标我将它与新的比例相乘
  • 现在您希望这个新坐标保持在现有坐标所在的位置。所以基本上,如果您从新的 scaled x,y 中减去 offset x,y,就会得到向左和向上的滚动。

更新后的代码如下

for (const divMain of document.getElementsByClassName('main')) {
// drag the section
for (const divSection of divMain.getElementsByClassName('section')) {
// when mouse is pressed store the current mouse x,y
let previousX, previousY
divSection.addEventListener('mousedown', (event) => {
previousX = event.pageX
previousY = event.pageY
})

// when mouse is moved, scrollBy() the mouse movement x,y
divSection.addEventListener('mousemove', (event) => {
// only do this when the primary mouse button is pressed (event.buttons = 1)
if (event.buttons) {
let dragX = 0
let dragY = 0
// skip the drag when the x position was not changed
if (event.pageX - previousX !== 0) {
dragX = previousX - event.pageX
previousX = event.pageX
}
// skip the drag when the y position was not changed
if (event.pageY - previousY !== 0) {
dragY = previousY - event.pageY
previousY = event.pageY
}
// scrollBy x and y
if (dragX !== 0 || dragY !== 0) {
divMain.scrollBy(dragX, dragY)
}
}
})
}

// zoom in/out on the section
let scale = 1
const factor = 0.05
const max_scale =4

divMain.addEventListener('wheel', (e) => {
// preventDefault to stop the onselectionstart event logic
for (const divSection of divMain.getElementsByClassName('section')) {
e.preventDefault();
var delta = e.delta || e.wheelDelta;
if (delta === undefined) {
//we are on firefox
delta = e.originalEvent.detail;
}
delta = Math.max(-1,Math.min(1,delta)) // cap the delta to [-1,1] for cross browser consistency
offset = {x: divMain.scrollLeft, y: divMain.scrollTop};
image_loc = {
x: e.pageX + offset.x,
y: e.pageY + offset.y
}

zoom_point = {x:image_loc.x/scale, y: image_loc.y/scale}

// apply zoom
scale += delta*factor * scale
scale = Math.max(1,Math.min(max_scale,scale))

zoom_point_new = {x:zoom_point.x * scale, y: zoom_point.y * scale}

newScroll = {
x: zoom_point_new.x - e.pageX,
y: zoom_point_new.y - e.pageY
}


divSection.style.transform = `scale(${scale}, ${scale})`
divMain.scrollTop = newScroll.y
divMain.scrollLeft = newScroll.x
}


})
}

更新后的 fiddle 是

https://jsfiddle.net/uy390v8t/1/

Results

关于Javascript 放大/缩小到鼠标 x/y 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57262208/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com