如何使固定元素保持相对于当前顶部滚动位置?

时间:2018-03-04 22:11:53

标签: javascript jquery position fixed

原始问题:

我有一个函数在提示时打开一个覆盖的fixed - 定位元素,我试图弄清楚如何在当前top位置打开它,而不是跳跃每次top: 0类处于活动状态时,都会在页面顶部(.no-scroll)。

到目前为止,这是我取得的进展:

var o = 0;
$("img.click").click(function() {
  var s = $("html, body");
  o = $(window).scrollTop(), s.css("position", "fixed"), s.css("background-position", "0 -" + o + "px");
  var i = $(this).attr("src");
  s.find("#img-open").attr("src", i), s.addClass("no-scroll"), $("#img-view").addClass("target");
});

我还在.no-scrollhtml代码中应用了body课程:

html {
  height: initial;
}

body {
  height: auto;
}

body.no-scroll,
html.no-scroll {
  overflow: hidden;
  -webkit-overflow-scrolling: touch;
}

更新(应用于代码段+附加说明):

感谢this answer,我能够调整一些额外的东西:

  1. no-scroll标记不需要html类。因此,它已被删除。
  2. 我在preventDefault()触摸事件中添加了touchmove,这使得body背景内容无法在iOS Safari等移动浏览器上滚动(截至2018年)。
  3. $(document).ready(function() {
      $("a.lbimg > img.lb-click").click(function() {
        $("#lb-view").addClass("target");
        var o = document.documentElement.scrollTop || document.body.scrollTop;
        $('body').addClass('no-scroll');
        document.documentElement.scrollTop = document.body.scrollTop = o;
        $('body').bind('touchmove', function(e) {
          e.preventDefault();
        });
      });
      $(".lbimg-wrap, #lb-controls").on("click", function(s) {
        $("#lb-view").removeClass("target");
        $('body').removeClass('no-scroll');
        $('body').unbind('touchmove');
      });
    });
    body {
      height: auto;
    }
    
    body,
    html {
      width: 100%;
      background-size: cover;
      background-repeat: no-repeat;
    }
    
    body {
      background: #808080;
      margin: 0;
      padding: 0;
      border: 0;
    }
    
    body.no-scroll {
      overflow: hidden;
    }
    
    p.content {
      color: white;
    }
    
    img {
      padding: 5px;
      border: 1px solid;
      box-sizing: border-box;
      z-index: 1;
    }
    
    .img-wrap {
      display: block;
    }
    
    .img-wrap img {
      line-height: 0;
      display: block;
    }
    
    a.lbimg {
      cursor: pointer;
      display: block;
      line-height: 0;
    }
    
    a.lbimg img {
      margin: 0 auto;
      padding: 0;
      border: 0;
    }
    
    .lb-click {
      width: 25%;
      height: auto;
    }
    
    .customlightbox {
      top: 0;
      bottom: 0;
      -webkit-box-sizing: border-box;
      box-sizing: border-box;
      position: fixed;
      left: 0;
      right: 0;
      background: rgba(0, 0, 0, 0.7);
      opacity: 0;
      z-index: -1;
    }
    
    .lbimg-wrap {
      width: 100%;
      height: 100%;
      padding: 47px;
      -webkit-box-sizing: border-box;
      box-sizing: border-box;
      position: relative;
      text-align: center;
    }
    
    .customlightbox img {
      border-color: white;
      width: auto;
      margin: auto;
      max-width: 100%;
      max-height: 100%;
      opacity: 0;
      position: relative;
      top: 50%;
      -webkit-transform: translateY(-50%);
      -ms-transform: translateY(-50%);
      transform: translateY(-50%);
    }
    
    #lb-controls {
      cursor: pointer;
      -webkit-box-sizing: border-box;
      box-sizing: border-box;
      position: fixed;
      height: 50px;
      width: 50px;
      top: -50px;
      right: -3px;
      border-left: 1px solid;
      border-bottom: 1px solid;
      border-color: white;
      z-index: 3;
    }
    
    #lb-close {
      display: block;
      position: absolute;
      overflow: hidden;
      height: 30px;
      width: 30px;
      right: 10px;
      top: 10px;
      -webkit-transform: rotate(45deg);
      -ms-transform: rotate(45deg);
      transform: rotate(45deg);
    }
    
    #lb-close:before,
    #lb-close:after {
      content: '';
      display: block;
      position: absolute;
      background: white;
      -webkit-border-radius: 2px;
      -moz-border-radius: 2px;
      border-radius: 2px;
    }
    
    #lb-close:before {
      width: 2px;
      height: 0;
      top: 0;
      left: 14px;
    }
    
    #lb-close:after {
      width: 0;
      height: 2px;
      top: 14px;
      left: 0;
    }
    
    .customlightbox.target {
      display: inline-block;
      z-index: 2;
    }
    
    .customlightbox.target,
    .customlightbox.target img {
      opacity: 1;
    }
    
    .customlightbox.target~#lb-controls {
      top: -3px;
    }
    
    .customlightbox.target~#lb-controls #lb-close:after {
      width: 30px;
    }
    
    .customlightbox.target~#lb-controls #lb-close:before {
      height: 30px;
    }
    
    .lb-animate {
      -webkit-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>
    
    <body>
    
      <p class="content">
        Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content
        to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content
        to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content
        to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content
        to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content
        to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll.
      </p>
    
      <div class="img-wrap">
        <a class="lbimg">
          <img class="lb-click" src="https://78.media.tumblr.com/8b1b8cbb2b963ab64eb2341f608638bf/tumblr_p4wbo7ZLJS1qccr26o1_1280.jpg">
        </a>
        <div class="customlightbox lb-animate" id="lb-view">
          <div class="lbimg-wrap">
            <img class="lb-animate" id="lbimg-open" src="https://78.media.tumblr.com/8b1b8cbb2b963ab64eb2341f608638bf/tumblr_p4wbo7ZLJS1qccr26o1_1280.jpg">
          </div>
        </div>
        <div id="lb-controls" class="lb-animate">
          <a id="lb-close" class="lb-animate"></a>
        </div>
      </div>
    
      <p class="content">
        Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content
        to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content
        to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content
        to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content
        to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content
        to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll. Content to scroll.
      </p>
    
    </body>

1 个答案:

答案 0 :(得分:1)

你快到了那里:

&#13;
&#13;
7
&#13;
$(document).ready(function() {

  $("a.lbimg > img.lb-click").click(function() {
    $("#lb-view").addClass("target");
    var o = document.documentElement.scrollTop || document.body.scrollTop;
    $('html, body').addClass('no-scroll');
    document.documentElement.scrollTop = document.body.scrollTop = o;
  });

  $(".lbimg-wrap, #lb-controls").on("click", function(s) {
      $("#lb-view").removeClass("target");
      $('html, body').removeClass('no-scroll');
  });
  
});
&#13;
html {
  height: initial;
}

body {
  height: auto;
}

body,
html {
  width: 100%;
  background-size: cover;
  background-repeat: no-repeat;
}

body {
  background: #808080;
  margin: 0;
  padding: 0;
  border: 0;
}

body.no-scroll,
html.no-scroll {
  overflow: hidden;
}

p.content {
  color: white;
}

img {
  padding: 5px;
  border: 1px solid;
  box-sizing: border-box;
  z-index: 1;
}

.img-wrap {
  display: block;
}

.img-wrap img {
  line-height: 0;
  display: block;
}

a.lbimg {
  cursor: pointer;
  display: block;
  line-height: 0;
}

a.lbimg img {
  margin: 0 auto;
  padding: 0;
  border: 0;
}

.lb-click {
  width: 25%;
  height: auto;
}

.customlightbox {
  top: 0;
  bottom: 0;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
  position: fixed;
  left: 0;
  right: 0;
  background: rgba(0, 0, 0, 0.7);
  opacity: 0;
  z-index: -1;
}

.lbimg-wrap {
  width: 100%;
  height: 100%;
  padding: 47px;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
  position: relative;
  text-align: center;
}

.customlightbox img {
  border-color: rgba(255, 255, 255, .5);
  width: auto;
  margin: auto;
  max-width: 100%;
  max-height: 100%;
  opacity: 0;
  position: relative;
  top: 50%;
  -webkit-transform: translateY(-50%);
  -ms-transform: translateY(-50%);
  transform: translateY(-50%);
}

#lb-controls {
  cursor: pointer;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
  position: fixed;
  height: 50px;
  width: 50px;
  top: -50px;
  right: -3px;
  border-left: 1px solid;
  border-bottom: 1px solid;
  opacity: .7;
  border-color: rgba(255, 255, 255, .7) !important;
  z-index: 3;
}

