Modal图片画廊关闭后跳转至顶部的问题咨询
问题描述
我正在开发一个Modal图片画廊,点击前两张图片可放大查看,但关闭图片后页面会跳转至顶部。请问能否实现关闭后停留在页面原位置,而非滚动到顶部?
复现步骤:
- 点击顶部前两张图片打开放大视图
- 向下滚动页面一点
- 点击关闭按钮,页面会跳回顶部
原代码如下:
CSS 代码
* { box-sizing: border-box; } body { margin: 0; font-family: sans-serif; background: #f5f6f7; } .header { text-align: center; text-transform: uppercase; padding: 32px; background-color: #0a0a23; color: #fff; border-bottom: 4px solid #fdb347; } .gallery { display: flex; flex-direction: row; flex-wrap: wrap; justify-content: center; align-items: center; gap: 16px; max-width: 1400px; margin: 0 auto; padding: 20px 10px; } .gallery img { width: 100%; max-width: 350px; height: 300px; object-fit: cover; border-radius: 10px; } .gallery::after { content: ""; width: 350px; } .lightbox-target { position: fixed; top: -100%; width: 100%; background: rgba(0,0,0,.7); width: 100%; opacity: 0; -webkit-transition: opacity .5s ease-in-out; -moz-transition: opacity .5s ease-in-out; -o-transition: opacity .5s ease-in-out; transition: opacity .5s ease-in-out; overflow: hidden; } .lightbox-target img { margin: auto; position: absolute; top: 0; left:0; right:0; bottom: 0; max-height: 0%; max-width: 0%; border: 3px solid white; box-shadow: 0px 0px 8px rgba(0,0,0,.3); box-sizing: border-box; -webkit-transition: .5s ease-in-out; -moz-transition: .5s ease-in-out; -o-transition: .5s ease-in-out; transition: .5s ease-in-out; } a.lightbox-close { display: block; width:50px; height:50px; box-sizing: border-box; background: white; color: black; text-decoration: none; position: absolute; top: -80px; right: 0; -webkit-transition: .5s ease-in-out; -moz-transition: .5s ease-in-out; -o-transition: .5s ease-in-out; transition: .5s ease-in-out; } a.lightbox-close:before { content: ""; display: block; height: 30px; width: 1px; background: black; position: absolute; left: 26px; top:10px; -webkit-transform:rotate(45deg); -moz-transform:rotate(45deg); -o-transform:rotate(45deg); transform:rotate(45deg); } a.lightbox-close:after { content: ""; display: block; height: 30px; width: 1px; background: black; position: absolute; left: 26px; top:10px; -webkit-transform:rotate(-45deg); -moz-transform:rotate(-45deg); -o-transform:rotate(-45deg); transform:rotate(-45deg); } .lightbox-target:target { opacity: 1; top: 0; bottom: 0; overflow:scroll; } .lightbox-target:target img { max-height: 100%; max-width: 100%; } .lightbox-target:target a.lightbox-close { top: 0; }
HTML 代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Modal images test</title> <link rel="stylesheet" href="./styles.css"> </head> <body> <header class="header"> <h1>css flexbox photo gallery</h1> </header> <div class="gallery"> <a class="lightbox" href="#dog"><img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/1.jpg"></a> <a class="lightbox" href="#dog2"><img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/2.jpg"></a> <img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/3.jpg"> <img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/4.jpg"> <img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/5.jpg"> <img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/6.jpg"> <img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/7.jpg"> <img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/8.jpg"> <img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/9.jpg"> </div> <div class="lightbox-target" id="dog"> <img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/1.jpg"/> <a class="lightbox-close" href="#"></a> </div> <div class="lightbox-target" id="dog2"> <img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/2.jpg"/> <a class="lightbox-close" href="#"></a> </div> </body> </html>
问题原因
问题出在关闭按钮的<a class="lightbox-close" href="#"></a>:点击该链接时,浏览器会默认跳转到页面锚点#,也就是页面顶部,导致滚动位置丢失。同时原实现依赖:target伪类控制lightbox的显示/隐藏,点击#会清除当前target,从而关闭lightbox。
解决方案
我们可以通过JavaScript阻止默认跳转+保留滚动位置来解决,同时保留原CSS的过渡动画效果:
修改后的完整代码
HTML 部分
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Modal images test</title> <link rel="stylesheet" href="./styles.css"> </head> <body> <header class="header"> <h1>css flexbox photo gallery</h1> </header> <div class="gallery"> <a class="lightbox" href="#dog"><img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/1.jpg"></a> <a class="lightbox" href="#dog2"><img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/2.jpg"></a> <img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/3.jpg"> <img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/4.jpg"> <img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/5.jpg"> <img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/6.jpg"> <img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/7.jpg"> <img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/8.jpg"> <img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/9.jpg"> </div> <div class="lightbox-target" id="dog"> <img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/1.jpg"/> <a class="lightbox-close" href="javascript:void(0)"></a> </div> <div class="lightbox-target" id="dog2"> <img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/2.jpg"/> <a class="lightbox-close" href="javascript:void(0)"></a> </div> <script> document.querySelectorAll('.lightbox-close').forEach(closeBtn => { closeBtn.addEventListener('click', function() { // 保存当前滚动位置 const currentScroll = window.scrollY; // 移除URL中的hash,触发lightbox关闭(原CSS的:target伪类失效) window.history.replaceState(null, document.title, window.location.pathname + window.location.search); // 恢复滚动位置 window.scrollTo(0, currentScroll); }); }); </script> </body> </html>
核心修改点
- 将关闭按钮的
href改为javascript:void(0),阻止默认跳转行为 - 添加JavaScript代码:
- 点击关闭按钮时保存当前滚动位置
- 通过
history.replaceState移除URL中的hash,让原CSS的:target伪类失效,自动关闭lightbox - 恢复之前保存的滚动位置,确保页面停留在原位置
CSS代码无需修改,原有的过渡动画会正常生效。
内容的提问来源于stack exchange,提问作者michalb93
相关产品推荐
相关产品推荐

