Zero to Hero com Saturn-V — Episódio I — Grid System

Paulo Freitas
SynchroTEC
Published in
6 min readOct 20, 2016

Se você ainda não sabe o que é o Saturn-V, estes são os links dos quais você precisa:

Este é o primeiro post de uma série que trará toda semana a explicação de uma feature do Saturn-V.

Vamos começar pelo Grid System.

Basicamente o Grid System é a parada mais importante para um site ou app ser responsivo. Pelo que me lembro, tudo meio que começou com 960.gs… mas não vou entrar em detalhes históricos aqui. O que importa é que sem um Grid System, você não vai muito longe nos dias de hoje. E o Saturn-V, como diz sua documentação, fornece um “ridiculous simple grid system”. E mano!! é muito simples mesmo!

Bom, eu já disse que o grid system é a parada mais importante para um app ser responsivo. Mas para que, de fato, ele serve?

Um grid system auxilia na implementação do layout e posicionamento dos elementos na tela. Seu funcionamento consiste em dividir a tela em linhas e colunas.

O HTML abaixo demonstra como criar um grid de 1 linha com 3 colunas.

<div class='sv-row'>
<div class='sv-column'>Column</div>
<div class='sv-column'>Column</div>
<div class='sv-column'>Column</div>
</div>

Este é o exemplo mais simples de grid do Saturn-V. Tudo que você precisa fazer é criar uma div com a classe sv-row e dentro dessa div, colocar quantas divs quiser com a classe sv-column. Só isso!

Com algo tão simples quanto isso, você poderá construir qualquer tipo de layout e posicionar elementos na tela onde você quiser. Responsive and mobile friendly.

O exemplo abaixo demonstra como criar um grid onde há um espaçamento entre as linhas. Note o uso da classe sv-row--with-gutter.

<div class='sv-row--with-gutter'>
<div class='sv-column'>Column</div>
<div class='sv-column'>Column</div>
</div>

Até agora criamos grids com colunas de mesma largura. Mas em muitos casos, será necessário especificar um tamanho diferente para cada coluna. O Saturn-V soluciona isso por meio das classes de porcentagem que devem ser usadas em conjunto com a classe sv-column. Existem 6 classes para porcentagens que variam de 20 a 80: _20, _25, _40, _60, _75 e _80.

O código abaixo demonstra como criar um grid com 1 linha e duas colunas, sendo uma coluna com 20% e outra com 80% do tamanho total da tela.

<div class='sv-row'>
<div class='sv-column _20'>Coluna com 20% de tamanho</div>
<div class='sv-column _80'>Coluna com 80% de tamanho</div>
</div>

Muuito simples, não é?!

Usar valores percentuais é muito importante para garantir que seu app é responsivo. Porém, em alguns casos é necessário fixar o tamanho de uma coluna. Para isso existem as classes de valores fixos _100--fixed, _150--fixed, _200--fixed, _250--fixed e _300--fixed.

O exemplo abaixo demonstra como criar um grid de 1 linha com 3 colunas, sendo que a primeira coluna tera uma largura fixa de 100px.

<div class='sv-row'>
<div class='sv-column _100--fixed'>100px</div>
<div class='sv-column'>column</div>
<div class='sv-column'>column</div>
</div>

Flexbox

O Grid System do Saturn-V é implementado usando flexbox. Mas o que é flexbox?

O Flexbox busca prover uma maneira eficiente de distribuir e posicionar os elementos dentro de um container, mesmo quando seu tamanho não é deteminado (fixo) ou é dinâmico, daí o uso do termo flex.

A ideia geral por trás do flexbox é que o tamanho dos elementos filhos de um container são ajustados para melhor aproveitar o espaço disponível, seja aumentando o tamanho destes elementos filhos para cobrir todo o tamanho do container, ou diminuindo para evitar overflow.

Container (sv-row) e elementos filhos (sv-column)

O flexbox não é apenas uma propriedade, mas um conjunto de propriedades, aplicadas ao container ou aos elementos filhos. Vamos dar uma olhada no código fonte do Saturn-V para entender melhor o funcionamento do flexbox.

Abaixo estão as definições das classes sv-row e sv-column.

.sv-row {
display: flex;
flex-direction: row;
flex-wrap: wrap;
margin-bottom: 10px;
}

.sv-column {
flex-basis: 100%;
transition: all 0.3s;
}

A propriedade display determina o uso de flexbox. Em seguida, temos a propriedade flex-direction que é definida com o valor row. Essa propriedade determina a direção do eixo principal do container, e portanto a direção que será usada para posicionar os elementos filhos, neste caso, os elementos com a classe sv-column. O valor default row estabelece que a direção é da direita para esquerda.

A terceira linha da classe sv-row define a propriedade flex-wrap: wrap;. Isso faz com que a linha seja quebrada caso não haja espaço suficiente para todos os elementos filhos em uma mesma linha.

Olhando para a classe sv-column, percebemos o uso da propriedade flex-basis. Esta propriedade determina o tamanho do elemento antes de todo o espaço disponível para o container ser distribuído.

Com essas duas classes conseguimos criar um container (sv-row) com elementos filhos (sv-column) de mesmo tamanho. Agora, vamos ver como funcionam as colunas de tamanho variável que criamos ao usar as classes de porcentagem (_20, _40, …) .

.sv-column {
flex: 1;
}
._20 {
flex: 2;
}

._25 {
flex: 2.5;
}

._40 {
flex: 4;
}

Na definição destas classes notamos o uso da propriedade flex, que é um shorthand para flex-grow. Basicamente, o que estamos fazendo, é definir a proporção de um determinado item em relação a seus irmãos e ao espaço disponível. Ao definirmos o valor de flex:1, e aplicarmos essa definição a todos os elementos filhos de um container, estamos dizendo que todos devem ter a mesma proporção de tamanho. Ou seja, todos devem ocupar um espaço igual. Porém, em um container (sv-row) com 2 elementos filhos (sv-column), se definirmos um deles com flex:1 e o outro com flex:2, estamos dizendo que o segundo item deve ocupar o dobro do espaço ocupado pelo seu irmão.

No Saturn-V, podemos pensar na propriedade flex como simples porcentagem. Portanto uma coluna com classe _20 ocupará 20% do tamanho da linha, contanto que haja uma segunda coluna com classe _80. Por isso, ao especificar uma classe de porcentagem para uma coluna é importante especificar as classses de porcentagem para as demais colunas da mesma linha.

Há muito mais sobre flexbox. Minha intenção aqui foi explicar como o Saturn-V usa flexbox para implementar seu Grid System. Talvez no futuro eu faça um post específico sobre flexbox.

Bom! Isso é tudo que você precisa saber sobre o Grid System do Saturn-V. Agora é mão na massa! Acesse a documentação e faça alguns testes ;)

Até a próxima!

--

--