12 de fev. de 2011

Criando uma tabela com colunas dinamicamente



O site é em Ingles então tive que traduzir. Espero que entendam.



Eu gosto Crazy Egg s tabela de preços "em seu Preços e Inscrição página. Quando você clica em "Sign Up" para uma opção, o plano da coluna que destaca, os planos de outros desaparecem, e um formulário de inscrição tem o seu lugar. Há uma série de coisas impressionantes acontecendo dentro desta pequena área. Eu queria tentar e recriar o comportamento passo a passo, e compartilhar o poder de combinar CSS, JavaScript e imagens de forma inteligente.
Se você acabou de clicar sobre a procurar no site Crazy Egg, em seguida, clicar novamente, considere visitar lá de novo quando você terminar de ler este tutorial. Se você está tão impressionado com a maneira como o site é reunir, como eu, você ou alguém que você conhece / trabalhar, provavelmente poderia beneficiar clique incrível Crazy Egg de rastreamento ferramentas de visualização. Seus preços se tornam mais fácil para começar, então vamos dar uma consideração quando você está dando-lhes o tráfego.




Para aqueles que gostam de saltar à frente: ver o exemplo final , ou baixar um zip com todo o html, CSS, JavaScript e suporte imagens usadas neste artigo.

Primeiros passos

Primeiro eu preciso de uma mesa, e eu vou modelo meu exemplo fora do Crazy Egg. Vou usar uma coluna à esquerda para as descrições, uma fileira de cima para títulos, e uma matriz de funções no organismo.  Nós vamos fazer uso de thead , tfoot e tbody

tbody.
<table>
  <thead>
    <tr>
      <th>'s go here
    <tr>
  </thead>
  <tfoot>
    <tr>
      <td>'s go here
    </tr>
  </tfoot>
  <tbody>
    <tr>
      <td>'s go here
    </tr>
  </tbody>
</table>

Próximo passo: Adicionar classe

Por padrão, todas as células da tabela são parecidos. Para estabelecer que as células em cada coluna estão relacionadas, eu preciso adicionar a todas as classes <td> e <th> tags.

<table>
  <thead>
    <tr>
      <th class="desc">
      <th class="choiceA">
      <th class="choiceB">
      ...
    <tr>
  </thead>
  <tfoot>
    <tr>
      <td class="desc">
      <td class="choiceA">
      <td class="choiceB">
    </tr>
  </tfoot>
  <tbody>
    <tr>
      <td class="desc">
      <td class="choiceA">
      <td class="choiceB">
    </tr>
  </tbody>
</table>

Veja um exemplo 2, adição de classe , que também mostra a caixa de seleção acrescentou. Aqui está uma imagem.



Próximo Passo: Estabelecer o que é um estado selecionado parece

Gostaríamos de indicar uma coluna selecionada, acrescentando class = "on" com as células adequadas. Uma vez que todas as células já tem um nome de classe atribuída, o sobre nome da classe será adicionado o valor do atributo de classe com um espaço.
<table>
  ...
  <tbody>
  ...
    <tr>
      <td class="desc">
      <td class="choiceA on">
      <td class="choiceB">
    </tr>
   ...
  </tbody>
</table>

Veja um  exemplo 3, o estado selecionado .



Próximo passo: Ligar colunas selecionadas com JavaScript

Quando alguém bate no botão "Escolher" em uma determinada coluna, queremos que a coluna inteira para assumir o estado selecionado. Precisamos de um JavaScript para isso.
Em Inglês, aqui está o que queremos que aconteça:
  1. Quando alguém clica em "Escolher" para a escolha A
  2. retire o nome da classe do "on" de todas as outras células
  3. em seguida, tomar todas as células com a classe para a escolha A
  4. e acrescentar "sobre" a ele.
