[Bookmark] CSS: Usando recuo e recuo

Se vários elementos de uma página da web estiverem localizados próximos um do outro, os usuários terão a sensação de que esses elementos têm algo em comum. O agrupamento de elementos ajuda o usuário a entender seu relacionamento avaliando a distância entre eles. Se todos os elementos estivessem localizados à mesma distância um do outro, seria difícil para o usuário navegar pela página para descobrir quais deles estão relacionados entre si e quais não. Este artigo é dedicado a tudo o que você precisa saber sobre como definir distâncias entre elementos e sobre como configurar espaços internos de elementos. Em particular, falaremos sobre em que situações vale a pena usar preenchimento interno e em que - externo (margem).




Tipos de distância CSS


As distâncias entre elementos e suas partes, personalizáveis ​​por CSS, são de dois tipos. Eles, em relação ao elemento, são divididos em interno e externo. Imagine que temos um elemento. Se dentro dela existe uma certa distância entre algumas de suas partes, esse é um recuo interno. Se estamos falando sobre a distância entre os elementos individuais - esse é o recuo externo.


Espaço interno e espaço externo

No CSS, a distância entre elementos e seus componentes pode ser ajustada da seguinte maneira:

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

A propriedade é paddingusada aqui para ajustar o recuo, e a propriedade marginé usada para configurar o recuo. Tudo é muito simples. Verdade? Porém, o ajuste de distâncias em CSS pode ser muito complicado se você trabalhar com componentes que possuem muitas peças pequenas e crianças.

Property Propriedade da margem - recuo


A propriedade é marginusada para definir a distância entre elementos individuais. Por exemplo, o exemplo anterior usou a propriedade CSS margin-bottom: 1rempara adicionar a distância vertical entre dois elementos localizados um acima do outro.

O recuo externo pode ser definido para quatro lados de um elemento (superior, direito, inferior, esquerdo - superior, direito, inferior, esquerdo). Portanto, antes de passar para exemplos e discussões de diferentes maneiras de definir distâncias, é importante esclarecer alguns conceitos básicos.

▍ Recolher o preenchimento externo


Se descrevermos o conceito de "colapso das margens externas" em palavras simples, podemos dizer que isso acontece se dois elementos localizados um acima do outro possuem margens externas, e o recuo de um deles é maior que o recuo do outro. Nesse caso, um recuo maior será usado e o menor será ignorado.


O recuo maior vence.No

diagrama acima, a propriedade está configurada no elemento superior e a propriedademargin-bottomno elemento inferiormargin-top. A distância vertical entre os elementos corresponde ao maior desses recuos.

Para evitar esse problema, é recomendável configurar o mesmo recuo em todos os elementos (conforme descrito aqui ). E aqui está outro fato interessante. O recurso CSS Tricks votou no uso de propriedadesmargin-bottomemargin-top. Como se viu, a propriedademargin-bottomvenceu, recebendo 61% dos votos.

Veja como resolver esse problema:

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

O uso de um seletor de CSS :notfacilita a remoção do recuo externo do último filho, a fim de se livrar do espaço desnecessário entre os elementos.

Aqui está uma demonstração do trabalho com margens externas.Um

outro exemplo relacionado ao recolhimento de margens externas está relacionado aos elementos filho e pai. Suponha que você tenha o seguinte HTML:

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

Aqui estão seus estilos:

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

.child {
  margin: 50px 0;
}

Veja como é o resultado da visualização de tudo isso.


Filho e pai

Observe que o filho se encosta na parte superior do pai. Este é o resultado do colapso de suas margens externas. De acordo com o W3C , existem várias opções para resolver esse problema:

  • Adicionando uma propriedade borderao elemento pai.
  • Configurando a propriedade de um displayelemento filho para um valor inline-block.

Uma solução mais compreensível para esse problema seria definir a propriedade do padding-topelemento pai.


Definindo o recuo superior do elemento pai

Ind Recuo negativo


