Skip to content

Instantly share code, notes, and snippets.

@jeftarmascarenhas
Last active August 29, 2015 14:13
Show Gist options
  • Save jeftarmascarenhas/0a4ae91dbef7891c6833 to your computer and use it in GitHub Desktop.
Save jeftarmascarenhas/0a4ae91dbef7891c6833 to your computer and use it in GitHub Desktop.
Como escrever seu CSS para projetos mobile-first Rápido e fácil (Garanto)!

Como escrever seu CSS para projetos mobile-first

Rápido e fácil (Garanto!)

Desenvolver sites responsivos hoje em dia é requisito para desenvolvedores front-end, quando falamos em responsivo você logo lembra em Mobile-first mesmo nunca tendo feito um projeto usando a abordagem. A algum tempo venho lendo, estudando e testando o conceito mobile-first, mas na grande maioria os artigos e exemplos que vejo, abordam como desenvolver site ou aplicação web em relação a planejamento e design, não falam sobre codificação para o mobile-first, mas agora este artigo vai mostra a você como pensar seu código CSS para mobile.

Conceito Mobile-first para CSS

Quando você usa o conceito mobile-first para fazer seu estilo CSS significa dizer que os estilos são aplicados primeiro para dispositivos moveis, só então são aplicados substituições, estilo avançados e consultas de media queries para telas maiores. No mobile-first styling você utiliza a propriedade min-width nas consultas de media queries. “Nos exemplos vou utilizar CSS puro, não vou utilizar pré-processadores” Exemplo rápido:


/* este estilo aplica-se a partir de 0px até 900px */
body {
      background: red;
} 
/* este estilo aplica-se a partir de 900px em diante */
@media ( min-width: 900px ) {
          body {
	background: green;
}
}

No exemplo acima o background fica vermelho para dispositivos mobile de 0px até 900px(899px) de 900px em diante o background fica verde.

Na abordagem desktop-first os estilos são aplicados primeiro para desktop onde você utiliza a propriedade max-width nas consultas de medias queries. Exemplo rápido:


/* este estilo aplica-se a partir de 900px em diante */
body {
      background: red;
} 
/* este estilo aplica-se a partir de 0px até 900px */
@media ( max-width: 900px ) {
          body {
	background: green;
}
}

Você pode ter um projeto que usa a abordagem mobile-first, e mesmo assim fazer um código Desktop-first, correto? Não, ou pelo menos não deveria. Desenvolver estilos para telas maiores geralmente são mais complicados do que para telas menores, quando você faz o estilo para mobile-first primeiro você simplifica o código e fica em conformidade com o projeto já que o mesmo foi planejado dentro da abordagem mobile-first.

Vamos ao próximo exemplo, imagine que você tem um layout que tenha três div’s com uma class com nome box, no mobile o estilo requer 100% de largura e no desktop requer 33.33%.

Exemple 1

Neste caso como estou utilizando a tag div que tem 100% de largura como padrão, eu não preciso seta um uma propriedade de largura. Veja o exemplo no código com o conceito mobile-first:


.box{
/*Não precisamos inserir nenhum código aqui */
}
.box:nth-child (odd) {
	background:#222;  /* Adicionei um background para um melhor entendimento */
}
@media ( min-width: 800px ) {
	float: left;
	width: 33.33%;
}

O código fica muito elegante e com linhas de CSS a menos.   Se utilizamos o conceito Desktop-first teríamos que modificarmos algumas propriedades para alguns viewports. Veja um exemplo de código Desktop-first:


.box {
	/*primeiro configuro as propriedades para telas maiores */
	float: left;
	width: 33.33%;
}
@media ( max-width: 800px ) {
/*Aqui configuro o estilo para telas menores, veja que preciso reescrever novamente para que o estilo fique de acordo com layout */
	float: none;
	width: 100%;
}

Com o exemplo do código CSS mobile-first nós poupamos algumas linhas de código e melhoramos a performance da CSS. Agora imagine quanto tempo você irá poupar em um projeto de médio e grande porte.

