¿Por qué CSS no admite relleno negativo?


124

He visto esto muchas veces que la posibilidad de un relleno negativo podría ayudar a que el desarrollo de CSS de ciertos elementos de la página sea mejor y más fácil. Sin embargo, no hay ninguna disposición para un relleno negativo en el CSS del W3C. Cuál es la razón detrás de esto? ¿Hay alguna obstrucción a la propiedad que impida su uso como tal? Gracias por tus respuestas.

ACTUALIZACIÓN

Como veo, por ejemplo, en caso de que esté usando una fuente que tenga algo, digamos, un espacio vertical de 20px, y desee aplicar un borde discontinuo en la parte inferior de la fuente, digamos cuando aparece un hipervínculo. En tales casos, encontrará que el estilo es demasiado descuidado, ya que el borde discontinuo aparecerá 20px debajo de la palabra especificada. si usa un margen negativo, no funcionará, ya que el margen altera el área fuera de los bordes. El relleno negativo puede ayudar en tales situaciones.


27
porque no tiene sentido tener relleno negativo
Petah

1
Es lo mismo que verías en un HTML generado por Frontpage. Funciona un poco, pero arroja muchos errores al ser validado. El relleno negativo no es parte de las especificaciones, pero aún es compatible con los navegadores.
Linus Kleen

9
Mucha gente quisiera un ejemplo. Aquí está el mío y por qué me encantaría el relleno negativo. Con la función de imagen de borde, es posible que desee dejar que el borde de la imagen se superponga ligeramente con el texto (por ejemplo, si está creando una burbuja brillante resaltada, muy popular en la web estos días;))
Himmators

81
Si algo "no tiene sentido" para alguien, no es excusa para que se interponga en el camino de otra persona.
Rolf

1
Estoy tratando de mostrar el código en una <span>etiqueta y la forma en que se analiza arroja saltos de línea adicionales al comienzo del bloque de código. Con relleno negativo, podría hacer que este espacio extra desaparezca.
Steven Lu

Respuestas:


86

Recientemente respondí una pregunta diferente en la que discutí por qué el modelo de caja es como es.

Hay razones específicas para cada parte del modelo de caja. El relleno está destinado a extender el fondo más allá de su contenido. Si necesita reducir el fondo del contenedor, debe hacer que el contenedor primario tenga el tamaño correcto y darle al elemento secundario algunos márgenes negativos. En este caso, el contenido no se rellena , se desborda.


2
Gracias amigo. Eso me da una razón satisfactoria. Salud. :)
ikartik90

11
¿Qué sucede si desea reducir el borde más cerca del texto, por ejemplo, cuando está usando una imagen de borde?
Himmators

55
a veces no es práctico editar el CSS de todos los elementos secundarios de un contenedor. Es posible que tenga CSS genérico que se aplique a estos elementos en todo el documento, y no desea cambiarlo por el contenido de un contenedor en particular, por ejemplo.
Rolf

15
Eh, es una razón, pero no lo llamaría satisfactorio. Este es un caso en el que la especificación va más allá de decirme cómo definir mi página y comienza a decirme cómo debo definir mi página. Si quiero que mi contenido se superponga con los bordes, bordes y / o márgenes de mi fondo, esa debería ser mi prerrogativa, a pesar de que la especificación define la imaginación de por qué podría querer hacerlo. Lo siento, solo estoy un poco irritado porque tengo que agregar imágenes sintéticas crudas o, peor aún, de un solo píxel de un solo color para obtener un separador de tamaño específico que sea más pequeño que la altura del texto y centrado verticalmente.
Jason

1
@zzzzBov, sentí que era relevante debido al ejemplo que di al final de por qué querría hacer tal cosa, que es una pregunta común en los comentarios en esta página. Es cierto que mi caballo estaba un poco alto antes de ese punto.
Jason

4

El relleno por definición es un entero positivo (incluido 0).

El relleno negativo haría que el borde colapsara en el contenido (vea la página del modelo de caja en w3); esto haría que el área de contenido sea más pequeña que el contenido, lo que no tiene sentido.


37
El borde que colapsa en el contenido es exactamente el efecto deseado. ¿Conoces alguna otra forma de obtener este efecto?
Rolf