Aqui estão as ferramentas necessárias para fazer isso:
  • A função javascript getElementsByClassName chamado, o que nos permite alvo elementos com base em seu valor de classe. (Estou usando um escrito por Robert Nyman )
  • A função javascript chamada addClassName (também através de Robert Nyman , embora o que eu estou usando ele não colocou em seu site ainda. Esta função será usado para adicionar "on" como um nome de classe para as colunas selecionadas.
  • A função javascript chamada removeClassName, que é usado para desmarcar as células, removendo o "sobre" o valor de seus atributos de classe (através de Robert Nyman )
  • Uma função JavaScript personalizado para amarrar o comportamento do conjunto.
Anexar a função personalizada para o evento onclick a "Escolha" link:
<tfoot>
  <tr>
    ...
    <td class="choiceA">
      <a href="#" onclick="activateThisColumn('choiceA');return false;">
        Choose
      </a>
    </td>
    <td class="choiceB">
      <a href="#" onclick="activateThisColumn('choiceB');return false;">
        Choose
      </a>
    </td>
    ...
  </tr>
</tfoot>
...

Próximo passo: Introdução Imagens

Se fôssemos apenas mudando as cores de fundo, ele não teria quase o mesmo frescor como a tabela Egg Crazy, cuja coluna selecionada parece pular para fora, ou estender além dos limites da tabela.



É óbvio que uma imagem de fundo é usado com a célula selecionada tabela de cabeçalho. O que não é óbvio é que as células de cabeçalho da tabela vizinhos também estão usando imagens de fundo, que tem uma cor sólida no fundo, e branco na parte superior. Isto é evidente quando ligar o celular apresenta Web usando Firefox Developer Toolbar:



Vou fazer algumas imagens que realizar a mesma coisa. Aqui estão as imagens que vou usar:
regular <th>
selected <th>

left column <th>



regular <td>
 
selected <td>




left column <td>







regular <td> in tfoot

selected <td> in tfoot



left side <td> in tfoot

choose button
Veja o exemplo 5, imagens e dimensões de células no lugar . 
 
Olhando bem - nós agora temos uma tabela com aparência decente com um comportamento dinâmico.
Mas não podemos parar. Vamos introduzir ainda mais o comportamento dinâmico.

Próximo passo: Exibindo um formulário, escondendo algumas colunas da tabela.

Em Crazy Egg, quando uma coluna é selecionada, todas as outras colunas desaparecem, os movimentos da coluna selecionada para a esquerda, e um formulário é exibido no espaço à direita. O botão de cancelamento do formulário, em seguida, reshows todas as outras colunas escondidas anteriormente.
Primeiro, vou chamar o formulário que vai existir fora da tabela.
Então devemos estilo o formulário para assumir as dimensões exatas das quatro colunas selecionadas.
O formulário terá de ser absolutamente posicionado sobre a mesa. Então, vamos introduzir um elemento de recipiente ao formulário ea tabela para ser nosso pai, parente posicionado.
<div id="prices">

  <div id="formcontainer">
  ...
  </div>
  
  <table id="pricetable">
  ...
  </table>
  
</div>
Ooops! O formulário não deve mostrar por padrão, e precisamos ter todas as outras células, exceto as células da coluna selecionada e células na coluna da esquerda agora. Nós vamos fazer uso de uma nova função, hasclass , que verifica a class = "lado". Vamos modificar nossa função JavaScript "activateThisColumn" para ocultar e mostrar apenas as células apropriadas.

function activateThisColumn(column) {
  var table = document.getElementById('pricetable');
  var form = document.getElementById('formcontainer');

  // first, remove the 'on' class from all other th's
  var ths = table.getElementsByTagName('th');
  for (var g=0; g<ths.length; g++) {
    removeClassName(ths[g], 'on');
    if (!hasclass(ths[g],'side')) {
      ths[g].style.display = 'none';
    }
  }
  // then, remove the 'on' class from all other td's
  var tds = table.getElementsByTagName('td');
  for (var m=0; m<tds.length; m++) {
    removeClassName(tds[m], 'on');
    if (!hasclass(tds[m],'side')) {
      tds[m].style.display = 'none';
    }
  }

  // now, add the class 'on' to the selected th
  var newths = getElementsByClassName(column, 'th', table);
  for (var h=0; h<newths.length; h++) {
    addClassName(newths[h], 'on');
    newths[h].style.display = '';
    // not all browsers like display = 'block' for cells
  }
    // and finally, add the class 'on' to the selected td
  var newtds = getElementsByClassName(column, 'td', table);
  for (var i=0; i<newtds.length; i++) {
    addClassName(newtds[i], 'on');
    newtds[i].style.display = '';
    // not all browsers like display = 'block' for cells
  }
  // show the form!
  form.style.display = 'block';
}

Mas ainda precisamos de esconder a forma e manter a nossa coluna selecionada quando o formulário é cancelado. Vamos adicionar uma função ao evento onclick do botão de cancelamento.

<input
  type="image"
  alt="Cancel"
  src="i/button_cancel.gif"
  onclick="hideTheForm();return false;" />


E a função diz:

function hideTheForm() {
  // get the form
  var form = document.getElementById('formcontainer');
  // hide the form
  form.style.display = 'none';

  // now get the hidden table cells and show them again
  var table = document.getElementById('pricetable');
  var tds = table.getElementsByTagName('td');
  for (var i=0; i<tds.length; i++) {
    tds[i].style.display = '';
  }
  var ths = table.getElementsByTagName('th');
  for (var k=0; k<ths.length; k++) {
    ths[k].style.display = '';
  }
}

Veja  o  exemplo 10, um formulário é revelado quando solicitados, e demitidos de vista quando cancelada .





Há mais coisas acontecendo com a forma Crazy Egg do que o que eu mencionei neste artigo. Principalmente, Crazy Egg invoca uma biblioteca JavaScript para animar a aparência do formulário ao invés de mudar de 'nenhuma' para 'block' e novamente isso sem rodeios. Essa etapa extra é além do escopo deste artigo, mas esse tipo de detalhe e de trabalho postas em forma dá uma indicação clara de que o pessoal da Crazy Egg realmente sabem o que estão fazendo. (Além disso, o IE tem alguns problemas para mostrar a minha forma, mas aqueles que poderiam ser facilmente superadas com comentários condicionais).
Espero que gostem do post, e ver o que alguns scripts embalados com imagens e CSS pode realizar em uma pequena quantidade de espaço.

Todo o html, CSS, JavaScript e imagens de apoio.

Baixar




0 comentários:

Postar um comentário

Deixe seu comentário aqui
Para exibir sua foto, escreva o seu comentário e clique em "Visualizar" e em seguida clique em "Adicionar Foto de Perfil"(Só é exibido quando o comentário é publicado como Conta do Google). Para editar seu perfil Clique aqui.