Criando layout tableless (div), com Ajax.


Vamos fazer um site com Ajax, e para quem não souber o que é Ajax, vai um breve comentário.

Ajax significa Asynchronous Javascript And XML. Quer dizer que Ajax nada mais é do que uma capacidade (ferramenta, biblioteca), de fazer com que, em Javascript, eu possa fazer requisições HTTP (e, dependendo do navegador, posso fazer outros tipo de conexões). As requisições que o Ajax faz, podem ser síncronas ou assíncronas. Se for síncrona, o script ficará esperando o retorno da requisição para continuar a executar o seu código. Se for assíncrona, o script enviará a requisição e continuará a sua execução normalmente, e o retorno dessa requisição deverá ser tratado por uma outra função.

O XML nem sempre é usado para trafegar as informações em Ajax, mas como o nome já pegou, então ficou assim mesmo, mas podemos utilizar qualquer tipo de protocolo texto (como JSON), para trafegar as informações via Ajax.

O principal motivo para desenvolver uma página (web site) com Ajax, é faze-la ficar mais interativa com o usuário, mais dinâmica e criativa.

Para saber um pouco mais sobre Ajax, acesse AJAX (programação).

O Código HTML do Layout em Div

Vamos pegar o layout do post Definindo um Layout de Website sem Tabelas (Tableless), e retirar a parte mais a direita dele, para que a parte do meio do layout, contenha somente o menu e o miolo.

O código ficará como abaixo (arquivo index.html):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-type" content="text/html;charset=ISO-8859-1" />
<title>Exemplo Estrutura de Site Tableless</title>

<link rel="stylesheet" type="text/css" href="estilo.css" />
<script language="javascript" src="script.js"></script>

</head>

<body>

<div id="todo">
	<div id="topo">
		<div id="logo">Logo</div>

		Aqui pode ser uma imagem de background e um texto.
	</div>

	<div id="meio">
		<div id="esquerda">
			<div id="menu">
				<div><a href="javascript: void(0);" onclick="ajaxHTMLmiolo('miolo', 'principal');">Principal</a></div>
				<div><a href="javascript: void(0);" onclick="ajaxHTMLmiolo('miolo', 'empresa');">Empresa</a></div>
				<div><a href="javascript: void(0);" onclick="ajaxHTMLmiolo('miolo', 'produtos');">Produtos</a></div>

				<div><a href="javascript: void(0);" onclick="ajaxHTMLmiolo('miolo', 'servicos');">Serviços</a></div>
				<div><a href="javascript: void(0);" onclick="ajaxHTMLmiolo('miolo', 'contato');">Contato</a></div>
			</div>
		</div>

		<div id="miolo">
			<div>Seção 1</div>
			<div>Seção 2</div>

			<div>Seção 3</div>
		</div>

		<div style="clear: both;"></div>
	</div>

	<div id="rodape">
		<div id="rodape_direita">
			Av. xxx yyy zzz, No 765<br/>
			Manaus - AM - CEP: 89000-000<br/>
			Email: <a href="mailto:seuemail@seudominio.com.br">seuemail@seudominio.com.br</a>

		</div>
	</div>
</div>

</body>
</html>

Maiores explicações sobre o layout, pode encontrar no link passado para o post.

As únicas mudanças foram a parte direita do layout que foi deletada, os menus agora são links (tag <a> com atributo onclick para chamada do Javascript), e foi inserida uma linha chamando o script script.js. Esse script contém a programação em Javascript para fazer a requisição em Ajax.

Uma outra mudança foi no arquivo de folhas de estilo estilo.css. Ele está sem os estilos da parte direita do layout e foi adicionado uma classe, para a frase que indica que o Ajax está carregando uma página, no nosso caso, a frase é simplesmente “Carregando…”, mas a classe está vazia, adicione os estilos que achar necessário.

O Código Javascript

O código Javascript precisa fazer tudo que o navegador faz automáticamente quando se coloca um link no web site: enviar a requisição, esperar pela resposta, pegar a resposta quando essa estiver pronta, tratar a resposta e exibir o que for necessário.

O código do arquivo script.js vai abaixo:

function getNewHttpRequest() {
	try {
		xmlhttp = new XMLHttpRequest();
	} catch(ee) {
		try {
			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			try {
				xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} catch(E) {
				xmlhttp = false;
			}
		}
	}

	return(xmlhttp);
}

oAjax = getNewHttpRequest();

//Fila de conexões
fila = [];
ifila = 0;

// funcao para altear o conteudo do miolo
function ajaxHTMLmiolo(id, conteudo) {
	ajaxHTML(id, 'conteudo.php?conteudo='+conteudo);
}

//Executa a próxima conexão da fila
function ajaxRun() {
	//Abre a conexão
	oAjax.open("GET", fila[ifila][1], true);
	//Função para tratamento do retorno
	oAjax.onreadystatechange = function() {
		if (oAjax.readyState == 4) {
			//Mostra o HTML recebido
			retorno = unescape(oAjax.responseText.replace(/\+/g, " "));
			document.getElementById(fila[ifila][0]).innerHTML = retorno;
			//Roda o próximo
			ifila++;
			if(ifila < fila.length) setTimeout("ajaxRun()", 20);
		}
	};

	//Executa
	oAjax.send(null);
}

function ajaxHTML(id, url) {
	//Carregando...
	document.getElementById(id).innerHTML="<span class='carregando'>"+"Carregando...</span>";
	//Adiciona à fila
	fila[fila.length] = [id, url];
	//Se não há conexões pendentes, executa
	if((ifila+1) == fila.length) ajaxRun();
}

Agora vamos as explicações.

Começando pela função getNewHttpRequest, que não recebe parâmetro, e retorna um objeto XMLHTTP. Esse objeto é o responsável pelas requisições que iremos fazer. Os blocos try {…} catch() {…}, tentam pegar o objeto XMLHTTP de várias formas, por causa das várias formas de pegar esse objeto de navegadores diferentes. Se não conseguir nenhuma, retorna false.

Abaixo pego o objeto XMLHTTP e coloco na variável oAjax e logo abaixo defino as minhas variáveis da fila de requisições.

Por que uma fila de requisições?

Tenho uma fila de requisições para organizar as minhas requisições Ajax, pois sem ela, se o usuário clicar em vários links antes de esperar a resposta de uma requisição, ou eu tenho que instanciar vários objetos do Ajax (XMLHTML), ou vai dar um erro no script que executa a requisição, quando uma outra requisição é feita antes de esperar a primeira terminar. A fila resolve esse problema, pois somente uma requisição é feita por vez, e se houver outra requisição na fila, ela é chamada logo após a requisição atual terminar.

A função ajaxHTMLmiolo serve para fazer uma requisição em Ajax que pega o conteúdo do miolo da página, que é o conteúdo da tag div que tem o atributo id igual a miolo, nesse layout é onde o conteúdo do web site será exibido. Essa função recebe dois argumentos, o primeiro é o id do elemento que vai ser exibido o resultado da requisição, o segundo é uma string que é enviada para o servidor para saber qual conteúdo buscar para exibir. Ela chama a função genérica de requisição Ajax, a ajaxHTML, que recebe o id do elemento que vais ser alterado e a URL que vai ser requisitada.

A função ajaxHTML coloca uma requisição na fila de requisições e tenta fazer essa requisição, se a fila estiver vazia, chamando a função ajaxRun, se não estiver vazia, ela não faz nada, pois assim que for a vez da requisição colocada, ela será feita.

A função ajaxRun pega a requisição que está na vez, na fila de requisições, e a executa, pelo método GET. A linha

	oAjax.open("GET", fila[ifila][1], true);

diz que é para abrir a conexão com a URL que está na fila, pelo método GET. O último parâmetro quer dizer que essa requisição tem que ser feita pelo modo assíncrono. Se o último parâmetro for false, a requisição seria feita no modo síncrono.

Para saber mais sobre o método GET, acesse Como Funciona os Métodos GET e POST – Diferenças.

