[Marcador] CSS: uso de sangría y sangría

Si varios elementos de una página web se encuentran cerca uno del otro, los usuarios tienen la sensación de que estos elementos tienen algo en común. La agrupación de elementos ayuda al usuario a comprender su relación al evaluar la distancia entre ellos. Si todos los elementos estuvieran ubicados a la misma distancia entre sí, sería difícil para el usuario navegar a través de la página para descubrir cuáles están relacionados entre sí y cuáles no. Este artículo está dedicado a todo lo que necesita saber sobre cómo establecer distancias entre elementos y sobre cómo configurar espacios internos de elementos. En particular, hablaremos sobre en qué situaciones vale la pena usar relleno interno y en qué - externo (margen).




Tipos de distancia CSS


Las distancias entre los elementos y sus partes, personalizables por CSS, son de dos tipos. Ellos, en relación con el elemento, se dividen en internos y externos. Imagina que tenemos un elemento. Si dentro de ella hay una cierta distancia entre algunas de sus partes, entonces esta es una sangría interna. Si hablamos de la distancia entre los elementos individuales, esta es la sangría externa.


Espacio interior y espacio exterior

En CSS, la distancia entre elementos y sus componentes se puede ajustar de la siguiente manera:

.element {
    padding: 1rem;
    margin-bottom: 1rem;
}

La propiedad se paddingusa aquí para ajustar la sangría, y la propiedad marginse usa para configurar la sangría. Todo es muy simple. ¿Verdad? Pero ajustar distancias en CSS puede ser muy complicado si trabaja con componentes que tienen muchas partes pequeñas y elementos secundarios.

▍ Propiedad de margen - Sangría


La propiedad se marginutiliza para establecer la distancia entre elementos individuales. Por ejemplo, el ejemplo anterior utilizó la propiedad CSS margin-bottom: 1rempara agregar la distancia vertical entre dos elementos ubicados uno encima del otro.

La sangría externa se puede configurar para cuatro lados de un elemento (superior, derecha, inferior, izquierda - superior, derecha, inferior, izquierda). Por lo tanto, antes de pasar a ejemplos y discusiones sobre diferentes formas de establecer distancias, es importante arrojar luz sobre algunos conceptos básicos.

▍ Contraer el acolchado exterior


Si describimos el concepto de "colapso de los márgenes externos" en palabras simples, entonces podemos decir que esto sucede si dos elementos ubicados uno encima del otro tienen márgenes externos, y la sangría de uno de ellos es mayor que la sangría del otro. En este caso, se usará una sangría más grande y se ignorará la más pequeña.


La sangría mayor gana.

En el diagrama anterior, la propiedad se configura en el elemento superior y la propiedadmargin-bottomen el inferiormargin-top. La distancia vertical entre los elementos corresponde al mayor de estos guiones.

Para evitar este problema, se recomienda configurar la misma sangría en todos los elementos (como se describe aquí ). Y aquí hay otro hecho interesante. El recurso CSS Tricks votó sobre el uso de propiedadesmargin-bottomymargin-top. Al final resultó que, la propiedadmargin-bottomganó, obteniendo el 61% de los votos.

Aquí se explica cómo resolver este problema:

.element:not(:last-child) {
    margin-bottom: 1rem;
}

El uso de un selector CSS :notfacilita la eliminación de la sangría externa del último elemento secundario para eliminar el espacio innecesario entre los elementos.

Aquí hay una demostración de cómo trabajar con márgenes externos.

Otro ejemplo relacionado con el colapso de los márgenes externos está relacionado con los elementos secundarios y primarios. Supongamos que tiene el siguiente HTML:

<div class="parent">
  <div class="child">I'm the child element</div>
</div>

Aquí están sus estilos:

.parent {
  margin: 50px auto 0 auto;
  width: 400px;
  height: 120px;
}

.child {
  margin: 50px 0;
}

Así es como se ve el resultado de visualizar todo esto.


Niño y padre

Tenga en cuenta que el niño se apoya contra la parte superior del padre. Este es el resultado del colapso de sus márgenes exteriores. Según el W3C , hay varias opciones para resolver este problema:

  • Agregar una propiedad borderal elemento padre.
  • Establecer la propiedad de un displayelemento hijo en un valor inline-block.

Una solución más comprensible a este problema sería establecer la propiedad del padding-topelemento padre.


Establecer la sangría superior del elemento padre

▍ Sangría negativa


