gpt4 book ai didi

javascript - 滚动时卡住所选元素

转载 作者:搜寻专家 更新时间:2023-10-31 08:27:43 24 4
gpt4 key购买 nike

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

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

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com