防止固定位置的背景在点击事件上跳转到页面顶部



我为页面上的多个图像开发了一个图像/灯箱查看器。打开查看器时,它会将.no-scroll类添加到 <body> 标记。除了其他一切正常运行之外,我还试图弄清楚为什么每次提示 .click(( 事件时,.no-scroll类都会跳转到页面顶部。

我已经读到这可能与应用position: fixed;有关,但由于我需要在这种情况下修复位置,因此似乎没有大量的解决方法。我什至尝试过应用 position: absolute;,但这并没有产生我想要的结果,因为它不会阻止身体背景在移动设备上垂直滚动(而position: fixed;能够(。

这是一个片段,应该进一步说明手头的问题:

$('.pic > img').click(function() {
  var srcToCopy = $(this).attr('src');
  $('body').find('.imgsrc').attr('src', srcToCopy);
  $('body').addClass('no-scroll');
  $('#view').addClass("target");
});
$('#customlightbox-controls').on('click', function() {
  $('body').removeClass('no-scroll');
  $('#view').removeClass("target");
});
body {
  background: url('http://2.bp.blogspot.com/-FFEo8jRHyI8/TtEKfbM9UTI/AAAAAAAAADk/Nj1P4BnDyro/s1600/Grass+00+seamless.jpg');
  background-size: cover;
  margin: 0;
  padding: 0;
  border: 0;
  height: auto;
  width: 100%;
}
body.no-scroll {
  overflow: hidden;
  height: auto;
  width: 100%;
}
.pic,
#imgsrc {
  display: inline-block;
  cursor: pointer;
}
img {
  width: 150px
}
a {
  display: inline-block;
  line-height: 0;
}
.container {
  text-align: center;
  display: block;
  width: 100%;
  line-height: 0;
}
.customlightbox {
  top: 0%;
  bottom: 0%;
  box-sizing: border-box;
  position: fixed;
  left: 0;
  right: 0;
  background: rgba(0, 0, 0, 0.7);
  z-index: -5;
  opacity: 0;
}
.customlightbox-imgwrap {
  width: 100%;
  height: 100%;
  padding: 20px;
  box-sizing: border-box;
  position: relative;
  text-align: center;
}
.customlightbox img {
  width: auto;
  margin: auto;
  max-width: 100%;
  max-height: 100%;
  opacity: 0;
  position: relative;
  top: 50%;
  transform: translateY(-50%);
}
#customlightbox-controls {
  cursor: pointer;
  box-sizing: border-box;
  position: fixed;
  height: 50px;
  width: 50px;
  top: -50px;
  right: -3px;
  z-index: 5;
  border-left: 2px solid white;
  border-bottom: 2px solid white;
  opacity: .7;
}
#close-customlightbox {
  display: block;
  position: absolute;
  overflow: hidden;
  height: 30px;
  width: 30px;
  right: 10px;
  top: 10px;
  -webkit-transform: rotate(45deg);
  -moz-transform: rotate(45deg);
  -ms-transform: rotate(45deg);
  -o-transform: rotate(45deg);
  transform: rotate(45deg);
}
#close-customlightbox:before {
  content: "";
  display: block;
  position: absolute;
  height: 0px;
  width: 2px;
  left: 14px;
  top: 0;
  background: white;
  border-radius: 2px;
}
#close-customlightbox:after {
  content: "";
  display: block;
  position: absolute;
  width: 0px;
  height: 2px;
  top: 14px;
  left: 0;
  background: white;
  border-radius: 2px;
}
.customlightbox.target {
  z-index: 4;
  opacity: 1;
  display: inline-block;
}
.customlightbox.target img {
  opacity: 1;
}
.customlightbox.target~#customlightbox-controls {
  top: -3px;
}
.customlightbox.target~#customlightbox-controls #close-customlightbox:after {
  width: 30px;
}
.customlightbox.target~#customlightbox-controls #close-customlightbox:before {
  height: 30px;
}
.lb-animate {
  -webkit-transition: 0.5s ease-in-out;
  -moz-transition: 0.5s ease-in-out;
  -ms-transition: 0.5s ease-in-out;
  -o-transition: 0.5s ease-in-out;
  transition: 0.5s ease-in-out;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!-- Lightbox Instance 1 -->
<div class="container">
  <div class="pic">
    <img src="https://syedimranrocks.files.wordpress.com/2012/09/flower01low1.png">
  </div>
</div>
<!-- Lightbox Instance 2 -->
<div class="container">
  <div class="pic">
    <img src="http://downloadicons.net/sites/default/files/Rose-Coral-Icon-906534.png">
  </div>
</div>
<!-- Lightbox Instance 3 -->
<div class="container">
  <div class="pic">
    <img src="https://images.vexels.com/media/users/3/136645/isolated/lists/54b1517db1906889a6971939de45d2a8-purple-sunflower-cartoon.png">
  </div>
</div>
<!-- Lightbox Instance 4 -->
<div class="container">
  <div class="pic">
    <img src="http://i2.wp.com/lfisdelhi.com/wp-content/uploads/2016/05/Sunflower-icon.png">
  </div>
</div>
<!-- Lightbox Instance 5 -->
<div class="container">
  <div class="pic">
    <img src="http://icongal.com/gallery/image/203372/birthday_flower_love_valentine_yellow_rose.png">
  </div>
</div>
<!-- Lightbox Controls -->
<div class="customlightbox lb-animate" id="view">
  <div class="customlightbox-imgwrap">
    <img class="imgsrc" id="customlightbox-img" src="">
  </div>
</div>
<div id="customlightbox-controls" class="lb-animate">
  <a id="close-customlightbox" class="lb-animate"></a>
</div>

只需要删除position: fixed;

var $scrollTop = 0;
$('.pic > img').click(function () {
    var $body = $('body');
    $scrollTop = $(window).scrollTop();
    $body.css('position', 'fixed');
    $body.css('top', '-' + $scrollTop + 'px');
    $body.css('background-position', '0 -' + $scrollTop + 'px');
    var srcToCopy = $(this).attr('src');
    $body.find('.imgsrc').attr('src', srcToCopy);
    $body.addClass('no-scroll');
    $('#view').addClass("target");
});
$('#customlightbox-controls').on('click', function () {
    var $body = $('body');
    $body.css('position', '');
    $body.css('background-position', '');
    $scrollTop = $(window).scrollTop($scrollTop);
    $body.removeClass('no-scroll');
    $('#view').removeClass("target");
});
body {
  background: url('http://2.bp.blogspot.com/-FFEo8jRHyI8/TtEKfbM9UTI/AAAAAAAAADk/Nj1P4BnDyro/s1600/Grass+00+seamless.jpg');
  background-size: cover;
  margin: 0;
  padding: 0;
  border: 0;
  height: 100%;
  width: 100%;
}
body.no-scroll {
    overflow: hidden;
    height: auto;
    width: 100%;
}
.pic,
#imgsrc {
    display: inline-block;
    cursor: pointer;
}
img {
    width: 150px
}
a {
    display: inline-block;
    line-height: 0;
}
.container {
    display: block;
    width: 100%;
    line-height: 0;
}
.customlightbox {
    top: 0%;
    bottom: 0%;
    box-sizing: border-box;
    position: fixed;
    left: 0;
    right: 0;
    background: rgba(0, 0, 0, 0.7);
    z-index: -5;
    opacity: 0;
}
.customlightbox-imgwrap {
    width: 100%;
    height: 100%;
    padding: 20px;
    box-sizing: border-box;
    position: relative;
    text-align: center;
}
.customlightbox img {
    width: auto;
    margin: auto;
    max-width: 100%;
    max-height: 100%;
    opacity: 0;
    position: relative;
    top: 50%;
    transform: translateY(-50%);
}
#customlightbox-controls {
    cursor: pointer;
    box-sizing: border-box;
    position: fixed;
    height: 50px;
    width: 50px;
    top: -50px;
    right: -3px;
    z-index: 5;
    border-left: 2px solid white;
    border-bottom: 2px solid white;
    opacity: .7;
}
#close-customlightbox {
    display: block;
    position: absolute;
    overflow: hidden;
    height: 30px;
    width: 30px;
    right: 10px;
    top: 10px;
    -webkit-transform: rotate(45deg);
    -moz-transform: rotate(45deg);
    -ms-transform: rotate(45deg);
    -o-transform: rotate(45deg);
    transform: rotate(45deg);
}
#close-customlightbox:before {
    content: "";
    display: block;
    position: absolute;
    height: 0px;
    width: 2px;
    left: 14px;
    top: 0;
    background: white;
    border-radius: 2px;
}
#close-customlightbox:after {
    content: "";
    display: block;
    position: absolute;
    width: 0px;
    height: 2px;
    top: 14px;
    left: 0;
    background: white;
    border-radius: 2px;
}
.customlightbox.target {
    z-index: 4;
    opacity: 1;
    display: inline-block;
}
.customlightbox.target img {
    opacity: 1;
}
.customlightbox.target ~ #customlightbox-controls {
    top: -3px;
}
.customlightbox.target ~ #customlightbox-controls #close-customlightbox:after {
    width: 30px;
}
.customlightbox.target ~ #customlightbox-controls #close-customlightbox:before {
    height: 30px;
}
.lb-animate {
    -webkit-transition: 0.5s ease-in-out;
    -moz-transition: 0.5s ease-in-out;
    -ms-transition: 0.5s ease-in-out;
    -o-transition: 0.5s ease-in-out;
    transition: 0.5s ease-in-out;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!-- Lightbox Instance 1 -->
<div class="container">
  <div class="pic">
    <img src="https://syedimranrocks.files.wordpress.com/2012/09/flower01low1.png">
  </div>
</div>
<!-- Lightbox Instance 2 -->
<div class="container">
  <div class="pic">
    <img src="http://downloadicons.net/sites/default/files/Rose-Coral-Icon-906534.png">
  </div>
</div>
<!-- Lightbox Instance 3 -->
<div class="container">
  <div class="pic">
    <img src="https://images.vexels.com/media/users/3/136645/isolated/lists/54b1517db1906889a6971939de45d2a8-purple-sunflower-cartoon.png">
  </div>
</div>
<!-- Lightbox Instance 4 -->
<div class="container">
  <div class="pic">
    <img src="http://i2.wp.com/lfisdelhi.com/wp-content/uploads/2016/05/Sunflower-icon.png">
  </div>
</div>
<!-- Lightbox Instance 5 -->
<div class="container">
  <div class="pic">
    <img src="https://www.iconexperience.com/_img/v_collection_png/256x256/shadow/flower_blue.png">
  </div>
</div>
<!-- Lightbox Controls -->
<div class="customlightbox lb-animate" id="view">
  <div class="customlightbox-imgwrap">
    <img class="imgsrc" id="customlightbox-img" src="">
  </div>
</div>
<div id="customlightbox-controls" class="lb-animate">
  <a id="close-customlightbox" class="lb-animate"></a>
</div>

编辑

以上是代码片段的更新,希望它最终对您有所帮助。

如果我

理解正确,您需要从body.no-scroll中删除固定的位置。将固定位置应用于元素会将其从文档流中删除。然后,该元素将相对于视口进行定位,并且由于主体基本上定义了视口,因此没有相对于它具有滚动的相对内容,因此浏览器默认位于页面顶部。

对不起,如果这没有任何意义,这里已经晚了。posititon:fixed on mozilla的这个定义可能会有所帮助。https://developer.mozilla.org/en-US/docs/Web/CSS/position#fixed

编辑

:编辑是因为@Yulio阿莱曼·希门尼斯(Aleman Jimenez(表明.lb-animate不需要position:fixed,这就是我的想法。

$('.pic > img').click(function() {
  var srcToCopy = $(this).attr('src');
  $('body').find('.imgsrc').attr('src', srcToCopy);
  $('body').addClass('no-scroll');
  $('#view').addClass("target");
});
$('#customlightbox-controls').on('click', function() {
  $('body').removeClass('no-scroll');
  $('#view').removeClass("target");
});
body {
  margin: 0;
  padding: 0;
  border: 0;
  height: 100%;
  width: 100%;
}
body.no-scroll {
  overflow: hidden;
  height: auto;
  width: 100%;
}
.pic,
#imgsrc {
  display: inline-block;
  cursor: pointer;
}
img {
  width: 150px
}
a {
  display: inline-block;
  line-height: 0;
}
.container {
  display: block;
  width: 100%;
  line-height: 0;
}
.customlightbox {
  top: 0%;
  bottom: 0%;
  box-sizing: border-box;
  position: fixed;
  left: 0;
  right: 0;
  background: rgba(0, 0, 0, 0.7);
  z-index: -5;
  opacity: 0;
}
.customlightbox-imgwrap {
  width: 100%;
  height: 100%;
  padding: 20px;
  box-sizing: border-box;
  position: relative;
  text-align: center;
}
.customlightbox img {
  width: auto;
  margin: auto;
  max-width: 100%;
  max-height: 100%;
  opacity: 0;
  position: relative;
  top: 50%;
  transform: translateY(-50%);
}
#customlightbox-controls {
  cursor: pointer;
  box-sizing: border-box;
  position: fixed;
  height: 50px;
  width: 50px;
  top: -50px;
  right: -3px;
  z-index: 5;
  border-left: 2px solid white;
  border-bottom: 2px solid white;
  opacity: .7;
}
#close-customlightbox {
  display: block;
  position: absolute;
  overflow: hidden;
  height: 30px;
  width: 30px;
  right: 10px;
  top: 10px;
  -webkit-transform: rotate(45deg);
  -moz-transform: rotate(45deg);
  -ms-transform: rotate(45deg);
  -o-transform: rotate(45deg);
  transform: rotate(45deg);
}
#close-customlightbox:before {
  content: "";
  display: block;
  position: absolute;
  height: 0px;
  width: 2px;
  left: 14px;
  top: 0;
  background: white;
  border-radius: 2px;
}
#close-customlightbox:after {
  content: "";
  display: block;
  position: absolute;
  width: 0px;
  height: 2px;
  top: 14px;
  left: 0;
  background: white;
  border-radius: 2px;
}
.customlightbox.target {
  z-index: 4;
  opacity: 1;
  display: inline-block;
}
.customlightbox.target img {
  opacity: 1;
}
.customlightbox.target~#customlightbox-controls {
  top: -3px;
}
.customlightbox.target~#customlightbox-controls #close-customlightbox:after {
  width: 30px;
}
.customlightbox.target~#customlightbox-controls #close-customlightbox:before {
  height: 30px;
}
.lb-animate {
  -webkit-transition: 0.5s ease-in-out;
  -moz-transition: 0.5s ease-in-out;
  -ms-transition: 0.5s ease-in-out;
  -o-transition: 0.5s ease-in-out;
  transition: 0.5s ease-in-out;
  position: fixed;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!-- Lightbox Instance 1 -->
<div class="container">
  <div class="pic">
    <img src="https://syedimranrocks.files.wordpress.com/2012/09/flower01low1.png">
  </div>
</div>
<!-- Lightbox Instance 2 -->
<div class="container">
  <div class="pic">
    <img src="http://downloadicons.net/sites/default/files/Rose-Coral-Icon-906534.png">
  </div>
</div>
<!-- Lightbox Instance 3 -->
<div class="container">
  <div class="pic">
    <img src="https://images.vexels.com/media/users/3/136645/isolated/lists/54b1517db1906889a6971939de45d2a8-purple-sunflower-cartoon.png">
  </div>
</div>
<!-- Lightbox Instance 4 -->
<div class="container">
  <div class="pic">
    <img src="http://i2.wp.com/lfisdelhi.com/wp-content/uploads/2016/05/Sunflower-icon.png">
  </div>
</div>
<!-- Lightbox Instance 5 -->
<div class="container">
  <div class="pic">
    <img src="https://www.iconexperience.com/_img/v_collection_png/256x256/shadow/flower_blue.png">
  </div>
</div>
<!-- Lightbox Controls -->
<div class="customlightbox lb-animate" id="view">
  <div class="customlightbox-imgwrap">
    <img class="imgsrc" id="customlightbox-img" src="">
  </div>
</div>
<div id="customlightbox-controls" class="lb-animate">
  <a id="close-customlightbox" class="lb-animate"></a>
</div>

最新更新