Se puede usar un valor negativo para cualquier sangría externa. En algunos casos, esta técnica es muy útil. Echa un vistazo a la siguiente figura.


Resultados de establecer la propiedad de relleno del elemento

primario El elemento primario tiene una propiedadpadding: 1rem. Esto hace que el niño tenga desplazamientos desde la parte superior, izquierda y derecha. Pero el niño debe estar adyacente a los bordes del padre. Los márgenes externos negativos ayudarán a lograr esto.

.parent {
    padding: 1rem
}

.child {
    margin-left: -1rem;
    margin-right: -1rem;
    margin-top: -1rem;
}

Eso es lo que sucedió como resultado de tal estilización.


Los márgenes externos negativos del niño ayudan a lograr el efecto deseado

Aquí hay una demostración

Si está interesado en el tema de los márgenes externos negativos, le recomiendo este artículo.

▍ Propiedad de relleno - relleno interno


Como ya se mencionó, la propiedad le paddingpermite controlar el espacio dentro del elemento. El propósito de aplicar esta propiedad depende de la situación en la que se use.

Por ejemplo, se puede usar para aumentar el espacio alrededor de los enlaces. Esto conduce a un aumento en el espacio de enlace en el que se puede hacer clic .


Sangrado en verde

▍ Situaciones en las que la propiedad de relleno no funciona


Es importante tener en cuenta que la sangría vertical no funciona con elementos que tienen una propiedad display: inline. Por ejemplo, estos son elementos <span>y <a>. Si configura la propiedad de paddingdicho elemento, dicha configuración en este elemento no funcionará. Este es solo un recordatorio amigable de que los elementos en línea deben cambiar una propiedad display:

.element span {
    display: inline-block;
    padding-top: 1rem;
    padding-bottom: 1rem;
}

Espacio entre elementos de diseño de cuadrícula CSS


En la cuadrícula CSS, puede ajustar fácilmente la distancia entre columnas y filas utilizando la propiedad grid-gap. Esta es una abreviatura de una propiedad que define la distancia entre columnas y filas.


Distancias entre columnas y filas.

.element {
    display: grid;
    grid-template-columns: 1fr 1fr;
    grid-gap: 16px; /*    16px     */
}

Un registro completo de estas propiedades se ve así:

.element {
    display: grid;
    grid-template-columns: 1fr 1fr;
    grid-row-gap: 24px;
    grid-column-gap: 16px;
}

El espacio entre elementos CSS de un diseño de Flexbox


Se sugiere una propiedad para los diseños de cuadrícula y flexbox. Esta es una propiedad gap. Actualmente, solo Firefox lo admite .

.element {
    display: flex;
    flex-wrap: wrap;
    gap: 16px;
}

Además, esta propiedad no se puede usar con CSS @supportspara determinar si es compatible y para tomar las decisiones adecuadas en función de esto. Si le gusta esta propiedad, vote para agregarla a Chrome.

Elementos de posicionamiento en CSS


Quizás el posicionamiento de los elementos no puede atribuirse directamente a las formas de ajustar la distancia entre ellos, pero en algunos casos, el posicionamiento juega un papel importante. Por ejemplo, si hay un elemento secundario en una posición absoluta que necesita ubicarse en 16pxlos bordes izquierdo y superior del elemento primario.

Considere el siguiente ejemplo. Hay una tarjeta en la que hay un icono que debe colocarse a cierta distancia de los bordes superior e izquierdo del elemento principal. Para lograr este efecto, puede usar el siguiente estilo:

.category {
    position: absolute;
    left: 16px;
    top: 16px;
}



La distancia entre los límites de los elementos primarios y secundarios se resalta en verde.

Escenarios de uso y estudios de casos


En esta sección, veremos escenarios para usar medios para ajustar distancias entre elementos. Algo similar puede surgir en su trabajo diario con CSS.

▍ Componente de encabezado



Un componente es un encabezado que tiene la siguiente configuración: sangría izquierda y derecha, espacio alrededor del logotipo, espacio alrededor del elemento de navegación, distancia entre el elemento de navegación y el nombre de usuario

En este caso, el componente del encabezado tiene un logotipo, un área de navegación y un área en la que se muestra información sobre el perfil del usuario. ¿Puedes adivinar cómo debería ser el código de estilización de tal elemento? Aquí, para facilitarlo, un marcado esquemático de dicho elemento:

