Guidelines CSS
Arquitetura e Metodologias


Cascading Style Sheets (CSS) é uma linguagem de folhas de estilo utilizada para definir a apresentação de documentos escritos em uma linguagem de marcação, como HTML ou XML. O seu principal benefício é a separação entre o formato e o conteúdo de um documento.
Tiago vilas boas (montanha)
- Desenvolvedor Front-End na Phone2Business
- 10 anos de experiência em TI
tiago@artesites.com.br
http://www.artesites.com.br
CSS - Reflows
Quando as manipulações afetam o conteúdo ou estrutura do documento ou na posição de um elemento, um refluxo (reflow) ou relayout acontece.
Quando as manipulações afetam a propriedade de visibilidade de um elemento acontece um Repaint.
Exemplo: opacity, background-color, visibility, outline.
"Reflow é o resultado de um evento que desencadeia mudanças no jeito que a pagina deve ser renderizada, tomando um tempo para o cálculo e reposicionamento de elementos em uma página."

CSS - Reflows
O reflow acontece quando algumas alterações são geralmente desencadeadas:
- Manipulação do DOM (adição de elemento, exclusão, alteração ou alterar na ordem dos elementos)
- Alterações de conteúdos, incluindo alterações de texto em campos do formulário
- Cálculos e/ou alterações de propriedades CSS
- Adição ou remoção de folhas de estilo
- Alteração no atributo class
- Manipulação na janela do navegador (redimensionamento, rolagem etc)
- Ativação de pseudo-classe (:hover)
Saiba mais em: http://www.phpied.com/rendering-repaint-reflowrelayout-restyle/
CSS - Reflows
Boas práticas para evitar os reflows/repaints:
- Evite configurar vários estilos inline; Ex:
<h1 style="color:blue; font-size: 14px; display: inline-block;">Isso é azul e etc</h1>- Evite manipular vários estilos do elemento através de JS, utilize classes para manipular as propriedades do estilo ao invés de propriedades estilos, utilizar propriedades de estilo diretamente no elemento geram reflows em excesso.
- Evite utilizar propriedades de estilo flutuantes em seus elementos, cuidado com o uso excessivo de modals.
- Reduza as alterações no atributo class.
- Evite o include de elementos HTML através de JS
- Evite adicionar ou remover estruturas HTML em seu DOM atráves de JS
- Utilize propriedades flexbox para a estrutura principal de sua página, isso reduz os reflows e aumenta o desempenho conforme o carregamento da página.
Saiba mais em: https://www.sitepoint.com/10-ways-minimize-reflows-improve-performance/
Arquitetura CSS
Para alguns o CSS não é importante por não conter uma codificação lógica, apesar de sua escrita ser simples, há uma série de armadilhas. Uma estrutura CSS desorganizada está ligada a inúmeros conflitos e até no surgimento de bugs. Conflitos de CSS são frutos de um código mal escrito que sobrescreve ou cancela regras especificas aplicadas em um layout ou componente.
Hoje em dia quando o assunto é CSS muito se fala em padrões web (informações controladas pelo HTML, formatação pelo CSS e comportamento controlado por JavaScript), mas porque nunca ouvimos falar de ARQUITETURA CSS?

Arquitetura CSS
E isto é o que mais fazemos quando escrevemos CSS. Uma arquitetura CSS bem executada envolve planejamento, reutilização, padronização e outras séries de metodologias, disciplinas a serem desenvolvidas e aplicadas.
"Há apenas duas coisas difíceis em Ciência da Computação: Invalidação de cache e dar nomes a coisas". Phil Karlton

Culpa DO CSS
Não é muito expressivo;
Ordem de definição de dependências;
Especificidade, particularidades;
Cheio de truques;
Document Standards diferentes (devices e browsers).
NOSSA CULPA
Falta de conhecimento sobre o projeto;
Falta de conhecimento em CSS;
Caos na estrutura;
Documentação inexistente ou muito ruim;
Não analisar o que já existe antes de criar algo do zero (qual é o limite do seu código. Proporção? Performance?);
Falta de padrões na codificação.
Culpa do CSS vs Nossa Culpa
metodologias




