Sin relleno cuando se usa el desbordamiento: automático

6 minutos de lectura

avatar de usuario
Felipe

no puedo conseguir padding-bottom para trabajar cuando uso overflow-y: auto en una caja Yo uso Firefox.

#container {
  padding: 3em;
  overflow-x: hidden;
  overflow-y: auto;
  width: 300px;
  height: 300px;
  background: red;
}

#some_info {
  height: 900px;
  background: #000;
}
<div id="container">
  <div id="some_info"></div>
</div>

Ver el JSFiddle.

  • Veo incluso relleno (rojo) alrededor de todos los bordes.

    – Grant Thomas

    20 de noviembre de 2012 a las 11:09


  • AHa, ¿tal vez es solo Firefox?

    – Felipe

    20 de noviembre de 2012 a las 11:12

  • Confirmo el problema en FF17

    – Alejandro Lavoie

    20 de noviembre de 2012 a las 11:13

  • W3C tiene que resolver este problema, ¡con suerte elegirán el comportamiento de Chrome! github.com/w3c/csswg-drafts/issues/129

    – Tobías Buschor

    18 de noviembre de 2017 a las 5:24

  • ¿Se solucionó este problema ahora? Estoy usando Windows y Chrome 92.0.4515.159, probé el violín y padding-bottom funciona como se esperaba

    –Kevin Chandra

    18 de agosto de 2021 a las 11:20

Una solución más sin DIV adicionales.

#container:after {
  content: "";
  display: block;
  height: 50px;
  width: 100%;
}

Trabajando en FF, Chrome, IE8-10.

  • ¿Alguna forma de hacer que funcione para el lado derecho? En Firefox, el desplazamiento horizontal termina cuando el contenido está justo en el borde del cuadro e ignora el relleno adicional.

    – Nick

    12 de febrero de 2017 a las 19:46

  • Si no le importaría explicar, ¿por qué los 50px? ¿Es este valor específico para el css en la pregunta o podría funcionar para cualquiera?

    – Ethan

    28 de agosto de 2017 a las 8:55

  • @Booligoosh, 50px es el tamaño del “relleno”. Para ser más precisos, debería ser 3em para reflejar el ejemplo dentro de la pregunta.

    – esHristov

    30 de agosto de 2017 a las 7:30

  • @isHristov, según tengo entendido, ¿50px es solo un valor de demostración?

    – Ethan

    30 de agosto de 2017 a las 11:05

  • Esto funciona solo si elimina el relleno inferior de #container; de lo contrario, obtiene un relleno inferior doble en Chrome.

    – kol

    24 de febrero de 2019 a las 12:35

Llegué tarde a la fiesta, pero pensé que valía la pena agregar una solución diferente que aborde algunas de las inquietudes planteadas anteriormente.

Vine aquí exactamente por el tipo de situación que planteó @Philip en respuesta a la solución de Alexandre Lavoie: tengo contenido generado dinámicamente dentro del contenedor, por lo que no puedo simplemente aplicar estilo a un nombre div específico como #some_info.

Afortunadamente, existe una solución simple para los navegadores que admiten CSS3: en lugar de aplicar relleno inferior al contenedor, aplique un margen inferior al último elemento secundario dentro del contenedor.

#container > :last-child {
    margin-bottom: 3em;
}

Siempre que el último elemento secundario en el contenedor div sea un elemento de nivel de bloque, esto debería funcionar.

MANIFESTACIÓN: http://jsfiddle.net/rwgZu/240/

PD Si la falla de Firefox para desplazarse hasta la parte inferior del relleno es realmente un error (como lo sugiere @Kyle), todavía no se ha solucionado a partir de Firefox 47.0. ¡Frustrante! Internet Explorer 11.0.9600.17843 exhibe el mismo comportamiento. (Google Chrome, por el contrario, muestra el relleno inferior como se esperaba).

  • Sí, todavía parece un error abierto: bugzilla.mozilla.org/show_bug.cgi?id=748518

    – Kevlarr

    14 de julio de 2020 a las 2:59

  • No funciona en FireFox 89.0.2 – todavía no respeta el margen inferior

    – TetraDev

    30 de junio de 2021 a las 23:16

Las soluciones anteriores no funcionaban para mis necesidades, y creo que encontré una solución simple.