<header class="c-header">
  <h1 class="c-logo"><a href="#">Logo</a></h1>
  <div class="c-header__nav">
    <nav class="c-nav">
      <ul>
        <li><a href="#">...</a></li>
      </ul>
    </nav>
    <a href="#" class="c-user">
      <span>Ahmad</span>
      <img class="c-avatar" src="shadeed.jpg" alt="">
    </a>
  </div>
</header>



Márgenes internos y externos

Se utilizan márgenes izquierdo y derecho. Su propósito es asegurar que el contenido del encabezado no se adhiera a sus bordes.

.c-header {
    padding-left: 16px;
    padding-right: 16px;
}

Al configurar enlaces de navegación, se debe tener en cuenta el hecho de que cada uno de ellos debe tener suficiente espacio interno tanto vertical como horizontalmente. Debido a esto, su área de clic será lo suficientemente grande, lo que mejorará la accesibilidad del proyecto.

.c-nav a {
    display: block;
    padding: 16px 8px;
}

Si hablamos de la distancia entre los elementos, puede usar la propiedad margino puede cambiar la propiedad de los displayelementos <li>a inline-block. Debido a esto, se agrega un pequeño espacio entre los elementos que se encuentran en el mismo nivel, debido al hecho de que dichos elementos se consideran símbolos.

.c-nav li {
    /*     ,     */
    display: inline-block;
}

Finalmente, el nombre de usuario y el avatar tienen una sangría externa izquierda.

.c-user img,
.c-user span {
    margin-left: 10px;
}

Tenga en cuenta que si está creando un sitio web multilingüe, se recomienda utilizar propiedades lógicas de CSS en esta situación :

.c-user img,
.c-user span {
    margin-inline-start: 1rem;
}



Las distancias antes y después del separador no son las mismas.

Tenga en cuenta que las distancias antes y después del separador no son las mismas. La razón de esto es que el ancho del bloque de navegación no está establecido. En cambio, aquí solo se configuran las sangrías internas. Como resultado, el ancho de los elementos de navegación depende de su contenido. Aquí hay soluciones a este problema:

  • Establecer el ancho mínimo para los elementos de navegación.
  • Aumenta la sangría horizontal.
  • Agrega una sangría adicional en el lado izquierdo del separador.

La forma mejor y más fácil es usar el tercer método, que es configurar la propiedad margin-left:

.c-user {
    margin-left: 8px;
}

Aquí hay una demostración

▍ Distancias en diseños de cuadrícula - CSS Flexbox


Los diseños de cuadrícula son el lugar donde a menudo se utilizan tecnologías para ajustar la distancia entre elementos. Considere el siguiente ejemplo.


Diseño de cuadrícula

Necesitamos ajustar la distancia entre las filas y columnas de la tabla. Aquí está el marcado:

<div class="wrapper">
    <div class="grid grid--4">
        <div class="grid__item">
              <article class="card"><!--   --></article>
        </div>
        <div class="grid__item">
              <article class="card"><!--   --></article>
        </div>
        <!--   .. -->
    </div>
</div>

Por lo general, prefiero mantener los componentes en un estado encapsulado y evitar configurar sus sangrías externas. Por esta razón, tengo un elemento grid_itemen el que se ubicará el elemento de la tarjeta.

.grid--4 {
    display: flex;
    flex-wrap: wrap;
}

.grid__item {
    flex-basis: 25%;
    margin-bottom: 16px;
}

Gracias a este código CSS, habrá cuatro tarjetas en cada línea. Aquí hay una forma posible de ajustar la distancia entre ellos:

.grid__item {
    flex-basis: calc(25% - 10px);
    margin-left: 10px;
    margin-bottom: 16px;
}

Al usar la función CSS, calc()se resta la sangría flex-basis. Como puede ver, esta no es una solución tan simple. De hecho, prefiero lo siguiente:

  • Establezca la propiedad del elemento de cuadrícula padding-left.
  • Configure el elemento padre para que tenga un margen externo negativo margin-leftcon el mismo valor que y padding-left.

Aprendí acerca de este método hace muchos años, después de leer aquí un artículo, cuyo nombre ya se ha olvidado (si sabe qué tipo de artículo, por favor hágamelo saber).

.grid--4 {
    display: flex;
    flex-wrap: wrap;
    margin-left: -10px;
}

.grid__item {
    flex-basis: 25%;
    padding-left: 10px;
    margin-bottom: 16px;
}