#lb-close {
  display: block;
  position: absolute;
  overflow: hidden;
  height: 30px;
  width: 30px;
  right: 10px;
  top: 10px;
  -webkit-transform: rotate(45deg);
  -ms-transform: rotate(45deg);
  transform: rotate(45deg);
}

#lb-close:before,
#lb-close:after {
  content: '';
  display: block;
  position: absolute;
  background: white;
  -webkit-border-radius: 2px;
  -moz-border-radius: 2px;
  border-radius: 2px;
}

#lb-close:before {
  width: 2px;
  height: 0;
  top: 0;
  left: 14px;
}

#lb-close:after {
  width: 0;
  height: 2px;
  top: 14px;
  left: 0;
}

.customlightbox.target {
  opacity: 1;
  display: inline-block;
  z-index: 2;
}

.customlightbox.target img {
  opacity: 1;
}

.customlightbox.target~#lb-controls {
  top: -3px;
}

.customlightbox.target~#lb-controls #lb-close:after {
  width: 30px;
}

.customlightbox.target~#lb-controls #lb-close:before {
  height: 30px;
}

.lb-animate {
  -webkit-transition: 0.5s ease-in-out;
  -o-transition: 0.5s ease-in-out;
  transition: 0.5s ease-in-out;
}
&#13;
&#13;
&#13;

相关问题