Um valor negativo pode ser usado para qualquer recuo externo. Em alguns casos, essa técnica é muito útil. Veja a figura a seguir.


Resultados de definir a propriedade preenchimento do elemento pai

do elemento pai tem uma propriedadepadding: 1rem. Isso faz com que a criança tenha deslocamentos da parte superior, esquerda e direita. Mas a criança deve estar adjacente às fronteiras dos pais. Margens externas negativas ajudarão a conseguir isso.

.parent {
    padding: 1rem
}

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

Foi o que aconteceu como resultado de tal estilização.


As margens externas negativas da criança ajudam a obter o efeito desejado

Aqui está uma demonstração

Se você estiver interessado no tópico margens externas negativas, recomendo este artigo.

PropertyPadding padding - padding interno


Como já mencionado, a propriedade paddingpermite controlar o espaço dentro do elemento. O objetivo de aplicar essa propriedade depende da situação em que é usada.

Por exemplo, ele pode ser usado para aumentar o espaço ao redor dos links. Isso leva a um aumento no espaço do link clicável .


Recuado em verde

▍ Situações em que a propriedade padding não funciona


É importante observar que o recuo vertical não funciona com elementos que possuem uma propriedade display: inline. Por exemplo, esses são elementos <span>e <a>. Se você configurar a propriedade paddingdesse elemento, essa configuração não funcionará. Este é apenas um lembrete amigável de que os elementos embutidos precisam alterar uma propriedade display:

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

Espaço entre elementos de layout de grade CSS


No CSS Grade, você pode facilmente ajustar a distância entre colunas e linhas usando a propriedade grid-gap. Esta é uma abreviação de uma propriedade que define a distância entre colunas e linhas.


Distâncias entre colunas e linhas

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

Um registro completo dessas propriedades é semelhante a este:

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

O espaço entre elementos CSS de um layout Flexbox


Há uma propriedade sugerida para layouts de grade e caixa flexível. Esta é uma propriedade gap. Atualmente, apenas o Firefox suporta .

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

Além disso, essa propriedade não pode ser usada com CSS @supportspara determinar se é suportado e para tomar decisões apropriadas com base nisso. Se você gosta desta propriedade - vote para adicioná-la ao Chrome.

Elementos de posicionamento em CSS


Talvez o posicionamento de elementos não possa ser atribuído diretamente a maneiras de ajustar a distância entre eles, mas, em alguns casos, o posicionamento desempenha um papel. Por exemplo, se houver um elemento filho absolutamente posicionado que precise ser localizado nas 16pxbordas esquerda e superior do elemento pai.

Considere o seguinte exemplo. Há um cartão no qual existe um ícone que precisa ser colocado a alguma distância das bordas superior e esquerda do elemento pai. Para alcançar esse efeito, você pode usar o seguinte estilo:

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



A distância entre os limites dos elementos pai e filho é destacada em verde.

Usar cenários e estudos de caso


Nesta seção, examinaremos os cenários para o uso de meios para ajustar distâncias entre elementos. Algo semelhante pode aparecer no seu trabalho diário com CSS.

▍ Componente de cabeçalho



Um componente é um cabeçalho com as seguintes configurações: recuo esquerdo e direito, espaço ao redor do logotipo, espaço ao redor do elemento de navegação, distância entre o elemento de navegação e o nome do usuário

Nesse caso, o componente do cabeçalho possui um logotipo, uma área de navegação e uma área na qual as informações são exibidas. sobre o perfil do usuário. Você consegue adivinhar como deve ser o código de estilização desse elemento? Aqui, para facilitar, uma marcação esquemática de um desses elementos:

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



Margens internas e externas As margens

esquerda e direita são usadas. Seu objetivo é garantir que o conteúdo do cabeçalho não se apegue às bordas.

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

Ao configurar links de navegação, é necessário levar em consideração o fato de que cada um deles deve ter espaço interno suficiente, tanto vertical quanto horizontalmente. Devido a isso, sua área clicável será grande o suficiente, o que melhorará a acessibilidade do projeto.

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

