鼠标点缩放图片-滚轮事件
mouse point zoom image - wheel event
这里是缩放工作示例。我希望图像在图像上的实际鼠标位置上放大。如何做到这一点?没有图书馆。
const image = document.querySelector('img');
const zoom = {
min: 1,
max: 3,
value: 1,
step: 0.1
};
image.addEventListener('wheel', event => {
event.preventDefault();
if (event.deltaY < 0) {
zoom.value = zoom.value >= zoom.max ? zoom.max : zoom.value + zoom.step;
} else if (event.deltaY > 0) {
zoom.value = zoom.value <= zoom.min ? zoom.min : zoom.value - zoom.step;
}
image.style.transform = `scale(${zoom.value})`
}
)
div {
width: 500px;
overflow: hidden;
}
img {
width: 100%;
}
<div>
<img src="https://picjumbo.com/wp-content/uploads/free-stock-photos-san-francisco-1080x720.jpg">
</div>
添加
image.style.transformOrigin = `${event.x}px ${event.y}px`
const image = document.querySelector('img');
const zoom = {
min: 1,
max: 3,
value: 1,
step: 0.1,
originX: 0,
originY: 0
};
image.addEventListener('wheel', event => {
event.preventDefault();
zoom.originX += (event.x-zoom.originX)/zoom.value;
zoom.originY += (event.y-zoom.originY)/zoom.value;
image.style.transformOrigin = zoom.originX+'px '+zoom.originY+'px';
if (event.deltaY < 0) {
zoom.value = zoom.value >= zoom.max ? zoom.max : zoom.value + zoom.step;
} else if (event.deltaY > 0) {
zoom.value = zoom.value <= zoom.min ? zoom.min : zoom.value - zoom.step;
}
image.style.transformOrigin = `${event.x}px ${event.y}px`
image.style.transform = `scale(${zoom.value})`
}
)
div {
width: 500px;
overflow: hidden;
}
img {
width: 100%;
}
<div>
<img src="https://picjumbo.com/wp-content/uploads/free-stock-photos-san-francisco-1080x720.jpg">
</div>
const image = document.querySelector('img');
const zoom = {
min: 1,
max: 3,
value: 1,
step: 0.1
};
var div = document.querySelector('div');
div.addEventListener('wheel', event => {
event.preventDefault();
if (event.deltaY < 0) {
zoom.value = zoom.value >= zoom.max ? zoom.max : zoom.value + zoom.step;
} else if (event.deltaY > 0) {
zoom.value = zoom.value <= zoom.min ? zoom.min : zoom.value - zoom.step;
}
image.style.transform = `scale(${zoom.value})`
var xPerc = (x * 100) / image.width;
var yPerc = (y * 100) / image.height;
image.style.transformOrigin = xPerc + '%' + ' ' + yPerc + '%';
}
)
var x, y;
div.addEventListener('mousemove', e => {
x = e.clientX - div.offsetLeft;
y = e.clientY - div.offsetTop;
})
div {
width: 500px;
overflow: hidden;
}
img {
width: 100%;
}
<div>
<img src="https://picjumbo.com/wp-content/uploads/free-stock-photos-san-francisco-1080x720.jpg">
</div>
试了一下您的示例,发现 transform-origin
可能会成功。添加了相对于图像容器的坐标 x,y 并将它们转换为百分比以设置图像的 tranform-origin
样式 属性.
把你image.style.transform...
改成(500x337是div-图片大小)
let x = (-event.offsetX+500/2)*(zoom.value-1);
let y = (-event.offsetY+337/2)*(zoom.value-1);
image.style.transform = `translate(${x}px,${y}px) scale(${zoom.value}) `
const image = document.querySelector('img');
const zoom = {
min: 1,
max: 3,
value: 1,
step: 0.1
};
image.addEventListener('wheel', event => {
event.preventDefault();
if (event.deltaY < 0) {
zoom.value = zoom.value >= zoom.max ? zoom.max : zoom.value + zoom.step;
} else if (event.deltaY > 0) {
zoom.value = zoom.value <= zoom.min ? zoom.min : zoom.value - zoom.step;
}
let x = (-event.offsetX+500/2)*(zoom.value-1);
let y = (-event.offsetY+337/2)*(zoom.value-1);
image.style.transform = `translate(${x}px,${y}px) scale(${zoom.value}) `
})
div {
width: 500px;
overflow: hidden;
}
img {
width: 100%;
}
<div>
<img src="https://picjumbo.com/wp-content/uploads/free-stock-photos-san-francisco-1080x720.jpg">
</div>
这里是缩放工作示例。我希望图像在图像上的实际鼠标位置上放大。如何做到这一点?没有图书馆。
const image = document.querySelector('img');
const zoom = {
min: 1,
max: 3,
value: 1,
step: 0.1
};
image.addEventListener('wheel', event => {
event.preventDefault();
if (event.deltaY < 0) {
zoom.value = zoom.value >= zoom.max ? zoom.max : zoom.value + zoom.step;
} else if (event.deltaY > 0) {
zoom.value = zoom.value <= zoom.min ? zoom.min : zoom.value - zoom.step;
}
image.style.transform = `scale(${zoom.value})`
}
)
div {
width: 500px;
overflow: hidden;
}
img {
width: 100%;
}
<div>
<img src="https://picjumbo.com/wp-content/uploads/free-stock-photos-san-francisco-1080x720.jpg">
</div>
添加
image.style.transformOrigin = `${event.x}px ${event.y}px`
const image = document.querySelector('img');
const zoom = {
min: 1,
max: 3,
value: 1,
step: 0.1,
originX: 0,
originY: 0
};
image.addEventListener('wheel', event => {
event.preventDefault();
zoom.originX += (event.x-zoom.originX)/zoom.value;
zoom.originY += (event.y-zoom.originY)/zoom.value;
image.style.transformOrigin = zoom.originX+'px '+zoom.originY+'px';
if (event.deltaY < 0) {
zoom.value = zoom.value >= zoom.max ? zoom.max : zoom.value + zoom.step;
} else if (event.deltaY > 0) {
zoom.value = zoom.value <= zoom.min ? zoom.min : zoom.value - zoom.step;
}
image.style.transformOrigin = `${event.x}px ${event.y}px`
image.style.transform = `scale(${zoom.value})`
}
)
div {
width: 500px;
overflow: hidden;
}
img {
width: 100%;
}
<div>
<img src="https://picjumbo.com/wp-content/uploads/free-stock-photos-san-francisco-1080x720.jpg">
</div>
const image = document.querySelector('img');
const zoom = {
min: 1,
max: 3,
value: 1,
step: 0.1
};
var div = document.querySelector('div');
div.addEventListener('wheel', event => {
event.preventDefault();
if (event.deltaY < 0) {
zoom.value = zoom.value >= zoom.max ? zoom.max : zoom.value + zoom.step;
} else if (event.deltaY > 0) {
zoom.value = zoom.value <= zoom.min ? zoom.min : zoom.value - zoom.step;
}
image.style.transform = `scale(${zoom.value})`
var xPerc = (x * 100) / image.width;
var yPerc = (y * 100) / image.height;
image.style.transformOrigin = xPerc + '%' + ' ' + yPerc + '%';
}
)
var x, y;
div.addEventListener('mousemove', e => {
x = e.clientX - div.offsetLeft;
y = e.clientY - div.offsetTop;
})
div {
width: 500px;
overflow: hidden;
}
img {
width: 100%;
}
<div>
<img src="https://picjumbo.com/wp-content/uploads/free-stock-photos-san-francisco-1080x720.jpg">
</div>
试了一下您的示例,发现 transform-origin
可能会成功。添加了相对于图像容器的坐标 x,y 并将它们转换为百分比以设置图像的 tranform-origin
样式 属性.
把你image.style.transform...
改成(500x337是div-图片大小)
let x = (-event.offsetX+500/2)*(zoom.value-1);
let y = (-event.offsetY+337/2)*(zoom.value-1);
image.style.transform = `translate(${x}px,${y}px) scale(${zoom.value}) `
const image = document.querySelector('img');
const zoom = {
min: 1,
max: 3,
value: 1,
step: 0.1
};
image.addEventListener('wheel', event => {
event.preventDefault();
if (event.deltaY < 0) {
zoom.value = zoom.value >= zoom.max ? zoom.max : zoom.value + zoom.step;
} else if (event.deltaY > 0) {
zoom.value = zoom.value <= zoom.min ? zoom.min : zoom.value - zoom.step;
}
let x = (-event.offsetX+500/2)*(zoom.value-1);
let y = (-event.offsetY+337/2)*(zoom.value-1);
image.style.transform = `translate(${x}px,${y}px) scale(${zoom.value}) `
})
div {
width: 500px;
overflow: hidden;
}
img {
width: 100%;
}
<div>
<img src="https://picjumbo.com/wp-content/uploads/free-stock-photos-san-francisco-1080x720.jpg">
</div>