javascript - 滚动时卡住所选元素

标签 javascript jquery html css scroll

我有一个要求,当所选元素位于容器的顶部折叠时,我需要将容器中元素列表中的所选元素卡住到顶部。当所选元素位于容器的底部折叠中时,我需要将其粘贴到底部。

如果所选元素在可见折叠中,则不应发生任何事情。我的意思是所选元素应该与其他相邻元素正常流动。

我设法在某种程度上解决了这个问题。但是当我向上滚动时,当所选元素粘在容器上方时,所选元素隐藏了。即使当我向下滚动时,当所选元素粘在容器底部时,也会发生这种行为。

Here is the Fiddle

enter image description here

$('.item').click(function () {
    $('.item').removeClass('select').removeClass('pAbsolute');
    $(this).addClass('select');
});

$('.parent').scroll(function () {
    var $selected = $('.item.select');
    var cTop = $selected.offset().top;
    var cHeight = $selected.height();
    var pHeight = $(this).height();
    if (cTop < 0) {
        $selected.css({
            'top': $(this).scrollTop(),
                'bottom': ''
        }).addClass('pAbsolute');
    } else if (cTop > pHeight - cHeight) {
        $selected.css({
            'bottom': -$(this).scrollTop(),
                'top': ''
        }).addClass('pAbsolute');
    } else {
        $selected.css({
            'top': '',
                'bottom': ''
        }).removeClass('pAbsolute');
    }
});

最佳答案

选择容器时,必须使用一致的值来保持相对于容器的初始偏移量。

然后,计算偏移量和滚动值,

  1. 如果 cTop < 0,这意味着它的顶部超出盒子,坚持到顶部。

  2. 如果cTop + cHeight > pHeight,这意味着它的 View 在底部 block 之外,设置为底部。

  3. 否则留在原地。

编辑:

选择一个新元素时,因为上一项可能具有 .pabsolute attr,当前元素的相对位置可能会更改,但是我们可以通过跟踪偏移量来在这些偏移之前和之后进行偏移类添加/删除操作。

然后我们可以通过手动更改容器的 scrollTop 来添加缺少的高度。

var offset;
$('.item').click(function () {
    // This is the offset in container before class change.
    offset = this.offsetTop;
    $('.item').removeClass('select').removeClass('pAbsolute');
    $(this).addClass('select');
    // Calculate the difference
    var distortion = offset - this.offsetTop;
    
    // Remove the distortion by manual scroll.
    var $parent = $(this).parent();
    $parent.scrollTop($parent.scrollTop() - distortion);
    
    offset = this.offsetTop;
});


$('.parent').scroll(function () {
    var $selected = $('.item.select');
    var cTop = offset - $(this).scrollTop();
    var cHeight = $selected.height();
    var pHeight = $(this).height();
    if (cTop < 0) {
        $selected.css({
            'top': $(this).scrollTop(),
                'bottom': ''
        }).addClass('pAbsolute');
    } else if (cTop + cHeight > pHeight) {
        $selected.css({
            'bottom': -$(this).scrollTop(),
                'top': ''
        }).addClass('pAbsolute');
    } else {
        $selected.css({
            'top': '',
                'bottom': ''
        }).removeClass('pAbsolute');
    }
});
body, html {
    padding: 0;
    margin: 0;
}
.parent {
    overflow: auto;
    height: 200px;
    position: relative;
}
.item {
    padding: 10px 15px;
    background-color: tomato;
    width: 100%;
}
.item.select {
    background-color: beige;
}
.pAbsolute {
    position: absolute;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="parent">
    <div class="item select">1</div>
    <div class="item">2</div>
    <div class="item">3</div>
    <div class="item">4</div>
    <div class="item">5</div>
    <div class="item">6</div>
    <div class="item">7</div>
    <div class="item">8</div>
    <div class="item">9</div>
    <div class="item">10</div>
    <div class="item">11</div>
    <div class="item">12</div>
    <div class="item">13</div>
    <div class="item">14</div>
    <div class="item">15</div>
    <div class="item">16</div>
    <div class="item">17</div>
    <div class="item">18</div>
    <div class="item">19</div>
    <div class="item">20</div>
    <div class="item">21</div>
    <div class="item">22</div>
    <div class="item">23</div>
    <div class="item">24</div>
    <div class="item">25</div>
    <div class="item">26</div>
    <div class="item">27</div>
    <div class="item">28</div>
    <div class="item">29</div>
    <div class="item">30</div>
    <div class="item">31</div>
    <div class="item">32</div>
    <div class="item">33</div>
    <div class="item">34</div>
    <div class="item">35</div>
    <div class="item">36</div>
    <div class="item">37</div>
    <div class="item">38</div>
    <div class="item">39</div>
    <div class="item">40</div>
    <div class="item">41</div>
</div>

关于javascript - 滚动时卡住所选元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31448349/

相关文章:

javascript - 如何将更改后的值存储到 JavaScript 对象中?

将 html 转换为 bbcode 的 Javascript,用于带有链接的图像

html - 全高侧边栏和带有粘性页脚布局的内容

javascript - AngularJS 使用 bind(this)

php - 如何在用户通过PHP填写表单后自动生成页面?

javascript - 使用 AJAX 下载文件。从 SD 卡。

javascript - 仅在选定的特定值上显示输入文本

javascript - HTML: 在字符串中嵌套 '

javascript - 使用 jQuery 和 CSS3 自定义圆形光标

javascript - 旋转并保持 Font Awesome 图标的位置