灯箱图片放大
灯箱(Lightbox):点缩略图后整屏暗化、图片居中放大展示,点空白或 Esc 关闭。结构:遮罩层 + 大图 img,点击缩略图把 src 传给大图并显示层;图片可加比例过渡做“从原位展开”动画。
进阶:左右箭头切换上一张/下一张;显示加载 loading;加上 e.preventDefault() 阻止href 跳转。
- 点缩略图:把大图 src 设给灯箱 img,遮罩 .show
- 点遮罩空白 / Esc 关闭;大图阻止冒泡
- 进阶:上一张/下一张按钮与原图位置展开动画
HTML
<style> #lbgs .thumbs { display: flex; gap: 12px; justify-content: center; padding: 20px 0; } #lbgs .thumbs img { width: 110px; height: 74px; object-fit: cover; border-radius: 8px; cursor: pointer; transition: transform .25s; } #lbgs .thumbs img:hover { transform: scale(1.06); } #lbMask { position: fixed; inset: 0; background: rgba(0,0,0,.85); display: flex; align-items: center; justify-content: center; opacity: 0; visibility: hidden; transition: .3s ease; } #lbMask.show { opacity: 1; visibility: visible; } #lbMask img { max-width: 80vw; max-height: 72vh; border-radius: 10px; transform: scale(.9); transition: .3s ease; } #lbMask.show img { transform: scale(1); } #lbMask .nav { position: fixed; color: #fff; font-size: 34px; cursor: pointer; top: 50%; transform: translateY(-50%); user-select: none; } #lbMask .pv { left: 24px; } #lbMask .nx { right: 24px; } </style> <div id="lbgs"><div class="thumbs"> <img src="https://picsum.photos/seed/a/640/400" alt="图1"> <img src="https://picsum.photos/seed/b/640/400" alt="图2"> <img src="https://picsum.photos/seed/c/640/400" alt="图3"> </div></div> <div id="lbMask"> <span class="nav pv">‹</span><img alt="预览"><span class="nav nx">›</span> </div> <script> var mask = document.getElementById('lbMask'), big = mask.querySelector('img'); var imgs = document.querySelectorAll('#lbgs .thumbs img'); var idx = 0; function show(i) { idx = (i + imgs.length) % imgs.length; big.src = imgs[idx].src.replace('/640/400', '/1200/750'); mask.classList.add('show'); document.body.style.overflow = 'hidden'; } function hide() { mask.classList.remove('show'); document.body.style.overflow = ''; } imgs.forEach(function (im, i) { im.addEventListener('click', function () { show(i); }); }); mask.addEventListener('click', function (e) { if (e.target === mask) hide(); }); mask.querySelector('.pv').addEventListener('click', function (e) { e.stopPropagation(); show(idx - 1); }); mask.querySelector('.nx').addEventListener('click', function (e) { e.stopPropagation(); show(idx + 1); }); document.addEventListener('keydown', function (e) { if (e.key === 'Escape') hide(); }); </script>
本节要点灯箱 = 遮罩 + 大图 src 切换;Esc/空白关闭,左右切换是完整形态。




