HTML5 – section ou article?

Nos blogs que acompanho as discussões mais polvorosas que eu vi acerca do HTML5 eram a respeito da semântica e confusão quanto ao uso do article e do section. A definição dos elementos pela W3C realmente é bastante rasa e permite diversas interpretações:

Article tag

O <article> define conteúdo externo.
O conteúdo externo pode ser um artigo de notícias a partir de um provedor externo, um texto de um blog, um texto de um fórum ou qualquer outro conteúdo de uma fonte externa.

W3C (EN)

Depois de ler algumas outras definições externas minha compreensão foi que o source do conteúdo não precisa ser uma fonte externa, mas o article é um conteúdo independente, o conteúdo que teria no feed daquela página, ou como o @elcio bem definiu: o "filézinho do conteúdo".

Section tag

O <section> define as seções em um documento.
Tal como capítulos, cabeçalhos, rodapés ou outras seções do documento.

W3C (EN)

São as seções genéricas do documento, podem estar dentro de um article (dividido em capítulos, por exemplo) ou para separar seções na home do site, por exemplo.

Percebam que a definição oficial é um pouco confusa – e foi o que causou um pouco de pânico enquanto a documentação do HTML5 era escrita. Agora a comunidade está um pouco mais calma acerca do assunto e resolvi dar meus pitacos, já que esclareci algumas dúvidas no curso da W3C de HTML5.

 

A maioria parte das tags html tem uma nomenclatura "técnica", um dos pontos que percebi nas leituras (em inglês a maioria) era que o nome com palavras que existem no idioma (inglês) causam confusão na hora de definir onde a tag será usada. 

Um texto interessante sobre o assunto é o Article vs. Section: We"ve Finally Gone Mad (EN) que dá uma brincada com algumas questões destas dúvidas, e este também fala sobre o assunto e exemplifica o uso de article e section.

Quando usar article e quando usar section?

Você já deve ter entendido, o article é seu conteúdo principal – aquilo que o usuário entrou para ler. O post no seu blog, a notícia, a seção de fotos (?), vídeo (?). Article é o conteúdo que seu usuário gostaria de ter no feed.

Eu li sobre o uso de article para os comentários, porém seguindo esta definição acima não é o correto (e eu jamais faria isso pensando em SEO).  Comentários normalmente não são conteúdo principal – é um conteúdo tangencial – e está relacionado ao conteúdo, portanto faz sentido utilizar o <aside>.

O section é um elemento genérico, "a nova div" como foi comentado no curso. Não é exatamente a "nova div", divs devem continuar existindo para quando for necessário alguma formatação específica para layout apenas (sem peso semântico), porém quando esta formatação for de uma seção da página a div deve ser trocada pelo <section>! 🙂

Uso errado do section

Um exemplo de uso errado do section seria  como a div "principal" da página, normalmente  usada para centralização de todo o site. Não é correto pois semânticamente trata o site como uma "seção", neste caso o correto é o uso de div – dica do próprio @diegoeis, que disse que <div> é coisa do passado e rebeldia no twitter.

 

Leia mais sobre HTML5:

 

HTML5 meta – Charset

Estou agora no curso de HTML5 da W3C e vou inicar uma série de posts sobre as idéias e definições do HTML5 passadas por aqui.

Depois de colocar o doctype correto o HTML5 mantém as tags <meta>, mas com algumas novidades que nos permitem especificar algumas coisas de forma mais intuitiva.

Setando o charset no HTML5

Inconsistência de charset é um problema muito comum e que causa dor de cabeça monstruosa entre os desenvolvedores – acentuação com problema, caracteres especiais que não são imprimidos na tela, etc. Tudo isso normalmente é relacionado a problemas de charset.

Alguns destes problemas acontecem por esquecimento de explicitar o charset, por usar um charset errado… no HTML4 tínhamos o seguinte:

<META http-equiv="Content-Type" content="text/html; charset=UTF-8">

Não existia uma meta especificando o charset e como a tag content-type enviada como cabeçalho pelo servidor era mandatória o charset era sobreposto pelo servidor – muitos desenvolvedores (como eu) não sabiam disso, setavam um charset no documento, ele não funcionava e ficávamos quebrando a cabeça para descobrir que diabos estava acontecendo se o charset "estava certo".