44
De acuerdo con Rolf. Usted, Oded, obviamente no está en un diseño experimental complejo, puedo ver. Usando relleno negativo y borde, sin poder usar valores de píxeles explícitos, es prácticamente imposible obtener resultados similares. Hasta donde sé, necesitaría múltiples elementos anidados para lograr lo mismo, sin embargo, las cosas se vuelven un poco más complicadas que, en algunos casos.
Yeti

4

Me gustaría describir un muy buen ejemplo de por qué negative paddingsería útil e increíble.

Como todos los desarrolladores de CSS sabemos, alinear verticalmente un div de tamaño dinámico dentro de otro es una molestia y, en su mayor parte, se considera imposible solo usando CSS. La incorporación de negative paddingpodría cambiar esto.

Por favor revise el siguiente HTML:

<div style="height:600px; width:100%;">
    <div class="vertical-align" style="width:100%;height:auto;" >
        This DIV's height will change based the width of the screen.
    </div>
</div>

Con el siguiente CSS, podríamos centrar verticalmente el contenido del interior divdentro del exterior div:

.vertical-align {
    position: absolute;
    top:50%;
    padding-top:-50%;
    overflow: visible;
}

Permíteme explicarte ...

Posicionar absolutamente la parte superior del div interno al 50% coloca el borde superior del div interno en el centro del div externo. Bastante simple. Esto se debe a que el posicionamiento basado en porcentajes es relativo a las dimensiones internas del elemento padre .

El relleno basado en porcentaje , por otro lado, se basa en las dimensiones internas del elemento objetivo . Entonces, al aplicar la propiedad de padding-top: -50%;hemos desplazado el contenido del div interno hacia arriba en una distancia del 50% de la altura del contenido del div interno, centrando así el contenido del div interno dentro del div externo y aún permitiendo la dimensión de altura del div interno para ser dinámico!

Si me preguntas OP, este sería el mejor caso de uso, y creo que debería implementarse solo para poder hacer este hack. jajaja O bien, deberían corregir la funcionalidad de vertical-aligny darnos una versión vertical-alignque funcione en todos los elementos.


1
Sí, pero para ese propósito prefiero tener nuevos atributos para elementos html, en lugar de secuestrar el comportamiento de otros atributos. Su ejemplo requiere un nuevo atributo inner-top; como el atributo superior del elemento relativamente posicionado, pero relativo a sí mismo, no al padre. Otro buen uso del relleno negativo sería hacer un elemento proporcionalmente a su ancho llenando con un relleno del 100%, pero permitiendo que el elemento crezca verticalmente si más contenido lo desborda, lo cual es imposible si el contenido está en un hermano abs-pos adicional. El relleno negativo llevaría el elemento contraído de relleno a su tamaño.
sergio

en 2018 el centrado es tan fácil como usar flex de pantalla con contenido justificado y elementos de alineación ... 3 líneas de código para tener un div centrado perfecto.
Kaiser


1

Preguntaste POR QUÉ, no cómo engañarlo:

Por lo general, debido a la pereza de los programadores de la implementación inicial, porque ya han puesto más esfuerzo en otras características, entregando efectos secundarios más extraños como flotadores, porque los diseñadores los solicitaron más en ese momento y aún no se han tomado el tiempo para permitir esto para que podamos usar las CUATRO propiedades para empujar / tirar de un elemento contra sus vecinos (ahora solo tenemos cuatro para empujar, y solo 2 para tirar).

Cuando se diseñó html, a las revistas les encantaba que el texto volviera a aparecer alrededor de las imágenes en ese entonces, ahora odiaban porque hoy tenemos tendencias táctiles y nos encantan las cosas con mucho espacio y nada para leer. Es por eso que ponen más presión sobre los flotadores que en el centrado, o que podría haber diseñado algo así margin-top: fill;, o margin: average 0;simplemente para alinear el contenido de la parte inferior, o distribuir su espacio adicional alrededor.

En este caso, creo que no se ha implementado debido a la misma razón que hace que CSS carezca de un :parentpseudo-selector: para evitar evaluaciones en bucle.

Sin ser ingeniero, puedo ver que CSS ahora está hecho para pintar elementos una vez, recordar algunas propiedades para pintar elementos futuros, pero NUNCA volver a elementos ya pintados.

