O documento apresenta padrões de HTML e CSS para criação de layouts e componentes de forma estruturada e semântica. É apresentado o padrão de grids para definir a estrutura do layout, minidocumentos para encapsular seções de conteúdo de forma autônoma e microsemântica para melhorar a acessibilidade e o significado do código HTML.
8. Problemas comuns
‣ Layout em CSS não é fácil de aplicar, nem de explicar
‣ Não existe sandbox, há muitos conflitos de
propriedades
‣ Inconsistência cross-browser
‣ Não é automaticamente testável
11. Estrutura para HTML & CSS
‣ Agilizar a criação e a manutenção de componentes.
‣ Melhorar a limpeza, a clareza e a flexibilidade tanto do
HTML, como do CSS.
‣ Diminuir o tempo desperdiçado fazendo ajustes para
um browser em específico.
12. Regras de Ouro
1. Separar container de conteúdo
2. Separar estrutura de estética
-- Nicole Sulivan (Yahoo!), em OOCSS
13. Cronograma
HTML CSS
Patterns Patterns
Grids Seletores
Estratégias
Minidocumentos Propriedades de Mundo
Validação
Microsemântica Layout
Pós-IE6
19. Grids
“Todo trabalho de design envolve a solução de problemas
em níveis visuais e organizativos. Figuras, símbolos, massa de
textos, títulos e tabelas devem se reunir para transmitir
informação. O grid é uma maneira de juntar esses
elementos.”
- Luiz Agner, designer, arquiteto e professor
Fonte: http://www.slideshare.net/agner/a-construo-do-grid
20. Grids
“O grid introduz uma ordem sistemática num leiaute e
permite que o designer diagrame uma grande quantidade de
informação. Também permite vários colaboradores num
mesmo projeto.”
- Luiz Agner, designer, arquiteto e professor
Fonte: http://www.slideshare.net/agner/a-construo-do-grid
21. Grids
“Vantagens do grid:
- Clareza
- Eficiência
- Economia
- Identidade”
- Luiz Agner, designer, arquiteto e professor
Fonte: http://www.slideshare.net/agner/a-construo-do-grid
22. Grids
‣ Padrão de-facto para layouts em CSS.
‣ Permite o intercâmbio de componentes entre
produtos
‣ Define o espaço horizontal que os componentes
podem ocupar (o conteúdo dos componentes
definem o espaço vertical)
‣ Dada uma largura fixa, pode-se compor “linhas” com
até 12 colunas.
31. Grids: Linhas
‣ As linhas podem ser definidas por blocos ou unidades
do grid.
glb-bloco
glb-grid 2 glb-grid-8 glb-grid-2
<div class=”glb-bloco”>
<div class=”glb-grid-2”></div>
<div class=”glb-grid-8”></div>
<div class=”glb-grid-2”></div>
</div>
32. Grids: Linhas
‣ As linhas podem ser definidas por blocos ou unidades
do grid.
glb-grid-4
glb-grid 1 glb-grid-2 glb-grid-1
<div class=”glb-grid-4”>
<div class=”glb-grid-1 glb-primeiro”></div>
<div class=”glb-grid-2”></div>
<div class=”glb-grid-1 glb-ultimo”></div>
</div>
43. Minidocumentos
‣ Pattern que subdivide páginas web em pequenos
“documentos” autosuficientes.
‣ É como um pequeno grid para os componentes que
vão preencher os compartimentos da estante.
‣ Juntando-se vários componentes formam-se
composições sólidas.
44. Minidocumentos
‣ Podem ser utilizados por widgets, destaques, forms,
menus, etc...
‣ Baseado nas novas tags do HTML 5: article, section,
header e footer.
77. Microsemântica
‣ Utilização de elementos semânticos para descrever
dados através de tags e/ou classes.
‣ É uma variação dos Microdados e, antigamente, de
Microformatos.
‣ Não serve paras os search engines, apenas melhora a
clareza do código.
78. Microsemântica
‣ É a partir daqui que se preocupa com:
‣ SEO
‣ Semântica
‣ Acessibilidade
‣ Microdados
‣ ...
79. Microdados
“Microdados é uma especificação WHATWG HTML5
usada para aninhar semântica dentro de conteúdos
existentes em páginas web.
Isso é feito usando atributos específicos: itemscope,
itemtype, itemid, itemprop e itemref.
Search engines, web crawlers, e navegadores podem
extrair e processar microdados a partir de uma página
web e usar isso para prover uma experiência de
navegação mais rica para os usuários.”
- Wikipedia
80. Microdados: Exemplo
<div>
<h1>Avatar</h1>
<span>
Director:
James Cameron
(born August 16, 1954)
</span>
<span>Science fiction</span>
<a href="/movies/avatar.html">Trailer</a>
</div>
81. Microdados: Exemplo
<div itemscope>
<h1>Avatar</h1>
<span>
Director:
James Cameron
(born August 16, 1954)
</span>
<span>Science fiction</span>
<a href="/movies/avatar.html">Trailer</a>
</div>
82. Microdados: Exemplo
<div itemscope itemtype="http://schema.org/Movie">
<h1>Avatar</h1>
<span>
Director:
James Cameron
(born August 16, 1954)
</span>
<span>Science fiction</span>
<a href="/movies/avatar.html">Trailer</a>
</div>
107. Organizando Seletores
‣ Namespaces: define a área de atuação dos seletores e
os agrupa visualmente.
‣ tag[.class].
‣ Separação por blocos.
‣ Ordem: especificidade, alfabética.
108. Organizando Seletores
‣ Namespaces: define a área de atuação dos seletores e
os agrupa visualmente.
‣ tag[.class].
‣ Separação por blocos.
‣ Ordem: especificidade, alfabética.
110. Namespaces
div.box-plantao { ... }
div.box-plantao a { ... }
div.box-plantao h6 { ... }
div.box-plantao li { ... }
div.box-plantao span.barra { ... }
div.box-plantao ul { ... }
Contexto ou Namespace
111. Organizando Seletores
‣ Namespaces: define a área de atuação dos seletores e
os agrupa visualmente.
‣ tag[.class].
‣ Separação por blocos.
‣ Ordem: especificidade, alfabética.
114. tag[.class]
‣ jQuery
$(‘div.box-plantao span.barra’)
ou $(‘div.box-plantao’).find(‘span.barra’) (para cachear o contexto)
‣ Lxml
html = lxml.etree.fromstring(response.content)
html.cssselect(‘div.box-plantao span.barra’)
‣ splinter
browser = Browser()
browser.find_by_css(‘div.box-plantao span.barra’)
115. tag[.class]
‣ Problemas de se utilizar só a classe:
‣ Desenvolvedores são muito ruins em nomear coisas.
‣ O nome da tag é tão objetivo quanto uma ordem
alfabética. Melhor utilizar os tokens já predefinidos
do que ficar elaborando nomes malucos.
‣ Classes abertas indicam pra outros devs, que é
permitido colocar a classe em qualquer tag.
116. tag[.class]
‣ Exemplos:
.fieldset-metadados fieldset.metadados
(exemplo do widget SEO)
.span_tag span.tag
(catálogo de vídeo v1.0)
.formulario-criacao-usuario form.criacao-usuario
‣ Só utilizar classes abertas quando é realmente
necessário aplicar a mais de uma tag (exemplo th, td).
117. tag[.class]
‣ Recomendo sempre ter 2 tag[.class]. Claro e conciso!
‣ Mínimo de 1 tag[.class]
div.box-plantao { ... }
‣ Máximo (prometa!) de 3 tag[.class]
div.box-plantao ul.principal li.ativo { ... }
118. Organizando Seletores
‣ Namespaces: define a área de atuação dos seletores e
os agrupa visualmente.
‣ tag[.class].
‣ Separação por blocos.
‣ Ordem: especificidade, alfabética.
119. Separação por blocos
div.box { ... }
div.box a { ... }
div.box span.barra { ... }
div.box-plantao h6 { ... }
div.box-plantao li { ... }
div.box-plantao ul { ... }
div#box-plantao-principal h6 { ... }
div#box-plantao-principal li { ... }
120. Separação por blocos
div.box { ... }
bloco
div.box a { ... }
div.box span.barra { ... }
div.box-plantao h6 { ... }
bloco div.box-plantao li { ... }
div.box-plantao ul { ... }
div#box-plantao-principal h6 { ... }
bloco
div#box-plantao-principal li { ... }
121. Ordem
menos específico
div.box { ... }
div.box a { ... }
div.box span.barra { ... }
div.box-plantao h6 { ... }
div.box-plantao li { ... }
div.box-plantao ul { ... }
div#box-plantao-principal h6 { ... }
div#box-plantao-principal li { ... }
mais específico
131. Uma propriedade por linha
‣ CSS 3 com vendor prefix são bem longos e variados
.box_shadow {
-webkit-box-shadow: 0px 0px 4px #ffffff;
-moz-box-shadow: 0px 0px 4px #ffffff;
box-shadow: 0px 0px 4px #ffffff;
}
132. Uma propriedade por linha
‣ CSS 3 com vendor prefix são bem longos e variados
.box_gradient {
background-color: #444444;
/* Saf4+, Chrome */
background-image: -webkit-gradient(linear, left top, left bottom, from(#444444),
to(#999999));
/* Chrome 10+, Saf5.1+, iOS 5+ */
background-image: -webkit-linear-gradient(top, #444444, #999999);
background-image: -moz-linear-gradient(top, #444444, #999999); /* FF3.6 */
background-image: -ms-linear-gradient(top, #444444, #999999); /* IE10 */
/* Opera 11.10+ */
background-image: -o-linear-gradient(top, #444444, #999999);
background-image: linear-gradient(top, #444444, #999999);
filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#444444',
EndColorStr='#999999'); /* IE6-IE9 */
}
141. Float:Left contra o Mundo
‣ O float serve para alinhar à esquerda, à direita ou não
alinhar (none).
‣ A propriedade tem a ver mais com conteúdo do que
com boxes.
‣ Suas dimensões são reduzidas para acomodar apenas
o próprio conteúdo ao contrário de display:block.
‣ É fonte de muitas confusões no mundo CSS.
147. Float:Left em Quadrinhos
A
A
B C
‣ B se alinhou à esquerda antes de C. Como saíram
do flow de boxes, a altura de A diminuiu.
‣ É como se estivessem caçando conteúdo abaixo.
148. Float:Left contra o Mundo
‣ Float:left/right tem um funcionamento difícil de
entender e de explicar.
‣ A maioria dos bugs nos IEs encontrados e registrados
pelo Position Is Everything tem o float envolvido.
http://www.positioniseverything.net/explorer.html
‣ Recomendação: evitar ao máximo.
149. Alternativas ao float:left
{
inline
display block
inline-block
{
static
relative
position
absolute
fixed
151. Antes de existir o CSS...
‣ No HTML, os elementos são divididos em inline-level
(também chamado de text-level) e block-level.
‣ Elementos inline-level (também chamados de text-
level) são os que convivem lado-a-lado com texto e
outro elementos inline-level.
‣ Elementos block-level são containers para
elementos inline-level, textos e outros elementos
block-level
152. Antes de existir o CSS...
Elementos inline-level Elementos block-level
<input> <a> <form>
<label> <img> <blockquote>
<div>
<li> <td>
<button> <cite> <em>
<fieldset>
<th>
<strong> <span> <p>
<textarea> <select> <h1>, <h2>, <h3>, <h4>,<h5>,<h6>
153. Antes de existir o CSS...
Elementos inline-level <dentro de> Elementos block-level
<input> <a> <form>
W3C
<label> <img> <blockquote>
<div>
<li> <td>
<button> <cite> <em>
<fieldset>
<th>
<strong> <span> <p>
<textarea> <select> <h1>, <h2>, <h3>, <h4>,<h5>,<h6>
154. Antes de existir o CSS...
Elementos inline-level <dentro de> Elementos block-level
<input> <a> <form>
W3C
<label> <img> <blockquote>
<div>
<li> <td>
<button> <cite> <em>
W3C <fieldset>
<th>
<strong> <span> <p>
<textarea> <select> <h1>, <h2>, <h3>, <h4>,<h5>,<h6>
155. Antes de existir o CSS...
Elementos inline-level <dentro de> Elementos block-level
<input> <a> <form>
W3C
<label> <img> <blockquote>
<div>
<li> <td>
<button> <cite> <em>
W3C <fieldset>
<th>
<strong> <span> <p>
<textarea> <select> <h1>, <h2>, <h3>, <h4>,<h5>,<h6>
W3C
156. Antes de existir o CSS...
‣ Leitura recomendada (é curto, prometo!):
http://www.w3.org/TR/html401/struct/global.html#h-7.5.3
‣ Regras da estrutura HTML:
http://www.w3.org/TR/html4/strict.dtd
159. Displays
‣ Os dois tipos básicos de display são:
‣ display:block permite um elemento ser
dimensionado com width, height, padding, margin,
etc.
‣ display:inline permite ficar lado-a-lado com outros
elementos e textos. Não pode ser dimensionado
com width e height. Apenas com valores laterais de
margin.
160. Display:Inline-block
‣ Junta características de elementos inlines e blocks.
‣ Permite ficar lado-a-lado com outros elementos e ser
dimensionados.
‣ É mais intuitivo de aplicar e explicar.
‣ É tratado como parte do texto.
161. Display:Inline-block
‣ Propriedade também consistente no cross-browser.
‣ No IE7, é simulado por *display:inline e *zoom:1.
* isto não é uma nota de rodapé, é um hack pro IE.
162. Display:Inline-block
Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Nunc massa sapien,
rutrum ac dignissim at, iaculis sit amet
libero. Aenean vehicula tortor vitae eros
pulvinar quis consectetur arcu suscipit.
Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Nunc massa sapien.Nunc massa sapien, rutrum ac dignissim at, iaculis sit amet libero. Aenean
vehicula tortor vitae eros pulvinar quis consectetur arcu suscipit.
display:inline-block
167. Position:Absolute
‣ Propriedade bem consistente cross-browser. Portanto
bem mais seguro de se usar do que o float.
‣ É sempre utilizado com uma ou mais das seguintes
propriedades: top, bottom, left, right.
179. Em vs Px
‣ “em” é uma unidade de medida relativa e mais
flexível. 1em = 100%, logo 1.02em=102%.
‣ “px” é uma unidade de medida absoluta e mais
intuitiva. 1px é 1px e ponto final.
181. Em vs Px
‣ As principais vantagens do “em” são:
‣ O tamanho da página aumenta conforme o
tamanho da fonte pré-definida pelo usuário em seu
navegador.
‣ A funcionalidade aumentar/diminuir fonte do IE6/7
só funciona com unidades de medidas.
‣ Se adapta melhor em telas pequenas como a de
celulares.
182. Em vs Px
‣ As principais desvantagens do “em” são:
‣ Número quebrado gera inconsistência entre
navegadores por causa do cálculo de conversão
para px. Ex.: 1.33em pode ser 15px em um
navegador, e 16px em outro.
‣ Todo valor em “em” tem que ser previamente
calculado de acordo com o elemento pai.
183. Em vs Px
‣ Vantagens do “px”:
‣ Previsibilidade: 1px = 1px e pronto!
‣ É a unidade padrão dos designers
184. Recomendação
‣ Use apenas “px.” O desenvolvimento front-end já é
instável o suficiente.
‣ Caso esteja interessado na flexibilidade do “em,”
considere utilizar o “rem.”
186. Hacks
‣ Evite ao máximo utilizá-los.
‣ É completamente possível fazer o mesmo CSS para
Firefox, Chrome, Safari e Opera. (excetuando
propriedades novas como border-radius e transition)
‣ Para IE o transtorno é tão grande que compensa
utilizar hacks.
187. Hacks: Quando usar?
‣ O mais recomendado no mercado é fazer conditional
comments.
‣ Mas a experiência mostra que da seguinte forma é
mais manutenível (na ordem):
‣ IE 9-: margin: 15px9;
‣ IE 7-: *margin: 15px;
‣ IE 6-: _margin: 15px;
190. Referências
‣ CSS Compatibility and Internet Explorer
(http://msdn.microsoft.com/en-us/library/cc351024(VS.85).aspx)
‣ When Can I Use...
(http://caniuse.com)
‣ CSS Frameworks (video com um overview)
(http://www.youtube.com/watch?v=EuhDIRzUJgc)
‣ Explorer Exposed!
(http://www.positioniseverything.net/explorer.html)
192. Exemplos e Exercícios
‣ Exemplo de Grid
(http://jsfiddle.net/lquixada/KVSNn/show/)
‣ Exercício do Grid
(http://jsfiddle.net/lquixada/qxxkK/show/)
‣ Exercício do Box Nas Novelas
(http://jsfiddle.net/lquixada/6mWM7/show/)
A cada dia nossos layouts ficam cada vez mais rebuscados, ser&#xE1; que apenas essas abordagens s&#xE3;o eficientes?\n
\n
- Voc&#xEA; olha o HTML e o CSS do cara do lado ou de terceiros e fala: &#x201C;meu deus!&#x201D; Salada de tags\n- Cada um por si. Faltam patterns.\n- Em Rails, temos o Model-View-Controller\n- Em Django, temos o Model-View-Template\n
\n
\n
\n
- Limpeza: evitar class-itis e div-itis\n- Clareza: utilizar tags sem&#xE2;nticas e classes\n- Ao inv&#xE9;s de corrigir bugs, evit&#xE1;-los\n\n
- Slide mais importante: Resumo do curso\n- Container e conte&#xFA;do est&#xE3;o dentro de estrutura\n
\n
\n
Boa parte do que fazemos no CDA s&#xE3;o boxes. &#xC9; o que vamos nos concentrar no curso.\n
\n
\n
\n
\n
\n
\n
\n
- Grids s&#xE3;o como estantes que alocam espa&#xE7;os para os componentes\n- &#xC9; como se os espa&#xE7;os verticais dos compartimentos pudessem variar\n
\n
- Existem v&#xE1;rios tipos de grid na web: blueprint, 960 (mais famoso), YUI Grids, etc.\n- Em geral seguem os mesmos princ&#xED;pios, s&#xF3; mudando alguns detalhes de implementa&#xE7;&#xE3;o.\n
- Vamos usar o glb-grid como exemplo.\n
\n
\n
\n
\n
- um bloco n&#xE3;o tem margens\n- glb-bloco &#xE9; um glb-grid-12 sem margins\n
- Na pr&#xE1;tica, utilizamos mais grid-4, grid-8 e grid-12\n- glb-bloco &#xE9; um glb-grid-12 sem margins\n\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
- Lembrar rob&#xF4;zinho do BBB\n
\n
\n
\n
se poss&#xED;vel utilizar tags HTML5: <section>, <header> e <footer>\n
Todo o css que vier dentro do <div class=&#x201D;box-plantao&#x201D;> ser&#xE1; a partir dessa classe.\n
\n
\n
\n
- Coment&#xE1;rios, de prefer&#xEA;ncia, din&#xE2;micos.\n
Perceba que s&#xF3; utilizei elementos inline, nenhum block. Blocks estruturam, inlines apresentam.\nNunca, nunca colocar um block dentro de um inline.\n
Nada de grids aqui dentro. Deixa o componente mais independente de grids. Ou seja, &#xE9; poss&#xED;vel alterar o grid da p&#xE1;gina sem afetar o componente.\n
Spoiler!\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
Mostrar os diferentes contextos\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
- Fica mais f&#xE1;cil fazer um git blame tamb&#xE9;m.\n
\n
\n
- Se o arquivo come&#xE7;ar a ficar longo demais, melhor quebrar em arquivos menores.\n
\n
Problema da ordem alfab&#xE9;tica: width longe do height, top longe do bottom, etc...\n
Permite ser sobrescrito para ser customiz&#xE1;vel em outros contextos.\n
Al&#xE9;m de n&#xE3;o fazer sentido, pode gerar efeitos colaterais.\n
\n
http://jsfiddle.net/lquixada/P3ED7/\n
\n
Mostrar diferen&#xE7;a entre display:inline e display:block no jsFiddle\n
\n
\n
essa abordagem &#xE9; mais usado quando h&#xE1; uma depend&#xEA;ncia de boxes.\n
essa abordagem &#xE9; mais usado quando h&#xE1; uma depend&#xEA;ncia de boxes.\n
essa abordagem &#xE9; mais usado quando h&#xE1; uma depend&#xEA;ncia de boxes.\n
\n
\n
http://jsfiddle.net/lquixada/4umjF/\n
\n
\n
\n
Mostrar a diferen&#xE7;a entre as positions relative, absolute, fixed e static no jsFiddle\n
Essa abordagem &#xE9; mais usado quando n&#xE3;o h&#xE1; uma depend&#xEA;ncia de boxes.\nSe a foto sumir, o quote desloca?\n
\n
\n
imagem: 145px x 85px\nbox: 620px de largura\ndura&#xE7;&#xE3;o: 1h\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
- Modulariza&#xE7;&#xE3;o. Ao tirar um widget, n&#xE3;o &#xE9; necess&#xE1;rio ca&#xE7;ar propriedades em arquivos separados.\n- Algu&#xE9;m conhece um hack para IE8-?\n
ver forma de valida&#xE7;&#xE3;o coletiva\n
\n
Utilizar jsfiddle.net para demonstra&#xE7;&#xF5;es\n
\n
Utilizar jsfiddle.net\n
\n
\n
- Lembrar que o SD se aplica a mat&#xE9;rias e p&#xE1;ginas inteiras\n- Estruturar HTML e CSS abrindo caminho para CSS3 e Javascript\n- Abrimos caminho para SEO, Microdata...\n