Si su contenedor y el contenido desbordado comparten el mismo color de fondo, puede agregue un borde superior e inferior con el color que coincida con el color de fondo. Para crear un relleno igual alrededor, establezca el ancho del borde igual al relleno izquierdo y derecho del contenedor.

Enlace a la versión modificada del violín de OP: http://jsfiddle.net/dennisoneil/rwgZu/508/

Un ejemplo simple a continuación.

Nota: Stack Overflow pone los resultados del fragmento en un pergamino de desbordamiento, lo que hace que sea un poco más difícil ver lo que está pasando. El violín puede ser su mejor opción de vista previa.

#container {
  background: #ccc;
  overflow-y: scroll;
  height: 190px;
  padding: 0 20px;
  border-top: 20px solid #ccc;
  border-bottom: 20px solid #ccc;
}
#overflowing {
  background: #ccc;
}
<div id="container">
  <div id="overflowing">
    This is content<br/>
    This is content<br/>
    This is content<br/>
    This is content<br/>
    This is content<br/>
    This is content<br/>
    This is content<br/>
    This is content<br/>
    This is content<br/>
    This is content<br/>
    This is content<br/>
    This is content<br/>
    This is content<br/>
    This is content<br/>
    This is content<br/>    
  </div>
</div>

  • Este tipo de obras, pero termina empujando la barra de desplazamiento hacia arriba desde la parte inferior por la cantidad de espesor del borde. Entonces se ve raro.

    – TetraDev

    30 de junio de 2021 a las 23:21

Aquí hay un posible enfoque que funciona perfectamente:

#container {
    overflow-x: hidden;
    overflow-y: auto;
    width: 300px;
    height: 300px;
}

#some_info {
    height: 900px;
    background: #000;
    border: 3em solid red;
}

Diseñe el div principal normalmente y haga que el div interno haga lo que usted quiere que haga.

Remover overflow-x y overflow en #containercambio height a 100% y añadir overflow-y:scroll; en #some_info

#container {
    padding: 3em;
    width: 300px;
    height: 300px;
    background: red;
}

#some_info {
    height: 100%;
    background: #000;
    overflow-y:scroll;
    width:100%;
}

Demostración de trabajo: http://jsfiddle.net/9yuohxuh/

avatar de usuario
fredrivett

Para aquellos que buscan una solución simple y pueden cambiar el DOM, pongan el overflow en el elemento exterior y el padding en el elemento interior.

.scroll {
    overflow-x: hidden;
    overflow-y: auto;
}

.scroll__inner {
    padding: 3em;
}

En el ejemplo de la pregunta original, se vería así:

#container {
    overflow-x: hidden;
    overflow-y: auto;
    width: 300px;
    height: 300px;
    background: red;
}

#some_info {
    height: 900px;
    background: #000;
    padding: 3em;
    box-sizing: border-box; /* only needed if wanting padding to not be added to height */
}

Nótese el uso de box-sizing: border-box aquí, que solo es necesario ya que el OP tiene una altura codificada (generalmente una mala práctica, pero podría ser necesaria en casos extremos), por lo que agregar esto border-box habilita el 3em acolchado para no aumentar la altura, sino almohadilla dentro del 900px.

Una nota final, recomendaría evitar las identificaciones para diseñar, principalmente debido a su especificidad extremadamente alta, ver esta publicación para más información sobre eso.

avatar de usuario
Rohit Azad Malik

Manifestación

Hola, ahora estoy acostumbrado a este css.

#container {
    padding: 3em;
    overflow-x: hidden;
    overflow-y: auto;
    width: 300px;
    height: 300px;
    background: red;
    padding-bottom:0; // add this line in your css
}

#some_info {
    height: 900px;
    background: #000;
    margin-bottom:3em; // add this line in your css
}

Manifestación

  • Esto funciona porque no hay contenido. Cuando agrega contenido, se superpone a todo lo que hay allí, ¡incluso al relleno! Cualquier borde, margen u otro contenedor uniforme sin contenido se colapsa dentro del div de desplazamiento (al menos en Chrome 43)

    – sergio

    04/07/2015 a las 20:45

  • No funciona si usas height: 100vhque es mi caso.

    – alejnavab

    7 oct 2016 a las 18:49

¿Ha sido útil esta solución?