Sou Front End Developer e graduando de Sistema de Informação na Universidade Unigranrio e Organizer do GDG Duque de Caxias, além de ser apaixonado por tecnologias web.
Twitter/Github: @lucasktrindade
A criação do CSS tinha como objetivo criar uma maneira mais fácil de formatar informações, eis que em 94 iniciou a criação das famosas Folhas de Estilo em Cascata por Håkon Wium Lie.
Já em 96 foi lançada a primeira recomendação oficial pelo W3C, considerado então o CSS nível 1.
A partir de um documento é possível controlar vários documentos HTML.
Facilidade na criação de layouts, códigos simples.
Linguagem de rápido aprendizado.
Escopo Global.
A falta de padrões torna difícil para manter um projeto.
Involuntária adoção a más práticas.
É a parte mais a direita de um seletor CSS.
#conteudo .devfestbh{}
O navegador vai buscar todas as instâncias do elemento .devfestbh e após isso subir até encontrar o #conteudo.
#conteudo *{}
O seletor acima seria mais custoso pois ele varreria todos os elementos da página até encontrar o descendente do #conteudo.
html body .wrapper #conteudo a{}
O navegador vai olhar para todos os elementos da direita para esquerda. Você pode transformar isso, nisso aqui:
#conteudo a{}
Traz conceitos da orientação a objetos das linguagens back end, com a ideia de evitar repetição de código, facilitar a expansão e manutenção do código. Criado por Nicole Sullivan.
Problemas que o OOCSS visa solucionar:
Soluções propostas:
Modular: combinável, reusável e extensível;
Leve: relacionamento 1:N entre CSS e potenciais layouts;
Rápido: poucas requisições HTTP e tamanhos mínimos de arquivos;
Pronto para o futuro: manutenível, semântico e padronizado;
Simplificado e acessível.
Princípios:
Separar estrutura e skin;
Separar contêiner e conteúdo;
Performance:
Intenso reúso de código;
Menos repaints e reflows.
Exemplos e tutoriais: http://oocss.org
É um guia de padrões, criado por Jonathan Snook, que pode ser utilizado para ser utilizado em projetos ou apenas para absorver partes que mais te interessam.
Contém os estilos aplicados aos elementos, serve para determinar a aparência padrão de todos os elementos, sem a utilização de classes ou IDs. Seria o css reset da sua página. Pode ser usado o normalize.css no base.
body {
margin: 0;
}
article,
aside,
footer,
header,
nav,
section {
display: block;
}
h1 {
font-size: 2em;
margin: 0.67em 0;
}
Pode conter um ou mais módulos, seria o footer,header, article da sua página e dentro desse layout possui módulos, basicamente a estilização usada no layout é o posicionamento na tela. Para nomenclatura é utilizado l- (ou layout-).
#article{
float:left;
width: 80%;
}
#sidebar{
float: right;
width: 20%;
}
.l-fixed #article{
width: 600px;
}
.l-fixed #sidebar{
width: 200px;
}
Geralmente estão contidos dentro de layouts e devem ser partes reutilizáveis em qualquer outro projeto, sem ter dependências. Os módulos geralmente são widgets, botões, searchbar, tabs e etc. Não deve ser usado IDs e seletores de elementos, é aconselhado usar classes. Não usar m- ou module-.
.button {
display: inline-block;
box-shadow: none;
border: none;
text-transform: uppercase;
padding: 10px;
background: #CFCFCF;
font-size: 14px;
}
Geralmente atribui comportamentos a layouts ou módulos, serve pra incrementar ou sobrescrever estilos. Para nomenclatura foi convencionado usar (is-). Exemplos:
Serve para alterações de cores, imagens e elementos da UI, geralmente alguma alteração cosmética. Pode ser preciso alterar os estilos Base, Layout ou Estado.
BEM vai além de um guia de normatização, é mais completo e pode ser considerado um framework pois possui temas e ferramentas úteis para iniciar o projeto. O modo BEM de estrutura um projeto se assemelha aos módulos do SMACSS e por consequência o OOCSS pois a intenção é reutilizar as estruturas em outros projetos. Criado na Yandex.
Entidade independente com seu próprio significado; é a abstração mais geral de um componente/módulo. Os blocos podem ser usados um dentro do outro.
Deve descrever seu propósito( "O que é?" - menu ou botão), e não o estado("O que parece?" - vermelho ou grande).
<!-- Correto. O bloco de erro é semanticamente válio -->
<div class="erro"></div>
<!-- Incorreto. Descreve aparência -->
<div class="texto-vermelho"></div>
Descendente e parte de um bloco; ajuda a formá-lo como um todo. Não pode ser usado sem estar contido em um bloco.
Deve descrever seu propósito( "O que é?" - input, button), e não o estado("O que parece?" - vermelho ou grande). O elemento é escrito com duplo underscore(__).
<!-- `search-form` block -->
<form class="search-form">
<!-- `input` element in the `search-form` block -->
<input class="search-form__input">
<!-- `button` element in the `search-form` block -->
<button class="search-form__button">Search</button>
</form>
Um estado ou comportamento diferente de um Bloco ou Elemento
O nome do modificador deve descrever aparência(size_s ou theme_islands, seu estado(disabled, focused, etc.) e/ou comportamento(directions_left-top).
<!-- The `search-form` block has the `focused` Boolean modifier -->
<form class="search-form search-form_focused">
<input class="search-form__input">
<!-- The `button` element has the `disabled` Boolean modifier -->
<button class="search-form__button search-form__button_disabled">Search</button>
</form>
<!-- The `search-form` block has the `theme` modifier with the value `islands` -->
<form class="search-form search-form_theme_islands">
<input class="search-form__input">
<!-- The `button` element has the `size` modifier with the value `m` -->
<button class="search-form__button search-form__button_size_m">Search</button>
</form>
A implementação dos blocos, elementos e modificadores são divididos em arquivos independentes de acordo com a tecnologia em que podemos conectar eles individualmente.
search-form/ # Directory of the search-form
__input/ # Subdirectory of the search-form__input
search-form__input.css # CSS implementation of the
# search-form__input element
search-form__input.js # JavaScript implementation of the
# search-form__input element
__button/ # Subdirectory of the search-form__button
# element
search-form__button.css
search-form__button.js
_theme/ # Subdirectory of the search-form_theme
# modifier
search-form_theme_islands.css # CSS implementation of the search-form block
# that has the theme modifier with the value
# islands
search-form_theme_lite.css # CSS implementation of the search-form block
# that has the theme modifier with the value
# lite
search-form.css # CSS implementation of the search-form block
search-form.js # JavaScript implementation of the
# search-form block
É uma metodologia criada por Harry Roberts, que representa abstratamente uma arquitetura CSS baseada em triângulo invertido. Quanto mais na base, mais específico as regras.
São configurações globais, são variáveis globais que vão definir cores, espaçamento e etc.
$color-ui: #BADA55;
$spacing-unit: 10px;
Deve conter funções e mixins relativos ao projeto, vem após as configurações pois pode ser que seja necessário uma variável global para uso.
@function strip-unit($num){
return $num/ ($num * 0 + 1);
}
Aqui onde geralmente se encontra os CSS resets; onde se coloca um Normalize.css e etc. Neste ponto o CSS efetivamente será compilado.
*{
-webkit-box-sizing:border-box;
-moz-box-sizing:border-box;
box-sizing:border-box;
}
Aqui consta a estilização dos elementos HTML. Define basicamente os estilos básicos de um elemento, sem nenhuma classe ou ID.
video{
height:auto;
max-width: 100%;
}
Comporta estilos não cosméticos/abstratos, remetendo mais a OOCSS, grids, contêineres e outros desta natureza.
.base-list {
margin: 0;
padding: 0;
list-style: none;
> .item {
padding: $spacing-unit;
}
}
Comporta o maior número de estilizações, já que nela devem constar códigos os elementos de UI do projeto(menus, carousels, slider e etc). Fazendo um paralelo com módulos do SMACSS.
.products-list {
@extend font-brand();
border-top: 1px solid $color-ui;
> .item {
border-bottom: 1px solid $color-ui;
}
}
Esta camada contém utilitários, helpers, sobrescritas e hacks e, devido ao propósito pelo qual existe, não se acanhe em usar !important se necessário.
.half-with{
width: 50% !important;
}
É feita por explicitude e especificidade, a hierarquia, a cascata e a especificidade CSS trabalham a favor do desenvolvedor. Recomenda-se que, na prática, cada camada seja formada por uma série de partials(Sass) com a seguinte convenção de nome: _<camada>.<partial>.scss.
Exemplos:
Twitter/Github: @lucasktrindade