Se falamos sobre a distância entre os elementos, você pode usar a propriedade marginou - você pode alterar a propriedade dos displayelementos <li>para inline-block. Por isso, um pequeno espaço é adicionado entre os elementos que estão no mesmo nível, devido ao fato de que esses elementos são considerados símbolos.

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

Finalmente, o nome de usuário e o avatar têm um recuo externo esquerdo.

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

Observe que, se você estiver criando um site multilíngue, é recomendável usar propriedades lógicas de CSS nesta situação :

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



As distâncias antes e depois do separador não são as mesmas.Tenha em

atenção que as distâncias antes e depois do separador não são as mesmas. A razão para isso é que a largura do bloco de navegação não está definida. Em vez disso, apenas os recuos internos são configurados aqui. Como resultado, a largura dos elementos de navegação depende do seu conteúdo. Aqui estão as soluções para esse problema:

  • Configurando a largura mínima para itens de navegação.
  • Aumente o recuo horizontal.
  • Adiciona um recuo extra no lado esquerdo do separador.

A melhor e mais fácil maneira é usar o terceiro método, que é configurar a propriedade margin-left:

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

Aqui está uma demonstração

▍ Distâncias nos layouts de grade - CSS Flexbox


Os layouts de grade são o local em que as tecnologias para ajustar a distância entre os elementos são frequentemente usadas. Considere o seguinte exemplo.


Layout da grade

Precisamos ajustar a distância entre as linhas e colunas da tabela. Aqui está a marcação:

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

Normalmente, prefiro manter os componentes em um estado encapsulado e evitar configurar seus recuos externos. Por esse motivo, tenho um elemento grid_itemno qual o elemento do cartão será localizado.

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

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

Graças a este código CSS, haverá quatro cartões em cada linha. Aqui está uma maneira possível de ajustar a distância entre eles:

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

Usando a função CSS, o calc()recuo é subtraído de flex-basis. Como você pode ver, essa não é uma solução tão simples. Na verdade, eu prefiro o seguinte:

  • Defina a propriedade do item de grade padding-left.
  • Defina o elemento pai para ter uma margem externa negativa margin-leftcom o mesmo valor que y padding-left.

Eu aprendi sobre esse método há muitos anos, depois de ler aqui algum artigo, cujo nome já se esqueceu (se você souber que tipo de artigo - por favor me avise).

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

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

A razão pela qual eu usei um valor negativo para aqui margin-lefté porque o primeiro cartão tem uma propriedade padding-leftque, na realidade, não é necessária. Como resultado, movo o elemento wrapper para a esquerda e me livre de espaço desnecessário.

→  Aqui está um exemplo de trabalho:

outra idéia semelhante é usar recuo e recuo negativo. Aqui está um exemplo do site do Facebook.


Margens internas e externas

Aqui está o código CSS que ilustra esta ideia:

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

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

▍Distância nos layouts de grade - CSS Grid


E agora - a melhor parte! Em layouts baseados-Grid CSS, a distância entre os elementos é muito conveniente para ajustar o uso da propriedade grid-gap. Além disso, você não pode se preocupar com a largura dos elementos e as bordas externas inferiores. O layout da grade CSS cuida de tudo isso.

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

Isso é tudo. Acredito que ninguém argumentará que a configuração de layouts de grade é mais fácil e compreensível do que a configuração de layouts Flexbox.

▍Definir a distância entre os elementos somente quando necessário


Nos layouts de grade, gosto muito do fato de a propriedade grid-gapser aplicada apenas quando deve haver alguma distância entre os elementos. Veja o seguinte layout.


O layout da grade na qual os elementos no ambiente móvel são organizados verticalmente e na área de trabalho - horizontalmente.Há

