CSS overflow-x : 표시; 그리고 overflow-y : 숨겨진; 스크롤바 문제 발생


454

스타일과 마크 업이 있다고 가정합니다.

ul
{
  white-space: nowrap;
  overflow-x: visible;
  overflow-y: hidden;
/* added width so it would work in the snippet */
  width: 100px; 
}
li
{
  display: inline-block;
}
<div>
  <ul>
    <li>1</li> <li>2</li> <li>3</li>
    <li>4</li> <li>5</li> <li>6</li>
    <li>7</li> <li>8</li> <li>9</li>
    <li>1</li> <li>2</li> <li>3</li>
    <li>4</li> <li>5</li> <li>6</li>
    <li>7</li> <li>8</li> <li>9</li>
    <li>1</li> <li>2</li> <li>3</li>
    <li>4</li> <li>5</li> <li>6</li>
    <li>7</li> <li>8</li> <li>9</li>
  </ul>
</div>

당신이 이것을 볼 때. 은 <ul>내가 오버 플로우 X / Y 볼 수 숨겨진 값을 지정한 경우에도 하단에 스크롤 막대가 있습니다.

(Chrome 11 및 오페라에서 관찰 됨 (?))

나는 w3c 사양이나 이것이 일어날 것을 말하는 무언가가 있어야한다고 생각하지만 내 인생에서 나는 그 이유를 해결할 수 없다.

JSFiddle

업데이트 :-에 감싸 인 다른 요소를 추가하여 동일한 결과를 달성하는 방법을 찾았습니다 ul. 확인 해봐.


원하는 결과는 무엇입니까? jsfiddle.net/Kyle_Sevenoaks/3xv6A/2
Kyle

@kyle 그것은 조금 더 보일 것입니다 : jsfiddle.net/3xv6A/5 불행히도 overflow-x hidden;스크롤을 설정 하면 스크롤을 제거하지만 아래쪽에 테두리를 숨기려면 li 요소가 필요하므로 원하는 점선 효과를줍니다. 왜 overflow-x: visible스크롤 막대를 만드는지 이해하지 못합니다 . 어색하지 않아야합니다.
James Khoury 2016 년

@JamesKhoury 솔루션을 조금 더 정교하게 할 수 있습니까? 정말 작동시킬 수 없습니다
George Katsanos

1
@GeorgeKatsanos 해결 방법 : jsfiddle.net/3xv6A/9는 부모의 존재에 의존 overflow: hidden;하고 아이가 주위에 삽입 <ul>존재를 overflow: visible.
James Khoury 1

@JamesKhoury 마 당신은 그것을 위해 일할 수 있다고 생각 embed.plnkr.co/2rbaISwvzuKhyPEFpBKD
조지 Katsanos에게

답변:


680

진지한 검색 후 내 질문에 대한 답변을 찾은 것 같습니다.

에서: http://www.brunildo.org/test/Overflowxy2.html

Gecko, Safari, Opera에서 'hidden'과 결합하면 'visible'이 'auto'가됩니다 (즉, 'visible'과 다른 것을 결합하면 'visible'이 'auto'가됩니다). Gecko 1.8, Safari 3, Opera 9.5는 그중에서도 꽤 일관성이 있습니다.

또한 W3C 사양 은 다음과 같이 말합니다.

'overflow-x'및 'overflow-y'의 계산 된 값은 'visible'과의 일부 조합이 불가능하다는 점을 제외하고는 지정된 값과 동일합니다. 하나가 'visible'로 지정되고 다른 하나가 'scroll'인 경우 또는 'auto'인 경우 'visible'이 'auto'로 설정됩니다. 'overflow-y'가 동일한 경우 'overflow'의 계산 된 값은 'overflow-x'의 계산 된 값과 같습니다. 그렇지 않으면 'overflow-x'와 'overflow-y'의 계산 된 값 쌍입니다.

짧은 버전 :

당신이 사용하는 경우 visible중 하나에 대한 overflow-x또는 overflow-y이외의 뭔가 visible다른 들어, visible값으로 해석됩니다 auto.


263
W3C가 이런 식으로 지정한다는 것을 이해하지만 그 동기는 무엇입니까? 꽤 이상하고 일관되지 않은 동작으로 인해 사소한 HTML 요소를 추가 해야하는 복잡한 해결 방법이 있습니다.
Erwin

