segunda-feira, 29 de abril de 2013

MicroFormatos

Definição de Web Semântica

No início da internet, tivemos o HTML para criar e marcar o conteúdo. Com ele, que é usado até hoje em todas as páginas existentes, é possível criar textos, links, inserir imagens e tabelas, formulários, e muito mais. Porém a classificação e o uso destes elementos permite apenas funcionalidade e não significado. Um link geralmente assume a forma de um texto ou imagem, que uma vez clicado leva a outra página, mas não diz o significado, a natureza dessa relação. Adicionar significado à relação dos elementos é a idéia principal por trás da semântica na web.

POR QUE É IMPORTANTE?

Para os usuários a diferença não é tão transparente ou mesmo útil no dia a dia. Pouca ou nenhuma funcionalidade nova é agregada para a intereção do usuário. Mas para os buscadores e indexadores, isso faz toda a diferença, e isso sim acaba afetando a qualidade da navegação dos usuários, além das relações comerciais (ou não) entre os próprios sites. Um exemplo seria procurar restaurantes, com determinada faixa de preço, com boa avaliação dos frequentadores, em determinada região. Outro exemplo seria procurar todos os artigos de um determinado autor que estão publicados sob determinada licensa de uso.

Definição de Microformatos

Microformatos são conjuntos de formatos de dados que usam tecnologias e padrões web para contextualizar informações online. As informações publicadas ganham marcações moduladas que levam em conta o seu significado em situações específicas, o que facilita a sua recuperação, seu compartilhamento e sua utilização.

Os microformatos fazem parte da "web semântica", mas ao contrário desta, procuram servir mais aos usuários do que aos programas e sistemas. Como se baseiam na grafia de XHTML, qualquer pessoa com domínio desta linguagem pode criar redes de dados de acordo com suas necessidades. Sua implementação é relativamente simples.

Os microformatos podem representar diversos tipos de conteúdo publicado em páginas web, como pessoas, eventos, links. Sua aplicação faz com que o HTML da página receba marcações compreensíveis por browsers ou ferramentas de busca compatíveis com microformatos.

O uso de microformatos pode permitir que editores de conteúdo eliminem ambiguidades no conteúdo publicado. Por exemplo, a palavra "belo horizonte" deixa de ser uma inserção neutra dentro de um texto e passa a ser reconhecida como o nome de uma cidade. Desta maneira, os resultados das buscas podem ser mais precisos e adaptados às necessidades de cada usuário.

Algumas restrições incluem o fato de que estes formatos ainda não são reconhecidos por todos os browsers. Embora possam ser lidas pelo Firefox, o Internet Explorer 7 não as reconhece (embora a Microsoft inclua esta funcionalidade no IE8).

Outro fator que dificulta a sua implementação é que as páginas precisam ser assinaladas uma a uma, embora já seja possível automatizar algumas etapas do processo.

Há ainda a dificuldade de associar todo o tipo de conteúdo publicado a estes formatos. Informações como bibliografias, por exemplo, ou a programação de filmes ainda não podem ser estruturadas (embora se possa marcar sites de filmes). Mas na medida em que mais editores forem aderindo ao seu uso, os microformatos tenderão a se adaptar a demandas cada vez mais especializadas como estas.

Definição dos microformatos hCard e hCalendar


hCard

A especificação hCard é baseado no padrão internacional conhecido como “vCard”. Trata-se de um arquivo de texto que é implementado em quase todos programas que armazenam informações de contato e qualquer sistema operacional no mundo inteiro. O propósito da especificação hCard é fornecer um padrão para compartilhar informações comerciais de alguém em páginas de HTML e XML e suas linguagens derivadas e pode representar não somente informações pessoais de contato, mas também sobre empresas, grandes corporações e lugares. Estes dados podem ser publicados em páginas web e lidos por aplicativos que compreendem o formato hCard (a ferramenta hCard Creator ajuda na criação). A formatação dos dados é feita através de estilos CSS, pois estes estão definidos por marcações padrões de XHTML.

hCalendar

A especificação hCalendar é baseado no padrão internacional para calendário e informações sobre eventos chamado de “iCalendar”. A lógica é a mesma: um hCalendar é 1:1 (um por um) 100% compatível com o padrão iCalendar utilizado em softwares como o Outlook ou o Google Calendar por exemplo. Assim como o hCard possui o seu “creator”, o hCalendar também possui o seu conhecido como hCalendar Creator. Compartilhar informações de eventos é bem comum, dado esse fato surgiu a necessidade de desenvolver um padrão microformat para se compartilhar informações de eventos.A formatação dos dados também é feita através de estilos CSS.

Aplicar microformats para marcação de contato (hCard), e informações sobre evento (hCalendar).


hCard

Abaixo segue um exemplo de hCard com as principais propriedades inseridas e que são utilizadas no hCard Creator. O que esta em negrito são as propriedades do hCard.