La razón por la que usé un valor negativo aquí margin-leftes porque la primera tarjeta tiene una propiedad padding-leftque, en realidad, no es necesaria. Como resultado, muevo el elemento contenedor hacia la izquierda y elimino el espacio innecesario.

→  Aquí hay un ejemplo de trabajo:

otra idea similar es usar sangría y sangría negativa. Aquí hay un ejemplo del sitio de Facebook.


Márgenes internos y externos

Aquí está el código CSS que ilustra esta idea:

.wrapper {
    margin-left: -4px;
    margin-right: -4px;
}

.story {
    padding-left: 4px;
    padding-right: 4px;
}

▍Distancia en diseños de cuadrícula - CSS Grid


Y ahora, ¡la mejor parte! En los diseños basados ​​en la cuadrícula CSS, la distancia entre elementos es muy conveniente para ajustar usando la propiedad grid-gap. Además, no puede preocuparse por el ancho de los elementos y los bordes externos inferiores. El diseño de cuadrícula CSS se encarga de todo esto.

.grid--4 {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    grid-gap: 1rem;
}

Eso es todo. Creo que nadie argumentará que configurar diseños de cuadrícula es más fácil y más comprensible que configurar diseños de Flexbox.

▍ Establecer distancia entre elementos solo cuando sea necesario


En los diseños de cuadrícula, me gusta mucho el hecho de que la propiedad grid-gapse aplica solo cuando debe haber cierta distancia entre los elementos. Eche un vistazo al siguiente diseño.


El diseño de la cuadrícula en el que los elementos en el entorno móvil están dispuestos verticalmente y en el escritorio, horizontalmente,

hay una sección del sitio con dos tarjetas. Necesito que se separen tanto en un entorno móvil, con una disposición vertical de tarjetas, como en un escritorio, con su disposición horizontal. Sin CSS Grid, tal flexibilidad de diseño es imposible de lograr. Echa un vistazo al siguiente código:

.card:not(:last-child) {
    margin-bottom: 16px;
}

@media (min-width: 700px) {
    .card:not(:last-child) {
        margin-bottom: 0;
        margin-left: 1rem;
    }
}

No muy conveniente ¿Verdad? ¿Qué pasa con el próximo estilo?

.card-wrapper {
    display: grid;
    grid-template-columns: 1fr;
    grid-gap: 1rem;
}

@media (min-width: 700px) {
    .card-wrapper {
        grid-template-columns: 1fr 1fr;
    }
}

¡Se hace! Y todo es mucho más simple.

▍Trabajar con sangría externa inferior


Supongamos que tenemos los siguientes componentes ubicados uno encima del otro. Cada uno de ellos tiene una sangría externa más baja.


Un conjunto de componentes dispuestos horizontalmente

Tenga en cuenta que hay un margen exterior inferior para el último elemento. Y esto está mal, ya que las sangrías deben estar presentes solo entre elementos.

Puede solucionar este problema recurriendo a una de las soluciones que ahora analizaremos.

Solución # 1: selector CSS: no


.element:not(:last-child) {
    margin-bottom: 16px;
}

Solución No. 2: una combinación de elementos vecinos del mismo nivel.


.element + .element {
    margin-top: 16px;
}

Análisis de decisión


Aunque la solución # 1 parece más atractiva, tiene las siguientes desventajas:

  • Conduce a problemas específicos de CSS. No se puede redefinir hasta que se use un selector :not.
  • No se aplica cuando hay más de una columna de elementos. Esto se ilustra a continuación.


Dos columnas de elementos y el problema de la solución No. 1

Si hablamos de la solución No. 2, su aplicación no genera problemas de especificidad. Es cierto que esta solución también es adecuada solo en aquellos casos en que se trata de una sola columna de elementos.

En esta situación, es mejor recurrir a la decisión de eliminar el espacio innecesario agregando una sangría externa negativa al elemento padre:

.wrapper {
    margin-bottom: -16px;
}

Aquí sucede lo siguiente. Gracias a esta configuración, el elemento se desplaza hacia abajo una distancia igual a la sangría externa especificada. Pero aquí debe tener cuidado de no establecer una sangría externa cuando utilice elementos que se superpongan.

▍ Tarjeta de componente


Ahora quiero discutir en detalle la configuración de las tarjetas de componentes. Quizás al final obtenga un libro completo al respecto. Aquí consideraré un patrón universal para configurar tarjetas y hablaré sobre cómo administrarlas.