21
@ Erwin 동의합니다. 누군가가 사양을 업데이트하기로 결정했습니다.
James Khoury

124
당신 말이 맞지만 말이되지 않습니다. x와 y를 원하는 가장 일반적인 이유는 하나를 숨기고 다른 하나는 보이게 할 수 있기 때문입니다.
rescuecreative

91
이것은 무섭다. 왜 우리가 허용 할 수 없습니다 overflow-x:visible동안 overflow-y:hidden부모 / 자식 해킹하지 않고? 예쁜 이층, IMO.
Slink

34
이것은 완전히 무너지고 있습니다. Bootstrap navbar 스크롤에 가로 방향으로 많은 드롭 다운 링크를 만들려고했지만 드롭 다운이 중단됩니다 overflow-y: visible. 부 CSS!
Andy

131

트릭을 수행하는 것처럼 보이는 또 다른 저렴한 해킹 :

style="padding-bottom: 250px; margin-bottom: -250px;"수직 오버플로가 발생하는 요소에서 250드롭 다운에 필요한만큼의 픽셀 을 나타내는 등


6
고마워 보이지만 문제를 해결하는 가장 좋은 방법 인 것 같습니다. CSS에서 오버플로가 끔찍하다 :(
Serge Eremeev

11
이렇게하면 가로 스크롤 막대가 훨씬 아래로 나타납니다
nafg

2
또한 요소 아래 250px에 대한 포인터 이벤트를 차단합니다. 그러나 그 주위에 길을 찾았 으며이 솔루션은 내가 사용하고 있습니다.
Chris Chudzicki

2
2 년이 지난 후에도 여전히이 문제에 대한 최고의 해답 인 것 같습니다 ... Chromium 오픈 소스 프로젝트에서 다른 브라우저 (Microsoft Edge)를 사용하면 더 좋은 브라우저뿐만 아니라 더 나은 브라우저 기능의 더 빠른 개발을 보게 될 것입니다. 적합성.
스펜서 오라일리

position: relative래퍼를 제거 하거나 사용할 수없는 특정 시나리오에서는 이것이 효과가있는 유일한 솔루션이지만 overflow-x: hidden해키를 보완 하기 위해 설정하려는 요소 내부의 자식 요소에 많은 못생긴 여백을 추가해야했습니다. 심. 그러나 이것은 나를 구했습니다. 감사합니다!
Philip Stratford

81

원래 Cycle jQuery 플러그인을 사용할 때 이것을 우회하는 CSS 방법을 찾았습니다. Cycle은 JavaScript를 사용하여 슬라이드를로 설정합니다 overflow: hidden. 따라서 사진을 그림으로 설정할 때 width: 100%세로로 잘린 것처럼 보이므로 !important설정 한 상자에 슬라이드 애니메이션이 표시되지 않고 표시되지 않도록했습니다.overflow: hidden 의 컨테이너 div로 했습니다. 미끄러지 다. 그것이 당신을 위해 작동하기를 바랍니다.

업데이트-새로운 솔루션 :

원래 문제 -> http://jsfiddle.net/xMddf/1/ (사용하더라도 overflow-y: visible"자동"이되고 실제로 "스크롤"이됩니다.)

#content {
    height: 100px;
    width: 200px;
    overflow-x: hidden;
    overflow-y: visible;
}

새로운 솔루션은 -> http://jsfiddle.net/xMddf/2/ (I는 사용하여 해결 방법을 찾을 래퍼 적용 DIV를 overflow-x하고 overflow-y같은 다른 DOM 요소에 제임스 쿠리는 결합의 문제에 조언 visiblehidden하나의 DOM 요소에 있습니다.)

#wrapper {
    height: 100px;
    overflow-y: visible;
}
#content {
    width: 200px;
    overflow-x: hidden;
}

12
이것은 어떻게 적용됩니까? overflow-x 또는 overflow-y에서 작동하지 않는 것 같습니다.
제임스 쿠리

1
@Macumbaomuetre 더 명확합니다. +1 감사합니다. 내가 추가 한 "업데이트"와 비슷합니다. 원래 랩핑 div를 변경할 수 없었고 솔루션은 jsfiddle.net/3xv6A/338
James Khoury

9
이 솔루션은 적용되지 않습니다. 문제는 overflow-x:visible;overflow-y:hidden. 다른 방법은 아닙니다.
Jakobovski

1
@TomasJansson @Edward는 않습니다 당신이 적용되는 경우 그냥 스왑을 가지고 일을 overflow-x하고 -y: 업데이트 바이올린 .
단지 학생 :

1
래퍼가 어떤 이유로 너비를 얻 자마자 실패합니다 -jsfiddle.net/ad1941k9/16
David Meister

10

세로로 스크롤 가능한 콘텐츠 가 모두 있는 고정 된 위치 지정된 사이드 바를 만들려고 할 때이 문제가 발생했습니다. 중첩 절대 아이를 배치 할 수 밖에 사이드 바의 경계를 표시 .

내 접근 방식은 별도로 적용되었습니다.

  • overflow: visible사이드 바 요소 의 속성
  • overflow-y: auto내부 래퍼에 속성

아래 예 또는 온라인 코드 펜을 확인하십시오 .

html {
  min-height: 100%;
}
body {
  min-height: 100%;
  background: linear-gradient(to bottom, white, DarkGray 80%);
  margin: 0;
  padding: 0;
}

.sidebar {
  position: fixed;
  top: 0;
  right: 0;
  height: 100%;
  width: 200px;
  overflow: visible;  /* Just apply overflow-x */
  background-color: DarkOrange;
}

.sidebarWrapper {
  padding: 10px;
  overflow-y: auto;   /* Just apply overflow-y */
  height: 100%;
  width: 100%;
}

.element {
  position: absolute;
  top: 0;
  right: 100%;
  background-color: CornflowerBlue;
  padding: 10px;
  width: 200px;
}
<p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?</p>
<div class="sidebar">
  <div class="sidebarWrapper">
    <div class="element">
      I'm a sidebar child element but I'm able to horizontally overflow its boundaries.
    </div>
    <p>This is a 200px width container with optional vertical scroll.</p>
    <p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?</p>
  </div>
</div>


2
나는 이것이 auto대신을 제외하고 다른 사람들이 제시 한 것과 동일한 솔루션이라고 확신합니다 hidden.
James Khoury 2012

@JamesKhoury 그러나 이것은 하나의 사용을 지적하기 때문에 이해할 수있는 유일한 것입니다position
Guichi

7

내가 사용하는 content+wrapper방법을 ... 하지만 지금까지 언급 한 것보다 뭔가 다른했다 : 나는 확실히 내 래퍼의 경계는 않았다고했다 NOT 내용의 경계에 줄을 내가 볼 수 있도록 싶었 방향을 .

중요 참고 : 쉽게 얻을 충분했다 content+wrapper, same-bounds다양한 CSS의 조합에 따라 하나의 브라우저 또는 다른에 대한 작업에 대한 접근 방식을 position, overflow-*등 ...하지만 나는 그들에게 얻을하는 방법을 사용할 수 없었다 결코 모든 올바른 (에지, 크롬, 사파리,. ..).

그러나 내가 다음과 같은 것을했을 때 :

  <div id="hack_wrapper" // created solely for this purpose
       style="position:absolute; width:100%; height:100%; overflow-x:hidden;">
      <div id="content_wrapper"
           style="position:absolute; width:100%; height:15%; overflow:visible;">         
          ... content with too-much horizontal content ... 
      </div>
  </div>

... 모든 브라우저가 행복했습니다.


5

이제이 문제를 해결하는 새로운 방법이 있습니다 : relative를 제거하면 overflow-y를 표시 해야하는 컨테이너에서 relative, overflow-y visible 및 overflow-x를 숨길 수 있으며 그 반대도 가능합니다 (overflow- x visible 및 overflow-y hidden, visible 속성을 가진 컨테이너가 상대적으로 배치되지 않았는지 확인하십시오).

자세한 내용은 CSS 트릭 에서이 게시물을 참조하십시오-그것은 나를 위해 일했습니다 : https://css-tricks.com/popping-hidden-overflow/


2
그러나 요소가 절대적인 경우 요소를 올바르게 배치하려면 자바 스크립트가 필요합니다.
gaurav5430
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.