根据CanIUse,在position:sticky
元素内存在Safari和overflow:auto
的已知问题:
将父级设置为自动溢出会阻止位置:粘性在Safari中工作
但是,这是我需要的确切用例。我有一个可滚动的div,它分为两列。即使滚动整个div,右列也应该是粘性的,并且永远不要动。我在右列上使用position:sticky
的原因是,我希望用户仍然能够使用光标在右列上来滚动左列。这是我发现可行的唯一解决方案。
此处是Firefox / Chrome的工作示例: http://cssdeck.com/labs/zfiuz4pc 滚动时,橙色区域保持固定,但在Safari中不是。
上面的示例对我的问题有一些不必要的包装,但是我想尽可能地复制要在其中运行此代码的环境。其基本要点是:
<div class="modal-content">
<div class="left-content">
</div>
<div class="sticky-element">
</div>
</div>
和CSS:
.modal-content {
display: flex;
overflow: auto;
flex-flow: row nowrap;
}
.left-content {
flex: 0 0 300px;
}
.sticky-element {
position: sticky;
top: 0;
right: 0;
width: 200px;
}
同样,这在FF / Chrome中有效,但在Safari中无效。有没有变通办法可以使其在所有浏览器中正常工作?还是有一种我可以用来保持滚动性的方法,即使将鼠标光标放在粘性元素上也可以保持滚动性?
答案 0 :(得分:4)
我有一个类似的案例:
<div scroll>
<div sticky />
<list />
</div>
只需用一个 div 包裹滚动内容,就像一个魅力:
<div scroll>
<div>
<div sticky />
<list />
</div>
</div>
答案 1 :(得分:3)
将display: block
添加到.sticky-element
对我来说很有效,而不必添加position: -webkit-sticky
。在this Codepen找到了这个解决方案。
答案 2 :(得分:1)
我从别人那里得到了这个解决方案:
http://cssdeck.com/labs/bu0nx69w
基本上,右面板使用position:sticky
而不是position:fixed
。关键还在于您will-change:transform
在父div中(在上述示例中,在.modal-content
中),因此position:fixed
相对于该父而不是视口是固定的。这是一个整洁的小把戏
答案 3 :(得分:1)
只需添加position: -webkit-sticky;
答案 4 :(得分:1)
position: sticky
将不起作用,如果您的父元素有 overflow: hidden
。有了这个 sticky
设置,它会自动将您的元素从 relative to actual fixed
转换到文档的顶部边框。
答案 5 :(得分:0)
我现在无法真正测试野生动物园,但是例如,在创建粘性页脚时,这一直是我的替代选择:
<!DOCTYPE html>
<html>
<head>
<title>sticky side div</title>
<style type="text/css">
.maindiv{
position: relative;
display: inline-block;
background-color: forestgreen;
width: calc(100vw - 150px);
height: 100%;
overflow: auto;
}
.sidediv{
position: fixed;
display: inline-block;
background-color: lightyellow;
float: right;
width: 100px;
height: 100%;
}
</style>
</head>
<body>
<div class="maindiv">
Lorem 45
</div>
<div class="sidediv">
Lorem 30
</div>
<div class="maindiv">
Lorem 100
</div>
<div class="maindiv">
Lorem 900
</div>
</body>
</html>
一旦知道正确内容的宽度,再向其中添加更多像素,然后使用css calc function
确保其他div不会流入
在Safari 7中,vh和vw也存在一个已知的错误。您可以通过设置height来解决此问题:在其父级为vh
或vw
宽的#child元素上继承
但如果您不希望获得跨浏览器支持,我的最佳建议是使用CSS Grids
答案 6 :(得分:0)
似乎iPhone和Safari不允许使用简单的CSS解决方案,对我有用的是使用jQuery / javascript:给您需要粘稠的元素position:absolute
和left: 0
,然后使用javascript计算窗口向左偏移,然后将该偏移添加到元素的left属性:
#stickyElement {
position: absolute;
left: 0;
}
function scrolling(){
$('.someElementScrollingLeft').on('scroll', function() {
let offset = $(this).scrollLeft();
/* For me it only didn't work on phones, so checking screen size */
if($( window ).width() <= 768)
{
let stickyElement = $('#stickyElement');
stickyElement.css("left", offset);
}
});
}
答案 7 :(得分:0)
针对此特定情况的另一种解决方案,只要您不需要模态最右边的滚动条即可。
由于粘性元素的高度与.modal-content
相同,因此可以从.sticky-element
完全去除粘性。首先,从.modal-content
中删除overflow:auto,然后将该样式添加到.left-content
中,因为这始终是您要滚动的部分。