图片放大镜特效

一个图片放大镜特效,当用户将鼠标悬停在图片上时,会显示一个放大区域。

关键点总结

  1. 基本布局
  • 使用 Flexbox 布局使内容居中。
  • 设置页面高度为视口高度,并移除默认边距。
  1. 容器和图片
  • .magnifier-container:设置相对定位,宽度为300px,高度为200px。
  • .image:设置图片的宽度和高度为100%,并使用 object-fit: cover 以确保图片覆盖整个容器。
  1. 放大镜玻璃
  • .magnifier-glass:设置绝对定位,初始透明度为0,带有白色边框和阴影。
  • background-image:设置背景图片。
  • background-size:设置背景图片的大小以便放大。
  • pointer-events: none:确保放大镜不会干扰鼠标事件。
  • transition: opacity 0.3s:添加透明度过渡效果。
  1. 鼠标事件处理
  • mousemove 事件:计算鼠标位置并调整放大镜的位置和背景图片的位置。
  • mouseleave 事件:当鼠标离开容器时,隐藏放大镜。

这段代码实现了一个简单的图片放大镜特效,当用户将鼠标悬停在图片上时,会显示一个放大区域,提供更好的细节查看体验。你可以根据需要调整图片、容器大小和其他样式属性。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            background-color: #f0f0f0;
            margin: 0;
            overflow: hidden;
        }
        .magnifier-container {
            position: relative;
            width: 300px;
            height: 200px;
        }
        .image {
            width: 100%;
            height: 100%;
            object-fit: cover;
        }
        .magnifier-glass {
            position: absolute;
            border: 3px solid #fff;
            border-radius: 50%;
            width: 100px;
            height: 100px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
            pointer-events: none;
            opacity: 0;
            transition: opacity 0.3s;
            background-image: url('https://syjm.net/public/demo2.webp'); /* 示例图片 */
            background-repeat: no-repeat;
            background-size: 400% 400%; /* 放大倍数 */
            z-index: 1;
        }
        .magnifier-container:hover .magnifier-glass {
            opacity: 1;
        }
    </style>
</head>
<body>
    <div class="magnifier-container">
        <img src="https://syjm.net/public/demo2.webp" alt="Sample Image" class="image">
        <div class="magnifier-glass"></div>
    </div>

    <script>
        document.addEventListener('DOMContentLoaded', () => {
            const magnifierContainer = document.querySelector('.magnifier-container');
            const magnifierGlass = document.querySelector('.magnifier-glass');

            magnifierContainer.addEventListener('mousemove', (e) => {
				// 获取容器的位置和尺寸
                const rect = magnifierContainer.getBoundingClientRect();
				
				// 计算鼠标相对于容器的位置
                let x = e.clientX - rect.left;
                let y = e.clientY - rect.top;

                // 检查鼠标是否在容器内
				if (x > magnifierContainer.offsetWidth || y > magnifierContainer.offsetHeight || x < 0 || y < 0) {
                    magnifierGlass.style.opacity = 0;  // 鼠标不在容器内时隐藏放大镜
                } else {
                    magnifierGlass.style.opacity = 1;  // 显示放大镜
					
					// 设置放大镜的位置
                    magnifierGlass.style.left = `${x - magnifierGlass.offsetWidth / 2}px`;
                    magnifierGlass.style.top = `${y - magnifierGlass.offsetHeight / 2}px`;

                    // 计算背景图片的位置
					const bgX = ((x / magnifierContainer.offsetWidth) * 100) - 25;
                    const bgY = ((y / magnifierContainer.offsetHeight) * 100) - 25;
					
					// 设置背景图片的位置
                    magnifierGlass.style.backgroundPosition = `${bgX}% ${bgY}%`;
                }
            });

            magnifierContainer.addEventListener('mouseleave', () => {
                magnifierGlass.style.opacity = 0; // 鼠标离开容器时隐藏放大镜
            });
        });
    </script>
</body>
</html>

No responses yet

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注