CSS overflow-x: видимый; и переполнение-у: скрыто; вызывая проблему полосы прокрутки - PullRequest
393 голосов
/ 21 июня 2011

Предположим, у вас есть стиль и разметка:

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 и opera (?))

Я предполагаю, что должна быть какая-то спецификация w3c или что-то, что говорит об этом, но я не могу понять почему.

JSFiddle

ОБНОВЛЕНИЕ: - Я нашел способ добиться того же результата, добавив еще один элемент, обернутый вокруг ul. Проверьте это.

Ответы [ 6 ]

604 голосов
/ 22 июня 2011

После некоторого серьезного поиска, кажется, я нашел ответ на свой вопрос:

из: http://www.brunildo.org/test/Overflowxy2.html

В Gecko, Safari, Opera, "visible" становится«auto» также в сочетании со «hidden» (другими словами: «visible» становится «auto» в сочетании с чем-либо, отличным от «visible»).Gecko 1.8, Safari 3, Opera 9.5 довольно последовательны среди них.

также W3C spec говорит:

Вычисленные значения 'переполнения-x 'и' overflow-y 'совпадают с указанными значениями, за исключением того, что некоторые комбинации с' visible 'невозможны: если одно указано как' visible ', а другое -' scroll 'или' auto ', тогда'visible' установлен на 'auto'.Вычисленное значение «переполнения» равно вычисленному значению «переполнения-x», если «переполнение-у» совпадает;в противном случае это пара вычисленных значений 'overflow-x' и 'overflow-y'.

Короткая версия:

Если вы используете visible для overflow-x или overflow-y и что-то отличное от visible для другого, значение visible интерпретируется как auto.

99 голосов
/ 18 сентября 2016

еще один дешевый хак, который, кажется, делает свое дело:

style="padding-bottom: 250px; margin-bottom: -250px;" на элементе, где вертикальное переполнение становится отсеченным, с 250, представляющим столько пикселей, сколько вам нужно для выпадающего списка, и т. Д..

76 голосов
/ 02 июля 2013

Изначально я нашел способ обойти это при использовании плагина Cycle jQuery. Цикл использует 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/ (Я нашел обходной путь, используя обертку div для применения overflow-x и overflow-y к различным элементам DOM, поскольку Джеймс Хури советовал по проблеме объединения visible и hidden к одному элементу DOM.)

#wrapper {
    height: 100px;
    overflow-y: visible;
}
#content {
    width: 200px;
    overflow-x: hidden;
}
7 голосов
/ 26 января 2017

Я столкнулся с этой проблемой, когда пытался создать фиксированную боковую панель с фиксированным положением с вертикальным прокручиваемым содержимым и вложенными дочерними объектами с абсолютным позиционированием в отображаются за пределами боковой панели .

Мой подход состоял в отдельном применении:

  • свойство overflow: visible для элемента боковой панели
  • an 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>
6 голосов
/ 14 апреля 2016

Я использовал content+wrapper подход ... , но Я сделал нечто иное, чем упомянуто до сих пор: я убедился, что границы моей оболочки были НЕ совпадают с границами содержимого в том направлении, в котором я хотел быть видимым .

Важное ПРИМЕЧАНИЕ. Было достаточно легко заставить подход content+wrapper, same-bounds работать в том или ином браузере в зависимости от различных комбинаций CSS position, overflow-* и т. Д. ... но я никогда не мог использовать этот подход, чтобы получить их все правильно (Edge, Chrome, Safari, ...).

Но когда ябыло что-то вроде:

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

... все браузеры были счастливы.

1 голос
/ 17 сентября 2018

Теперь существует новый способ решения этой проблемы - если вы удалите position: относительный из контейнера, который должен иметь видимый overflow-y, вы можете иметь видимый overflow-y и overflow-x скрытый, и наоборот (скрытый overflow-x и скрытый overflow-y, просто убедитесь, что контейнер со свойством visible не расположен относительно).

См. Этот пост из CSS Tricks для более подробной информации - у меня это сработало: https://css -tricks.com / popping-hidden-overflow /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...