Tarjeta de componentes (si tiene ganas de comer, lo siento)

Piense en dónde exactamente en esta tarjeta se usa la distancia entre los elementos y sus partes. Aquí está mi respuesta a esta pregunta.


Márgenes internos y externos

Aquí está el marcado:

<article class="card">
    <a href="#">
      <div class="card__thumb"><img src="food.jpg" alt=""></div>
      <div class="card__content">
        <h3 class="card__title">Cinnamon Rolls</font></h3>
        <p class="card__author">Chef Ahmad</p>
        <div class="card__rating"><span>4.9</span></div>
        <div class="card__meta"><!-- --></div>
      </div>
    </a>
</article>

Aquí está el estilo de clase card__content:

.card__content {
    padding: 10px;
}

Gracias a la sangría establecida aquí, se establecerá el desplazamiento para todos los niños. Luego configure los márgenes exteriores:

.card__title,
.card__author,
.card__rating {
  margin-bottom: 10px;
}

Al configurar la separación de calificación e información, utilicé el borde:

.card__meta {
    padding-top: 10px;
    border-top: 1px solid #e9e9e9;
}

¡Pero aquí nos enfrentamos a un problema! El borde no está atado a los bordes, lo que se debe a la card__contentsangría del elemento padre con la clase .


El separador no está atado al borde.

Quizás, ya haya adivinado que las sangrías negativas nos ayudarán aquí:

.card__meta {
    padding-top: 10px;
    border-top: 1px solid #e9e9e9;
    margin: 0 -10px;
}

Pero aquí nuevamente, algo salió mal. Ahora el texto se ha pegado al borde de la tarjeta.


El separador es normal, pero el contenido de la tarjeta no está ubicado correctamente.

Para resolver este problema, debe configurar las sangrías izquierda y derecha para el contenido de la tarjeta.

.card__meta {
    padding: 10px 10px 0 10px;
    border-top: 1px solid #e9e9e9;
    margin: 0 -10px;
}



La tarjeta está configurada como debería

Aquí hay un ejemplo

▍ Contenido de artículos


Estoy seguro de que de lo que vamos a hablar aquí es una situación muy, muy común. El punto aquí es que el contenido de los artículos generalmente va a páginas de CMS (Sistema de gestión de contenido - sistema de gestión de contenido), o se genera automáticamente en función de los archivos Markdown. No puede especificar clases de elementos aquí.

Considere el siguiente ejemplo, que muestra marcas que contienen una mezcla de encabezados, párrafos e imágenes.

<div class="wrapper">
  <h1>Spacing Elements in CSS</h1>
  <p><!-- content --></p>
  <h2><font color="#3AC1EF">Types of Spacing</font></h2>
  <img src="spacing-1.png" alt="">
  <p><!-- content --></p> 
  <p><!-- content --></p> 
  <h2><font color="#3AC1EF">Use Cases</font></h2>
  <p><!-- content --></p> 
  <h3><font color="#3AC1EF">▍Card Component</font></h3> 
  <img src="use-case-card-2.png" alt="">
</div>

Para que todo tenga una apariencia decente, las distancias entre los elementos deben ser uniformes y deben usarse de manera responsable. Mientras trabajaba en este ejemplo, tomé prestados algunos estilos de type-scale.com .

h1, h2, h3, h4, h5 {
  margin: 2.75rem 0 1.05rem;
}

h1 {
  margin-top: 0;
}

img {
  margin-bottom: 0.5rem;
}

Aquí hay un diagrama de la página con el texto del artículo.


Diseño de página y aplicación de las propiedades margen superior e margen inferior

Si un elemento va<p>seguido de un encabezado, por ejemplo, un encabezadoTypes of Spacing,se ignorarála propiedad delmargin-bottomelemento<p>. Esto, como puedes adivinar, es una consecuencia del colapso de los márgenes exteriores.

Aquí hay un ejemplo

▍ Sangría externa, según corresponda


Eche un vistazo al siguiente diseño.


Elementos en condiciones normales y en una situación de

falta de espacio Los elementos no se ven muy bien cuando están demasiado cerca uno del otro. Creé este diseño usando Flexbox. Esta técnica se llama "Ajuste de desplazamiento de alineación". Descubrí su nombre desde aquí .

.element {
    display: flex;
    flex-wrap: wrap;
}

