Conheça o Plugfeed | » Início » Desenvolvimento » CSS e Tableless » Criando um PageControl com css
Conheça o Plugfeed | » Início » Desenvolvimento » CSS e Tableless » Criando um PageControl com css -->
 
Avaliação: | Publicado em: 02/04/2007
Criando um PageControl com css
Leonardo L Procopio (mas pode me chamar de Léo!). Sou formado em Analise e Desenvolvimento de Sistemas. Trabalho com desenvolvimento deskop e web. Meu objetivo e transmitir o que sei de forma simples e descontraída!
Criando um PageControl com css

Tableless!!!
Bom! Resolvi criar um artigo explicando como se projetar um panel com  links no topo (se preferir podemos chamar de PageControl).
Isso é muito conhecido aos desenvolvedores de desktop, e nossa idéia é deixar da mesma forma na  web!

Primeiramente vamos visualisar o nosso PageControl


Essa é a estrutura do nosso html!

-----------------------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="generator" content="PSPad editor, www.pspad.com">
<title>PageControl</title>
</head>
<body>
  <div id="tudo">
<ul id="menu_horizontal">
<li><a href=#>Dados</a></li>
<li><a href=#>Grid</a></li>
<li><a href=#>Extras</a></li>
<li><a href=# class="epecial">Contato</a></li>
<li><a href=#>Exemplo</a></li>
  </ul>
  <div id="conteudo_painel">
</div>
</div>
</body>
</html>

-------------------------------------------


Como podemos ver, ele contem um div logo após o body, que engloba todo o conteudo, podendo ser considerado o nosso
segundo body.
Pra que utilizamos isso? Da uma olhada no artigo que escrevi sobre centralizar a pagina na tela .
ele só ta aqui para centralizar!!!

Agora, vamos ao esqueleto do nosso menu (nossas abas!).
Você poderia usar varios comandos html para fazer esse esqueleto, mas na
minha opnião as listas não-ordenadas (<ul>), é a melhor escolha, pois mesmo com o css desabilitado ele vai manter
os links de forma legivel.

Note que temos uma classe="especial" em um link. Isso é necessário para dar um diferencial no link que esta selecionado
(você vai entender melhor isso na frente).

Vamos começar a formatação do nosso menu:

Estamos zerando a margem e o espaço interior da nossa lista, e tambem retirando o marcador.
#menu_horizontal{
    background: #ccc;
    margin: 0;
    padding: 0;
    list-style: none;
}

Agora vamos tirar os links um de baixo do outro e colocar ao lado.
Mas antes disso vou explicar: nos estamos notando que onde os links estão, é um elemento Bloco. Isso quer dizer que ele vai
criar uma quebra de linha antes e depois dele (resumidamente falando!!!). Para colocarmos um ao lado do outro teremos que
retirar essa propriedade dele, fazer um flutuar ao lado do outro:
#menu_horizontal li{
    float: left;
}

Pronto!
, agora sim ta começando a ter a forma que estamos querendo!
Agora vamos começar a manipular os links, para dar uma melhor apresentação.
Lembra que tivemos que fazer as li que estavam como bloco vicar uma do lado da outra (inline)? Agora vamos fazer os links
(<a href=...>) que são elementos inline (eles não causam quebra de linha antes e depois deles) virarem blocos.
Aproveitando também para dar um espaçamento entre o texto e as bordar, tirar e tirar o sublinhado!
#menu_horizontal li a{
    display: block;
    background: #f0f0f0;
    padding: 2px 15px 5px;
    margin-right: 7px;
    text-decoration: none;
    color: #000;
    font: 11px Verdana;
    border-top: 1px solid #8cacbb;
    border-right: 1px solid #8cacbb;
    border-left: 1px solid #8cacbb;
}

sintaxe de valores : "padding: top right bottom left;"
Você percebe que não coloquei a borda em baixo do links, eu vou deixar que o div onde vai aparecer o resultado faça isso!

Vamos dar uma melhorada, aplicando uma formatação para o estado hover dos nosso links (estado hover, é quando o ponteiro está
em cima do link!)

#menu_horizontal li a:hover{
    border-top: 1px solid black;
}

Notem que só estou mudando a cor da borda de cima p/ preto, mas você pode colocar uma outra cor de fundo, mudar as outras
bordas, fica a seu gosto.

Agora vamos formatar onde vai aparecer o nosso conteudo, que no caso vai ser o <div id="conteudo_painel"></div>.
Nossa idéia é deixar o fundo da nossa div da mesma cor do fundo dos links; dar um tamanho minimo pra ele (assim deixamos
um padrão mesmo quando o texto for pequeno); uma largura de 700px e a mesma borda dos links. Ufa! Vamos começar!
#conteudo_painel{
    background: #f7f7f7;
    min-height: 300px;
    width: 700px;
    clear: both;
    border: 1px solid #8cacbb;
}

Você notou que tive que colocar um comando clear: both;. Ele é necessário pois os nossos links estão com um float, e sendo
assim eles ficam "sem peso" na página, flutuando mesmo! O clear: both; limpa tudo que tem do lado esquerdo e direito, ou
seja: nada no lado esquerdo e nada no lado direito. Jogando assim pra baixo dos links o noss #conteudo_painel!