Na linha

	oAjax.onreadystatechange = function() {

estou informando ao objeto que a função seguinte é a função que eu quero que ele execute quando o estado da minha requisição mudar. Essa função normalmente é chamada de função de callback, ela fica esperando algum evento acontecer para executar, sem interromper a execução do código. Nesse caso, ela espera o evento de alteração de estado da requisição ocorrer para ser chamada, logo, ela provavelmente será chamada mais de uma vez, pois durante uma requisição o estado muda algumas vezes.

Essa função de callback vai testar se o estado atual da requisição é o estado que eu quero, com a linha:

		if (oAjax.readyState == 4) {

O estado do objeto Ajax que eu quero é igual a 4, que é o estado onde a resposta foi lida por completo. Para ver uma lista dos estados do objeto Ajax, acesse XMLHttpRequest.

Após a resposta estar pronta, eu a pego e coloco em uma variável, fazendo uma substituição de todos os sinais de “mais” (’+'), por um espaço em branco. Se faz essa substituição, pois a resposta vem codificada como URL, e nessa codificação, os espaços são convertidos em sinais de “mais” (’+'). A linha que faz isso é a linha abaixo:

		retorno = unescape(oAjax.responseText.replace(/\+/g, " "));
		document.getElementById(fila[ifila][0]).innerHTML = retorno;

A outra linha pega o elemento que tem o atributo id igual ao que foi passado para a requisição e coloca a resposta como conteúdo desse elemento, no caso do elemento em questão (div), faz o conteúdo ser exibido, mas pode ser feito para qualquer tipo de conteúdo, até um campo hidden (escondido) ou para preencher um selectbox.

		ifila++;
		if(ifila < fila.length) setTimeout("ajaxRun()", 20);

As linhas acima fazem o controle da fila, a primeira incrementa a posição da fila, fazendo a próxima requisição ser lida, se houver. A segunda linha verifica se o tamanho da fila é maior que a posição atual de leitura da fila, se for, é porque ainda existe requisição a ser feita, então ele programa um timer para em 20 milisegundos, para ser executada essa requisição.

Aqui termina a função de callback, ela será executada após o envio da requisição.

A última linha da função ajaxRun

	oAjax.send(null);

faz com que a requisição seja feita (enviada). O parâmetro dela, passado como null, indica que não estou enviando nada na requisição, porque já enviei o que eu queria pela URL passada.

O Código PHP

O código em PHP serve para fornecer o conteúdo requisitado pelo Ajax, perceba que a nossa URL da requisição Ajax tem como endereço o arquivo conteudo.php, lá na função ajaxHTMLmiolo, e o código desse arquivo (conteudo.php), vai abaixo:

<?php

$conteudo = $_GET["conteudo"];

if($conteudo == "principal") {
	$fileToRead = "conteudo/principal.html";
}
else if($conteudo == "empresa") {
	$fileToRead = "conteudo/empresa.html";
}
else if($conteudo == "produtos") {
	$fileToRead = "conteudo/produtos.html";
}
else if($conteudo == "servicos") {
	$fileToRead = "conteudo/servicos.html";
}
else if($conteudo == "contato") {
	$fileToRead = "conteudo/contato.html";
}

$conteudoArquivo = file_get_contents($fileToRead);

print(urlencode($conteudoArquivo));

?>

Ele simplesmente pega o valor do “conteudo”, que foi passado pelo método GET (olha novamente a URL passada na função ajaxHTMLmiolo), e compara com as strings acima. Cada if faz ele colocar na variável $fileToRead um caminho para um arquivo. Na penúltima linha ele joga todo o conteúdo do arquivo para a variável $conteudoArquivo, e na última linha ele codifica para URL e imprime na “tela” com a função print. A impressão na tela, é a resposta que o Ajax pega. QUALQUER coisa que você imprima na tela, vai ser o retorno da sua requisição Ajax, até mesmo se der um erro no script PHP, caso esteja configurado para exibir o erro na tela, o Ajax vai pegar como retorno.

Não vou colocar o conteúdo dos arquivos HTML de resposta, mas você pode ver o exemplo todo rodando em http://www.comocriarsites.com/exemplos/SiteTablelessAjax/. Lá você mesmo pode pegar os arquivos HTML.



Iniciando programação HTML/PHP – Ferramentas

Para tem um bom início com programação HTML/PHP, devemos ter boas ferramentas de trabalho e também saber do que precisamos para começar.

Esse post vai explicar um pouco sobre cada programa necessário para o desenvolvimento em PHP.

O PHP – Hypertext Preprocessor

Para programar em PHP, assim como em qualquer outra linguagem, precisamos do “compilador”, ou no caso do PHP, que é uma linguagem script, precisamos do processador do script, que executa o código fonte. Esse processador é o próprio PHP, Hypertext Preprocessor, ou Pré-Processador de Hipertexto, que processa dados vindo de páginas Web em um servidor.

O PHP pode também ser executado em uma linha de comando, e também pode ser usado para aplicações desktop (PHP/GTK), mas esse post se limitará a falar sobre o PHP executando em um servidor, processando páginas Web (Web Sites).

O PHP pode ser baixado em http://www.php.net ou http://www.php.net/downloads.php para ir direto a página de downloads.

No momento da escrita desse post, a última versão do PHP é a 5.3.1. Para baixar para o Linux, pegue o código fonte e compile. Para o Windows, o PHP se dividiu em Thread-Safe e Non-Thread-Safe, e também em 2 versões de compiladores diferentes, uma com o Visual Studio 6 (VC6) e outra com o Visual Studio 2008 (VC9).

Se você está usando o Apache no Windows, utilize a versão VC6, que é a compilada no Visual Studio 6. Se você estiver utilizando o IIS – Internet Infomation Service, que é o servidor HTTP da Microsoft, utilize a versão do VC9 do PHP. Esse post não vai mostrar como instalar o PHP no IIS e recomendação é utilizar o Apache HTTP Server.

A diferença entre as versões Thread-Safe e Non-Thread-Safe podem ser vistas em Difference between PHP thread safe and non thread safe binaries, mas basicamente, a versão Non-Thread-Safe, serve para deixar o PHP mais rápido em servidores HTTP para Windows, leia o artigo do link. :)

O Servidor HTTP – Apache

O PHP por si só, não serve como servidor de páginas da Web (Servidor HTTP), ele precisa ser instalado em um servidor HTTP para funcionar para esse propósito. Um dos servidores mais conhecidos no mercado é o Apache, da Apache Software Foundation, e ele é open-source, ou seja, tem o código-fonte aberto, para que quiser, poder baixar o fonte e modifica-lo ao seu bel prazer.

Para baixar o Apache HTTP Server, você deve entrar em http://www.apache.org ou http://httpd.apache.org para ir direto ao projeto do servidor HTTP.

O Apache HTTP Server tem 3 versões estáveis, no momento da escrita desse post: a versão 1.x.x (atualmente 1.3.41), a versão 2.0.x (atualmente 2.0.63) e a versão 2.2.x (atualmente 2.2.14). Todas essas versões funcionam muito bem. Eles mantem essas 3 versões por questão de compatibilidade com vários outros programas que utilizam uma dessas versões mas não utilizam as outras.

Eu recomendo baixar a versão 2.2.x, ela está bem legal e nunca me deu problema. Baixe o pacote binário com instalador MSI para Windows, e para o Linux, baixe o código fonte e compile, ou utilize alguma ferramenta (APT ou algo similar, dependendo do seu Linux), para instalar o apache.

Eclipse IDE  PDT – PHP Development Tools

O Eclipse IDE para PHP é uma ferramenta muito boa, tanto para escrever o código PHP, quanto para o HTML, CSS e Javascript. Ele tem um extra: pode fazer debug de código PHP.

Você pode baixar ele em http://www.eclipse.org/pdt/, ou a versão dele com o Zend em http://www.zend.com/community/pdt?ecl=EclipseZend.

O Eclipse é só descompactar e começar a usar, criar um projeto e já pode rodar com CTRL+F11.

O Banco de Dados MySQL

Se você precisa de um banco de dados confiável, rápido e robusto, o MySQL é a solução. Ele tem o código aberto também, então você pode baixar e, se precisar de uma nova funcionalidade, é só meter a mão na massa.

O MySQL pode ser baixado em http://www.mysql.com/, a versão da comunidade.

Para gerenciar o MySQL, eu recomendo o SQLyog, que é um frontend para o MySQL muito bom. Ele tem uma versão FULL e uma versão da comunidade. A versão da comunidade já faz muita coisa, mas para quem quer realmente trabalhar com o MySQL, a versão FULL vale a pena. Ele pode ser baixado em http://webyog.com/en/.

Com esse conjunto de ferramentas, você estará muito bem armado para programar em PHP, rápido e fácil.



Fazendo Formulário HTML (Como Fazer Fomulário HTML) – Form

Para que serve um formulário? Um formulário serve para o usuário interagir de alguma forma com o site, enviando informações, escolhendo ou selecionando certas funções do site ou entrar em contato com o criador ou dono do site.

Como posso fazer um fomulário HTML? O HTML tem alguns elemento que ajudam na criação de formulários e na interação usuário-website. Esses elemento apresentam diversas formas de apresentar ao usuário informações que o site quer que o usuário preencha, selecione ou marque. Para quem programa em outras linguagens, os elementos HTML para fazer formulário são os padrões, de caixa de texto, seleção de um ou vários em uma lista, marcar opções e também escrever textos em várias linhas.

Vamos ver como fazer o elemento Form (tag <form>) do HTML, que é o elemento pai de todos os outros elementos de formulário HTML e no fim desse post teremos links para outros posts descrevendo os outros elementos HTML de formulário.

A Tag <form> – Elemento Form

A tag <form> é utilizada para fazer um formulário, nela define-se vários aspectos do formulário como para onde ele é enviado e que forma de envio é utilizado. Sempre que for fazer um formulário, todos os componentes do formulário devem ficar entre as tags <form> e </form>.

Vamos ver alguns atributos da tag de fomulário <form>.

Action

- O atributo action da tag <form> diz para onde o formulário deve ser enviado. O valor desse atributo é o endereço, estático ou relativo, de onde está a página que vai tratar esse formulário.

Method

- O method diz como enviar os dados do formulário, pode ser pelo método GET ou POST. Se você não especificar o método (atributo method), o padrão é o GET.

Para saber mais sobre os métodos GET e POST acesse Como Funciona os Métodos GET e POST – Diferenças.

Name

- Esse atributo nomeia o fomulário <form>, fazendo ele poder ser identificado por folhas de estilo e scripts (como Javascript). Esse atributo está em desuso, é utilizado somente para compatibilidade com códigos HTML antigos e os códigos HTML novos devem utilizar o atributo id.

Id

- Esse atributo pode ser utilizado em qualquer elemento HTML, ele define uma identificação única para o elemento HTML e deve ser único em um documento.

Target

- Indica onde o resultado da submissão do formulário HTML será exibida. Pode ser o nome de um frame (ou iframe, tag <iframe>), ou uma janela, ou uma dessas seguintes constantes:

– _blank – O resultado do formulário HTML é exibido em uma janela nova e sem nome. alguns navegadores deixam a opção para o usuário, de exibir esse resultado em uma nova aba.

– _self – Exibe a página referenciada na mesma página ou no mesmo frame que o link ou formulário está. Essa é a opção padrão.

- _parent – Exibe a página referenciada no frame pai do frame que o link ou formulário está. Se o frame não tiver frame pai, essa opção fica igual a opção “_self“.

- _top – Exibe a página referenciada na tela inteira do navegador, cancelando qualquer frame que a página anterior continha.

Enctype

- Esse atributo diz como o formulário HTML vai codificar os dados enviados. Se você não quiser enviar nenhum arquivo (upload) para o servidor, você pode não colocar esse atributo no seu formulário HTML (form), que ele vai ficar com o valor padrão, que vai funcionar normal.

Os valores para esse atributo podem ser:

- application/x-www-form-urlencoded – Esse é o valor padrão, se você quiser saber como os dados são codificados, entre em http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1.

- multipart/form-data – Se você quer fazer envio de arquivos (upload), via formulário HTML, você deve utilizar esse valor para o atributo Enctype. O valor padrão não é suficiente para enviar grandes quantidades de dados binários. Esse valor deve ser utilizado quando desejas enviar arquivos, dados binários ou caracteres não ASCII.

Para outros valores desse atributo, consulte: http://www.w3.org/TR/html401/types.html#type-content-type.

Accept

- Esse atributo define quais tipos de conteúdo (content types), que o servidor vai processar corretamente. Colocam-se os tipos separados por vírgula.

O atributo accept especifica que tipos de arquivos (<input type=”file”>), o navegador deve filtrar, para não enviar arquivos para o servidor que não seja correspondente a um dos tipos especificados nesse atributo.

Se você quiser uma lista dos tipos (MIME types) de conteúdo, entre em: http://www.w3.org/TR/html401/references.html#ref-MIMETYPES e em: http://www.iana.org/assignments/media-types/

Accept-charset

- Esse atributo define qual tipo de codificação de caracteres (charset) o servidor vai identificar os dados enviados pelo formulário HTML.

Para ver uma lista de codificação de caracteres (charset), acesse: http://www.w3.org/TR/html401/references.html#ref-CHARSETS.

Até a data de escrita desse post, e mesmo sem testar, o Internet Explorer não aceita esse atributo.

Exemplo de Formulário HTML (<form>)

Vamos ver um exemplo simples do uso de formulário HTML. O exemplo irá mostrar alguns campos, onde todos devem ser preenchidos para o envio do formulário. Se algum campo não for preenchido, aparece uma mensagem de erro no campo que não foi preenchido.

O nosso arquivo para executar esse código é o contato.php.

O Arquivo contato.php.

Nesse arquivo temos o nosso código PHP que processa o fomulário HTML quando ele é enviado.

<?php

$Enviar = $_POST["Enviar"];

if(strlen($Enviar) > 0) { // o formulário foi enviado
	$nome = $_POST["nome"];
	$email = $_POST["email"];
	$telefone = $_POST["telefone"];
	$departamento = $_POST["departamento"];
	$mensagem = $_POST["mensagem"];

	if((strlen($nome) > 0) && (strlen($email) > 0) && (strlen($telefone) > 0) &&
		(strlen($departamento) > 0) && (strlen($mensagem) > 0)) { // todos os dados preenchidos
		print("<strong>Dados do Formulário:<strong><BR>");
		print("<strong>Nome:</strong>".$nome."<BR>");
		print("<strong>Email:</strong>".$email."<BR>");
		print("<strong>Telefone:</strong>".$telefone."<BR>");
		print("<strong>Departamento:</strong>".$departamento."<BR>");
		print("<strong>Mensagem:</strong>".$mensagem."<BR>");
	}
	else { // nem todos os dados preenchidos, voltar para o formulário
		// dizer em msg de erro o que falta no formulário
		if(strlen($nome) == 0)
			$erro_nome = "<span class=\"msg_erro\">O campo Nome deve ser preenchido</span>";
		if(strlen($email) == 0)
			$erro_email = "<span class=\"msg_erro\">O campo Email deve ser preenchido</span>";
		if(strlen($telefone) == 0)
			$erro_telefone = "<span class=\"msg_erro\">O campo Telefone deve ser preenchido</span>";
		if(strlen($departamento) == 0)
			$erro_departamento = "<span class=\"msg_erro\">O campo Departamento deve ser preenchido</span>";
		if(strlen($mensagem) == 0)
			$erro_mensagem = "<span class=\"msg_erro\">O campo Mensagem deve ser preenchido</span>";

		// colocando o departamento selecionado como selecionado
		$$departamento = "selected=\"true\"";

		require("contatoform.php");
	}
}
else { // o formulário não foi enviado
	require("contatoform.php");
}

?>

Onde tem a chamada do array $_POST, pegamos os dados enviados do formulário, pelo método POST. Para pegar os dados enviados pelo método GET, utilizamos o array $_GET. No nosso exemplo, somente enviamos dados pelo método POST, então somente utilizaremos o array $_POST.

No array $_POST, temos todos os nomes  das variáveis que enviamos do formulário, como chaves do array (array associativo), e seus valores como os valores do formulário. Se temos um campo tipo text, com nome “email” (name=”email”), e enviamos esse formulário pelo método POST, teremos no PHP, o array $_POST["email"] com o valor do que foi escrito no campo email.

No nosso exemplo, se o formulário foi enviado, ele pega todos os valores que foram enviados e testa, para ver se algum está em branco (com número de caracteres igual a zero). Se todos estiverem preenchidos, o programa mostra eles na tela. Se algum não tiver sido preenchido, o programa testa para ver quais não foram preenchidos e seta uma mensagem de erro personalizada para cada campo não preenchido, e volta a mostrar o fomulário.

A linha que faz o campo selecionável (selecbox) ficar como estava quando foi enviado, merece um pouco mais de explicação. A linha é a seguinte: $$departamento = “selected=\”true\”";. Ela está simplesmente, colocando na variável com o nome do valor da variável $departamento, o valor “selected=\”true\”". Por exemplo, se a minha variável $departamento for igual a “comercial”, depois de executar essa linha, eu terei uma variável $comercial com o valor igual a “selected=\”true\”". Isso tudo para, no arquivo HTML, eu poder selecionar automaticamente o que foi estava selecionado no fomulário, no campo de seleção (selectbox). Vamos entender isso mais a frente.

O Arquivo contatoform.php.

Nesse arquivo tem o nosso formulário em HTML e um pouco de PHP para deixar o formulário mais dinâmico.

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
	<title>Exemplo de Formulário HTML/PHP</title>

	<link rel="stylesheet" type="text/css" href="estilo.css" />

</head>
<body>

<form name="form_contato" action="contato.php" method="post">
	<div>Nome: <?php echo($erro_nome); ?></div>
	<div><input name="nome" id="nome" type="text" value="<?php echo($nome); ?>" /></div>

	<div>Email: <?php echo($erro_email); ?></div>
	<div><input name="email" id="email" type="text" value="<?php echo($email); ?>" /></div>

	<div>Telefone: <?php echo($erro_telefone); ?></div>
	<div><input name="telefone" id="telefone" type="text" value="<?php echo($telefone); ?>" /></div>

	<div>Departamento: <?php echo($erro_departamento); ?></div>
	<div>
		<select name="departamento" id="departamento">
			<option value="">...</option>
			<option value="comercial" <?php echo($comercial); ?>>comercial</option>
			<option value="financeiro" <?php echo($financeiro); ?>>financeiro</option>
			<option value="juridico" <?php echo($juridico); ?>>jurídico</option>
			<option value="suporte" <?php echo($suporte); ?>>suporte</option>
		</select>
	</div>

	<div>Mensagem: <?php echo($erro_mensagem); ?></div>
	<div><textarea name="mensagem" id="mensagem" rows="5" cols="25"><?php echo($mensagem); ?></textarea></div>

	<div><input name="Enviar" value="Enviar" type="submit" /></div>
</form>

</body>
</html>/

Esse arquivo simplesmente define 5 campos e um botão de submeter o formulário, sendo que um desses campos é um campo selecionável (selectbox).

Todos eles tem no atributo value, um trecho de código em PHP, por isso precisamos que a extensão desse arquivo seja reconhecida como extensão para processamento do PHP. Esse trecho serve para definir no formulário HTML, caso de erro, o que o usuário já tinha escrito antes, porque sem isso o fomulário viria todo em branco novamente, e isso é ruim, pois se eu errei somente uma coisinha no fomulário, e ele voltar em branco, terei que preenche-lo todo novamente.

No caso do selecbox, eu tenho que fazer com que a seleção do usuário volte a aparecer se o formulário der erro, então coloco um trecho PHP exibindo uma variável com o nome do value da opção (option) em questão, para no script de processamento, ele tratar isso, como foi explicado no arquivo contato.php.

Podes perceber que tenho várias classes de folha de estilo no documento, e o documento também chama um arquivo de folha de estilo, que eu colocarei somente para mostrar a mensagem de erro em destaque.

O Arquivo estilo.css

Esse arquivo é bem simples, abaixo o código:

.msg_erro {
	color: red;
	font-weight: bold;
}

Com essa classe eu destaco as minhas mensagens de erro.

O Exemplo Pronto

Você pode ver esse exemplo pronto em http://www.comocriarsites.com/exemplos/formulariohtmlsimples/.



Como Funciona os Métodos GET e POST – Diferenças

Quando falamos em como enviar um formulário, vem em mente os métodos GET e POST, esses são os métodos utilizados para enviar um formulário. Mas quando fazemos uma requisição HTTP, nós sempre utilizamos um desses métodos, normalmente o GET.

Se você digita um endereço na barra de endereço seu navegador e aperta a tecla enter (ou clica no botão ir), o navegador faz uma requisição HTTP para o servidor do endereço digitado e o método dessa requisição é o GET. Se você clica em um link em um site, o navegador também se encarrega de fazer um requisição HTTP com o método GET, para buscar o conteúdo da página que você clicou.

Como Funciona o Método GET

O método GET utiliza a própria URI (normalmente chamada de URL) para enviar dados ao servidor, quando enviamos um formulário pelo método GET, o navegador pega as informações do formulário e coloca junto com a URI de onde o formulário vai ser enviado e envia, separando o endereço da URI dos dados do formulário por um “?” (ponto de interrogação).

Quando você busca algo no Google, ele faz uma requisição utilizando o método GET, você pode ver na barra de endereço do seu navegador que o endereço ficou com um ponto de interrogação no meio, e depois do ponto de interrogação você pode ler, dentre outros caracteres, o que você pesquisou no Google.

Quando Utilizar o Método GET

Você deve utilizar o método GET sempre que a requisição que você faz não altere o estado do servidor, tipo uma consulta, uma busca ou qualquer outra coisa que, além de não alterar o estado do servidor, também possa sempre reproduzir os mesmos resultados quando fizer a mesma requisição e for passado os mesmos parâmetros para esta requisição.

Voltando ao exemplo do Google, na ferramenta de busca dele, quando a busca é feita, ele deixa a URI toda na barra de endereço do navegador, você pode, por exemplo, copiar essa URI e mandar para alguém, dizendo para ele acessar o terceiro item da busca, e se esse alguém acessar essa mesma URI, vai achar o mesmo terceiro item que você indicou, quantas vezes for necessário (lógico que de tempos em tempos, o Google atualiza as posições das páginas).

O nome dado ao comportamento de quando você deve utilizar o GET é idempotente, que nada mas é do que já o explicado acima: uma requisição idempotente deve retornar a mesma coisa não importa quantas vezes ela é feita, ou seja, deve ter sempre os mesmos efeitos colaterais, não importando quantas requisições idempotentes são feitas.

Requisição com o método GET pode ter seu retorno cacheados (armazenados em cache), pois não se alteraria o retorno se fizéssemos uma mesma requisição GET. Isso pode causar um erro comum, que se você precisar sempre que as requisições GET cheguem ao servidor, elas podem não chegar sempre que uma requisição é feita, pois se estiver no cache de algum proxy ou do seu navegador, o retorno pode vir antes de chegar no servidor. Se você precisa que uma requisição chegue sempre no servidor, não utilize GET.

O método GET ainda pode ter limitações quanto ao tamanho dos dados a serem enviados e também ao que pode ser enviado. Quanto ao tamanho, pode-se ter uma restrição ao tamanho da URI que pode ser enviada em um requisição, e se seus dados ultrapassarem esse tamanho, provavelmente ocorrerá um erro, ou seus dados vão ser passados incompletos.

Quanto ao que pode ser enviado, como os dados vão ser enviados pela URI, só poderão ser enviados caracteres aceitos na URI, se você quer enviar dados binários (como arquivo, imagens e outros), não poderá usar GET.

Como Funciona o Método POST

O método POST envia os dados colocando-os no corpo da mensagem. Ele deixa a URI separada dos dados que serão enviados e com isso podemos enviar qualquer tipo de dados por esse método. Quando você faz um registro em um formulário e depois de enviar a URI não tem o ponto de interrogação separando os dados que você digitou, provavelmente o formulário foi enviado pelo método POST.

Quando Utilizar o Método POST

Utilizamos o método POST sempre que vamos alterar alguma coisa no servidor, ou sempre que queremos enviar dados que não podem ser enviados pelo método GET, como arquivos. Esse método é utilizado em formulário de cadastro e registro de usuários, envio de dados para alteração do sistema, cadastro de dados em sistemas de sites e outros.

O retorno de uma requisição com método POST normalmente não deve ser cacheada (armazenada em cache) então se você quiser que uma requisição sempre chegue ao servidor quando ela for feita, utilize POST.

A diferença é simples, sempre que for buscar ou apenas consultar alguma coisa, utilize GET e se for fazer alguma alteração com a requisição, envio de arquivo ou os dados forem muitos, utilize POST.

Diferenças no Lado do Servidor entre GET e POST (PHP, CGI)

Enviar dados pelo método GET e POST é diferente, então, o servidor pega esses dados de diferentes maneiras.

No PHP, quando enviamos dados pelo método GET, ele cria um array identificado por $_GET, que contém todos os dados enviados por esse método. Quando enviamos os dados pelo método POST, o PHP cria um array identificado por $_POST, também com todos os dados enviados por esse método.

Já em um script CGI, quando utilizamos o método GET, os dados são recebido em uma variável de ambiente, e com o método POST, os dados são recebidos pela entrada padrão (stdin).

Links interessantes sobre GET e POST:

- Methods GET and POST in HTML forms – what’s the difference?
- Hypertext Transfer Protocol — HTTP/1.1 – 9 Method Definitions



Definindo um Layout de Website sem Tabelas (Tableless)

Vou apresentar nesse post como fazer o código do layout de um website sem utilizar tabelas (tableless), e utilizando muito <div>. Para continuar lendo esse post, você deve estar familiarizado com CSS (folha de estilos ou cascading style sheets) e com alguns estilos, principalmente com o estilo float.

Para um bom entendimento de como utilizar CSS, acesse Entendendo CSS (folhas de estilo): Cascading Style Sheet – Parte 1 e Entendendo CSS (folhas de estilo): Cascading Style Sheet – Parte 2.

Para saber utilizar o estilo float, acesse Estilo Float (CSS Style Float).

Sabendo um pouco de CSS, vamos focalizar agora no que vai fazer o nosso layout, o <div>. Eu posso encaixar vários divs em um documento, dando estilos diferentes a eles, formando um layout agradável. Aqui vou abordar um layout normalmente utilizado, que é com um topo, um corpo e um rodapé, sendo o corpo dividido em 3 partes, uma barra de menu a esquerda, um espaço para conteúdo e uma barra lateral a direita.

Vamos ao código de exemplo, e se você quer vê-lo funcionando, acesse Exemplo Estrutura de Site Tableless.

Vou colocar o código por partes para melhor explica-lo, e no final do post está o código completo de como fazer o site com div e sem tabela (tableless).

O Cabeçalho (<head>)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-type" content="text/html;charset=ISO-8859-1" />
<title>Exemplo Estrutura de Site Tableless</title>

<link rel="stylesheet" type="text/css" href="estilo.css" />

</head>

A primeira linha do seu código sempre que for fazer um site, tem que ser a definição do DOCTYPE, que diz aos navegadores como deve ser tratado o seu código, e para saber mais sobre o DOCTYPE (DTD – Document Type Definition), acesse O que é e para que serve o DOCTYPE ou DTD (Document Type Definition).

O atributo xmlns da tag <html> serve para ficar nos padrões de um documento XHTML, esse atributo serve para definir o namespace que o documento utilizará. Esse valor que está no exemplo é o valor padrão.

Já dentro do cabeçalho do site (<head>), devemos dizer aos navegadores que tipo de codificação de texto estamos utilizando, isso se faz com a tag <meta>, como definido do exemplo, diz que o texto do documento está com a codificação ISO-8859-1, que é o padrão para nossa língua portuguesa, mas existe uma codificação padrão mundial que é o famoso UNICODE (UTF-8). Se seu documento estiver escrito em um tipo de código e sua tag <meta> de definição de conteúdo estiver dizendo que está em outro, o navegador poderá exibir caracteres estranhos.

A próxima tag interessante é a <link>, que serve para adicionar algum conteúdo externo ao documento, comumente utilizada para adicionar um arquivo de folha de estilos (CSS – Cascading Style Sheet) a um documento, como feito no exemplo. A tag <link> adiciona no documento a folha de estilos do arquivo estilo.css.

Para fazer um site, você deve ter em mente sempre como o navegador vai vizualizar o site, então quando for criar o site, defina seu DTD – Document Type Definition sempre e também defina sempre na criação do seu site, o código de caracteres a ser utilizado (como UTF-8 e ISO-8859-1).

A Folha de Estilos do Site (CSS – Cascading Style Sheet)

body {
	margin:0px;
	background-color: #cccccc;
	font-family:"Trebuchet MS", Tahoma, Arial, Verdana;
	font-size:12px;
	color:#000;
}

#todo {
	position: relative;
	width: 750px;
	border: 1px solid black;
	margin:0px auto;
	background-color: white;
}