Como resultado de aplicar esta técnica, el ajuste de línea se realiza si el área de visualización es inferior a un cierto límite. Así es como se ve.


Los elementos secundarios están en nuevas líneas.

Aquí debe lidiar con una situación intermedia en la que dos elementos todavía están uno al lado del otro, pero la distancia entre ellos es cero. En este caso, prefiero recurrir a la propiedadmargin-right, que evita que los elementos se toquen entre sí y acelera la respuestaflex-wrap.


Los elementos no se tocan

▍ Modo de escritura de propiedad CSS


Primero citamos MDN : "La propiedad writing-modeestablece la posición horizontal o vertical del texto, así como la dirección del bloque".

¿Alguna vez ha pensado en cómo deben comportarse las sangrías externas cuando se usan con un elemento cuya propiedad writing-modees diferente del estándar? Considere el siguiente ejemplo.


Tarjeta con un encabezado vertical.

Aquí están los estilos:

.wrapper {
    /*              */
    display: flex;
}

.title {
    writing-mode: vertical-lr;
    margin-right: 16px;
}

El encabezado se gira 90 grados. Debe haber un espacio vacío entre este y la imagen. Al final resultó que, la propiedad se margin-rightmuestra perfectamente con diferentes valores de la propiedad writing-mode.

Aquí hay un ejemplo

: creo que hemos cubierto suficientes escenarios de sangría. Ahora considere algunos conceptos interesantes.

Encapsulación de componentes


Los grandes sistemas de diseño contienen muchos componentes. ¿Será lógico ajustar sus márgenes exteriores?

Considere el siguiente ejemplo.


Botones

<button class="button">Save Changes</button>
<button class="button button-outline">Discard</button>

¿Dónde necesito ajustar la distancia entre los botones? ¿Necesito configurar algunas propiedades del botón izquierdo o derecho? ¿Quizás pueda usar una combinación de elementos vecinos del mismo nivel?

.button + .button {
    margin-left: 1rem;
}

No hay nada bueno al respecto. ¿Qué pasa si solo hay un botón? ¿Y cómo funcionará en un dispositivo móvil, en el caso de que los botones estén ubicados verticalmente y no horizontalmente? En general, aquí nos enfrentamos a muchas preguntas difíciles.

▍Uso de componentes abstraídos


La solución a los problemas anteriores es el uso de componentes abstraídos, que se utilizan para colocar otros componentes en ellos. Esto, como se dijo aquí , es un poco un cambio en la responsabilidad de administrar el relleno al elemento padre. Repensamos el ejemplo anterior a la luz de esta idea.


Componentes primarios y secundarios

<div class="list">
    <div class="list__item">
        <button class="button">Save Changes</button>
    </div>
    <div class="list__item">
        <button class="button button-outline">Discard</button>
    </div>
</div>

Tenga en cuenta que hay elementos de envoltura. Cada botón tiene su propio envoltorio.

.list {
    display: flex;
    align-items: center;
    margin-left: -1rem; /*       */
}

.list__item {
    margin-left: 1rem;
}

¡Eso es todo! Y lo que es más, este concepto es fácil de aplicar a cualquier marco de JavaScript. Por ejemplo:

<List>
  <Button>Save Changes</Button>
  <Button outline>Discard</Button>
</List>

Y la herramienta JS utilizada debe colocar cada elemento en su propio contenedor.

Componentes utilizados como separadores


Si duda de leer el encabezado correctamente, no lo dude. Estamos hablando de componentes utilizados como separadores. En particular, aquí me refiero a este artículo, que analiza el concepto que evita el uso de sangría y utiliza componentes separadores en su lugar.

Imagine que en una determinada sección del sitio necesita una sangría externa izquierda de tamaño 24px. Al mismo tiempo, los siguientes requisitos se proponen para la sangría:

  • La sangría externa no debe configurarse directamente en el componente, ya que forma parte de un sistema de diseño ya creado.
  • La sangría debe ser flexible. En una página puede tener un tamaño X, y en la otra, un tamaño Y.

Primero noté este truco mientras exploraba el nuevo diseño de Facebook .


Elemento separador de diseño de Facebook

Aquí se utiliza como elemento separador<div>con un estilo en líneawidth: 16px. Su único propósito es agregar espacio vacío entre el elemento izquierdo y el elemento contenedor.

