내 위치 : 플렉스 박스를 사용할 때 고정 요소가 고정되지 않습니다.


115

나는 이것에 약간 붙어 있었고 이것을 공유 할 것이라고 생각했습니다 position: sticky+ flexbox gotcha :

내 고정 div는 내 뷰를 플렉스 박스 컨테이너로 전환 할 때까지 잘 작동했고 갑자기 div가 플렉스 박스 부모에 래핑되었을 때 고정되지 않았습니다.

.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>

문제를 보여주는 JSFiddle


이 동작이 지원하는 모든 브라우저에서 지속됩니까 position: sticky?
TylerH

1
@TylerH 나는 그것이 모든 브라우저라고 믿습니다. Chrome과 Safari 모두에서 이와 같이 작동했습니다.
BHOLT

감사. Firefox에서도 발생하는 문제와 해결 방법을 확인할 수 있습니다.
TylerH

답변:


220

플렉스 박스 요소의 기본값은 stretch이므로 모든 요소의 높이가 같으므로 스크롤 할 수 없습니다.

align-self: flex-start고정 요소에 추가 하면 높이가 자동으로 설정되어 스크롤이 허용되고 수정되었습니다.

현재 이것은 모든 주요 브라우저에서 지원 되지만 Safari는 여전히 -webkit-접두사 뒤에 있으며 Firefox를 제외한 다른 브라우저에는 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>

솔루션을 보여주는 JSFiddle


26
이것은 포함 된 flex 요소 내에서 스크롤 할 때만 작동합니다.-전체 창을 스크롤 할 때 (적어도 Firefox에서는) 고정되지 않습니다. 따라서 모순적인 동작을 경험하는 사람들에게는 모순적인 기대를 경험할 가능성이 더 높습니다 (예 : i was)
aequalsb

@aequalsb 전체 페이지를 스크롤 할 때 고정하는 방법을 알고 있습니까?
Douglas Gaskell

@Douglas 문제는 문제가 있음을 암시하기 때문에 오해의 소지가 flexbox있지만 문제는 sticky요소 포함과 더 관련이 있습니다. 이 바이올린을보세요 : jsfiddle.net/9y87zL5c 여기서 SECOND 빨간색 상자는 예상대로 작동하지만 첫 번째 빨간색 상자는 고정되지 않습니다. 그래서 ... 이것은 flexbox와 관련이 없습니다 (따라서 모순되는 기대) ... 또한 ... 더 정확한 방식으로 결과를보기 위해 jabberwocky 무리를 추가했습니다.
aequalsb

30

제 경우에는 상위 컨테이너 중 하나가 overflow-x: hidden;적용되어 position: sticky기능 이 중단 됩니다. 해당 규칙을 제거해야합니다.

상위 요소에는 위의 CSS 규칙이 적용되어서는 안됩니다. 이 조건은 'body'요소까지 (포함하지 않음) 모든 상위에 적용됩니다.


또한 overflow-x:hiddenhtml 요소에 있을 수 없습니다 .
사무엘 Liew

감사합니다. 나는 항상 끈적 끈적한 위치로 어려움을 겪고 있으며 귀하의 답변을 읽을 때 까지이 조건에 대해 알지 못했습니다. :)
Raphael Aleixo 20.01.27

1
@SamuelLiew, 예 overflow-x: hidden;, HTML 요소에 가질 수 있습니다 .
TheoPlatica

나는 기뻐요 @RaphaelAleixo 나는 :) 도움이 될 수
TheoPlatica

이것이 내가 스티커가 올바르게 작동하는 것을 막는 것입니다. 감사합니다!
MoOx

7

내용이 포함 된 플렉스 항목에 하위 div를 추가하고 할당 position: sticky; top: 0;할 수도 있습니다.

그것은 첫 번째 열의 내용이 고정되어야하고 두 번째 열이 스크롤 가능하게 나타나는 2 열 레이아웃에서 저에게 효과적이었습니다.


전적으로 동의합니다. 이것이 제가 찾을 수있는 가장 간단하고 신뢰할 수있는 옵션입니다. 이렇게하면 용기의 높이를 제어하여 부착을 중지 할시기를 제어 할 수도 있습니다.
Ibrahim ben Salah

0

임시 변통 플렉스 박스 테이블을 만들었는데이 문제가있었습니다. 이 문제를 해결하기 위해 단순히 고정 헤더 행을 flexbox 바로 앞에 놓았습니다.


0

내 상황에서는 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

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>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.