#topo {
	position: relative;
	width: 746px;
	height: 100px;
	border: 2px solid red;
}

#meio {
	position: relative;
	width: 750px;
	min-height: 400px;
	background-color: #eeeeee;
}

#rodape {
	width: 746px;
	height: 75px;
	border: 2px solid brown;
}

#esquerda {
	float: left;
	width: 150px;
	min-height: 400px;
	border: 2px solid green;
}

#miolo {
	float: left;
	width: 438px;
	min-height: 400px;
	border: 2px solid blue;
}

#direita {
	float: right;
	width: 150px;
	min-height: 400px;
	border: 2px solid yellow;
}

#menu {
	width: 150px;
	height: 400px;
}

.itemMenu {
	width: 140px;
	height: 21px;
	background-color: lightyellow;
	padding: 3px 0px 0px 10px;
	border-bottom: 1px solid black;
}

#logo {
	float: left;
	width: 200px;
	height: 100px;
	text-align: center;
	background-color: #cccccc;
	margin-right: 20px;
}

.secao_miolo {
	width: 428px;
	height: 150px;
	text-align: center;
	background-color: #cccccc;
	margin: 2px 5px 4px 5px;
}

.secao_direita {
	width: 140px;
	height: 100px;
	text-align: center;
	background-color: #cccccc;
	margin: 4px 5px 4px 5px;
}