uma seção do site com dois cartões. Preciso que eles sejam separados em um ambiente móvel, com um arranjo vertical de cartões e em um desktop, com seu arranjo horizontal. Sem o CSS Grid, é impossível obter essa flexibilidade de layout. Dê uma olhada no seguinte código:

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

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

Não é muito conveniente. Verdade? E o 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;
    }
}

Está feito! E tudo é muito mais simples.

OrkTrabalho com recuo externo inferior


Suponha que temos os seguintes componentes localizados um acima do outro. Cada um deles tem um recuo externo mais baixo.


Um conjunto de componentes dispostos horizontalmente

Observe que há uma margem externa inferior para o último elemento. E isso está errado, já que os recuos devem estar presentes apenas entre os elementos.

Você pode corrigir esse problema recorrendo a uma das soluções que analisaremos agora.

Solução 1: seletor de CSS: não


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

Solução nº 2: uma combinação de elementos vizinhos do mesmo nível


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

Análise de decisão


Embora a solução nº 1 pareça mais atraente, ela possui as seguintes desvantagens:

  • Isso leva a problemas específicos de CSS. Não pode ser redefinido até que um seletor seja usado :not.
  • Não se aplica quando há mais de uma coluna de itens. Isso é ilustrado abaixo.


Duas colunas de elementos e o problema da solução nº 1

Se falamos da solução nº 2, sua aplicação não leva a problemas com especificidade. É verdade que essa solução também é adequada apenas nos casos em que se trata de uma única coluna de elementos.

Nessa situação, é melhor recorrer à decisão de remover espaço desnecessário adicionando um recuo externo negativo ao elemento pai:

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

Aqui acontece o seguinte. Graças a essa configuração, o elemento é deslocado para baixo por uma distância igual ao recuo externo especificado. Mas aqui você deve tomar cuidado para não definir um recuo externo ao usar a sobreposição dos elementos.

▍ Placa Componente


Agora, quero discutir em detalhes as configurações das placas componentes. Talvez no final eu receba um livro inteiro sobre isso. Aqui vou considerar um padrão universal para configurar cartões e falar sobre como gerenciá-los.


Placa de componentes (se você sentir vontade de comer - me desculpe)

Pense onde exatamente nesta placa é usada a distância entre os elementos e suas partes. Aqui está a minha resposta a esta pergunta.


Margens internas e externas

Aqui está a marcação:

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

Aqui está o estilo da classe card__content:

.card__content {
    padding: 10px;
}

Graças ao recuo definido aqui, o deslocamento para todos os filhos será definido. Em seguida, configure as margens externas:

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

Ao configurar a separação de classificação e informação, usei a borda:

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

Mas aqui estamos diante de um problema! A borda não está vinculada às bordas, devido ao card__contentrecuo do elemento pai na classe .


O separador não está amarrado à borda.Você

talvez já tenha adivinhado que os recuos negativos nos ajudarão aqui:

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

Mas aqui novamente, algo deu errado. Agora, o texto ficou preso na borda do cartão.


O separador é normal, mas o conteúdo do cartão não está localizado corretamente.Para

resolver esse problema, você precisa configurar os recuos esquerdo e direito para o conteúdo do cartão.

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



A placa está configurada como deveria

Aqui está um exemplo

▍ Conteúdo dos artigos


Estou certo de que o que falaremos aqui é uma situação muito, muito comum. O ponto aqui é que o conteúdo dos artigos geralmente vai para as páginas do CMS (Content Management System - sistema de gerenciamento de conteúdo) ou é gerado automaticamente com base nos arquivos Markdown. Você não pode especificar classes de elementos aqui.

Considere o exemplo a seguir, que mostra a marcação contendo uma mistura de títulos, parágrafos e imagens.

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

A fim de trazer tudo para uma aparência decente, as distâncias entre os elementos devem ser uniformes e devem ser usadas com responsabilidade. Enquanto trabalhava neste exemplo, peguei emprestados alguns estilos do type-scale.com .

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

h1 {
  margin-top: 0;
}

img {
  margin-bottom: 0.5rem;
}

Aqui está um diagrama da página com o texto do artigo.


Layout da página e aplicação das propriedades da margem superior e inferior da margem

Se um elemento for<p>seguido por um cabeçalho, por exemplo, um cabeçalhoTypes of Spacing, a propriedade domargin-bottomelemento<p>será ignorada. Isso, como você pode imaginar, é uma conseqüência do colapso das margens externas.

Aqui está um exemplo

Ind Recuo externo, conforme aplicável


Veja o seguinte layout.


Elementos em condições normais e em uma situação de falta de espaço Os

elementos não parecem muito bons quando estão muito próximos um do outro. Eu criei esse layout usando o Flexbox. Essa técnica é chamada de "Alinhamento de deslocamento de alinhamento". Eu descobri o nome dela daqui .

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

Como resultado da aplicação desta técnica, a quebra de linha é realizada se a área de visualização for menor que um determinado limite. Aqui está como fica.


Os elementos filhos estão em novas linhas:

aqui você precisa lidar com uma situação intermediária na qual dois elementos ainda estão próximos, mas a distância entre eles é zero. Nesse caso, prefiro recorrer à propriedademargin-right, que impede que os elementos se toquem e acelere a respostaflex-wrap.


Elementos não se tocam

Modo de gravação da propriedade CSS


Primeiro, citamos o MDN : "A propriedade writing-modedefine a posição horizontal ou vertical do texto, bem como a direção do bloco".

Você já pensou em como os recuos externos devem se comportar quando usados ​​com um elemento cuja propriedade writing-modeé diferente do padrão? Considere o seguinte exemplo.


Cartão com cabeçalho vertical

Aqui estão os estilos:

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

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

O cabeçalho é girado 90 graus. Deve haver um espaço vazio entre ele e a imagem. Como se viu, a propriedade margin-rightmostra-se perfeitamente com diferentes valores da propriedade writing-mode.

Aqui está um exemplo

: acredito que já cobrimos cenários de indentação suficientes. Agora considere alguns conceitos interessantes.

Encapsulamento de componentes


Sistemas de design grandes contêm muitos componentes. Será lógico ajustar suas margens externas?

Considere o seguinte exemplo.


Botões

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

Onde preciso ajustar a distância entre os botões? Preciso configurar algumas propriedades do botão esquerdo ou direito? Talvez você possa usar uma combinação de elementos vizinhos do mesmo nível?

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

Não há nada de bom nisso. E se houver apenas um botão? E como funcionará em um dispositivo móvel, no caso em que os botões estão localizados na vertical e não na horizontal? Em geral, aqui nos deparamos com muitas questões difíceis.

SingUsando componentes abstratos


A solução para os problemas acima é o uso de componentes abstraídos, que são usados ​​para colocar outros componentes neles. Isso, como dito aqui , é uma mudança na responsabilidade de gerenciar o preenchimento do elemento pai. Repensamos o exemplo anterior à luz dessa idéia.


Componentes pai e filho

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

Observe que existem elementos de invólucro. Cada botão possui seu próprio invólucro.

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

.list__item {
    margin-left: 1rem;
}

Isso é tudo! Além disso, esse conceito é fácil de aplicar a qualquer estrutura JavaScript. Por exemplo:

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

E a ferramenta JS usada deve colocar cada elemento em seu próprio wrapper.

Componentes usados ​​como separadores


Se você duvida que leu o cabeçalho corretamente - não hesite. Estamos falando de componentes usados ​​como separadores. Em particular, refiro-me a este artigo, que discute o conceito que evita o uso de indentação e usa componentes separadores.

Imagine que em uma determinada seção do site você precise de um recuo externo esquerdo 24px. Ao mesmo tempo, os seguintes requisitos são apresentados ao recuo:

  • O recuo externo não deve ser configurado diretamente no componente, pois faz parte de um sistema de design já criado.
  • O recuo deve ser flexível. Em uma página pode ter um tamanho Xe, por outro - um tamanho Y.

