Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Arquitetura CSS

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for Rafael Rinaldi Rafael Rinaldi
December 05, 2014

Arquitetura CSS

Hoje em dia quando o assunto é CSS muito se fala em modularização e arquitetura de código. Mas o que de fato é isso? Quais abordagens podemos utilizar para tornar o código do nosso CSS mais organizado?

Nessa apresentação procuro passar uma visão geral das técnicas mais populares, detalhando suas particularidades e a ideologia por traz de cada uma.

Também falo de técnicas mais recentes que abordam o desenvolvimento de CSS de perspectivas diferentes e algumas dicas gerais de como deixar seu código mais flexível a mudanças.

--

Video
https://www.eventials.com/locaweb/arquitetura-css-com-rafael-rinaldi/?playlist=4o-seminario-locaweb-desenvolvimento-sao-paulo

Anotações sobre a palestra no blog do Tableless
http://tableless.com.br/arquitetura-css-anotacoes-da-palestra-rafael-rinaldi

Avatar for Rafael Rinaldi

Rafael Rinaldi

December 05, 2014
Tweet

More Decks by Rafael Rinaldi

Other Decks in Design

Transcript

  1. ›❯ Não é muito expressivo; ›❯ Ordem de definição de

    dependências; ›❯ Especificidade; ›❯ Cheio de truques.
  2. ›❯ Falta de conhecimento sobre o proprio projeto; ›❯ Caos

    na estrutura; ›❯ Documentação inexistente ou muito ruim; ›❯ Não analisar o que já existe antes de criar algo do zero.
  3. Conteúdo Apresentação (e agora também animações) Comportamento e interações mais

    complexas http://alistapart.com/article/understandingprogressiveenhancement ⡗
  4. Padrão visual que se repete e que pode ser abstraído

    em um contexto próprio Técnicas → OOCSS
  5. html { box-sizing: border-box; } *, *::before, *::after { box-sizing:

    inherit; } body { background: #bada55; } input[type=text] { border: 2px solid #444; } Técnicas → SMACSS → Base
  6. ›❯ Utilizado por elementos fixos da aplicação; ›❯ Seletor único,

    não reutilizável; ›❯ Variações são representadas por classes com o prefixo l . Técnicas → SMACSS → Layout
  7. #header { font-size: 2em; color: fuchsia; width: 100%; height: 15em;

    /* Dica: não precisa especificar unidade p/ line height */ line-height: 1.5; } #sidebar { font-size: .75em; color: gray; float: right; } .l-inverse #sidebar { float: left; } Técnicas → SMACSS → Layout
  8. ›❯ Trechos de código reutilizáveis; ›❯ Partes modulares do design;

    ›❯ Padrões. Técnicas → SMACSS → Modules
  9. ›❯ Como os módulos irão se apresentar em estados específicos;

    ›❯ Representado por classes com o prefixo is . Técnicas → SMACSS → State
  10. .sidebar.is-expanded { opacity: 1; } .button.is-disabled { cursor: not-allowed; background:

    lightgray; opacity: .75; pointer-events: none; /* Capeta */ } Técnicas → SMACSS → State
  11. /* No arquivo do componente botão */ .button { border:

    1px solid; } /* No arquivo de tema do botão */ .button { border-color: fuchsia; background: seagreen; font-family: 'Ubuntu Mono', monospace; } Técnicas → SMACSS → Theme
  12. ›❯ Facilitar a manutenção de projetos de longa duração; ›❯

    Facilidade de entendimento do código; ›❯ Diminuir curva de aprendizado em novos membros do time; ›❯ Reutilização de código. Técnicas → BEM
  13. ›❯ Parte de um bloco com uma função específica; ›❯

    Não possui um contexto próprio. Técnicas → BEM → Element
  14. Uma propriedade de um bloco ou elemento que altera seu

    comportamento Técnicas → BEM → Modifier
  15. ›❯ Utiliza-se hífen para separar palavras em nomes longos; ›❯

    Underscore duplo para separar um bloco de um elemento; ›❯ PascalCase e camelCase são aceitos. Técnicas → BEM → Nomenclatura
  16. <ul class="list list_size_big list_type_links"> <li class=“list__item”> <a href=“/seminario-locaweb”>Seminário Locaweb</a> </li>

    <li class="list__item list__item_state_active”> <a href=“/femug-sp">FEMUG-SP</a> </li> </ul> Técnicas → BEM → Nomenclatura
  17. Criado por desenvolvedores do Twitter numa tentativa de focar numa

    arquitetura baseada em componentes Técnicas → SUIT CSS
  18. ›❯ Utiliza-se camelCase para separar palavras em nomes longos; ›❯

    Utilitários devem começar com o prefixo u . Técnicas → SUIT CSS → Nomenclatura
  19. /* Definição de um componente */ .MyComponent {} /* Definição

    de um estado */ .MyComponent.is-animating {} /* Definição de um modificador */ .MyComponent--modifier {} /* Definição de subelementos */ .MyComponent-part {} .MyComponent-anotherPart {} Técnicas → SUIT CSS → Nomenclatura
  20. <div class="u-cf"> <a class="u-floatLeft" href="{{url}}"> <img class="u-block" src="{{src}}" alt=""> </a>

    <p class="u-sizeFill u-textBreak"> </p> </div> Técnicas → SUIT CSS → Nomenclatura
  21. /* Inline de imports procura por libs instaladas via NPM

    */ @import "normalize.css"; /* Atalhos para lidar com media queries */ @custom-media --wide-screen (min-width: 80em); /* Valores padrão */ :root { --base-font-size: 16px; } @media (--wide-screen) { html { /* Utiliza Autoprefixer p/ lidar c/ vendor prefixes */ font-size: calc(var(--base-font-size) * 2); } } Técnicas → SUIT CSS → Nomenclatura
  22. ›❯ Settings: variáveis e configurações; ›❯ Tools: mixins e funções;

    ›❯ Generic: resets, configuração de box sizing, etc; ›❯ Base: estilos atrelados a tags, sem o uso de classes; ›❯ Objects: padrões visuais que se repetem; ›❯ Components: elementos de interface com contexto específico; ›❯ Trumps: overrides (geralmente utiliza-se !important ). Técnicas → itcss
  23. ›❯ Evita redundância na descrição de regras de estilo; ›❯

    Elimina problemas com especificidade; ›❯ Estrutura granular; ›❯ Elimina a necessidade de “escrever CSS para remover CSS”. Técnicas → itcss
  24. Outras Abordagens → csstyle <a class="button --action +rounded +glass"> Cadastre-se

    <span class="button__icon --rocket"></span> </a> Component
  25. Outras Abordagens → csstyle <a class="button --action +rounded +glass"> Cadastre-se

    <span class="button__icon --rocket"></span> </a> Option Option
  26. Outras Abordagens → csstyle <a class="button --action +rounded +glass"> Cadastre-se

    <span class="button__icon --rocket"></span> </a> Tweaks
  27. Outras Abordagens → csstyle <a class="button --action +rounded +glass"> Cadastre-se

    <span class="button__icon --rocket"></span> </a> Parts
  28. Outras Abordagens → csstyle @include component(button) { background: #6bd9ed; padding:

    15px; @include option(action){ color: #1f1f1f; background: #a7e040; padding-top: 0; } @include part(icon){ font-size: 34px; position: relative; top: 10px; } @include tweak(rounded) { border-radius: 10px; } }
  29. Outras Abordagens → AMCSS <!-- Botão padrão --> <a am-Button>Inscrever-se

    no Seminário Locaweb</a> <!-- Variações do botão --> <a am-Button="primary large”>Informações</a> <a am-Button="info small”>Cancelar inscrição</a>
  30. A mágica está no seletor ~= que nos permite selecionar

    qualquer atributo que contenha uma lista de regras separadas por espaço Outras Abordagens → AMCSS
  31. <!doctype html> <title>Exemplo uilang</title> <script src=“uilang.js”></script> <style> /* Definição de

    estilos e transições */ #notification { transition: .8s } #notification.hidden { opacity: 0 } </style> <div id=“notification”> <p>Você tem três mensagens não lidas.</p> <button class=“hide”>Esconder</button> </div> <code> clicking on ".hide" adds class "hidden" on "#notification" </code> Outras Abordagens → uilang
  32. p { color: purple; line-height: >= 16; line-height: <= ::window[height]

    / 12; } #product { $col-width: == ::[width] / 12 !require; $col-left: == ::[left] + ::[$col-width]; .price { left: == ::parent[$col-left]; width: == ::parent[$col-width]; } .description { left: == ::parent[$col-left] + ::parent[$col-width]; } } .sprite { z-index: >= #bg[z-index] >= 50; } Outras Abordagens → Grid Style Sheets
  33. Depende de um runtime (que roda em um web worker)

    e de um pré-processador Outras Abordagens → Grid Style Sheets
  34. CSS na Magnetis ›❯ Conceito de categorização do SMACSS; ›❯

    Conceito de estados do SMACSS; ›❯ Conceito de elementos do BEM; ›❯ Conceito de modificadores do SUIT CSS.
  35. CSS na Magnetis ›❯ Sass com a sintaxe SCSS; ›❯

    Autoprefixer; ›❯ Sistema de grid Susy; ›❯ Breakpoint; ›❯ SVG; ›❯ Rails (partials & Sprockets = ❤); ›❯ Bower.
  36. /* Componente sidebar */ .accordion {} /* Componente sidebar no

    estado expandido */ .accordion.is-expanded {} /* Modificador `big` do componente botão */ .button--big {} /* Componente `menu` */ .menu {} /* Componente `menu-item` */ .menu-item {} /* Para definir estados, utilizamos `is` */ .menu-item.has-icon {} /* Elemento `icon` dentro do componente `menu` */ .menu-item__icon {} CSS na Magnetis
  37. app ├── assets │ └── stylesheets │ ├── application.scss │

    ├── base │ │ ├── _breakpoints.scss │ │ ├── _defaults.scss │ │ ├── _grid.scss │ │ ├── _typography.scss │ │ └── _variables.scss │ ├── components │ │ ├── _button.scss │ │ ├── _dropdown.scss │ │ ├── _gallery.scss │ │ └── _link.scss │ ├── helpers │ │ ├── _classes.scss │ │ ├── _functions.scss │ │ ├── _mixins.scss │ │ └── _placeholders.scss │ └── layout │ ├── _footer.scss │ ├── _header.scss │ └── sections │ ├── _dashboard.scss │ └── _homepage.scss ├── bower.json └── vendor └── assets └── bower ├── normalize-css └── susy
  38. //= require 'normalize-css' @import // Estilos e configurações base 'base/variables',

    'base/grid', 'base/breakpoints', 'base/typography', 'base/deafults', // Utilitários 'helpers/*', // Componentes 'components/*', // Arquivos de layout 'layout/**/*'; CSS na Magnetis
  39. Facilita o uso de ferramentas e a criação de um

    guia de estilo Pontos positivos
  40. <style> navigation ul li a { /* Valores hexadecimais sempre

    em minúsculo, por favor */ color: #c0ffee; } </style> <navigation> <ul> <li><a href="/seminario">Seminário Locaweb</a></li> <li><a href="/femug-sp">FEMUG-SP</a></li> </ul> </navigation> Pontos positivos
  41. <style> .link { color: #coffee; } </style> <navigation> <ul> <li>

    <a class="link" href=“/seminario">Seminário Locaweb</a> </li> <li> <a class="link" href="/femug-sp">FEMUG-SP</a> </li> </ul> </navigation> Pontos positivos
  42. <div class="nav__bar is-moved-by-drawer headroom headroom--top"> <div class="nav nav--main" id="ShopifyMainNav"> <nav

    class="page-width"> <button type="button" class="icon nav__hamburger"> <span class="visuallyhidden">Mobile Navigation</span> </button> <div class="nav__logo-wrapper"> <a class="icon nav__logo--full-color" href="/"> <span class="visuallyhidden">Home</span> </a> </div> </nav> </div> </div> Não existe bala de prata
  43. Pense no seu time na hora de tomar decisões de

    arquitetura Não existe bala de prata
  44. /* ============================================================== Grid layout ============================================================== */ /** * Column layout

    with horizontal scroll. * * This creates a single row of full-height, non-wrapping columns * that can be browsed horizontally within their parent. * * Example HTML: * * <div class="grid"> * <div class="cell cell-3"></div> * <div class="cell cell-3"></div> * <div class="cell cell-3"></div> * </div> */ Não existe bala de prata