#rodape_direita {
	float: right;
	width: 200px;
	text-align: right;
	margin: 5px 10px 0px 0px
}

#rodape_direita a{color: #cc6600; text-decoration: none;}
#rodape_direita a:hover{color: #cc6600; text-decoration: underline;}

Os estilos do seu site devem ser todos definidos nesse arquivo, ou você pode separar os arquivos por parte do site, por exemplo, eu tenho um arquivo para o estilo do site todo, mas do banner e do menu (rollover ou popup), que já tenho prontos e bem definidos, eu coloco em outro arquivo, como se fosse modularizar o código, se não quero o banner, só retiro os arquivos do banner, se não quero o menu, só retiro os arquivos do menu, e assim podemos fazer com outras partes do site.

Explicando rapidamente, o elemento com o identificador todo, vai ser o elemento pai de todos os outros elementos do conteúdo do site, ele vai definir o tamanho do site e alguns estilos do site, como no exemplo, a cor de fundo do site (background). O elemento com o identificador todo, vai ser dividido verticalmente em 3 partes, o topo, o meio e o rodape.

Nesse exemplo eu coloco bordas e cor de fundo nos elementos para demonstrar onde eles estão e o tamanho deles. As partes verticais do site, tem a mesma largura, que é a largura total do site. O elemento com identificador meio vai ser dividido em 3 partes horizontais: esquerda, miolo e direita.

Normalmente na esquerda fica o menu do site (se o site tiver menu), se você quiser um menu horizontal, normalmente ficaria na parte de baixo do topo, ou logo abaixo do topo, em um outro <div>. Fazer os ajustes para o seu site ficar com um menu diferente é fácil, coloque outro <div>, coloque alguns estilos nele e pronto. Ainda na parte esquerda, colocamos o estilo float: left, pois queremos que essa parte fique na esquerda, e a próxima parte fique a direita dela.

O miolo do site também fica com o estilo float: left, pois queremos que ele fique a esquerda da próxima parte que iremos colocar. Como ele vem depois do <div> da esquerda, o miolo ficará colado a direita deste.

A parte da direita do site fica com o estilo float: right, para ficar a direita e os outros elemento a esquerda dele.

Uma parte da nossa folha de estilos que é bem interessante são as últimas duas linhas, elas dizem que qualquer tag <a>, dentro do elemento com o identificador rodape_direita, deve ter esses estilos atribuídos a elas. Isso é bem útil quando tenho em diferentes partes do meu site, diferentes estilos da mesma tag.

Para saber mais sobre a tag <a>, acesse A Tag <a> – Fazendo Link (Hyperlink).

O Código HTML do Site sem Tabelas (com <div> – Tableless)

Vamos colocar o site por partes, primeiro o topo, depois o meio e por fim o rodapé. Abaixo o código do topo.

O Topo

<body>

<div id="todo">
	<div id="topo">
		<div id="logo">Logo</div>
		Aqui pode ser uma imagem de background e um texto.
	</div>

No corpo do documento temos um elemento <div> que vai englobar todo o nosso site. Esse elemento <div> está ai para definir a largura e altura do site, qualquer tipo de fundo (cores e imagens) e o alinhamento do site no navegador. Colocamos o identificador todo nesse <div>. Sempre que for fazer um site, defina bem a largura do site, pois se a largura for variável, o conteúdo do site pode “quebrar” o layout, fazendo o site ficar diferente do planejado.

O primeiro elemento dentro do nosso <div> todo, é um <div> que ficará responsável pela parte de cima do site, onde podemos colocar o nome do site, um logo do site e mais coisas como propagandas e até mesmo o menu do site (se o menu for horizontal). Esse <div> identificamos por topo. Normalmente ele ocupa a parte de cima inteira do site, com a mesma largura do <div> todo. A altura é variável, depende muito do que queremos colocar no topo. Uma dica é, não colocar a altura do topo muita, pois poderá esconder muitas partes do conteúdo do site, que ficará logo abaixo, mas também não colocar a altura pouca, pois se for um site de empresa, a logo, o título ou o nome do site tem que serbem visualizado.

O Meio

	<div id="meio">
		<div id="esquerda">
			<div id="menu">
				<div class="itemMenu">Principal</div>
				<div class="itemMenu">Empresa</div>
				<div class="itemMenu">Produtos</div>
				<div class="itemMenu">Serviços</div>
				<div class="itemMenu">Contato</div>
			</div>
		</div>

		<div id="miolo">
			<div class="secao_miolo">Seção 1</div>
			<div class="secao_miolo">Seção 2</div>
			<div class="secao_miolo">Seção 3</div>
		</div>

		<div id="direita">
			<div class="secao_direita">Seção 1</div>
			<div class="secao_direita">Seção 2</div>
			<div class="secao_direita">Seção 3</div>
		</div>
		<div style="clear: both;"></div>
	</div>

Logo após o topo, colocamos um <div> identificado por meio. Nesse meio teremos o conteúdo do nosso site. No exemplo, dividimos o meio em três partes, horizontalmente. A primeira parte, mais a esquerda, colocamos um menu.

Na parte do meio colocamos algumas seções que o site pode ter, tipo algumas notícias na página principal, ou chamadas para artigos e outros. Nessa parte fica o conteúdo do nosso site, quando clicar em um item do menu, só é necessário mudar essa parte do site, e se necessário ou quiser, mudar também a terceira parte do meio, a parte da direita.

Na parte da direita podemos colocar algumas seções do site mais importantes, para dar melhor destque a elas, ou podemos colocar propagandas de todos os tipos, ou informações fixas que se quer ter em todas as seções do site.

Como essas partes do site requerem o estilo float, colocamos um <div> na penúltima linha com o estilo clear, para corrigir o problema de ajuste de altura. Esse jeito de corrigir pode não ser o mais elegante, mas foi o que eu achei mais fácil de fazer e sem problemas de fazer.

O Rodapé

	<div id="rodape">
		<div id="rodape_direita">
			Av. xxx yyy zzz, No 765<br/>
			Manaus - AM - CEP: 89000-000<br/>
			Email: <a href="mailto:seuemail@seudominio.com.br">seuemail@seudominio.com.br</a>
		</div>
	</div>
</div>

</body>
</html>

Na parte de baixo do site, temos normalmente um rodapé, que diz quem fez o site, algumas informações sobre contatos da empresa do site, tipo endereço, email, telefones e outros. Nós colocamos um <div> com o identificador rodape para fazer o rodapé do site. No exemplo coloquei um outro <div> dentro do rodape, para fazer ele ficar a direita com alguns dados de contato do site.

O Código Inteiro do Site em <div> – Tableless

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-type" content="text/html;charset=ISO-8859-1" />
<title>Exemplo Estrutura de Site Tableless</title>

<link rel="stylesheet" type="text/css" href="estilo.css" />

</head>

<body>

<div id="todo">
	<div id="topo">
		<div id="logo">Logo</div>
		Aqui pode ser uma imagem de background e um texto.
	</div>

	<div id="meio">
		<div id="esquerda">
			<div id="menu">
				<div class="itemMenu">Principal</div>
				<div class="itemMenu">Empresa</div>
				<div class="itemMenu">Produtos</div>
				<div class="itemMenu">Serviços</div>
				<div class="itemMenu">Contato</div>
			</div>
		</div>

		<div id="miolo">
			<div class="secao_miolo">Seção 1</div>
			<div class="secao_miolo">Seção 2</div>
			<div class="secao_miolo">Seção 3</div>
		</div>

		<div id="direita">
			<div class="secao_direita">Seção 1</div>
			<div class="secao_direita">Seção 2</div>
			<div class="secao_direita">Seção 3</div>
		</div>
		<div style="clear: both;"></div>
	</div>

	<div id="rodape">
		<div id="rodape_direita">
			Av. xxx yyy zzz, No 765<br/>
			Manaus - AM - CEP: 89000-000<br/>
			Email: <a href="mailto:seuemail@seudominio.com.br">seuemail@seudominio.com.br</a>
		</div>
	</div>