Creio que você já percebeu que apenas utilizando propriedade min-width você já resolve várias questões no desenvolvimento mobile-first, mas nem sempre vai ser o suficiente. Em alguns casos você terá que usar a combinação min-width e max-width para resolver algumas cominações que a propriedade min-width não poderá resolver. Vamos analisar o exemplo onde podemos utiliza o min-width e max-width juntos para resolver problemas em layout responsivos.

Vamos considerar um exemplo de um site que seja divido da seguinte forma: 3 box em uma fileira para dispositivo mobile e 4 box em uma fileira para desktop. Exemple 2

O código para este exemplo é bem simples:

.boxs {
	float: left;
	width: 28.33%;
}
@media ( min-width: 800px ) {
	width: 25%; // bem simples
}

Mas ele fica um pouco complicado se a espaços entre os boxs. Exemple 3

Digamos que os espaços ocupem 5% de largura;

.boxs {
	float: left;
	width: 33.33%;
	margin-right: 5%;
	margin-bottom: 5%;
}

Neste caso teremos que dar uma margin-rigth:0; a cada 3 boxs (itens) para que as boxs não sejam empurradas para baixo no caso do layout mobile.

.boxs :nth-child(3n) { margin-right: 0%;

}   Mas também esse código deve trabalhar uma fileira com 4 boxs para ir de acordo com o layout proposto para o desktop.


.boxs {
	float: left;
	width: 28.33%;
	margin-right: 5%;
	margin-bottom: 5%;
}
.boxs :nth-child(3n) {

	margin-right: 0%;
}
@media ( min-width: 800px ) {

    width: 21.25% /* ( 100% - 15% ) / 4  os 15% são da margin-rigth */
 	
  .boxs:nth-child(4n) {
	     
 	margin-rigth: 0%;
    }

}

Este código não funciona bem porque nós especificamos que a cada 3 boxs (itens) deve ter um margin-right: 0. Essa propriedade fica em cascata com isso em uma largura maior o padrão do layout não fica como desejado e rompe-se. Veja como ficaria se você utilizar o código acima: Exemple 4   Nós poderíamos corrigir usando a consulta de media min-width dando a cada 3 boxs uma margin-right: 5%;


.boxs {
	float: left;
	width: 28.33%;
	margin-right: 5%;
	margin-bottom: 5%;
}

@media ( min-width: 800px ) {

 width: 21.25% /* ( 100% - 15% ) / 4  os 15% são da margin-rigth */
.boxs :nth-child(3n) {

	margin-right: 5%;
}
 	
  .boxs:nth-child(4n) {
	     
 	margin-rigth: 0%;
    }
}

Isto resolve, mas não fica bem porque não estamos usando o viewport apropriado e sim repetindo para todos os viewports. Como nós somos bons desenvolvedores sempre buscamos escrever as CSS mais apropriadas possíveis e sem repetições. Usaremos a cominação max-width e min-width.


.boxs {
	float: left;
	margin-right: 5%;
	margin-bottom: 5%;
}

@media ( max-width: 800px ) {
     .boxs {
width: 28.33%;	     
   }
.boxs:nth-child(3n){
	margin-right: 0%;
   }

}
@media ( min-width: 800px ) {

.boxs{
	width: 21.25%; /* ( 100% - 15% )  / 4 */
  }
.boxs:nth-child(4n) {
	margin-right: 0%;
  }
	
}

Este código funcionará bem porque o max-width: 800px limita os seletores abaixo de 800px com isso o estilo não afetará outros viewports.

Conclusão.

Quando você utiliza min-width para consulta de media queries para site responsivo, você consegue reduzir a complexidade do seu código, mas min-width não é a solução para todos os problemas como mostrei nós exemplos, você pode utilizar a combinação max-width e min-width para fazer um código CSS muito limpo. Obrigado, até o próximo post. 

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment