CSS possui uma palavra-chave auto
que você pode usar ao trabalhar com várias propriedades de elementos. Essas são propriedades que afetam a posição, altura e largura dos elementos. Essas são propriedades projetadas para ajustar o recuo dos elementos e suas outras características. Eu tinha um desejo em algum lugar para gravar tudo o que sei auto
. Por exemplo, para organizar tudo isso na forma de material que possa se tornar uma referência para aqueles que estão interessados nos meandros do uso dessa palavra-chave.A palavra auto
- chave tem um significado especial quando usada com várias propriedades CSS. Analisaremos os recursos auto
relacionados à aplicação desse valor a várias propriedades. Aqui, em primeiro lugar, estaremos interessados nos detalhes técnicos do trabalho.
auto
. Também falaremos sobre como tirar o máximo proveito do uso dessa propriedade. Aqui você encontrará notas sobre auto
casos de uso e exemplos.Propriedade Width: auto
A largura inicial dos elementos do bloco, como <div>
ou <p>
, é o valor auto
. Isso leva ao fato de que esses elementos ocupam todo o espaço horizontal do bloco que os contém.“Largura do bloco que contém o elemento” é, de acordo com a especificação CSS, um valor calculado pela seguinte fórmula:‘margin-left’ + ‘border-left-width’ + ‘padding-left’ + ‘width’ + ‘padding-right’ + ‘border-right-width’ + ‘margin-right’
Quando a largura do elemento de valor especificado auto
, ele pode ser configurado tais propriedades como margin
, padding
, border
e é, portanto, não será maior do que o seu elemento pai. A largura do bloco que restringe o conteúdo do elemento do bloco será o tamanho do conteúdo menos a largura de suas partes definidas pelas propriedades margin
(campo, recuo externo), padding
(recuo interno) e border
(borda).Comparação de largura: automática e largura: 100%Considere, por exemplo, os recursos do dispositivo dos layouts acima.Aqui está a marcação HTML:<div class="wrapper">
<div class="item"></div>
</div>
Aqui está o CSS:* {
box-sizing: border-box;
}
.wrapper {
max-width: 600px;
margin: 2rem auto 0;
padding: 1rem;
}
.item {
padding: 1rem;
margin: 0 50px;
border: 15px solid #1f2e17;
}
Aqui tudo parece como deveria, o conteúdo é limitado ao elemento pai.O elemento está dentro do elemento paiE o que acontece se você especificar que a largura do elemento (width
) não deve ser especificada como um valorauto
, mas como100%
? Com essa abordagem, o elemento ocupará 100% da largura do elemento pai, ao qual o espaço alocado nas margens direita e esquerda será adicionado. Aqui está o estilo apropriado:.item {
width: 100%;
padding: 1rem;
margin: 0 50px;
border: 15px solid #1f2e17;
}
Mas o que acontece depois de aplicá-lo a um elemento.O elemento se estende além do elemento pai (a direção do texto é ltr) eo elemento é amplo568px
. É calculado da seguinte forma:‘border-left-width’ + ‘padding-left’ + ‘width’ + ‘padding-right’ + ‘border-right-width’ = 15 + 16 + 506 + 16 + 15 = 568px
Se a propriedade estiver direction
configurada para um valor ltr
, o valor margin-right
será completamente ignorado. No nosso caso, é exatamente isso que acontece. No entanto, se direction
gravado rtl
, será ignorado margin-left
.O elemento vai além do elemento pai (a direção do texto é rtl).Aqui você pode experimentar o código de exemplo.▍ Casos de uso para largura: auto
A fim de entender corretamente o significado auto
, não há história suficiente sobre o básico. Portanto, realizei uma pesquisa com o objetivo de mostrar cenários para o uso prático da propriedade width: auto
.Larguras diferentes de elementos nas versões para celular e computador da página
Opções de aplicativos para dispositivos móveis e computadoresHá um grupo de botões. É necessário que na versão móvel do aplicativo eles estejam localizados próximos um do outro (um elemento que contém um botão deve ocupar 50% do elemento pai). Na versão da área de trabalho do aplicativo, cada botão deve ocupar toda a largura do contêiner pai. Como fazer isso?Aqui está a marcação HTML:<div class="group">
<div class="group__item">
<button class="c-button">Sign In</button>
</div>
<div class="group__item">
<button class="c-button c-button--ghost">Register</button>
</div>
</div>
Para colocar botões próximos uns dos outros na versão móvel da página, usei o layout do flexbox. Aqui está o CSS relevante:.group {
display: flex;
}
.group__item {
width: 50%;
}
Na versão desktop, preciso dos botões para ocupar toda a largura do elemento pai. Pode haver uma tentação de usar o design width: 100%
. Verdade? Mas há uma solução melhor:@media (min-width: 800px) {
.group {
display: block;
}
.group__item {
width: auto;
}
}
Como .group__item
esse é um elemento de bloco, o uso width: auto
leva ao fato de que esse elemento preenche perfeitamente o espaço disponível em seu elemento pai.Aqui está uma versão funcional deste exemplo.Propriedade Height: auto
Se considerarmos trabalhar com uma propriedade height
que define a altura dos elementos, tudo parecerá diferente. A altura do elemento, ao aplicar o valor auto
, corresponde à altura do conteúdo do elemento.Considere o seguinte exemplo:<div class="wrapper">
<div class="item">What's my height?</div>
</div>
Para que um elemento com uma classe .item
ocupe toda a altura do contêiner, você pode usar um dos seguintes métodos:- Você pode definir um elemento com uma classe como
.wrapper
altura fixa e, em seguida, adicionar uma .item
propriedade ao estilo do elemento height: 100%
. - Você pode usar o
.wrapper
layout da caixa flexível para o elemento , para que o filho .item
, por padrão, seja estendido para o tamanho do elemento pai.
Aqui está o CSS:.wrapper {
height: 200px;
}
.item {
height: 100%;
}
Elementos pai e filhoCampos e palavra-chave automática
Os campos (margens externas) costumam ser usados para centralizar horizontalmente elementos cuja largura é conhecida.Considere um exemplo.O item a ser centralizado Oretângulo azul precisa ser centralizado horizontalmente. Para esse fim, você pode usar o seguinte estilo:.element {
margin-left: auto;
margin-right: auto;
}
Voltando à especificação CSS:Se as propriedades 'margin-left' e 'margin-right' estiverem definidas como 'auto', a largura das margens será a mesma. Isso leva ao alinhamento horizontal do elemento em relação às arestas do bloco, incluindo ele.Os campos de um elemento têm a mesma largura.Aquiestá uma demonstração deste exemplo.Uso da margem: propriedade automática para elementos absolutamente posicionados
Elemento centralizadoOutro cenário menos comum para aplicar um valorauto
é centralizar elementos absolutamente posicionados usando uma construçãomargin: auto
. Se houver um elemento que precise ser centralizado dentro do elemento pai na horizontal e na vertical, pode parecer que você precise usar a propriedadetranslateX
oupara issotranslateY
.Para que a propriedademargin: auto
nos permita alinhar adequadamente o elemento, as seguintes condições devem ser atendidas:- A largura e a altura do elemento são especificadas.
- A propriedade do elemento está configurada
position: absolute
.
Aqui está a marcação HTML:<div class="wrapper">
<div class="item">I am centered.</div>
</div>
Aqui está o código do estilo:.wrapper {
position: relative;
}
.item {
width: 200px;
height: 100px;
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
margin: auto;
}
Aqui está uma demonstração dessa técnica de alinhamento.Layouts Flexbox e personalização automática de campos
O uso de campos configurados automaticamente pode, em alguns casos, ser um truque muito útil. Se o elemento filho tiver um campo cujas dimensões são definidas usando o valor auto
, ele será deslocado ao máximo no elemento pai para o lado oposto ao campo configurado. Por exemplo, se uma propriedade for atribuída a um elemento flexível margin-left: auto
, ela será deslocada ao máximo para a direita.Vamos olhar para o seguinte layout. Existem dois elementos filho retangulares localizados no elemento pai flexbox.Um par de elementos em um contêiner flexboxPrecisamos que o elemento 2 seja movido para a borda direita do contêiner. Usar o valorauto
da propriedade éótimopara issomargin-left
:.wrapper {
display: flex;
}
.item-2 {
margin-left: auto;
}
Aqui está o que aconteceu depois de aplicar esse estilo.O elemento número 2 é movido para a borda direita do contêiner.Note-se que essa técnica também funciona com os elementos sendo alinhados verticalmente. Neste exemplo, aplique o seguinte estilo do elemento # 2:.item-2 {
margin-top: auto;
}
Aqui está o resultado.Elemento No. 2 é movido para a borda inferior do recipiente.Além disso, se houver apenas um elemento filho, em seguida, de modo a alinhá-lo horizontalmente e verticalmente, pode utilizar a propriedademargin: auto
. Suponha que no contêiner haja apenas o elemento número 1, que precisa ser alinhado exatamente assim. Para fazer isso, usamos o seguinte estilo:.item-1 {
margin: auto;
}
Isso é suficiente para centralizar o elemento.Item nº 1 centrado no contêinerPropriedade flexível e valor automático
Ao desenvolver layouts flexbox, você pode usar a propriedade para elementos filho flex: auto
. O que esse design significa? O fato é que, quando um elemento filho tem uma propriedade flex: auto
, isso é equivalente ao fato de o elemento receber um estilo flex: 1 1 auto
semelhante à seguinte construção: .item {
flex-grow: 1;
flex-shrink: 1;
flex-basis: auto;
}
Aqui está o que a MDN diz sobre isso : “As dimensões de um elemento são determinadas de acordo com suas propriedades width
e height
, mas o elemento pode ser esticado, ocupando espaço livre adicional disponível no contêiner flex. Um elemento, para caber em um contêiner, pode e é compactado em seu tamanho mínimo. Isso é semelhante a definir estilo flex: 1 1 auto
. ”Em outras palavras, o tamanho do elemento com a propriedade flex: auto
será definido com base em sua largura e altura. Mas esse elemento pode esticar ou contrair, dependendo da quantidade de espaço disponível no contêiner. Eu não sabia disso até começar a pesquisar para este artigo.Como sempre, considere um exemplo.Aqui está a marcação:<div class="wrapper">
<div class="item item-1">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
</div>
Aqui estão os estilos:.wrapper {
display: flex;
flex-wrap: wrap;
}
.item {
width: 120px;
height: 500px;
}
.item-1 {
flex: auto;
}
E aqui está o resultado.Usando flex: autoAqui está uma versão funcional deste exemplo.Layouts de grade e valor automático
Use automático para ajustar colunas
Usando as colunas de modelo de grade: estilo auto 1fr 1frAo desenvolver layouts de grade, você pode usar o valorauto
ao configurar as colunas. Isso significa que a largura das colunas dependerá do tamanho do seu conteúdo. Aqui está o que eu quero dizer:.wrapper {
display: grid;
grid-template-columns: auto 1fr 1fr;
}
Layouts de grade e usando o valor automático para definir campos
Ao usar layouts de grade, o valor auto
pode ser usado para personalizar os campos do elemento. Isso é feito para obter resultados semelhantes aos alcançados quando usados auto
nos layouts do Flexbox. Se estivermos trabalhando com um layout de grade, e um dos elementos da grade tiver, por exemplo, um estilo margin-left: auto
, ele será movido para o lado direito do layout e sua largura será selecionada com base no tamanho do seu conteúdo.Considere o seguinte exemplo.Layout da gradePrecisamos da largura de um elemento paraItem 1
depender do seu conteúdo, e não do espaço da grade disponível para ele. Para fazer isso, podemos usar o seguinte estilo: .item-1 {
margin-left: auto;
}
Aqui está o resultado da aplicação desse estilo.A largura de um elemento depende do seu conteúdo.Layouts TRTL
Vale ressaltar que o uso de propriedades margin-left: auto
ou se margin-right: auto
mostra bem para layouts LTR (para layouts em que o conteúdo está localizado da esquerda para a direita), por exemplo, para aqueles que são usados para exibir textos escritos em inglês. Mas esteja ciente de que, em sites multilíngues, esses significados são invertidos. Ainda melhor, e eu recomendaria fazer exatamente isso, usando as propriedades Flexbox ou Grid em tais modelos, fazendo isso nos casos em que o objetivo possa ser alcançado com a ajuda deles. Se isso não for possível com a ajuda de tais propriedades, recorra à definição das propriedades da margem usando auto
apenas como último recurso. Em vez disso, é melhor usar as propriedades lógicas do CSS .Propriedade de estouro
Ao trabalhar com elementos de páginas da web, precisamos saber sobre o tamanho do conteúdo que esses elementos são capazes de conter. Se o conteúdo for maior do que o elemento pode conter, você precisará mostrar a barra de rolagem para trabalhar com esse conteúdo.Para resolver esse problema, você pode tentar usar o seguinte estilo:.element {
overflow-y: scroll;
}
Mas com essa abordagem, uma barra de rolagem pode aparecer mesmo que o elemento exiba conteúdo cujo tamanho não exceda o tamanho do elemento. Aqui está um exemplo.Elemento ao qual o estilo de rolagem overflow-y: está atribuídoNo navegador Chrome na plataforma Windows, a barra de rolagem é sempre exibida. Este é um exemplo de um elemento que se comporta mal e pode confundir o usuário.O uso em vez desse valorauto
permite garantir que a barra de rolagem seja exibida apenas nos casos em que a altura do conteúdo exceda a altura do contêiner.Oseguinte é indicadono MDN : “Depende do agente do usuário. Se o conteúdo for colocado na área do elemento correspondente ao espaço interno do elemento, será igual ao conteúdo exibido no modovisible
mas isso cria um novo contexto de formatação de bloco. "Os navegadores da área de trabalho exibem barras de rolagem se o conteúdo for maior que o tamanho do item."Propriedades para elementos de posicionamento
CSS-properties responsáveis para o posicionamento de elementos, tais como top
, right
, bottom
e left
, o valor é mantido auto
. Sobre o que quero falar agora, aprendi durante a redação deste artigo.Considere o seguinte layout.Layout da demonstraçãoHá um elemento pai com uma propriedade customizadapadding
que define o recuo. Este elemento tem outro elemento, um filho. O elemento filho está absolutamente posicionado, mas suas propriedades, responsáveis pelo posicionamento, não estão configuradas. Aqui estão os estilos:.wrapper {
position: relative;
padding: 16px;
}
.item {
position: absolute;
width: 100px;
height: 100px;
}
O fato é que, em CSS, cada propriedade possui um certo valor inicial (o valor padrão). Se você examinar um elemento filho e observar os estilos computados, qual será o valor de sua propriedade left
?Examinando os estilos calculados do filho.Ovalor padrão para a propriedadeleft
é este16px
. De onde veio se nem perguntamos a ele? A razão para isso é que as propriedades de um elemento absolutamente posicionado são consistentes com seu pai mais próximo, cuja propriedade está configuradaposition: relative
. O elemento pai tem uma propriedadepadding: 16px
. Isso faz com que o filho seja colocado a 16 pixels dos lados superior e esquerdo do pai. Interessante, certo?Agora você pode ter uma pergunta sobre qual é o uso disso para nós. Proponho lidar com isso.Imagine que uma criança precisa ser colocada em100px
na borda esquerda do elemento pai ao exibir a página em telas pequenas e em telas grandes, é possível colocar o elemento onde ele estaria localizado ao aplicar os valores padrão.Aqui está um estilo adequado para telas pequenas:.wrapper {
position: relative;
}
.item {
position: absolute;
left: 100px;
width: 100px;
height: 100px;
}
Como redefinir o valor da propriedade left
ao exibir uma página em telas grandes? Além disso, o valor left: 0
aqui não pode ser usado, pois isso levará ao fato de o elemento filho ser pressionado na borda do elemento pai, mas não precisamos dele. Dê uma olhada no layout da página mostrado abaixo. Ele esclarece meu argumento.O elemento filho não se comporta corretamente.Para repor as propriedades de posicionamento do elemento filho, você deve usar a construçãoleft: auto
. Isso é afirmado no MDN da seguinte maneira: "Um elemento é colocado horizontalmente, pois teria que ser posicionado se fosse um elemento estático."Isso significa que, ao colocar o elemento, a propriedade do elementopadding
paiserá levada em consideraçãoe será garantido que o elemento filho não "cole" na borda do elemento pai.Aqui está o CSS:.item {
position: absolute;
left: 100px;
width: 100px;
height: 100px;
}
@media (min-width: 800px) {
.item {
left: auto;
}
}
O mesmo se aplica a uma propriedade top
. Os valores calculados das propriedades right
e bottom
definidos por padrão são equivalentes, respectivamente, à largura e altura do elemento.Aqui está um projeto de demonstração para esta seção.Exemplos de uso do valor automático
Devo dizer imediatamente que os exemplos dados aqui não cobrem todas as possibilidades de significado auto
, mas espero que o que eu digo a você seja útil.Arrow Seta da dica de ferramenta
Ao criar dicas de ferramentas, eles precisam ter uma seta apontando para o objeto ao qual a dica de ferramenta se refere. Portanto, essas dicas são mais compreensíveis. No caso de estarmos desenvolvendo um sistema de design, precisamos fornecer diferentes estados de prompt. Por exemplo, solicita uma seta apontando para a esquerda e uma seta apontando para a direita.Setas direcionais apontando em direções diferentes.tooltip:before {
position: absolute;
left: -15px;
}
.tooltip.to-right:before {
position: absolute;
left: auto;
right: -15px;
}
Observe que eu usei a propriedade left: auto
para substituir a propriedade left: -15px
na implementação original. E assim você sabe, isso é usado com bastante frequência. Portanto, eu recomendaria usar o seguinte em vez da abordagem acima:.tooltip:before {
position: absolute;
right: 100%;
}
.tooltip.to-right:before {
position: absolute;
right: auto;
left: 100%;
}
Usando um valor 100%
, evitamos usar um valor fixo (largura da seta), o que pode levar ao mau funcionamento do sistema se o tamanho da seta mudar. Esta solução é mais adequada para possíveis alterações futuras.▍ Placa Componente
Talvez seu projeto tenha um cartão de componente no qual, no canto superior esquerdo, seja algum tipo de ícone. Pode desempenhar um papel decorativo ou pode ser um botão para executar uma ação. Independentemente da função do ícone, os componentes precisam ser projetados para que o ícone possa ser posicionado no canto superior esquerdo e no canto superior direito. Aqui está como fica.Placa componente com um ícone localizado em diferentes ângulosUsando uma propriedade,left: auto
é possível redefinir facilmente o valor da propriedade especificada em sua implementação básica. Aqui está o CSS:.card .icon {
position: absolute;
left: 15px;
top: 15px;
}
.card.is-right .icon {
left: auto;
right: 15px;
}
Layouts do Flexbox e valor da propriedade de margem automática
Os layouts Flexbox oferecem aos desenvolvedores da Web possibilidades verdadeiramente infinitas. Combinando os recursos desses layouts com os campos, cujo valor é usado para configurá-los auto
, podemos criar layouts muito poderosos.Considere o seguinte exemplo.Ajuste automático dos campos do elementoHá um contêiner vertical que contém o título do elemento, sua descrição e botão localizado à direita. Precisamos que o botão seja anexado ao lado direito do contêiner.Aqui está a marcação:<div class="item">
<div class="item-group">
</div>
<button class="item__action">Confirm</button>
</div>
Aqui estão os estilos: .item {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.item__action {
margin-left: auto;
}
Feito! O uso da propriedade margin-left: auto
permite que você coloque o botão no canto superior direito do elemento. O que é ainda melhor é que podemos usar propriedades lógicas de CSS se estivermos desenvolvendo um site multilíngue. O CSS será algo como isto:.item__action {
margin-inline-start: auto;
}
Se você quiser saber mais sobre o estilo RTL, aqui está um recurso útil dedicado a este tópico.Layouts de grade e valor automático da margem
Ajustando os campos dos elementos Grade, você pode definir valores fixos e percentuais, e também - você pode usar o valor auto
. Estou particularmente interessado no significado auto
. Veja o seguinte layout.Layout da gradeAqui está um fragmento da marcação:<p class="input-group">
<label for="">Full Name</label>
<input type="email" name="" id="">
</p>
Aqui estão os estilos:.input-group {
display: grid;
grid-template-columns: 1fr;
grid-gap: 1rem;
@media (min-width: 700px) {
grid-template-columns: 0.7fr 2fr;
}
}
Gostaria de alinhar os rótulos, elementos label
, na borda esquerda dos campos para inserir dados (elementos input
). Para fazer isso, você precisa aplicar o seguinte estilo:.input-group label {
margin-left: auto;
}
A aplicação desse estilo resultará no resultado mostrado na figura a seguir.Legendas à esquerda para entrada de dados▍ Projeto de janelas modais
Janela modalAo trabalhar no design de janelas modais, é importante considerar que o conteúdo que precisa ser exibido na janela pode não caber totalmente nele. Para que a janela funcione normalmente nessa situação, você pode usar o seguinte estilo:.modal-body {
overflow-y: auto;
}
Graças a esse estilo, a barra de rolagem aparece apenas se o conteúdo da janela for grande o suficiente.Sumário
Neste artigo, examinamos os recursos da aplicação da palavra-chave auto
em CSS. Esperamos que você ache útil o que lê hoje.Queridos leitores! Em que situações você usa valor auto
em CSS?