No HTML5 temos uma meta específica para especificar o nosso charset:

<meta charset="UTF-8">

Agora seu navegador realmente sabe com qual charset ele deve tratar o documento, pois a regra do servidor não irá sobrepor a do seu documento, mas não se esqueça que para inserir esta meta tag você precisa especificar corretamente o doctype.

Leia mais sobre HTML5:

E também a documentação das meta tags no W3C.

HTML5 – Tag aside

Dando continuidade as explicações sobre as novas tags do HTML5, você já sabe especificar o doctype, já fez o seu menu utilizando a tag nav, como você deve classificar o conteúdo relacionado ao seu conteúdo principal?

aside – conteúdo relacionado

A tag <aside> não é para fazer colunas como eu já li por aí, nas dicas para escrever um bom HTML eu falei: semântica na escrita, ignore o layout.

A tag aside define uma área de conteúdo relacionado ao seu conteúdo principal (que provavelmente será um article, o "filé do conteúdo" – vou tratar em outro post já começado), então pode fazer sentido você utilizar isso para uma barra lateral – desde que o conteúdo esteja relacionado ao seu conteúdo principal.

Um exemplo do @elcio no curso da W3C é o uso do aside para as listas de comentário. Isto resolve a dúvida do uso de sectionou article para comentários. Desde que li as definições eu tenho em mente usar apenas um article por página – pensando em SEO, este article está reservado para o conteúdo principal, que eu quero que seja indexado e considerado importante pelos buscadores, pois ele é o conteúdo mais importante para o meu usuário.

Vou continuar escrevendo diversos posts sobre HTML5 durante o curso, para quem quiser acompanhar mais de perto sigam @odesenvolvedor que estou pulicando as dicas rápidas por lá!

(Os posts feitos durante o curso serão atualizados com as correções, estou "correndo" para não perder nada de conteúdo do curso).

Html5 – tag NAV

Se tudo der certo esta semana eu vou participar do curso de HTML5 da W3C e para me preparar para o curso eu dei continuidade aos meus estudos e testes com HTML5.

Prometi que vou abordar em posts por aqui algumas tags específicas do HTML5, já expliquei a importância do uso do html5 doctype, hoje vou falar da tag NAV, que traz melhorias na semântica e consequentemente na indexação das páginas.

<nav>

A tag <nav>, como o nome indica, defina uma seção de navegação no documento – uma lista de links. No HTML4 ainda é comum ver menus de navegação com o seguinte código:

<ul class="nav">
    <li><a href="#" title="Home">Home</a></li>
    <li>
<a href="#" title="Sobre">Sobre</a></li>
    <li>
<a href="#" title="Contato">Contato</a></li>
</ul>

Com as mudanças do HTML5 alguns microformats foram transformados em tags, o <nav> é uma delas. Um menu agora poderá ser escrito da seguinte forma:

<nav>
    <a href="#">Home</a>
    <a href="#">
Sobre</a>
    <a href="#">
Contato</a>
</nav>

Uma seção focada na navegação melhora a semântica do documento e pode facilitar muito a navegação através de leitores de tela, melhorando a acessibilidade do site.

Segundo a W3C elementos como "próximo" e "anterior" devem estar dentro de uma <nav>, portanto acredito que a tag também pode ser usada para paginação, por exemplo.

SEO e a tag <nav>

Além da questão da acessibiliade e semântica sem dúvida a <nav> vai influenciar na indexação dos buscadores, visto que os links são os canais do "juice" das páginas. Acredito que o uso não deve ficar preso apenas a menu e a o <nav> deve ser aplicado a qualquer  "seção de navegação" da sua página, por exemplo:

  • Menu principal
    Exemplo acima, menu no header ou barra lateral para as páginas principais do site
  • Histórico
    No caso de blogs é comum ter um "histórico" – é uma seção de navegação, faz sentido o uso da classe
  • Próximo / Anterior e paginação
    Também são elementos de navegação e bastante usados em muitos blogs.
  • Breadcrumb
    Importante para a navegação do site, semanticamente faz muito sentido estar classificado como navegação.
  • Lista de links dentro do conteúdo
    Bacana para a navegação e importante para SEO, é como o uso de ferramenta de links recomendados, que adivinha só? É um conjunto para navegação… 😉

 

Dicas

Algumas coisas que acho que vale a pena ressaltar…

<nav> não é <menu>

No html5 existe a tag menu e isso pode causar confusão em alguns desenvolvedores, porém para o menu de navegação de um site o correto é o uso do <nav>. A descrição da tag menu é que ela é uma lista de comandos, então faz mais sentido o uso dela em aplicações web onde o menu é utilizado para listar comandos, e não links de navegação.

Utilize o doctype correto

Você precisa dizer para o seu navegador como ele deve interpretar o seu documento, para isso utilize o doctype do HTML5 sempre que ele for utilizado.

<nav> aceita listas

Acabei de questionar no curso de HTML5 sobre o uso de <nav> e lsitas, não é necessário utilizar uma lista dentro do elemento <nav>, portanto você pode ter o seguinte:

<nav>
  <li><a href="#" title="Title">Item</a></li>
  <li><a href="#" title="Title">Item</a></li>
  <li><a href="#" title="Title">Item</a></li>
  <li><a href="#" title="Title">Item</a>
     <nav>
        <li><a href="#" title="Title">Item</a></li>
        <li><a href="#" title="Title">Item</a></li>
      </nav>
  </li>
  <li><a href="#" title="Title">Item</a></li>
</nav>

 

O <nav> não é um UL, ele aceita parágrafos, listas, links, etc. 🙂

Salvando objetos com ID definido no Data Mapper (CI)

Desde que comecei a estudar e utilizar o Code Igniter eu recomendo o uso do ORM Data Mapper, que facilita a vida nas consultas ao banco de dados (leia: tutorial do Data Mapper no Code Igniter), esta semana ele mais uma vez se mostrou muito útil enquanto eu fazia a migração do banco antigo do And After para o novo.

Depois de dominar (yeaaaah) relacionamento de tabelas com o Code Igniter (usando o Data Mapper) e finalizar o sistema do And After neste framework estou fazendo a migração de todo o conteúdo para a nova plataforma: textos, comentários, cadastro de usuários, logs, tags, blogs…

Achei que seria extremamente trabalhoso, pois toda a estrutura de banco foi alterada – recomecei o sistema do zero sem pensar na migração, fiz isso para evitar "puxadinhos" e gambiarras (que com o crescimento de sistema, estava cheio) e desenvolver tudo direito, do zero, um sistema novo.

No ônibus voltando para São Paulo fiz em alguns minutos a migração dos usuários e iniciei a dos textos (que será um pouco mais complicada devido aos relacionamentos), mas tive um problema com o Data Mapper: não perder os ID"s dos objetos que estão sendo migrados.

Como salvar um objeto com um ID existente?

O Data Mapper usa o atributo ID do objeto para verificar se ele deve fazer um insert ou um update, se o objeto ID existe ele fará um UPDATE, portanto você não consegue setar o ID de um objeto e usar o $object->save();, pois ele fará um update mesmo que o objeto não exista (e não vai acontecer nada no seu banco).

Para isso o Data Mapper tem a função save_as_new, segue um exemplo abaixo:

$user = new User();
$user->id = 1;
$user->login = "Admin";
$user->password = "password";
$success = $user->save_as_new();

Se não deu nenhum problema no seu banco (neste caso ele deveria estar limpo) você acabou de criar um usuário "Admin" com o id 1na sua tabela.

Problemas comuns

Após fazer a migração pode acontecer problemas ao tentar salvar novos objetos na tabela, isso pode acontecer porque o auto_increment (do ID) não foi atualizado – e está tentando inserir um novo objeto na tabela com um ID que já foi registrado "na mão".

Para facilitar o entendimento vamos a ao exemplo do caso da migração do And After. Existem aproximadamente 1.500 usuários cadastrados no site, após a migração o último ID utilizado na tabela de usuários foi o 1600 (devido a usuários excluídos, testes no banco, etc).

Preciso avisar a minha tabela que o próximo auto_increment (ID) é 1601, e não 1 (que seria o primeiro inserido de forma "natural", sem ID setado). O código abaixo executa esta atualização no banco:

// Update MySQL AUTO_INCREMENT:
$user->db->query("ALTER TABLE `users` AUTO_INCREMENT = 1601;");

Agora a migração da tabela users está completa e é possível utilizar ela normalmente.

Para mais dúvidas sobre o save leia a documentação do data mapper (EN).