<div class="vcard">
            <img src="http://www.revolucao.etc.br/imagens/foto_henrique_costa_pereira.jpg" alt="photo" class="photo"/>
            <span class="fn n">
                        <span  class="given-name">Henrique</span> <span  class="additional-name">Costa</span> <span class="family-name">Pereira</span>
            </span>
            <div class="org">Visie</div>
            <a class="email" href="mailto:henrique.costapereira@gmail.com">henrique.costapereira@gmail.com</a>
            <div class="adr">
            <div class="street-address">Av Paulista, 1000 - Centro</div>
            <span class="locality">São Paulo</span> ,
            <span class="region">SP</span> ,
            <span class="postal-code">38400-360</span>
            <span class="country-name">Brasil</span>
            </div>
            <div class="tel">9999-9999</div>
</div>


vcard: é a propriedade obrigatória que identifica qual a especificação que está sendo utilizada. Todas as especificações microformats começam com uma tag e uma propriedade que envolve todas as outras no formato de “pai e filho”, exatamente como no exemplo acima. Todas as outras propriedades são filho da propriedade vcard, ou seja, devem ser devidamente aninhadas dentro de uma estrutura que contenha a classe “vcard” como no exemplo dado anteriormente. As sub-propriedades podem ter ainda outras propriedades dependentes dela como no caso da propriedade “adr”. Se observar a propriedade “street-address”, ela é filha da propriedade “adr”, que por sua vez é filha direta da propriedade “vcard”.

photo: significa “foto” :D . Esta propriedade geralmente é utilizada na tag <img> que contém a foto da pessoa do hCard. Este é um daqueles casos em que não faz nenhum sentido utilizar esta propriedade em outra tag que não seja a tag <img>

fn: é a abreviação de “family name”. Essa propriedade pode ser usada para compartilhar o nome completo da pessoa sem nenhuma outra sub-propriedade (ou propriedade filho) da seguinte maneira:

<span class="fn">Henrique Costa Pereira </span>

Entretanto, existe outra propriedade que pode expandir a quantidade de descrição do nome de uma pessoa. Esta propriedade chama-se “n”, que é a abreviação de “nome” apenas e é utilizado quando se quer utilizar outras propriedades que estão presente no vCard como honorific-prefix, given-name, additional-name, family-name, honorific-suffix. Por isso que no exemplo dado anteriormente temos o seguinte trecho:

<span class="fn n">
      <span  class="given-name">Henrique</span> 
      <span  class="additional-name">Costa</span> 
      <span     class="family-name">Pereira</span>
</span>

Veja outro exemplo dessas propriedades aplicadas:

<cite class="fn n">
            <span class="honorific-prefix">Dr.</span>
            <span class="given-name">John</span>
            <span class="additional-name">Philip</span>
            <span class="additional-name">Paul</span>
            <span class="family-name">Stevenson</span>,
            <span class="honorific-suffix">Jr.</span>,
            <span class="honorific-suffix">M.D.</span>,
            <span class="honorific-suffix">A.C.P.</span>
</cite>


As subpropriedades nunca devem ser aplicadas sem as propriedades pai. Você precisa sempre saber se uma propriedade depende de outra. Isso vale para todas as especificações microformats. Sempre que existir um atributo dependente de outro, será necessário a estrutura completa na markup.

Ou seja, “fn” é o seu nome completo e “n” é a propriedade necessária para poder declarar outras propriedades especificas como “given-name” (primeiro nome), “additional-name” (nome do meio) e “family-name” (sobrenome ou último nome). Com isso nós temos nosso primeiro exemplo prático de aplicação de propriedades filhas, ou seja, propriedades que dependem de outra.

Veja um exemplo do que não deve ser feito:

<div class="vcard">
     <span class="fn">
             <span  class="given-name">Henrique Costa Pereira</span>
     </span>
</div>


Você não deve utilizar a propriedade “given-name” sem a propriedade pai, que é “fn” (que está riscada). Veja o correto abaixo:

<div class="vcard">
     <span class="fn">
             <span  class="given-name">Henrique Costa Pereira</span>
     </span>
</div>


Outra coisa que não deve ser feita é combinar a propriedade raiz, com outras propriedades como no exemplo:

<div class="vcard fn">
        <span  class="given-name">Henrique Costa Pereira</span>
</div>


E também não é possível combinar propriedades com suas sub-propriedades como no exemplo:

<div class="vcard">
           <span  class="fn given-name">Henrique Costa Pereira</span>
</div>


Os dois exemplos acima são “ilegais” e NUNCA devem ser utilizados dessa maneira em nenhuma especificação microformat composta.

org: significa “organização”. Ou seja, o nome da empresa. Esta proprieda possui outras 2 propriedades filhas “organization-name” e “organization-unit”. Entretanto, se nenhuma das duas propriedades filhas for encontrada (ou seja, se você não usá-las) a propriedade “org” assumirá automaticamente o valor de “organization-name”. Na maioria dos casos nenhuma das duas sub-propriedades de “org” são necessárias ou mesmo utilizadas.