</div>

</body>
</html>

Não esqueca do arquivo de folha de estilo (CSS), e ajustar o nome dele ao nome colocado na tag <link> do cabeçalho do site.

Agora já podemos fazer várias modificações para o site ficar visualmente atrativo e também já sabemos como fazer um site em <div> de graça (grátis).

Se você quiser um site ou hospedagem profissional, acesse Panasoft.



A Tag <a> – Fazendo Link (Hyperlink)

O link (ligação) é uma parte vital para o funcionamento da internet, ele conecta uma página a outra, e podemos acessar uma página com apenas um clique. Nesse post vou explicar como fazer um link de uma página a outra, de uma página para ela mesma e explicar alguns atributos da tag <a>.

A tag <a> é a tag utilizada para criar um link em uma página, o nome da tag é a inicial de anchor (âncora), que é o termo utilizado na maioria da literatura. Para criar um link para esse site, utilizamos a tag <a> como a seguir:

<a href="http://www.comocriarsites.com" title="o melhor blog de como criar sites">Como Criar Sites</a>

E o resultado dessa linha é:

Como Criar Sites

Atributos de Link – Tag <a> (href – Hypertext Reference, title e target)

O atributo que diz para onde o link aponta (para onde o usuário vai quando o link é clicado), é o href. O valor do atributo href é o endereço do site ao qual o link aponta.Você pode ver isso no exemplo acima, onde esse blog é para onde o link aponta, logo o endereço dele é o valor do atributo href do link. Mais abaixo veremos que podemos ter outros valores no atributo href.

Você pode colocar o atributo title da tag <a> para fazer o efeito de aparecer o valor desse atributo quando o mouse ficar em cima do link, dando uma descrição do destino do link para o usuário. No exemplo acima também colocamos o atributo title, e o valor dele é a descrição do site. Se você parar o mouse em cima do link de exemplo acima, ele mostrará o valor do atributo title. O atributo title também serve para outro propósito, que é para as máquinas de buscas saberem do que se trata o destino do link, podendo dar algum tipo de tratamento para essa descrição, como palavras chaves para a máquina de busca indexar melhor o site destino do link.

O atributo target define um alvo para o link ser aberto. Um alvo pode ser uma janela (nova ou já aberta) ou um frame (nas versões mais recentes de sites, frames não são mais utilizados). Para abrir o link em uma nova janela, utilize como valor do atributo target, o _blank.

<a href="http://www.comocriarsites.com" target="_blank">Como Criar Sites</a>

O atributo target não é mais padrão, segundo as normal da W3C no padrão strict. No padrão transitional ainda é permitido o seu uso. Para saber um pouco mais sobre os padrões e como coloca-los no seu site, acesse O que é e para que serve o DOCTYPE ou DTD (Document Type Definition).

Link Estático e Dinâmico

O que chamamos de link estático é o link que tem no seu atributo href o endereço completo do site destino. Os exemplos acima tem essa característica, o endereço completo. Para ligar (linkar) páginas que estejam no mesmo domínio, podemos fazer referência dinâmica, e chamamos de link dinâmico. O link dinâmico conta como início o diretório que a página que possui o link está, e para referenciar outra página no mesmo diretório, podemos colocar somente o nome da outra página no atributo href.

<a href="pagina2.html">página no mesmo diretório</a>

No exemplo acima, estamos linkando (ligando) a página2.html da nossa página, que tem que estar no mesmo diretório.

Nós podemos chamar páginas que estão em diretórios distintos, acima ou abaixo. Para fazer um link dinâmico de uma página que está no diretório exemplo, a uma página que está no diretório exemplo/teste, fazemos:

<a href="teste/pagina2.html">página em um diretório abaixo</a>

Para fazer um link dinâmico de uma página que está no diretório exemplo/teste, a uma página que está no diretório exemplo, fazemos:

<a href="../pagina2.html">página em um diretório acima</a>

Nós podemos também fazer combinações de páginas acima e abaixo, como acessar uma página que está em um outro diretório no mesmo nível que o diretório atual:

<a href="../teste2/pagina2.html">página em outro diretório do mesmo nível</a>

Link com Texto e com Imagens

Nos exemplos acima nós vimos vários links, mas todos eles sempre estão com um texto para ser clicado, mas um link pode ser uma imagem também. Para um link ser imagem, nós temos que simplesmente colocar uma imagem dentro da tag <a>.

<a href="http://www.comocriarsites.com"><img src="img/imagem_teste.png" border="0"></a>

O exemplo acima mostra como colocar um link com imagem. Podemos notar que dentro da tag <img> colocamos o atributo border=”0″, isso é porque por padrão, quando uma imagem é colocada como link, ela exibe uma borda, e com esse atributo fica somente a imagem normal.

Link para a mesma Página

Um link pode ter o seu destino na mesma página que está sendo exibida no navegador, ou indicar um certo ponto em uma outra página. Para fazer isso temos que identificar o ponto ao qual queremos que o link aponte e coloque o identificador desse ponto no atributo href do nosso link. Vamos ao exemplo:

<h2 id="indice">Índice</h2>

<a href="#topico1">Tópico 1</a><br>
<a href="#topico2">Tópico 2</a><br>
<a href="#topico3">Tópico 3</a><br>
<a href="#topico4">Tópico 4</a><br>
<a href="#topico5">Tópico 5</a><br>
<br>
<h2 id="topico1">Tópico 1</h2>
...
<a href="#indice">Voltar ao Índice</a>
<br><br>
<h2 id="topico2">Tópico 2</h2>
...
<a href="#indice">Voltar ao Índice</a>
<br><br>
<h2 id="topico3">Tópico 3</h2>
...
<a href="#indice">Voltar ao Índice</a>
<br><br>
<h2 id="topico4">Tópico 4</h2>
...
<a href="#indice">Voltar ao Índice</a>
<br><br>
<h2 id="topico5">Tópico 5</h2>
...
<a href="#indice">Voltar ao Índice</a>

Para ver esse exemplo funcionando acesse Exemplo de Links Internos como Índice.

Nesse exemplo criamos um índice para a nossa página, e quando o usuário clicar nos itens do índice, ele vai ser levado direto para os tópicos correspondentes. Não tem muitos segredos aqui, somente que cada tópico vai ter um identificador único, que pode ser qualquer nome, ou o nome do tópico para melhor representar, e o atributo href dos links tem os identificadores com um jogo da velha na frente, como valor.

Pode notar no exemplo também que após cada tópico tem outro link para retornar ao índice, para melhorar a navegação do usuário.

No nosso exemplo funcionando, também há links para outra página, com identificador de onde quer que seja mostrado essa outra página. Isso também é simples, basta colocar no atributo href o endereço da página a ser acessada, seguido de jogo da velha e o identificador da parte onde se quer mostrar.

<a href="outra_pagina.html#topico1">Tópico 1 na outra página</a>

Link para Arquivo

Um link também pode ser apontado para um arquivo, na verdade ele é sempre apontado para um arquivo, só que quando esse arquivo é uma página da web, nós dizemos que o link aponta para um página, mas podemos facilmente fazer um link para um arquivo, só precisamos colocar no atributo href da tag <a> o endereço do arquivo.

<a href="http://www.comocriarsites.com/arquivos/backup.zip">Download Arquivo</a>

No exemplo acima estamos fazendo um link para um arquivo .zip (zipado). Ao clicar no link o usuário vai ter a opção de abrir o arquivo ou salvar o arquivo.

Link para Email

Um outro tipo de link é o link para email, esse não é um modo elegante de fazer o usuário enviar email para o dono do site ou o administrador, mas na falta de algum script para envio de email por formulário esse resolve.

Para fazer um link para email, nós colocamos a palavra mailto, seguido de dois pontos (:), seguido do email ao qual vai ser enviado a mensagem, caso o usuário clique.

<a href="mailto:gerente@comocriarsites.com">Envie um email para mim</a>

No exemplo acima, ao clicar no link, vai abrir o gerenciador de email padrão do usuário (Thunder Bird, Outlook, …) já com o email para ser enviado, só precisando o usuário digitar a mensagem.



O que é e para que serve o DOCTYPE ou DTD (Document Type Definition)

Com o passar do tempo os padrões da web foram mudando, e sem enrolar muito no assunto, foi preciso criar padrões compatíveis com os diversos dispositivos que hoje acessam a web ao mesmo tempo que precisava ter uma linguagem de marcação (como o HTML), que poderia ser bem poderosa no sentido de ter flexibilidade par fazer várias coisas (ser bem ampla). Desse processo todo surgiu o XHTML, que é uma junção do HTML e o XML (eXtensible Markup Language).

Ainda utilizamos muito o HTML, muitas páginas o tem como linguagem, mas a web está sendo construida hoje com o XHTML. Ai surge a pergunta: Mas como o meu navegador vai saber com qual linguagem a página que ele está acessando foi construída? E nesse ponto entra o DOCTYPE.

O DOCTYPE serve para dizer aos visitantes da página com qual tipo de linguagem padrão a página foi construída. Hoje temos básicamente 6 tipos que são considerados os principais:

DOCTYPE HTML 4.01 Strict

Esse padrão se refere a paginas feita em HTML no modo strict. Esse seria o modo correto de fazer as páginas utilizando o HTML, ele não possui elementos de apresentação (<b>, <center>, <i>) e elementos muito antigos (fora de uso) e frames não são permitidos.

Para você dizer aos visitantes que sua página foi feita com esse padrão, você deve adicionar no início do código da sua página o seguinte trecho:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

DOCTYPE HTML 4.01 Transitional

Nesse padrão as páginas também são feitas somente com HTML, mas esse modo é mais flexível para conter códigos mais antigos, então ele permite elementos de apresentação e os elementos muito antigos. Ele continua não permitindo frames. Esse é o padrão para transição dos documentos antigos para o novo padrão.

Para dizer aos visitantes que seu código é desse padrão, coloque no começo do seu código a linha abaixo:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

DOCTYPE HTML 4.01 Frameset

Com esse padrão de página, você pode colocar tanto elementos de apresentação e antigos, como frames. Ele seria o padrão para quem não quer ter o mínimo de trabalho para atualizar sua página.

O código para ele é:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">

DOCTYPE XHTML 1.0 Strict

Esse padrão seria o modo correto de fazer uma página nos dias atuais. Ele utiliza o XHTML e não contém elementos de apresentação e os muito antigos, assim como não permite frames.

O código para ser colocado no início do seu documento é:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

DOCTYPE XHTML 1.0 Transitional

O padrão transitional para XHTML funciona no mesmo esquema do transitional para HTML, ele permite elementos de apresentação e elementos muito antigos, mas continua não permitindo frames. Esse deve ser o padrão mais utilizado atualmente.

Para dizer aos visitantes tratarem seu código com esse padrão, coloque o linha abaixo no início do seu documento:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

DOCTYPE XHTML 1.0 Frameset

Esse padrão é igual ao padrão XHTML 1.0 transitional, mas esse permite frames. Para utilizar esse padrão coloque, no início do seu documento, o código abaixo:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

Fora os padrões listados acima, temos um que provavelmente será o futuro das páginas, que é o XHTML 1.1, esse padrão é similar ao XHTML 1.0 strict, com o adicional de permitir módulos do XHTML.

Para você saber um pouco das diferenças entre os padrões HTML e XHTML, leia XHTML vs HTML Tutorial e nunca se esqueça de procurar nas máquinas de busca (Google, Yahoo!, etc).

Se você quiser verificar se seus códigos estão de acordo com as regras definidas, acesse Markup Validation Service. E não se esqueça que é a W3C que definiu esses padrões e outros vários padrões relacionados a web, então qualquer dúvida, pode fuçar no site deles.

Para uma lista mais completa, da própria W3C, dos padrões de documentos da web (DTD – Document Type Definition) e como coloca-los nos seus documentos (DOCTYPE), acesse Recommended list of DTDs.



Função getElementById() do Javascript

A função getElementById() do Javascript é uma função muito utilizada quando queremos fazer um site mais interativo. Essa função pode retornar o objeto de qualquer elemento na página que tenha um id único, e também funciona na maioria dos navegadores.

A função getElementById() do Javascript é bem fácil de usar, e é útil em muitas ocasiões. Vamos exemplificar algumas para melhor entendimento.

getElementById() para Tratamento e Envio de Formulário

Vamos supor que eu quero fazer alguma verificações do formulário antes de envia-lo. Eu posso chamar uma função Javascript que faz uso do getElementById() para fazer as verificações necessárias antes de realmente enviar o formulário, porque caso as verificações não procedam, eu posso não enviar o formulário. Vamos ao código:

<html>
<head>
	<title>Exemplo de getElementById() no Formulário</title>

<style type="text/css">

#msg_erro {
	color: red;
	font-weight: bold;
}

</style>

</head>
<body>

<script language="JavaScript">

function teste_submit()
{
	var obj_form = document.getElementById('form_teste');
	var obj_nome = document.getElementById('nome_teste');
	var obj_cargo = document.getElementById('cargo_teste');
	var obj_msg_erro = document.getElementById('msg_erro');
	var msg_erro = '';

	if(obj_nome.value == '')
		msg_erro = 'campo NOME vazio';
	else if(obj_cargo.value == '')
		msg_erro = 'campo CARGO vazio';

	if(msg_erro == '')
		obj_form.submit();
	else
		obj_msg_erro.innerHTML = msg_erro;
}

</script>

<form id="form_teste" action="http://www.comocriarsites.com" method="post">
Nome: <input type="text" id="nome_teste" name="nome_teste"><BR>
Cargo: <input type="text" id="cargo_teste" name="cargo_teste"><BR>
<input type="Button" value="Enviar" onclick="teste_submit();">
</form>
<div id="msg_erro"></div>

</body>
</html>

Algumas pessoas que conhecem um pouco de Javascript podem dizer “eu posso fazer a mesma coisa com o onSubmit“, mas nós não estamos vendo o onSubmit e sim o getElementById(). :P

Você pode ver esse exemplo da função getElementById() funcionando em Exemplo de getElementById() no Formulário.

No código acima temos um formulário HTML com dois campos e um botão de enviar, uma tag <div> para mensagem de erro e uma função Javascript identificada por teste_submit(). Quando o botão de enviar for pressionado, vai ser chamada a função Javascript teste_submit(). Essa função pega os objetos do formulário, dos campos do fomulário e do <div>, verifica se algum dos campos está vazio, e se algum deles estiver vazio, ele grava uma string em uma variável local (msg_erro) e depois faz essa string aparecer na tela. Se os dois campos não estiverem vazios, a função submete (envia) o formulário.

Os passos de pegar os objetos dos elementos do documento são feitos com a função getElementById(), que é uma função do documento, por isso tenho que colocar o document antes da função getElementById(). Como parametro da  função getElementById() tenho que colocar o idetificador único do elemento, que se define pelo atributo id.

Se você está usando uma linguagem no lado do servidor (PHP, ASP ou outras), isso faz com que reduza a carga no servidor, pois tratamos certos erros antes de realmente enviar o formulário. E isso agiliza o processo para o cliente também, que não precisa esperar carregar uma nova página para saber que o formulário que ele tentou enviar está faltando alguma coisa ou está errado.



Estilo Float (CSS Style Float)

Vamos ver como funciona o estilo float (style float) e algumas dicas para que ele possa ser utilizado corretamente. Ele serve para dizer onde o elemento vai “flutuar” na página. Isso é usado em elementos do tipo bloco (block – como <div>, <p>, <img> e outros) para faze-lo ficar exatamente onde você quiser, sem precisar usar tabela (tableless). Para uma renderização correta do elemento com o estilo float, o mesmo deve ter especificado a sua largura (width).

Valores para o Estilo Float

Os valores para o estilo float podem ser:

none

- Esse é o valor definido para o elemento não “flutuar” para lado algum. Você não precisa colocar esse estilo se você desejar esse valor.

left

- Esse valor faz o elemento “flutuar” a esquerda, deixando qualquer outro elemento a direita desse elemento.

right

- Esse valor faz o elemento “flutuar” a direita, deixando qualquer outro elemento a esquerda desse elemento.

Existem outros valores para o estilo float, mas normalmente são irrelevantes e quase nunca, se não nunca, serão usados, pelo menos eu nunca vi.

O estilo float faz o elemento se sobrepor aos outros elemento da página. Ele também faz o elemento meio que flutuar na página, podendo gerar alguns erros no fluxo dos elementos da página. Nós veremos algumas dicas para corrigir esses erros no final desse post.

Exemplificando o Estilo Float

Agora vou colocar um exemplo do código para o estilo float. Para ver os exemplos abaixo funcionando entre em Exemplo de Estilo Float. Primeiro um exemplo do elemento sem o float.

Sem Float

<div style="width: 200px; min-height: 50px; border: 1px solid black;">
	<div style="width: 50px; height: 50px; background-color: blue;"></div>
	<div style="width: 50px; height: 50px; background-color: red;"></div>
</div>

Esse é o exemplo para você ver como seria exibido os elementos sem o estilo float. Ele desenha um retângulo com dois quadrados dentro, só que esses quadrados estão exibidos um embaixo do outro.

Float Left

<div style="width: 200px; height: 50px; border: 1px solid black;">
	<div style="float: left; width: 50px; height: 50px; background-color: blue;"></div>
	<div style="float: left; width: 50px; height: 50px; background-color: red;"></div>
</div>

Nesse exemplo temos o mesmo retângulo, só que os quadrados internos dele estão com o estilo float: left e vemos que não há quebra de linha entre os elementos e todos estão alinhados a esquerda.

Float Right

<div style="width: 200px; height: 50px; border: 1px solid black;">
	<div style="float: right; width: 50px; height: 50px; background-color: blue;"></div>
	<div style="float: right; width: 50px; height: 50px; background-color: red;"></div>
</div>

Nesse exemplo temos quase a mesma coisa do exemplo passado, só que os elementos internos estão alinhados a direita, porque temos o estilo float: right nos elementos internos.

Float Left-Right

<div style="width: 200px; height: 50px; border: 1px solid black;">
	<div style="float: left; width: 50px; height: 50px; background-color: blue;"></div>
	<div style="float: right; width: 50px; height: 50px; background-color: red;"></div>
</div>

Esse exemplo é para mostrar como podemos colocar na mesma linha dois elementos sem usar tabela, para isso usamos em um elemento o estilo float: left e no outro o estilo float: right.

Dicas para Resolver Problemas com o Estilo Float

Umas das propriedades de elementos que utilizam o estilo float é que ele não ajusta a altura do elemento pai de acordo com a sua altura. Veja esses exemplos funcionando em Exemplo Estilo Float Manha. E vamos ao código:

Float sem Ajuste de Altura

<div style="width: 200px; height: 50px; border: 1px solid black; background-color: yellow;">
	<div style="float: left; width: 50px; height: 50px; background-color: blue;"></div>
	<div style="float: left; width: 50px; height: 75px; background-color: red;"></div>
</div>
<div style="width: 200px; height: 50px; border: 1px solid black; background-color: gray;"></div>

Nesse exemplo temos um elemento pai, que é um retângulo, com dois elementos filhos dentro, mas um dos elementos filhos está com a altura (height) maior que a do elemento pai, e como esse elemento filho está com o estilo float definido, o elemento pai não vai cobrir todo o elemento filho, então o elemento filho vai ficar uma parte fora do elemento pai. Logo embaixo existe outro elemento que deveria ficar após a altura total do elemento mais alto dos elementos anteriores a ele, só que não acontece, e o elemento filho acima, que tem altura maior, fica sobre o elemento que está mais abaixo no esquema.

Float com Ajuste de Altura por Estilo Clear

<div style="width: 200px; min-height: 50px; border: 1px solid black; background-color: yellow;">
	<div style="float: left; width: 50px; height: 50px; background-color: blue;"></div>
	<div style="float: left; width: 50px; height: 75px; background-color: red;"></div>
	<div style="clear: both;"></div>
</div>
<div style="width: 200px; height: 50px; border: 1px solid black; background-color: gray;"></div>

Para corrigir o ajuste de altura, temos algumas técnicas, mas a técnica exemplificada foi a de limpar (clear) o estilo float no final do elemento pai, para ser ajustada a altura dele corretamente. Isso normalmente é feito colocando em uma tag <div> o estilo clear: both. Você pode também criar uma classe com o estilo clear: both e atribuir essa classe a um elemento sempre que você precisar limpar o float.

div.limpar {
	clear: both;
}

<div class="limpar"></div>

Para saber mais sobre o estilo clear acesse Estilo Clear (CSS Style Clear).

Se você colocar o <div> com o estilo clear: both após o fechamento do elemento pai, o próximo elemento vai ficar corretamente posicionado, mas o elemento pai ainda vai ficar com a altura errada.

Float com Ajuste de Altura por Estilo Overflow

Outro ajuste para fixar a altura correta é colocar o estilo overflow: auto no elemento pai. Ele vai se ajustar automaticamente a altura dos elemento filhos. Mas essa técnica não é muito interessante já que se você quiser utilizar o estilo overflow do elemento pai para algum outro propósito não vai poder.

Se você quiser saber mais sobre o estilo overflow acesse Estilo Overflow (CSS Style Overflow).

Float com Ajuste de Altura por Pseudo Elemento After

Existe uma técnica que chama mais atenção por ser teoricamente melhor, porém é um pouco mais complexa, que é a técnica chamada clearfix, que consiste em fazer o clear com o pseudo elemento after, para os navegadores que tem esse pseudo elemento, e para o IE antigo, que não suporta o pseudo elemento after, fazer com que o elemento pai tenha a propriedade hasLayout. Para o elemento ter a propriedade hasLayout basta colocar o estilo zoom: 1 nele.

Vamos ao código:

<style type="text/css">

.clearfix {display: inline-block;} /* isso serve para IE/Mac */

.clearfix:after {
	content: " ";
	display: block;
	height: 0;
	clear: both;
	font-size: 0;
	visibility: hidden;
}

* html .clearfix { zoom: 1; }
.clearfix { display: block; }

</style>

<div style="width: 200px; min-height: 50px; border: 1px solid black; background-color: yellow;" class="clearfix">
	<div style="float: left; width: 50px; height: 50px; background-color: blue;"></div>
	<div style="float: left; width: 50px; height: 75px; background-color: red;"></div>
</div>
<div style="width: 200px; height: 50px; border: 1px solid black; background-color: gray;"></div>

Como pode ver no código acima, a técnica consiste em aplicar uma classe que tenha o pseudo elemento after, no elemento pai dos elementos que irão “flutuar” na página. O pseudo elemento after coloca um espaço logo após o elemento pai, mas coloca ele invisível e com a propriedade clear: both. Os elementos de cima da folha de estilos servem para ajeitar esse bug no IE/Mac e os de baixo servem para antigas versões do IE.

Para saber mais sobre o pseudo elemento after entre em CSS Pseudo Elementos: First-Letter, First-Line, Before e After.

Outras Técnicas

Uma outra técnica menos abordada é dar ao elemento pai o estilo display: table, mas acho que essa técnica não é muito boa, porque utiliza um estilo que nós podemos querer utilizar para outros fins. Essa técnica é abordada no site CSS: Truques para dominar a propriedade Float, mas sem muitas explicações de por que essa técnica funciona.

Para saber mais sobre as outras técnicas de posicionamento, leia CSS float: considerações, dicas e macetes para bons layouts na web e How To Clear Floats Without Structural Markup.

E para corrigir algum bug do IE com relação a margem colocada na mesma direção qual o elemento flutue, veja Bug Fix: IE Double Margin Float Bug.

Para criação e hospedagem profissional de websites e sistemas, acesse Panasoft.



CSS Pseudo Elementos: First-Letter, First-Line, Before e After

Os pseudo elementos servem para modificar algumas partes do documento que não ficam na árvore do documento.

Se você quer saber como utilizar um pseudo elemento, é como utilizar uma pseudo classe, acesse Entendendo CSS (folhas de estilo): Cascading Style Sheet – Parte 2.

Pseudo Elemento First-Letter

O pseudo elemento first-letter é utilizado para colocar na primeira letra do elemento um estilo especificado. Exemplo:

<style type="text/css">
.fletter:first-letter {
	font-size: 30px;
}
</style>

<div class="fletter">Primeira letra vai ser maior que a outras.</div>

Nesse exemplo a primeira letra do texto dentro do <div> terá o tamanho de 30 pixels. Você pode ver esse exemplo funcionando em Pseudo Elemento – First-Letter e First-Line.

O pseudo elemento first-letter somente funciona com elementos de bloco e também somente funcionam alguns estilos, como: propriedades de fonte, propriedades de cor, propriedades de fundo (background), propriedades de margens, propriedades de padding (sabe lá como se traduz isso), propriedades de bordas, text-decoration, vertical-align (se o estilo for float: none), text-transform, line-height, float e clear.

Pseudo Elemento First-Line

O pseudo elemento first-line é utilizado para colocar na primeira linha do elemento um estilo especificado. Exemplo:

<style type="text/css">
.fline {
	width: 200px;
}
.fline:first-line {
	font-size: 30px;
}
</style>

<div class="fline">Primeira linha vai ser maior que a outras.</div>

No exemplo acima, a primeira linha do texto dentro do <div> terá o tamanho de 30 pixels. Você pode ver esse exemplo funcionando em Pseudo Elemento – First-Letter e First-Line.

O pseudo elemento first-line funciona somente em elementos de bloco e com os mesmos estilos especificados na parte do first-letter.

Pseudo Elemento Before

O pseudo elemento before adiciona algum conteúdo antes do elemento ao qual ele é definido. Exemplo:

<style type="text/css">
.clabef:before {
	content: 'P: ';
}
</style>

<div class="clabef">Antes de qualquer conteúdo do elemento entra o que tem no before.</div>
<div class="clabef">Antes de qualquer conteúdo do elemento entra o que tem no before.</div>
<div class="clabef">Antes de qualquer conteúdo do elemento entra o que tem no before.</div>

Nesse exemplo vai sempre haver um “P: “ antes do conteúdo de cada <div>. Você pode ver esse exemplo funcionando em Pseudo Elemento – Before e After.

Pseudo Elemento After

O pseudo elemento after adiciona algum conteúdo depois do elemento ao qual ele é definido. Exemplo:

<style type="text/css">
.claaft:after {
	content: '.';
}
</style>

<div class="claaft">Depois de qualquer conteúdo do elemento entra o que tem no after</div>
<div class="claaft">Depois de qualquer conteúdo do elemento entra o que tem no after</div>
<div class="claaft">Depois de qualquer conteúdo do elemento entra o que tem no after</div>

Nesse exemplo vai sempre haver um “.” depois do conteúdo de cada <div>. Você pode ver esse exemplo funcionando em Pseudo Elemento – Before e After.