2010-08-03 4 views
1

Ok, donc c'est essentiellement sur les tables déroulantes. Si j'ai un élément de table, je peux faire défiler le contenu (avec un peu de javascript, y compris la barre de défilement en utilisant la largeur) en faisant la hauteur fixe et la hauteur fixe, puis en passant en mode automatique sur le tbody.Comment créer une table défilante dans Google Chrome

Ceci fonctionne dans Firefox, mais dans google chrome les hauteurs sur le th/tbody sont ignorées et la table entière se développe contre le défilement comme prévu.

Y a-t-il une solution css qui peut être appliquée à la table pour que cela fonctionne également dans Google Chrome? Ou dois-je créer l'en-tête une table, le corps une table différente, assurer la largeur des colonnes en utilisant js ou css et faire défiler le parent de la table de corps avec son contenu?

+0

Ce serait horriblement balisage non sémantique. Avez-vous essayé de régler la hauteur pour toute la table? – MvanGeest

+1

Pouvez-vous poster du code? – cesarnicola

+0

La hauteur de la table agit comme une propriété min-height. Ne peut pas forcer la table à être seulement une certaine hauteur. Je voulais une solution qui ne m'obligerait pas à diviser la table en deux tables, l'une pour la tête, l'autre pour le pied, avec des largeurs de colonnes fixes. –

Répondre

1

Voici une solution complète qui devrait fonctionner (en utilisant jQuery) Vous aurez besoin de deux tables chacune dans un élément div séparé. Chaque table aura la même section de thead. Seul contentTable aura la section tbody

<div class="scrollableTable" 
    <div> 
     <table class="headerTable"> 
      <thead> 
       <tr> 
        <th>Column 1</th> 
        <th>Column 2</th> 
        <th>Column 3</th> 
       </tr> 
      </thead> 
     </table> 
    </div> 
    <div style="height:240px; overflow:auto;"> 
     <table class="contentTable" style="width:100%; margin-top:-20px;"> 
      <thead> 
       <tr> 
        <th>Column 1</th> 
        <th>Column 2</th> 
        <th>Column 3</th> 
       </tr> 
      </thead> 
      <tbody> 
       <tr> 
        <td>value 1</td> 
        <td>value 2</td> 
        <td>value 3</td> 
       </tr> 
       <tr> 
        <td>value 4</td> 
        <td>value 5</td> 
        <td>value 6</td> 
       </tr> 
       .... 
      </tbody> 
     </table> 
    </div> 
</div> 

Ensuite, vous devrez appeler cette fonction à chaque fois que les données sont modifiées:

ResizeWidths($('.scrollableTable')); 


function ResizeWidths(div) 
{ 
    var headerCells = $(div).find('.headerTable thead').find('th'); 
    var contentCells = $(div).find('.contentTable thead').find('th'); 
    for(var i =0, ii = headerCells.length;i<ii;i++) 
    { 
     if($(headerCells[i]).width()!=$(contentCells[i]).width()) 
      $(headerCells[i]).width($(contentCells[i]).width()); 
    } 
} 
+0

Je voulais une solution dans une seule table, qui fonctionne sur tous les navigateurs autres que le chrome, j'essaie simplement de comprendre pourquoi le chrome ne fonctionne pas. –

+0

J'espérais éviter quelque chose comme ça, mais on dirait que je n'aurais pas d'autre choix que de le faire de cette façon. –

+0

Je l'ai testé sur IE7/8, Chrome et FF et ça marche bien. J'ai ajouté 2 choses: 1) '$ (div) .find ('.tableTable') [0] .style ['marginTop'] = '-' + $ (contentCells [0]). Height() + 'px'; 'assigner dynamiquement la marge négative-top. 2) code pour synchroniser le défilement horizontal entre les divs d'en-tête et de contenu. Dans FF et Chrome, j'ai utilisé l'événement onscroll. Dans IE 7/8 j'ai ajouté un setInterval 100ms appelant la méthode de synchronisation (je sais, moche, mais fonctionne). – helios

1

Je suppose que vous utilisiez le script de la page

suivant

Afin de corriger le bug se produisant dans le Chrome changer les lignes suivantes:

if (document.all && document.getElementById && !window.opera) this.initIEengine(); 
    if (!document.all && document.getElementById && !window.opera) this.initFFengine(); 

à ceci:

var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1; 
    if (is_chrome = true) { 
     this.initIEengine() 
    } 
    else { 
     if (document.all && document.getElementById && !window.opera) this.initIEengine(); 
     if (!document.all && document.getElementById && !window.opera) this.initFFengine(); 
    } 

fonctionne parfaitement alors

+0

Ne pas utiliser ce script ... Mais est-ce une chose globale qui va définir certains comportements IE dans la page entière? Cela ressemble plus à l'utilisation d'un nuke pour tuer une souris. Toujours très bon à savoir, il y a quelque chose qui peut être fait. –

Questions connexes