email: a mais óbvia das propriedades. Geralmente esta propriedade é utilizada junto com a tag <a> como no exemplo:

<a class="email" href="mailto:henrique.costapereira@gmail.com">henrique.costapereira@gmail.com</a>

Entretanto esta não é uma obrigação.

adr: é uma sub-propriedade do hcard ao mesmo tempo em que também é um especificação microformat composta por si só que vamos ver mais á frente. Mas em resumo, ela significa endereço e possui outras propriedades filhas onde pelo menos uma propriedade filho é obrigatória. Veja um exemplo abaixo;

<div class="adr">
    <div class="street-address">665 3rd St.</div>
    <div  class="extended-address">Suite 207</div>
    <span class="locality">San Francisco</span>,
    <span class="region">CA</span>
    <span class="postal-code">94107</span>
    <div class="country-name">U.S.A.</div>
</div>


Veja o trecho do exemplo que eu havia dado anteriormente:

<div class="adr">
        <div class="street-address">Av Paulista, 1000 - Centro</div>
        <span class="locality">São Paulo</span> ,
        <span class="region">SP</span> ,
        <span class="postal-code">38400-360</span>
        <span class="country-name">Brasil</span>
</div>


As propriedades filha de “adr” são: “street-address”, significa “endereço da rua” (mesmo que seja uma avenida para os mais espertinhos). As outras são “locality” (localidade, geralmente o nome da cidade), “region” (região, geralmente o nome do estado ou província), “postal-code” (CEP) e “country-name” (nome do país). Outras propriedades aqui!

tel: significa “telefone” e possui uma sub-propriedade e uma excessão. Geralmente as pessoas utilizam a propriedade “tel” sozinha e sem nenhuma outra sub-propriedade junto como no exemplo geral que eu havia dado:

<div class="tel">9999-9999</div>

A sub-propriedade é chamada de “type” e pode receber os seguintes valores: “home” (para telefone residencial), work (para o telefone do trabalho), pref (para o telefone preferencial), fax (para o número do seu fax) , cell (seu celular) e pager (número do seu pager). Como “type” é uma subpropriedade de “tel”, é preciso de uma segunda propriedade para o número desses telefones propriamente ditos, que no caso é “value”.

Esta é uma propriedade genérica usada geralmente em sub-propriedades quando a propriedade pai não necessariamente precisa de filhos (ou sub-propriedades) para ter seu valor. Como o número do telefone é inserido na propriedade “tel”, quando ela possui uma sub-propriedade dentro, é necessário alocar este valor para outra propriedade. Então sempre que usar a sub-propriedade “type” para indicar o tipo do número do telefone que está compartilhando, será necessário usar também a sub-propriedade genérica chamada de “value” para colocar o número do telefone propriamente dito conforme o exemplo abaixo:

 <div class="tel">
    <span class="type">cell</span>
    <span class="value">9999-9999</span>
</div>

Só o conteúdo que importa!

Veja um exemplo abaixo:

<p class="vcard">
            <span class="fn">
                        <span  class="given-name">Marcos Borges será o nosso palestrante esta  noite</span>
            </span> e ele vai falar sobre biologia  marinha.
</p>


Quando um parser interpretar este trecho e remover o conteúdo relacionado a “given-name”, o resultado será:
 Marcos Borges será o nosso palestrante esta noite

A propriedade “given-name” refere-se ao nome e é somente isto que ela deve conter.

Bom, como o objetivo das propriedades é descrever trechos de informação, você só deve deixar dentro delas o que realmente for a informação que diz respeito a propriedade. Colocar trechos de informações desnecessárias dentro de uma propriedade é o erro mais comum ao escrever microformats. Isso ocorre quando se coloca texto que não condiz com o valor da propriedade.

hCalendar

Veja um exemplo de hCalendar. Em negrito estão as propriedades do hCalendar:

<p class="vevent">     O que: <span class="summary">Festa dos blogueiros</span><br />      Quando: <abbr class="dtstart" title="2006-09-01T19:30:00">1  de setembro às 7:30 da noite!</abbr> até ás <abbr class="dtend" title="2006-09-01T21:30:00">9:30</abbr><br  />      Onde: <span class="location">Escritório da  Visie: Av Fagundes Filho, Vila Monte Alegre, nº 145, São  Paulo/SP</span>      <span class="description">Este é  o encontro oficial de todos os blog de tenconologia do Brasil, não  perca!</span> </p>