Es por eso (supongo) que el relleno se calcula sobre el ancho, porque ese es el valor que estaba disponible al momento de comenzar a pintarlo.

Si tuviera un valor negativo para el relleno, afectaría los límites exteriores, que YA se han definido cuando el margen ya se ha establecido. Lo sé, todavía no se ha pintado nada, pero cuando lees cómo va el proceso de pintura, creado por genios con tecnología de los años 90, siento que estoy haciendo preguntas tontas y solo digo "gracias", jeje.

Uno de los requisitos de las páginas web es que estén rápidamente disponibles, a diferencia de una aplicación que puede tomar su tiempo y consumir los recursos de la computadora para hacer que todo esté correcto antes de mostrarla, las páginas web necesitan usar pocos recursos (para que quepan en cada dispositivo posible) y desplazarse en una brisa.

Si ve aplicaciones con reflujo y posicionamiento complejos, como InDesign, ¡no puede desplazarse tan rápido! ¡Se necesita un gran esfuerzo tanto de los procesadores como de la tarjeta gráfica para pasar a las páginas siguientes!

Por lo tanto, pintar y calcular hacia adelante y olvidarse de un elemento una vez dibujado, por ahora parece ser IMPRESCINDIBLE.



0

Debido a que los diseñadores de CSS no tenían la previsión de imaginar la flexibilidad que esto traería. Hay muchas razones para expandir el área de contenido de un cuadro sin afectar su relación con los elementos vecinos. Si cree que no es posible, coloque un nowraptexto largo en un cuadro, establezca un ancho en el cuadro y observe cómo el contenido desbordado no hace nada al diseño.

Sí, esto sigue siendo relevante con CSS3 en 2019; caso en cuestión: diseños de flexbox. Los márgenes de los elementos de Flexbox no se contraen, por lo que para espaciarlos de manera uniforme y alinearlos con el borde visual del contenedor, uno debe restar los márgenes de los elementos del relleno de su contenedor. Si algún resultado es <0, debe usar un margen negativo en el contenedor, o sumar ese negativo con el margen existente. Es decir, el contenido del elemento afecta cómo se definen los márgenes para él, que es al revés. La suma no funciona correctamente cuando el contenido de los elementos flexibles tiene márgenes definidos en diferentes unidades o se ve afectado por un tamaño de fuente diferente, etc.

El siguiente ejemplo debería, idealmente, tener cuadros grises alineados y espaciados uniformemente, pero lamentablemente no lo son.

body {
  font-family: sans-serif;
  margin: 2rem;
}
body > * {
  margin: 2rem 0 0;
}
body > :first-child {
  margin-top: 0;
}
h1,
li,
p {
  padding: 10px;
  background: lightgray;
}
ul {
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  padding: 0;/* just to reset */
  padding: -5px;/* would allow correct alignment */
}
li {
  flex: 1 1 auto;
  margin: 5px;
}
<h1>Cras facilisis orci ligula</h1>

<ul>
  <li>a lacinia purus porttitor eget</li>
  <li>donec ut nunc lorem</li>
  <li>duis in est dictum</li>
  <li>tempor metus non</li>
  <li>dapibus sapien</li>
  <li>phasellus bibendum tincidunt</li>
  <li>quam vitae accumsan</li>
  <li>ut interdum eget nisl in eleifend</li>
  <li>maecenas sodales interdum quam sed accumsan</li>
</ul>

<p>Fusce convallis, arcu vel elementum pulvinar, diam arcu tempus dolor, nec venenatis sapien diam non dui. Nulla mollis velit dapibus magna pellentesque, at tempor sapien blandit. Sed consectetur nec orci ac lobortis.</p>

<p>Integer nibh purus, convallis eget tincidunt id, eleifend id lectus. Vivamus tristique orci finibus, feugiat eros id, semper augue.</p>

Me he encontrado con muchos de estos pequeños problemas a lo largo de los años en los que un poco de relleno negativo habría sido muy útil, pero en cambio me veo obligado a agregar calc()preprocesadores de marcado, uso o CSS no semánticos que solo funcionan cuando las unidades son las mismas etc.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.