Aquí hay una cita de este manual de capacitación de React: “Pero en el mundo real, necesitamos espacios definidos fuera de los componentes para organizar los componentes en páginas y escenas. Es aquí donde la configuración de la sangría externa se abre paso en el código del componente para ajustar las distancias entre los componentes cuando se ensamblan ”.

Estoy de acuerdo con eso. En un sistema de diseño grande, agregar sangría a los componentes será irracional. Esto dará como resultado un código no tan atractivo.

▍ Problemas del componente separador


Ahora que se ha familiarizado con la idea de componentes separadores, hablemos sobre algunos de los problemas que se espera que ocurran al trabajar con ellos. Estas son las preguntas en las que he estado pensando:

  • ¿Cómo un componente separador ocupa espacio en un componente padre? ¿Cómo se comporta en diseños horizontales y verticales? Por ejemplo, ¿cómo separaría un componente tales componentes vertical y horizontalmente?
  • ¿Necesito displaydiseñar estos componentes en función de la propiedad del componente principal (Flexbox, Grid)?

Examinemos estas preguntas.

▍ Tamaños de componentes separadores


Puede crear un componente separador que acepte varios parámetros. No soy un desarrollador de JavaScript, pero creo que esto es lo que se llama "accesorios". Considere el siguiente ejemplo, tomado de aquí .

Hay un componente separador ubicado entre Headery Section.

<Header />
<Spacer mb={4} />
<Section />

Y aquí hay una situación ligeramente diferente. Aquí, el separador se utiliza para crear una distancia ajustable automáticamente entre el logotipo (componente Logo) y el área de navegación representada por los componentes Link.

<Flex>
  <Logo />
  <Spacer m="auto" />
  <Link>Beep</Link>
  <Link>Boop</Link>
</Flex>

Puede parecer que implementar dicho separador usando CSS es muy simple, y que es suficiente para usar el diseño justify-content: space-between. Pero, ¿qué pasa si necesitas cambiar el diseño? En este caso, debe cambiar la estilización.

Eche un vistazo al siguiente ejemplo. ¿Este código parece flexible?

<Flex>
  <Logo />
  <Link>Beep</Link>
  <Link>Boop</Link>
  <Spacer m="auto" />
  <Link>Boop</Link>
</Flex>

En este caso, la estilización necesita ser cambiada.

En términos de tamaño, podemos decir que el tamaño del separador se puede ajustar en función del tamaño del elemento padre. En el caso anterior, puede tener sentido crear una propiedad growestablecida en un valor en CSS flex-grow: 1.

<Flex>
  <Spacer grow="1" />
</Flex>

▍Uso de pseudoelementos


Otra idea que se me ocurrió es usar pseudoelementos para crear separadores.

.element:after {
    content: "";
    display: block;
    height: 32px;
}

¿Quizás tengamos la oportunidad de hacer que un pseudo-elemento sea un separador y no usar un elemento separado para esto? Por ejemplo:

<Header spacer="below" type="pseudo" length="32">
  <Logo />
  <Link>Home</Link>
  <Link>About</Link>
  <Link>Contact</Link>
</Header>

Hasta ahora, no he usado componentes separadores en mis proyectos. Pero estoy buscando escenarios en los que puedan ser útiles para mí.

Funciones matemáticas CSS min (), max (), clamp ()


¿Puede la sangría ser dinámica? Por ejemplo, ¿es posible usar tal sangría, cuyo tamaño mínimo y máximo depende del ancho del área de visualización? Puedo responder esta pregunta positivamente. Las funciones CSS, de acuerdo con los datos de CanIUse , son compatibles con todos los principales navegadores.

Recuerde los diseños de cuadrícula y hable sobre cómo se puede usar la sangría dinámica en ellos.

.wrapper {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-gap: min(2vmax, 32px);
}

Construcción min(2vmax, 32px)significa lo siguiente: use una distancia igual 2vmaxpero no superior 32px.

→  Aquí hay una demostración en video de dicho diseño

→  Aquí hay un ejemplo.

Tal flexibilidad es realmente asombrosa. Nos brinda muchas oportunidades para crear diseños dinámicos y flexibles de páginas web.

Resumen


En este artículo, examinamos las características de ajustar las distancias entre los elementos de las páginas web usando CSS y hablamos sobre la administración del espacio interno de los elementos. Esperamos que encuentre útil lo que aprendió hoy.

¡Queridos lectores! ¿Qué herramientas usa con más frecuencia para ajustar la distancia entre los elementos de la página web?


All Articles