Observe que o conteúdo que não faz parte de nenhum campo, eu deixei do lado de fora de qualquer uma das propriedades como os trechos “o que”, “quando”, “onde”, assim como eu já falei anteriormente. Observe que eu utilizei a tag <br /> propositalmente também, mas poderiam não estar ali. Se quiser uma quebra de linha, é mais interessante que você utilize CSS para isso. De qualquer maneira, eu inseri a tag <br /> somente para mostrar que ela pode sim estar ali, desde que fora de qualquer propriedade.
Vamos ver mais algumas considerações. Você observou que o formato da data é o do design pattern <abbr> + date time? Pois é, por isso foi necessário trabalhar os coneitos dele lá atrás. Brian Suda (de novo o cara) criou um XSLT que extrai o conteúdo microformato de qualquer site com o padrão hCalendar e o exporta para o formato .ics (iCalendar) utilizado pelos softwares, chamado de X2V.

As únicas propriedades OBRIGATÓRIAS do hCalendar são apenas 3. Elas são “vevent”, a propriedade raiz que não pode faltar nunca, “summary” que é uma breve descrição do evento e “dstart”, que é a data do evento (sem isso como vamos saber que algo vai acontecer?). Todas as outras propriedades são opcionais.


vcalendar – Esta propriedade pode ser usada para um ou mais eventos e é aplicada como uma propriedade raiz que supõe englobar mais de um evento, onde cada evento dentro dessa propriedade “vcalendar” possui sua própria propriedade raiz “vevent”. Esta propriedade é opcional e pode ser omitida.
vevent – Esta é a propriedade raiz e sua utilização é obrigatória.
dtstart – Data de início do evento
dtend – Data do fim do evento
duration – Duração do evento
summary – Resumo do evento, ou título do evento, ou nome do evento etc.
uid – É como se fosse um identificador do evento, onde geralmente se utiliza uma url.
dtstamp – Date e hora de quando o documento sobre o evento foi criado.
method – Valores para esta propriedade são PUBLISH, REQUEST, REPLY, ADD, CANCEL, REFRESH, COUNTER, or DECLINECOUNTER. Por exemplo um valor igual a “request” indica que foi feita uma requisição para o evento ocorrer.
category – Valores comuns para esta propriedade são: MEETING, APPOINTMENT, CONFERENCE, EXPO. Esta propriedade pode repetir, onde um evento pode estar enquadrado em mais de uma categoria.
location – Diz onde o evento vai acontecer.
url – Este é óbvio. A URL dá página do evento se ouver. esta propriedade e “uid” são basicamente a mesma coisa e só foi marida no padrão hCalendar porque faz parte do padrão iCalendar.
description – Uma descrição mais detalhada e/ou uma sinopse do evento diferente da informação provida pelo campo “summary”.
last-modified – Date e hora em que a informação sobre o evento foi atualizada.
status – Valores comuns que indicam o estatus de um evento são: TENTATIVE, CONFIRMED, CANCELLED
class – Indica a classificação de um evento com os seguintes valores: PUBLIC, PRIVATE, CONFIDENTIAL.
Vamos usar a criatividade agora e ver como nós podemos expandir a especificação hCalendar misturando um hCalendar com um hCard:

<p class="vevent">
        O que: <span class="summary">Festa dos blogueiros</span><br />
        Quando: <abbr class="dtstart"  title="2006-09-01T19:30:00">1 de setembro às 7:30 da  noite!</abbr> até ás <abbr class="dtend"  title="2006-09-01T21:30:00">9:30</abbr><br />
        Onde: <span class="location vcard">
                                   Escritório da <span class="fn">Visie</span>:
                                   <address class="adr">
                                       <span class="street-address">Av Fagundes Filho</span>
                                       <span class="extended-address">Vila Monte Alegre, nº 145</span>
                                       <span class="locality">São Paulo</span>
                                       <abbr class="region" title="São Paulo">SP</abbr>
                                   </address>
              </span>
                        <span class="description">Este é o encontro oficial de  todos os blog de tenconologia do Brasil, não perca!</span>
</p>


Como foi dito anteriormente, o hCard também é para empresas. Ou seja, pegue o atributo “location” e à partir dele eu criei o hcard que poderá ser “enxergado” por parsers separadamente do evento em si. Poderíamos ter apenas colocado a especificação adr ao invés da especificação hCard? Claro que sim. Tudo vai depender do nosso interesse em manipular a informação e como nós vamos querer manipulá-la. Mas não vamos parar por aqui. Vamos colocar a especificação geo nesse bolo:

<p class="vevent">
                        O que: <span class="summary">Festa dos blogueiros</span><br />
                        Quando: <abbr class="dtstart"  title="2006-09-01T19:30:00">1 de setembro às 7:30 da  noite!</abbr> até ás <abbr class="dtend"  title="2006-09-01T21:30:00">9:30</abbr><br />
                        Onde: <span class="location vcard">
                                   Escritório da <span class="fn">Visie</span>:
                                   <address class="adr">
                                        <abbr class="geo" title="42.352163;-71.062867"><span  class="street-address">Av Fagundes Filho</span></abbr>
                                        <span class="extended-address">Vila Monte Alegre, nº 145</span>
                                        <span class="locality">São Paulo</span>
                                        <abbr class="region" title="São Paulo">SP</abbr>
                                   </address>
                        </span>
                        <span class="description">Este é o encontro oficial de  todos os blog de tenconologia do Brasil, não perca!</span>
</p>


Pronto, agora nós temos um hCalendar, mais um hCard, mais a especificação geo tudo junto! Quanta informação este trecho carrega não? Por isso que chamam este tipo de microformats de “compostos”, pela capacidade que possuem de serem modulares (podem se aplicar a qualquer contexto que possua este tipo de informação) e podem ser mesclados sem perda de dados e sem redundâncias como no exemplo.


Passo a passo: Como utilizar uma ferramenta de tradução microformatos para criar um link que permita o usuário baixar ou mover o conteúdo para outro local (por exemplo, traduzir hCard para vCard para download em um programa de catálogo de endereços).

 


Vamos supor que você quer facilitar a vida de quem acessa o seu site para pessoas que não utilizam extensions (nem o Firefox), pessoas que não possuem muito conhecimento de informática, mas pelo menos importam arquivos .vcf para seus contact book como o Outlook. Brian Suda criou um arquivo de XSLT que parseia seu HTML e transforma o hcard em um arquivo vCard que pode ser importado por qualquer aplicativo que armazena informações de contato.

Basta proceder da seguinte maneira como no exemplo:

hCard para vCard
<a type="text/directory" href="http://h2vx.com/vcf/tantek.com">Download vCard</a>

hCalendar para iCalendar
<a type="text/calendar" href="http://h2vx.com/ics/microformats.org/wiki/events">Download iCalendar</a>

Nos exemplos acima apenas passei o endereço tantek.com do hCard (que é onde hcard está no XHTML) e o endereço microformats.org/wiki/events do hCalendar pelo parser em XSLT criado por Brian Suda. Basta substituir o endereçotantek.com  e o microformats.org/wiki/events pelo endereço que você quiser fornecer vCards ou iCalendar. Se você quiser alterar o XLST (que é a parte mais difícil e que já foi pensada e implementada por Suda) e colocar suas próprias features ou hospedar no seu próprio site.

Referências:


http://www.w3c.br/Padroes/WebSemantica

http://microformats.org/

http://www.avellareduarte.com.br/projeto/conceitos/websemantica/websemantica.htm

http://www.avellareduarte.com.br/projeto/conceitos/websemantica/websemantica+microformatos.htm
http://campus.tableless.com.br/2012/05/microformats-compostos-1/

http://campus.tableless.com.br/2012/05/microformats-compostos-2/

http://microformats.org/wiki/H2VX

http://h2vx.com/vcf/

http://h2vx.com/ics/



segunda-feira, 22 de abril de 2013

Técnicas de Substituição de Imagens e Padrões de Repetição para Imagens

Técnicas de substituição de imagens vem do termo inglês “Image Replacement”, a técnica é usada para substituir(ocultar) um texto por uma imagem com o mesmo texto, através da propriedade background do css.   

Image replacement e SEO:

SEO(Search Engine Optimization) é um conjunto de técnicas de desenvolvimento de um site, focando a melhor visibilidade nos resultados dos grandes motores de busca para este. A indexação feita pelos se baseia em textos, uma tag de grande utilização para rankeamento dos motores busca como o famos Google é a tag <h1>, partindo dessa ideia chegamos a um bom motivo para utilizar o image replacement: boa visibilidade nos motores de busca, sem deixar aparência do site de lado, conforme mostramos abaixo a codificação do exemplo anterior:

HTML:
<h1>Exemplo</h1>

CSS:
h1 { width: 200px; height: 50px; background: url('') no-repeat; text-indent: -909em; overflow: hidden;

Técnica de Gilder/Levin

Criada por Tom Gilder e Levin Alexander, esta técnica usa um SPAN vazio para conter a imagem e, usando posicionamento absoluto, sobrepõe o texto com a imagem.
Desvantagens:
Usa um SPAN vazio. Um elemento vazio é, de certa forma, algo que não deveria ser usado nunca, por que a imagem deve representar um texto realmente presente no conteúdo, conforme já mencionado, por questões de acessibilidade, levando em conta a interpretação de um leitor de tela.
Impossibilita o uso de imagens transparentes.
Vantagens:
Funciona perfeitamente para usuários com CSS habilitado e imagens desabilitadas.
Exemplo:
HTML:
<h1 id="titulo"><span></span>Ao vencedor, as batatas</h1>
CSS:
#titulo{
  width:438px;
  height:36px;
  position:relative;
  overflow:hidden;
}
#titulo span{
  position:absolute;
  width:100%;
  height:100%;
  background:#fff url() no-repeat;
}
O que a técnica faz é estabelecer as dimensões do “container”, no caso o H1, exatamente iguais às da imagem, posicioná-la com posicionamento relativo e definir overflow hidden, para que o texto não extrapole os limites, caso o usuário o redimensione pelo browser. Depois coloca o SPAN com posicionamento absoluto e com as mesmas dimensões do “container”, com a imagem de fundo. Note que o SPAN fica acima do H1, por causa do posicionamento absoluto. Não é necessário usar z-index.

Fahrner Image Replacement (FIR)

Todd Fahrner membro do W3C, colaborador da WaSP, desenvolvedor e autor consagrado no universo Web Standards é inventor da técnica de substituir texto por imagem. A técnica inventada por Fahrner recebeu seu nome e é conhecida pelo acrônimo FIR iniciais para Fahrner Image Replacement.

O código FIR:

HTML:

<h1 id="topo">
<span>CSS para Web Design</span>
</h1>

CSS:

h1#topo {
width: 270px;
height: 40px;
background-image: url(cwd.gif);
}
h1#topo span {
display: none;
}

Radu Darvas <img> Replacement

A técnica de Radu Darvas propõe o uso do elemento IMG na marcação estrutural, para abrigar uma imagem GIF transparente de um pixel com o atributo "alt" definido com o texto da informação passada pela imagem.

O código de Radu Darvas:
HTML:
<h1 id="topo">
<img src="spacer.gif" alt="CSS para Web Design!" />
<span>CSS para Web Design</span>
</h1>
CSS:
h1#topo {
width: 270px;
height: 40px;
background-image: url(cwd.gif);
}
h1#topo span { display: none;}
h1#topo img {
width: 0px;
height: 0px;
}

Stuart Langridge Image Replacement

A técnica de Stuart não usa o elemento extra SPAN e esconde o texto declarando padding igual à altura da imagem e height igual à zero. Devido ao box model quebrado do IE são acrescidas algumas regras CSS extras para aquele navegador.
HTML:
<h1 id="topo">
CSS para Web Design
</h1>
CSS:
h1#topo {
    padding: 40px 0 0 0; /* padding-top=altura imagem */
    overflow: hidden;
    background: url(cwd.gif) no-repeat;
    height: 0 !important;
    height /**/:40px; /* height=altura imagem - hack IE5's */
 }

Malarkey Image Replacement (MIR)

Na técnica de Malarkey também não aparece elemento extra SPAN e o texto é escondido com uso de letter-spacing muito grande e negativo.
É necessário um 'hack' para o Ópera que interpreta erroneamente a declaração letter-spacing.
HTML:
<h1 id="topo">
CSS para Web Design
</h1>
CSS:
 h1#topo {
 letter-spacing : -1000em;
 width:270px;
 height: 40px;
 background-image: url(cwd.gif);
 }
 /* Hack para Opera, esconde do MacIE */
 /*\*/html>body #topo {
 letter-spacing : normal;
 text-indent : -999em;
 overflow : hidden;
 }/* Fim do hack */

Lindsay Image Replacement

Nesta técnica o texto é escondido declarando-se um tamanho de fonte muito pequeno, igual a 1px e fazendo a cor do texto igual a cor do fundo.
HTML:
<h1 id="topo">
CSS para Web Design
</h1>
CSS:
h1#topo {
 background: url(cwd.gif) no-repeat;
 width: 270px;
 height: 40px;
 font-size: 1px;
 color: #xxx; /* cor do fundo */

Dave Shea Image Replacement

Dave Shea usando a técnica original com um elemento SPAN extra, proposta por Fahrner desenvolveu uma versão usando o atributo title para fornecer um toltip quando o ponteiro do mouse passa sobre a imagem e deixando o elemento SPAN vazio.
HTML:
<h1 id="topo" title="CSS para Web Design">
<span></span>
CSS para Web Design
</h1>
CSS:
h1#topo {
 position: relative;
width: 270px;
 height: 40px;
 }
h1#topo span {
 background: url(cwd.gif) no-repeat;
 position:absolute;
 width: 100%;
 height: 100%;
 }

Referências:

segunda-feira, 15 de abril de 2013

Formulários Acessíveis

Elementos básicos para construção de formulários:

-Form:


O elemento <form> (o "container" para os elementos a seguir). Ele cria uma área para a entrada de dados podendo conter campos de texto, checkboxes, radio-buttons etc.

Atributos do Form:

Id: Identificador único e exclusivo utilizado num documento;

Action:  Endereço da aplicação para onde o formulário e seus dados serão enviados;

Method:  Método utilizado para envio do formulário;

Enctype:  Tipo de codificação dos dados do formulário.

Ex:
<form action="teste.php"
method="post" enctype="multipart/form-data">

Oninput: A tag <output> representa o resultado de um cálculo (como um realizado por um script).

Ex:
<form oninput="x.value=parseInt(a.value)+parseInt(b.value)">0
<input type="range" id="a" value="50">100
+<input type="number" id="b" value="50">
=<output name="x" for="a b"></output>
</form>


Autocomplete: O atributo autocomplete especifica se um campo de entrada deve ou não ter habilitado o completamento automático. Ele também permite que o navegador preveja o valor quando um usuário começa a digitar em um campo, o navegador deve exibir opções para preencher o campo, com base em valores anteriormente digitados.