Notei esse truque pela primeira vez ao explorar o novo design do Facebook .


Elemento separador de design do Facebook

Aqui é usado como um elemento separador<div>com um estilo embutidowidth: 16px. Seu único objetivo é adicionar espaço vazio entre o elemento esquerdo e o elemento container.

Aqui está uma citação deste manual de treinamento do React: “Mas no mundo real, precisamos de espaços definidos fora dos componentes para organizar os componentes em páginas e cenas. É aqui que as configurações da indentação externa entram no código do componente para ajustar as distâncias entre os componentes quando são montados. ”

Eu concordo com isso. Em um grande sistema de design, adicionar recuo aos componentes será irracional. Isso resultará em um código não tão bonito.

Issues Problemas do componente separador


Agora que você se familiarizou com a ideia de componentes separadores, vamos falar sobre alguns dos problemas que se espera que ocorram ao trabalhar com eles. Aqui estão as perguntas que eu tenho pensado:

  • Como um componente separador ocupa espaço em um componente pai? Como ele se comporta nos layouts horizontais e verticais? Por exemplo, como esse componente separaria os componentes vertical e horizontalmente?
  • Preciso estilizar esses componentes com base na propriedade displaydo componente pai (Flexbox, Grid)?

Vamos examinar essas perguntas.

IzesTamanhos de componentes separadores


Você pode criar um componente separador que aceite vários parâmetros. Não sou desenvolvedor de JavaScript, mas acho que isso é chamado de "adereços". Considere o exemplo a seguir, retirado daqui .

Há um componente separador localizado entre Headere Section.

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

E aqui está uma situação um pouco diferente. Aqui, o separador é usado para criar uma distância ajustável automaticamente entre o logotipo (componente Logo) e a área de navegação representada pelos componentes Link.

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

Parece que implementar um separador usando CSS é muito simples e basta usar o design justify-content: space-between. Mas e se você precisar alterar o design? Nesse caso, você precisa alterar a estilização.

Veja o exemplo a seguir. Esse código parece flexível?

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

Nesse caso, a estilização precisa ser alterada.

Em termos de tamanho, podemos dizer que o tamanho do separador pode ser ajustado com base no tamanho do elemento pai. No caso acima, pode fazer sentido criar uma propriedade growdefinida como um valor em CSS flex-grow: 1.

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

SeUso de pseudoelementos


Outra idéia que me veio à mente é usar pseudoelementos para criar separadores.

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

Talvez tenhamos a oportunidade de transformar um pseudoelemento em um separador e não usar um elemento separado para isso? Por exemplo:

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

Até agora, não usei componentes separadores em meus projetos. Mas estou procurando cenários em que eles possam ser úteis para mim.

Funções matemáticas CSS min (), max (), clamp ()


O recuo pode ser dinâmico? Por exemplo, é possível usar esse recuo, cujo tamanho mínimo e máximo depende da largura da área de visualização? Eu posso responder essa pergunta positivamente. As funções CSS, de acordo com os dados do CanIUse , são suportadas por todos os principais navegadores.

Lembre-se de layouts de grade e fale sobre como o recuo dinâmico pode ser usado neles.

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

Construção min(2vmax, 32px)significa o seguinte: use uma distância igual, 2vmaxmas não superior a 32px.

→  Aqui está uma demonstração em vídeo desse layout

→  Aqui está um exemplo.

Essa flexibilidade é realmente incrível. Isso nos dá muitas oportunidades para criar layouts dinâmicos e flexíveis de páginas da web.

Sumário


Neste artigo, examinamos os recursos de ajuste das distâncias entre elementos de páginas da Web usando CSS e discutimos sobre o gerenciamento do espaço interno dos elementos. Esperamos que você ache útil o que aprendeu hoje.

Queridos leitores! Quais ferramentas você usa com mais frequência para ajustar a distância entre os elementos da página da web?


All Articles