CSS overflow-x: visible; y overflow-y: hidden; causando problema con la barra de desplazamiento


Supongamos que tiene algún estilo y el marcado:

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>

Cuando vea esto. El <ul> tiene una barra de desplazamiento en la parte inferior a pesar de que he especificado valores visibles y ocultos para el desbordamiento x / y.

(observado en Chrome 11 y opera (?))

Supongo que debe haber alguna especificación del w3c o algo que diga que esto suceda, pero por mi vida no puedo entender por qué.

JSFiddle

ACTUALIZACIÓN:- he encontrado una manera de lograr el mismo resultado mediante la adición de otro elemento envuelto alrededor de la ul. Compruébalo.

 343
Author: James Khoury, 2011-06-21

6 answers

Después de una búsqueda seria, parece que he encontrado la respuesta a mi pregunta:

De: http://www.brunildo.org/test/Overflowxy2.html

En Gecko, Safari, Opera, 'visible' se convierte en 'auto' también cuando se combina con 'oculto' (en otras palabras: 'visible' se convierte en "auto" cuando se combina con cualquier otra cosa diferente de ‘visible’). Gecko 1.8, Safari 3, Opera 9.5 son bastante consistentes entre ellos.

También el W3C spec dice:

Los valores calculados de 'overflow-x' y 'desbordamiento-y' son lo mismo que su valores especificados, excepto que algunos combinaciones con 'visible' no son posible: si se especifica como 'visible' y el otro es 'scroll' o 'auto', luego 'visible' se establece en ‘auto’. El valor calculado de 'desbordamiento' es igual a la calculada valor de 'overflow-x' si 'overflow-y' es lo mismo; de lo contrario es el par de los valores calculados de "overflow-x' y "desbordamiento".

Versión Corta:

Si usted está usando visible para overflow-x o overflow-y y algo distinto de visible para el otro, el visible valor se interpreta como auto.

 540
Author: James Khoury,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-14 18:00:07

Originalmente encontré una forma CSS de omitir esto al usar el plugin Cycle jQuery. Cycle usa JavaScript para establecer mi diapositiva en overflow: hidden, por lo que al establecer mis imágenes en width: 100% las imágenes se verían cortadas verticalmente, por lo que las obligué a ser visibles con !important y para evitar mostrar la animación de la diapositiva fuera de la caja, establecí overflow: hidden en el div contenedor de la diapositiva. Espero que funcione para ti.

ACTUALIZACIÓN - Nueva solución:

Problema original - > http://jsfiddle.net/xMddf/1 / (Incluso si utilizo overflow-y: visible se convierte en "auto" y en realidad "scroll".)

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

La nueva solución -> http://jsfiddle.net/xMddf/2/ (Encontré una solución alternativa usando un wrapper div para aplicar overflow-x y overflow-y a diferentes elementos DOM como James Khoury aconsejó sobre el problema de combinar visible y hidden a un solo elemento DOM.)

#wrapper {
    height: 100px;
    overflow-y: visible;
}
#content {
    width: 200px;
    overflow-x: hidden;
}
 67
Author: Macumbaomuerte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-26 10:21:21

Otro truco barato, que parece hacer el truco:

style="padding-bottom: 250px; margin-bottom: -250px;" en el elemento donde el desbordamiento vertical se está cortando, con 250 representando tantos píxeles como necesite para su menú desplegable, etc.

 63
Author: Justin Krause,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-18 04:09:41

Me he encontrado con este problema al intentar construir una barra lateral posicionada fija con tanto contenido desplazable vertical y anidado hijos posicionados absolutos para ser mostrados fuera de los límites de la barra lateral.

Mi enfoque consistía en aplicar por separado:

  • una propiedad overflow: visible para el elemento sidebar
  • una propiedad overflow-y: auto para la envoltura interna de la barra lateral

Por favor, consulte el siguiente ejemplo o una en línea codepen .

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
Author: Andrea Carraro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-26 14:02:55

Usé el método content+wrapper... pero hice algo diferente de lo mencionado hasta ahora: Me aseguré de que los límites de mi envoltura no se alinearan con los límites del contenido en la dirección en la que quería ser visible.

NOTA importante: Fue bastante fácil obtener el enfoque content+wrapper, same-bounds para trabajar en un navegador u otro dependiendo de varias combinaciones de css de position, overflow-*, etc... pero nunca pude usar ese enfoque para hacer que todos sean correctos (Edge, Chrome, Safari,...).

Pero cuando tuve algo como: {[12]]}

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

... todos los navegadores estaban contentos.

 2
Author: dsdsdsdsd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-14 19:57:03

Ahora hay una nueva forma de abordar este problema - si elimina position: relative del contenedor que necesita tener el desbordamiento-y visible, puede tener desbordamiento-y visible y desbordamiento-x oculto, y viceversa (tener desbordamiento-x visible y desbordamiento-y oculto, solo asegúrese de que el contenedor con la propiedad visible no esté relativamente posicionado).

Ver este post de CSS Tricks para más detalles-funcionó para mí: https://css-tricks.com/popping-hidden-overflow /

 0
Author: Alexandra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-17 20:53:20