OOCSS - Object Oriented CSS
Em 2009, depois de otimizar e reescrever o CSS do Facebook, Nicole Sullivan inventou uma nova maneira de desenvolver CSS e a chamou de Object Oriented CSS.
O OOCSS está baseado em dois pontos cruciais que são a separação da estrutura e do visual e a independência do container em relação ao conteúdo.

OOCSS - OBJECT ORIENTED CSS
Nesse trecho de código CSS utilizamos a orientação a objetos para separar a estrutura do componente das propriedades visuais (skin).
Grid, botões, formulários, tipografia, menus, tabelas e muitas outras coisas, são exemplos de objetos.
Com o OOCSS podemos reaproveitar as estruturas em diversos casos.
/// Estrutura ///
.button {
background-color: #000;
border: none;
color: white;
padding: 15px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 14px;
}/// Skin - Visual ///
.button-small {
padding: 10px;
}
.button-large {
padding: 30px;
}
.button-rounded {
border-radius: 10px;
}
SMACSS - Scalable and MOdular architecture for CSS
O SMACSS nada mais é que um guia para escrever um bom código em CSS. É uma tentativa de documentar uma abordagem consistente para o desenvolvimento de sites (pequenos, médios ou grandes) ao utilizar CSS. Possui uma documentação bem completa e até um livro oficial. (https://smacss.com/book/)

CSS é fácil, mas desenvolver projetos escaláveis é difícil!
SMACSS - Scalable and MOdular architecture for CSS
Foi criado por John Snook para resolver problemas de arquitetura do app de e-mail do Yahoo, virou referência em arquitetura CSS .(https://smacss.com).

Seu sistema é baseado em cinco categorias: base, layout, module, state e theme.
SMACSS - base
Regras globais de estilo, tudo aqui irá perpetuar por todo projeto.
/* http://meyerweb.com/eric/tools/css/reset/
v2.0 | 20110126
License: none (public domain)
*/
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */
/**
* 1. Change the default font family in all browsers (opinionated).
* 2. Correct the line height in all browsers.
* 3. Prevent adjustments of font size after orientation changes in
* IE on Windows Phone and in iOS.
*/
/* Document
========================================================================== */
html {
font-family: sans-serif; /* 1 */
line-height: 1.15; /* 2 */
-ms-text-size-adjust: 100%; /* 3 */
-webkit-text-size-adjust: 100%; /* 3 */
}
No base normalmente utilizamos o CSS Reset criado pelo Eric Meyer ou o normalize.css do Nicolas Gallagher.
SMACSS - Layout
No layout organizamos os seletores únicos da aplicação, estrutura de elementos que são únicos e não reutilizáveis, como header, footer, main, sidebar.
#header {
@include clearfix();
background: #fff;
border-bottom: 1px solid #ccc;
.logo {
float: left;
padding: 10px 20px;
}
}
#sidebar {
@include clearfix();
}
#footer {
@include clearfix();
background: #999;
border-top: 1px solid #ccc;
.map-links {
padding: 10px 20px;
color: #f0f0f0;
}
}SMACSS - MODULES
No modules geralmente ficam os códigos reutilizáveis, como os componentes, botões, inputs, ícones, widgets, alerts e outros.
.btn{
display: inline-block;
background: blue;
position: relative;
border-radius: 5px;
}
.input, .btn:after{
color: #fff;
}
.btn:after{
position: absolute;
content: '@';
right: 0;
width: 1.3em;
height: 1em;
}
.input{
background: transparent;
color: #fff;
border: 0;
padding-right: 20px;
cursor: pointer;
position: relative;
padding: 5px 20px 5px 5px;
z-index: 1;
}SMACSS - STATES
Caso o elemento seja modificado durante a navegação pela interação do usuário ou através de JavaScript, o SMACSS sugere que seja utilizado um seletor modificador precedido com o prefixo is-.
.is-active { … }
.is-selected { … }
.is-visible { … }
.is-hidden { … }
.is-collapsed { … }
SMACSS - THEME
Define as partes do seu site que serão customizadas com skins e visuais diferenciados dependendo da ocasião, por exemplo, se estivermos no natal é possível que alguma imagem ou elemento do seu HTML seja substituída por outra imagem/estilo sazonal.
// in module-name.scss
.mod {
border: 1px solid gray;
}
// in theme.scss
.mod {
border-color: red;
}SMACSS - ESTRUTURA DE PASTAS
scss
application.scss -> importa todos arquivos _index.scss para todas as pastas
base
_base.scss -> estilização para todos os seletores base (ex: h1, h2, body, *, ...)
_index.scss -> importa todos os outros arquivos dentro da pasta base
_normalize.scss -> reseta os estilos
layout
_container.scss ->
_extends.scss ->
_index.scss -> importa todos os outros arquivos dentro da pasta layout
_panel.scss ->
modules
_buttons.scss ->
_extends.scss ->
_forms.scss ->
_headlines.scss ->
_icons.scss ->
_img.scss ->
_index.scss -> importa todos os outros arquivos dentro da pasta modules
_nav.scss ->
_navbar.scss ->
states
_index.scss -> importa todos os outros arquivos dentro da pasta states
theme
_index.scss -> importa todos os outros arquivos dentro da pasta theme
_halloween.scss
_christmas.scss ->
utilities
_config.scss -> arquivo de configuração
_functions.scss ->
_helpers.scss -> helpers
_index.scss -> importa todos os outros arquivos dentro da pasta utilities
_mixins.scss -> mixins
SMACSS - APPLICATION.scss
application.scss
@import utilities
@import base
@import layout
@import module
@import state
@import themeB.E.M - Block, element and modifier
Foi desenvolvido por Russos (brutos mesmo) para resolver problemas específicos da Yandex com os objetivos:

- Facilitar a manutenção de projetos de longa duração;
- Facilidade de entendimento do código
- Diminuir a curva de aprendizado para novos membros do time
- Reutilização do código

Sugere uma estrutura para nomear as classes da sua folha de estilo baseando-se no elemento em questão.
B.E.M - Block
Entidade independente da aplicação/website capaz de conter outros blocos. Um bloco pode ser simples ou conter outros blocks internos. Ele funciona como um container que contém outros elementos ou até mesmo outros blocos.

B.E.M - ELEMENT
O "element "é uma “peça” do bloco. Em especifico um bloco é um container e os elementos são as peças (componentes) inseridos dentro desse bloco.
Um campo Input e um botão Search são elementos interno de um container Search Block:

B.E.M - MODIFIER
O B.E.M sugere que se for preciso modificar um elemento interno, é precedido adicionar dois hifens ( -- ) após o nome do elemento ou bloco a ser modificado.
Resultando em uma estrutura parecida com essa:

// Block & Element //
.block__btn {
background: #FFF;
padding: 1rem 0;
text-transform: uppercase;
// Modifier //
&--default {
background: #ccc;
color: #000;
}
&--positive {
background: #4CAF50;
color: #FFF;
}
&--negative {
background: #FF0000;
color: #FFF;
}
}B.E.M - NOMENCLATURA

O B.E.M foi desenvolvido para auxiliar na criação de classes em CSS de fácil compreensão, semânticas e não tão extensas como a maioria imagina.
CONCLUSÃO

LINKS
Dúvidas ?

Guidelines CSS - Arquitetura e Metodologias
By Tiago Vilas Boas
Guidelines CSS - Arquitetura e Metodologias
Arquiteturas e metologias CSS - Workshop
- 670