提问人:bholtbholt 提问时间:6/9/2017 最后编辑:TylerHbholtbholt 更新时间:5/25/2023 访问量:164655
我的立场:使用flexbox时粘性元素不粘性
My position: sticky element isn't sticky when using flexbox
问:
我被困在这个上了一会儿,以为我会分享这个 + flexbox 陷阱:position: sticky
我的粘性 div 工作正常,直到我将视图切换到 flex box 容器,突然间 div 在包装在 flexbox 父级中时没有粘性。
.flexbox-wrapper {
display: flex;
height: 600px;
}
.regular {
background-color: blue;
}
.sticky {
position: -webkit-sticky;
position: sticky;
top: 0;
background-color: red;
}
<div class="flexbox-wrapper">
<div class="regular">
This is the regular box
</div>
<div class="sticky">
This is the sticky box
</div>
</div>
答:
由于 flex box 元素默认为 ,因此所有元素的高度都相同,无法滚动。stretch
添加到粘性元素中,将高度设置为自动,允许滚动,并修复它。align-self: flex-start
目前,所有主流浏览器都支持此功能,但 Safari 仍然落后于前缀,并且除 Firefox 之外的其他浏览器在表格方面存在一些问题。-webkit-
position: sticky
.flexbox-wrapper {
display: flex;
overflow: auto;
height: 200px; /* Not necessary -- for example only */
}
.regular {
background-color: blue; /* Not necessary -- for example only */
height: 600px; /* Not necessary -- for example only */
}
.sticky {
position: -webkit-sticky; /* for Safari */
position: sticky;
top: 0;
align-self: flex-start; /* <-- this is the fix */
background-color: red; /* Not necessary -- for example only */
}
<div class="flexbox-wrapper">
<div class="regular">
This is the regular box
</div>
<div class="sticky">
This is the sticky box
</div>
</div>
评论
flexbox
sticky
top: 0
top: 100px
overflow
height
top
align-self
您也可以尝试将子 div 添加到包含内容的 flex 项中,并分配给它。position: sticky; top: 0;
这对我适用于两列布局,其中第一列的内容需要具有粘性,而第二列的内容看起来是可滚动的。
评论
就我而言,其中一个父容器已应用于它,这将破坏功能。您需要删除该规则。overflow-x: hidden;
position: sticky
任何父元素都不应应用上述 CSS 规则。此条件适用于所有父母,直到(但不包括)“身体”元素。
评论
overflow-x:hidden
overflow-x: hidden;
overflow-x: hidden;
overflow: hidden;
我做了一个临时的flexbox桌子,遇到了这个问题。为了解决这个问题,我只需将粘性标题行放在 flexbox 之外,就在它前面。
就我的情况而言,(或)解决方案不起作用。我也需要保留,因为有些容器会水平滑动。align-self: flex-start
justify-self: flex-start
overflow-x: hidden
我的解决方案需要嵌套才能获得所需的行为:display: flex
overflow-y: auto
- 标头可以动态调整高度,从而防止玩弄或
position: absolute
position: fixed
- 内容垂直滚动,水平受限于视图宽度
- 粘性元素可以垂直位于任何位置,粘在标题的底部
- 其他元素可以水平滑动
- 看起来 SO 片段工具无法在子元素上渲染以正确演示水平幻灯片,或者我的实际布局中可能有一些其他设置使其工作......
width
- 请注意,需要不执行任何其他操作的包装元素才能允许在父元素下正常工作
overflow-x: auto
overflow-x: hidden
- 看起来 SO 片段工具无法在子元素上渲染以正确演示水平幻灯片,或者我的实际布局中可能有一些其他设置使其工作......
body {
height: 100vh;
width: 100vw;
display: flex;
flex-direction: column;
}
body>header {
background-color: red;
color: white;
padding: 1em;
}
.content {
overflow-x: hidden;
overflow-y: auto;
display: flex;
flex-direction: column;
}
article {
position: relative;
display: flex;
flex-direction: column;
overflow-y: auto;
}
.horizontal_slide {
display: flex;
overflow-x: auto;
background-color: lightblue;
padding: .5em;
}
.horizontal_slide>* {
width: 1000px;
}
.toolbar {
position: sticky;
top: 0;
z-index: 10;
background-color: lightgray;
padding: .5em;
display: flex;
}
<header>Fancy header with height adjusting to variable content</header>
<div class="content">
<article class="card">
<h1>One of several cards that flips visibility</h1>
<div class="overflow_x_wrapper">
<div class="horizontal_slide">
<div>Reason why `overflow-x: hidden` on the parent is required
</div>
<div>Reason why `overflow-x: hidden` on the parent is required
</div>
<div>Reason why `overflow-x: hidden` on the parent is required
</div>
</div>
<div class="toolbar">Sticky toolbar part-way down the content</div>
<p>Rest of vertically scrollable container with variable number of child containers and other elements</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</article>
</div>
根据我的经验,全球解决方案/规则:
不要将带有粘性元素的结构直接放在 { display : flex } 容器中。
取而代之的是(对于 flex 布局)将带有粘性元素的 table/div 放在 flex 子容器中(例如,使用 { flex: 1 1 auto },但没有 { display : flex } ),那么一切都应该按预期工作。
评论
如果您在父元素中使用 flex,请对要使其粘性的元素使用 align-self: flex-start。
position: sticky;
align-self: flex-start;
top: 0;
overflow-y: auto;
评论
align-self: flex-start
top: 100px;
确保 flex-wrapper 已分配高度,并将溢出值设置为 auto。 然后将“align-self: flex-start;”添加到粘性元素中。
.flexbox-wrapper {
display: flex;
height: 600px; //<- nessary,and don't assign with %
overflow:auto; //<-fix
}
.regular {
background-color: blue;
}
.sticky {
position: -webkit-sticky;
position: sticky;
top: 0;
background-color: red;
align-self: flex-start; // <-fix
}
<div class="flexbox-wrapper">
<div class="regular">
This is the regular box
</div>
<div class="sticky">
This is the sticky box
</div>
</div>
这对我有用,但我不知道这是否是你遇到的问题。 我的问题是,当视口太小时,flexbox 中的居中内容被隐藏了
/*this is the wrapper of centered content*/
.section {
overflow-y: auto;
max-height: none;
height: 100%;
min-height: 100vh; /*optional, can be changed to anything*/
}
<div class="section">
<div class="content">
Some long content that is centered....
</div>
</div>
评论
position: sticky