商城我的项目中,有鼠标移入图片放大的性能,钻研一下实现
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Image zoom</title> </head> <style> body { display: flex; justify-content: center; align-items: center; min-height: 100vh; } #image { width: 300px; height: 300px; background-color: #000; background-image: url(https://placekitten.com/900/900); background-size: 300px 300px; background-repeat: no-repeat; } #image[zoomed] { background-size: 900px 900px; background-position: calc(var(--x) * 100%) calc(var(--y) * 100%); } </style> <body> <div id="image"></div> </body> <script> let el = document.querySelector('#image') // PC端操作 el.addEventListener('mouseenter', enterHandler) el.addEventListener('mousemove', moveHandler) el.addEventListener('mouseleave', leaveHandler) // 挪动端操作 el.addEventListener('touchstart', enterHandler) el.addEventListener('touchmove', moveHandler) el.addEventListener('touchend', leaveHandler) function enterHandler(e) { e.target.setAttribute('zoomed', 1) moveHandler(e) } function moveHandler(e) { // getBoundingClientRect用于获取元素绝对于视窗的地位汇合。汇合中有top, right, bottom, left等属性 let rect = e.target.getBoundingClientRect() let offsetX, offsetY let isH5 = ['touchstart', 'touchmove', 'touchend'].includes(e.type) // 是挪动端,并且touches事件存在 if (isH5 && e.touches[0]) { offsetX = e.touches[0].pageX - rect.left offsetY = e.touches[0].pageY - rect.top e.preventDefault() } else { // PC端 offsetX = e.offsetX offsetY = e.offsetY } // 元素的地位信息 let x = offsetX / rect.width let y = offsetY / rect.height // 设置元素属性,用于计算background-position的地位 e.target.style.setProperty('--x', x) e.target.style.setProperty('--y', y) } function leaveHandler(e) { e.target.removeAttribute('zoomed') moveHandler(e) } </script></html>
具体成果复制上来关上看看