Ex:
<form action="teste.php" autocomplete="on">


Novalidate: Ele especifica que os dados do formulário (de entrada) não devem ser validados quando submetidos.

Ex:
<form novalidate>

- Input – vários types:


Text 


<input type="text"> Define um campo de entrada de uma linha que um usuário pode digitar texto:
<form>
First name: <input type="text" name="firstname"><br>
Last name: <input type="text" name="lastname">
</form>

Como o código HTML acima aparece no navegador:

First name:
Last name:

Password

<input type="password"> Define um campo de senha:
<form>
Password: <input type="password" name="pwd">
</form>

Como o código HTML acima aparece no navegador:

Password:

E-mail

O tipo de e-mail é usado para campos de entrada que devem conter um endereço de e-mail.

E-mail: <input type="email" name="email">

Search

O tipo de pesquisa é usado para campos de pesquisa (um campo de pesquisa se comporta como um campo de texto normal).

Search Google: <input type="search" name="googlesearch">

URL

O tipo de url é usado para campos de entrada que devem conter um endereço URL.
O valor do campo url é validada automaticamente quando o formulário é enviado.

<input type="url" name="homepage">

Hidden

Um parágrafo oculto:
<p hidden>This paragraph should be hidden.</p>


Number

O tipo de número é usado para campos de entrada que devem conter um valor numérico.
Você também pode definir restrições sobre o que os números são aceitos:

Quantity (between 1 and 5): <input type="number" name="quantity" min="1" max="5">

Ranger

O tipo gama é utilizada para campos de entrada que deve conter um valor a partir de uma gama de números. Você também pode definir restrições sobre o que os números são aceitos.

<input type="range" name="points" min="1" max="10">

Tel

Defini um campo para digitar um número de telefone:

Telephone: <input type="tel" name="usrtel">



Data

O tipo de data permite que o usuário selecione uma data.
Birthday: <input type="date" name="bday">

Datetime

O tipo datetime permite que o usuário selecione uma data e hora (com fuso horário).


Birthday (date and time): <input type="datetime" name="bdaytime">


Datetime-local

O tipo datetime-local permite que o usuário selecione uma data e hora (sem fuso horário).

Birthday (date and time): <input type="datetime-local" name="bdaytime">

Month

O tipo de mês permite que o usuário selecione um mês e ano.

Birthday (month and year): <input type="month" name="bdaymonth">

Week

O tipo semana permite que o usuário selecione uma semana e ano.

Select a week: <input type="week" name="week_year">

Checkbox

O objeto Checkbox representa uma caixa de seleção em um formulário HTML.
Checkboxes permitir que um usuário selecione uma ou mais opções de um número limitado de opções.

Radio

O objeto Rádio representa um botão de opção em um formulário HTML.
Botões de rádio permitem que o usuário selecione apenas uma de um conjunto pré-definido de opções. Você define grupos com a propriedade de nome (botões de rádio com o mesmo nome pertencem ao mesmo grupo).

Color

O tipo de cor é utilizada para campos de entrada que deve conter uma cor.

Select your favorite color: <input type="color" name="favcolor">


Button

Um botão clicável 
<button type="button">Click Me!</button>

Image

O estado do botão imagem representa ou uma imagem a partir do qual um usuário pode selecionar uma coordenada e enviar o formulário, ou, alternativamente, um botão a partir do qual o usuário pode enviar o formulário. O elemento é um botão, especificamente um botão de envio.

Reset

O estado do botão de reset representa um botão que, quando ativado, redefine a forma.

Submit

O estado submit representa um botão que, quando ativado, envia o formulário.

Textarea

A tag <textarea> define um multi-linha de controle de entrada de texto.

Select+option

O elemento <select> é usado para criar uma lista drop-down.
Os <option> marcas dentro do elemento <select> definir as opções disponíveis na lista.

<select>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="mercedes">Mercedes</option>
  <option value="audi">Audi</option>
</select>

Datalist+option

A tag <datalist> especifica uma lista de opções pré-definidas para um elemento <input>.
A tag <datalist> é usado para fornecer um recurso "autocompletar" em elementos <input>. Os usuários verão uma lista suspensa de opções pré-definidas como entrada de dados.
Use o atributo do elemento <input> da lista para vinculá-lo em conjunto com um elemento <datalist>.

Keygen

A tag <keygen> especifica um campo gerador de par de chaves utilizado para formulários.
Quando o formulário é enviado, a chave privada é armazenada localmente, ea chave pública é enviada para o servidor.

Output

A tag <output> representa o resultado de um cálculo (como uma realizada por um script).


Button

A tag <button> define um botão clicável
Dentro de um elemento <button> você pode colocar conteúdo, como texto ou imagens. Esta é a diferença entre este elemento e os botões criada com o elemento <input>.
Dica: Sempre especificar o tipo de atributo para um elemento <button>. Navegadores diferentes usam diferentes tipos padrões para o elemento <button>.