Bom, agora só falta um pequeno detalhe pra finalizar nossa obra prima.
Para mostrar qual aba estamos visualizando o conteudo, vamos tirar o sublinhado de baixo dela. Mas como fazer isso?
Nós vamos criar uma class ("especial"), quer ira pintar a borda de baixo do link que foi clicado. Sendo assim, cada
pagina da aba selecionado deverá ter essa class.
Ex: Se for clicado no link Dados, ele vai abrir o documento dados e vai colocar a class="especial" naquele link. Mudando
assim para cada pagina que representa o link.

Olha o códgio:
#menu_horizontal li a.especial{
    background: #f7f7f7;
    margin-bottom: -1px;
    border-bottom: 1px solid #f7f7f7;
}

E no dependendo da pagina é só colocar no link class="especial", para diferenciar do restante.
Suponhamos que a pessoa clicou no link "Extras" e abriu a pagina extras com o mesmo pagecontrol, pra mostrar que estamos
naquela painel, colocamos a classe nele:
<ul id="menu_horizontal">
    <li><a href=#>Dados</a></li>
    <li><a href=#>Grid</a></li>
    <li><a href=# class="especial">Extras</a></li>
    <li><a href=#>Contato</a></li>
    <li><a href=#>Exemplo</a></li>
</ul>

E pronto!!
Agora, é só adaptar a sua necessidade e gosto!
Seria bom utilizar ajax pra somente recarregar o div, dando um efeito legal, mas fica a criterio de vocês (e num oooutro
artigo é claro!)

veja o código final:
-----------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1250">
<meta name="generator" content="PSPad editor, www.pspad.com">
<title></title>
<style type="text/css">
/* <![CDATA[ */
#tudo{
width: 770px;
margin: 15px auto;
/*border: 1px solid silver;*/
}
#menu_horizontal{
background: #ccc;
margin: 0;
padding: 0;
list-style: none;
}

#menu_horizontal li{
float: left;
}
#menu_horizontal li a{
display: block;
background: #f0f0f0;
padding: 2px 15px 5px;
margin-right: 7px;
text-decoration: none;
color: #000;
font: 11px verdana;
border-top: 1px solid #8cacbb;
border-right: 1px solid #8cacbb;
border-left: 1px solid #8cacbb;

}
#menu_horizontal li a:hover{
border-top: 1px solid black;
}
#menu_horizontal li a.especial{
background: #f7f7f7;
margin-bottom: -1px;
border-bottom: 1px solid #f7f7f7;
}/**/
#conteudo_painel{
background: #f7f7f7;
min-height: 300px;
width: 700px;
clear: both;
border: 1px solid #8cacbb;
}
/* ]]> */
</style>
</head>
<body>
<div id="tudo">
<ul id="menu_horizontal">
<li><a href=#>Dados</a></li>
<li><a href=#>Grid</a></li>
<li><a href=#>Extras</a></li>
<li><a href=# class="especial">Contato</a></li>
<li><a href=#>Exemplo</a></li>
</ul>
<div id="conteudo_painel">
</div>
</div>
</body>
</html>
----------------------


Grande abraço!!!

Leonardo L Procópio
msn: leonardomerce@hotmail.com
relatosnoturno.blogspot.com
twitter.com/eek_

Parabens pelo post Leonardo, testei ele no firefox e no opera tudo Ok. Mas no IE ele fica descentrado e tambem não aparece a aba aberto no contato. Sabe como corrigir isto. Blz...
Leonardo Procópio <leonardolp@gmail.com>
ai Mauricio, coloquei uns codigo para corrigir esses erros no ie:

coloca esse em cima do #tudo:
body{
text-align: center; /centralizar no ie/
}

e depois no #tudo tu acrescenta isso:
text-align: left; / arrumar o hack pro ie de centralizar/

mas em baixo no #conteudo tu acrescenta isso, logo em cima do min-height: 300px;:
height: 300px;


testa ai e me fala!!
grande abraço!!!
Braz Alves de Lima <braz@ici.curitiba.org.br>
Olá Maurício!

Realmente não deu certo, mas a única solução acho é tirar as bordas mesmo! Acredito que o IE não reinderiza muito bem e acaba colocando borda onde não existe...tire as bordas e deixe o fundo das abas que não fazem parte do que foi selecionado, mais escuras. Vou deixar o código no site: www.licencomp.com

Abraços amigo
Eu queria botar o conteudo assim ke clika na aba sem precisar recarregar outra página.

Tem como fazer isso?
Cara... Muito bom as suas dicas... está sendo uma mão na roda... eu que estou começando estou sentindo firmeza... valeu
Leonardo L Procópio <leonardolp@gmail.com>
Que bom! em Breve estaremos renovando o estoque!!! : Não avaliado
Adorei essas dicas me ajudaram muito...
Valeuuuuuuuuuuuuuuuuu
Obrigada
Bonitinho mas não é funcional. Lamentável. Não tem dinamismo... falta um javascript pra mudar o class ao ser clicado na aba.
Leonardo L Procópio <leonardolp@gmail.com>
Uma boa seria buscar o conteudo com Ajax! Mas como o artigo é mais sobre css xhtml, preferi não extender para essa parte!
Grande abraço! : Não avaliado








Um produto Detetive.net