Desbordamiento oculto con desplazamiento de desbordamiento anidado que no funciona

4 minutos de lectura

avatar de usuario de user2296153
usuario2296153

Tengo un problema con un div que no se recorta al padre a pesar de que tiene overflow: hidden.

he mirado a través de la overflow: hidden preguntas aquí en stackoverflow pero la mayoría de ellos tienen problemas con position o parecen sugerir que mi código debería funcionar.

Aquí hay un MWE, puedes encontrar el jsfiddle aquí:

<div id="parent">
  <div id="scroller">
    <div id="child">
      meh
    </div>
  </div>
</div>

CSS:

#parent {
  height: 500px;
  overflow: hidden;
}

#scroller {
  overflow: scroll;
}

#child {
  height: 10000px;
}

lo que espero

#parent tiene overflow: hidden entonces #scroller se recorta a la altura del padre. Porque es #child es más alto que la altura resultante overflow: scroll da como resultado una barra de desplazamiento.

Lo que sucede

#scroller solo usa la altura de #child e ignora a los dos overflow propiedades.

¿Qué pasa con las soluciones simples?

  • En mi problema del mundo real hay múltiples <div>pecado #parent entonces no puedo dar #scroller una altura.
  • El html se genera automáticamente, por lo que no puedo eliminarlo #scroller.

Gracias por toda la ayuda, Stefan

RESPUESTA

En realidad, hay una respuesta de solo CSS en los comentarios con display: flex. Ver:

https://jsfiddle.net/huocukw7/6/

#parent {
  height: 500px;
  overflow: hidden;
  display: flex;
  flex-direction:column;
}

#scroller {
  overflow: auto;
  flex-grow:1;
}

#child {
  height: 10000px;
}

  • muéstrenos su ejemplo del mundo real, de lo contrario no podemos ayudarlo, es decir, ¿están anidados, son otras secciones dentro del padre? – puede ser un caso de dar a estos divs múltiples una altura también

    – Pete

    21 de abril de 2017 a las 9:48


  • @Pete: ¿Quiénes son “ellos”? Y escribí que hay múltiples divs en parent. La pregunta se puede responder fácilmente con el MWE a mano. Según la respuesta del Sr. Alien, el problema es que el desplazador necesita una altura y la única forma de completar correctamente el padre es recurrir a javascript.

    – usuario2296153

    21 de abril de 2017 a las 13:33


  • son los otros divs, y no, no lo es: si nos das la estructura real, puedo mostrarte una forma CSS pura de darle una altura a ese div, pero si no te molesta, entonces usa tu js. Me he mudado, así que buena suerte si no estás dispuesto a hacer el esfuerzo, entonces yo tampoco.

    – Pete

    21 de abril de 2017 a las 13:38


  • y eso no fue demasiado difícil ahora, ¿verdad? Aquí tienes, usa display:flex: jsfiddle.net/huocukw7/6

    – Pete

    21 de abril de 2017 a las 13:46


  • Se agregó a la pregunta en una edición. EDITAR: y lo publiqué como respuesta porque eso es lo que tiendo a leer primero en stackoverflow. Ahora me siento sucio al robar tu respuesta. :PAG

    – usuario2296153

    21 de abril de 2017 a las 14:42


Todo lo que necesita hacer es proporcionar height para usted #scroller

#scroller {
  overflow: scroll;
  padding: 10px;
  background-color: red;
  height: 100%;
}

Manifestación


Según tu punto – En mi problema del mundo real, hay múltiples s en #parent, por lo que no puedo darle una altura a #scroller.

No hay otra manera de hacer que se pueda desplazar sin asignar un height lo. Sin eso, se extenderá hasta que finalice el elemento secundario, lo que no hará que su contenedor se pueda desplazar.

Puede usar JavaSript aquí, para calcular el height en tiempo de ejecución y añádalo al elemento.

  • Gracias. Temía tener que recurrir a javascript debido a las deficiencias de CSS. Es bueno tener confirmación al menos.

    – usuario2296153

    21 de abril de 2017 a las 13:29

En realidad, hay una respuesta de solo CSS en los comentarios con display: flex. Ver:

https://jsfiddle.net/huocukw7/6/

#parent {
  height: 500px;
  overflow: hidden;
  display: flex;
  flex-direction:column;
}

#scroller {
  overflow: auto;
  flex-grow:1;
}

#child {
  height: 10000px;
}

Aunque dijiste que no puedes agregar una altura explícita a #scroller, ¿qué hay de agregar height:inherit;. Eso tiene el efecto deseado de agregar una barra de desplazamiento.

  • Gracias por la sugerencia. Desafortunadamente eso es lo mismo que agregar height: 100%;.

    – usuario2296153

    21 de abril de 2017 a las 13:36

Para la posteridad: tuve este mismo problema al usar Foundation’s Reveal cubrir.

body.is-reveal-open tenía overflow: hidden;

.reveal-overlay tenía overflow-y: scroll; (

y mi elemento secundario que quería tener un cuadro de desplazamiento tenía una altura explícita grande, una altura máxima más pequeña y overflow: scroll.

Después de mucha depuración, reduje el problema y esto terminó arreglándolo:

.reveal-overlay {
  overflow: hidden; // changed from overflow-y: scroll
}

No me preguntes por qué funcionó esto, no tengo ni idea. Pero lo hizo.

avatar de usuario de jackycflau
jackycflau

Aquí hay una solución para el usuario de Bootstrap 4, lo que debe preocuparse es solo cómo colocar la clase correcta relacionada con Flex en el lugar correcto. Desde parent tiene solo 1 hijo directo, es bastante simple:

HTML

<div class="d-flex flex-column" id="parent">
  <div class="h-100" id="scroller">
    <div id="child">
      meh
    </div>
  </div>
</div>

CSS (No necesita hacer nada con CSS, solo lo copio de la pregunta)

#parent {
  height: 500px;
  overflow: hidden;
}

#scroller {
  overflow: scroll;
}

#child {
  height: 10000px;
}

Un consejo más: si tiene varios hijos directos bajo parent y requieren el scroller para llenar la altura restante de la parent <div>entonces tendrás que aplicar flex-grow-1 clase en lugar de h-100 hacia scroller. (Para aquellos que están familiarizados con el desarrollo de Android, el flex-grow-1 tener el mismo efecto que layout_height=0dp o layout_width=0dp en un diseño de restricción)

¿Ha sido útil esta solución?