Estrutura de elementos de formulários–Boas Práticas IHC

Input type="text"
o Estrutura: Rótulo - Elemento
o Exemplo: Nome: <input type="text" name="nome" />

Input type="password"
o Estrutura: Rótulo - Elemento
o Exemplo: Senha: <input type="password" name="senha" />

Input type="button"
o Estrutura: Não se aplica
o Exemplo: <input type="button" name="cmdSend" value="Envia" />

Input type="submit"
o Estrutura: Não se aplica
o Exemplo: <input type="submit" name="cmdSend" value="Envia" />

Input type="radio"
o Estrutura: Elemento - Rótulo
o Exemplo:
<input type="radio" name="radsim" value="Yes" />Sim<br />
<input type="radio" name="radnao" value="No" />Não<br />

Input type="checkbox"
o Estrutura: Elemento - Rótulo
o Exemplo:
Nome: <input type="text" name="nome" />
Senha: <input type="password" name="senha" />
<input type="button" name="cmdSend" value="Envia" />
<input type="submit" name="cmdSend" value="Envia" />
<input type="radio" name="radsim" value="Yes" />Sim<br />
<input type="radio" name="radnao" value="No" />Não<br />
< input type="checkbox" name="chkSubscribe" value="Subscribe" /> Assinar Boletim

Textarea
o Estrutura: Rótulo - Elemento
o Exemplo: Observações: <textarea name="txtObservacoes"></textarea>

Select
o Estrutura: Rótulo - Elemento
o Exemplo: Estado: <select name="ddlestado">
                           <option>AL - Alagoas</option>
                            ...
Button
o Estrutura: Não se aplica
o Exemplo: <button name="cmdSalvar">Salvar</button>

Formulários Acessíveis

A criação de uma estrutura que respeite as boas práticas de IHC é o primeiro passo para a
criação de formulários acessíveis. O próximo passo é a adição de elementos que garantam
a acessibilidade dos formulários. Esses elementos são: LABEL, FIELDSET, LEGEND e
OPTGROUP.

Label

O elemento LABEL é utilizado, em conjunto com o atributo “id” para relacionar de forma clara o elemento ao seu rótulo.
O elemento LABEL pode ser usado em conjunto com todos os elementos de formulário, exceto o elemento BUTTON.
Ex:
<label for="nome">Nome:</label>
<input type="text" name="nome" id="nome"/>

Fieldset e Legend

O elemento FIELDSET é utilizado para agrupar os itens de formulários com características
em comum. Por exemplo, um formulário para inscrição em boletim pode ter seus
elementos agrupados da seguinte forma:
_ Dados de identificação: Nome, sobrenome, endereço físico, endereço de email;
_ Preferências de recebimento: periodicidade (diária, semanal, mensal) e tipo de
boletim (html, texto plano);
_ Artigos de seu interesse: Lista de itens que podem constar no boletim.
O elemento FIELDSET é utilizado em conjunto com o elemento LEGEND, que melhora a
acessibilidade do elemento FIELDSET quando este não é visível em navegadores gráficos.

Ex:
<label for="nome">Nome:</label>
<input type="text" name="nome" id="nome"/>
<fieldset>
<legend>Quais suas cores preferidas?</legend>
<input type="checkbox" name="chk0" id="chk0_0" value="vermelho">
<label for="chk0_0">vermelho</label><br />
<input type="checkbox" name="chk1" id="chk1_1" value="verde">
<label for="chk1_1">verde</label><br />
<input type="checkbox" name="chk2" id="chk2_2" value=" azul">
<label for="chk2_2">azul</label><br />
<input type="checkbox" name="chk3" id="chk3_3" value="amarelo">
<label for="chk3_3">amarelo</label>
</fieldset>

Optgroup

O elemento OPTGROUP trabalha de forma semelhante ao FIELDSET, agrupando itens do
elemento SELECT quando necessário. Cada elemento OPTGROUP recebe um atributo
“label” que é o nome do grupo criado.

Ex: tecla de atalho para a busca
<select name="Lista de mercado">
<optgroup label="Laticínios">
<option>leite desnatado</option>
<option>queijo ralado</option>
<option>queijo prato</option>
<option>requeijão</option>
</optgroup>
<optgroup label="Vegetais">
<option>alface</option>
<option>alho</option>
<option>Beringela</option>
<option>Cenoura</option>
<option>Pimentão</option>
</optgroup>
<optgroup label="Frutas">
<option>Abacaxi</option>
<option>Banana</option>
<option>Manga</option>
</optgroup>
</select>

Accesskey

O uso de teclas de atalho através do atributo “accesskey”, permite escolher um atalho de
teclado para cada um dos campos do formulário, possibilitando o acesso rápido. O
atributo pode ser aplicado tanto ao elemento LABEL como ao elemento INPUT.
Ex:
<input type="text" name="txtbusca" accesskey="s" />


Referências: