202 votes

barre de défilement horizontale en haut et en bas du tableau

J'ai un très grand table sur ma page. J'ai donc décidé de mettre une barre de défilement horizontale qui est placée en bas du tableau. Mais je voudrais que cette barre de défilement soit également placée en haut du tableau.

Ce que j'ai dans le modèle est le suivant :

<div style="overflow:auto; width:100%; height:130%">
<table id="data" style="width:100%">

Est-il possible de le faire uniquement en HTML et CSS ?

1 votes

stackoverflow.com/questions/2274627/ J'ai trouvé cette solution utile.

0 votes

262voto

StanleyH Points 716

Pour simuler une deuxième barre de défilement horizontale au sommet d'un élément, mettez une "fausse" barre de défilement. div au-dessus de l'élément qui a un défilement horizontal, juste assez haut pour une barre de défilement. Attachez ensuite des gestionnaires de l'événement "scroll" à l'élément fictif et à l'élément réel, afin que l'autre élément soit synchronisé lorsque l'une des barres de défilement est déplacée. L'élément factice ressemblera à une deuxième barre de défilement horizontale au-dessus de l'élément réel.

Pour un exemple concret voir ce violon

Voici le code :

HTML :

<div class="wrapper1">
  <div class="div1"></div>
</div>
<div class="wrapper2">
  <div class="div2">
    <!-- Content Here -->
  </div>
</div>

CSS :

.wrapper1, .wrapper2 {
  width: 300px;
  overflow-x: scroll;
  overflow-y:hidden;
}

.wrapper1 {height: 20px; }
.wrapper2 {height: 200px; }

.div1 {
  width:1000px;
  height: 20px;
}

.div2 {
  width:1000px;
  height: 200px;
  background-color: #88FF88;
  overflow: auto;
}

JS :

$(function(){
  $(".wrapper1").scroll(function(){
    $(".wrapper2").scrollLeft($(".wrapper1").scrollLeft());
  });
  $(".wrapper2").scroll(function(){
    $(".wrapper1").scrollLeft($(".wrapper2").scrollLeft());
  });
});

0 votes

$ est pour jQuery. Il suffit de le charger dans le <head> de votre page comme ceci : <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.‌​min.js"></script>

1 votes

Avez-vous réussi à le faire fonctionner ? Pour en savoir plus sur jQuery, voir api.jquery.com/scrollLeft (Bien sûr, vous pouvez le faire sans jQuery en attachant directement des gestionnaires onscroll). Pour une dégradation progressive pour les utilisateurs sans JS, vous pouvez ajouter la div factice au DOM par JS.

1 votes

Oui j'ai réussi à le faire fonctionner, j'ai juste dû ajouter <script type="text/javascript" src="path"></script> à <head>. Donc à chaque fois que j'ajoute jquery je dois ajouter celui que @fudgey a ajouté ? Désolé, javascript et jquery sont encore un peu du chinois pour moi.

43voto

pawel.suwala Points 151

Essayez d'utiliser le jquery.doubleScroll plugin

jQuery :

$(document).ready(function(){
  $('#double-scroll').doubleScroll();
});

CSS

#double-scroll{
  width: 400px;
}

HTML

<div id="double-scroll">
  <table id="very-wide-element">
    <tbody>
      <tr>
        <td></td>
      </tr>
    </tbody>
  </table>
</div>

Démo

6 votes

Voir github.com/avianey/jqDoubleScroll pour une version de l'impressionnant plugin de Pawel qui ne nécessite pas jQueryUI.

2 votes

Le lien mène à un GitHub non mis à jour avec des liens brisés dans Read Me. Je n'ai pas essayé le js actuel.

22voto

simo Points 1147

Tout d'abord, excellente réponse @StanleyH Si quelqu'un se demande comment créer un conteneur à double défilement avec une largeur dynamique

css

.wrapper1, .wrapper2 { width: 100%; overflow-x: scroll; overflow-y: hidden; }
.wrapper1 { height: 20px; }
.div1 { height: 20px; }
.div2 { overflow: none; }

js

$(function () {
    $('.wrapper1').on('scroll', function (e) {
        $('.wrapper2').scrollLeft($('.wrapper1').scrollLeft());
    }); 
    $('.wrapper2').on('scroll', function (e) {
        $('.wrapper1').scrollLeft($('.wrapper2').scrollLeft());
    });
});
$(window).on('load', function (e) {
    $('.div1').width($('table').width());
    $('.div2').width($('table').width());
});

html

<div class="wrapper1">
    <div class="div1"></div>
</div>
<div class="wrapper2">
    <div class="div2">
        <table>
            <tbody>
                <tr>
                    <td>table cell</td>
                    <td>table cell</td>
                    <!-- ... -->
                    <td>table cell</td>
                    <td>table cell</td>
                </tr>
            </tbody>
        </table>
    </div>
</div>

Démonstration

http://jsfiddle.net/simo/67xSL/

3 votes

Utilisez $('.div1').width( $('.div1')[0].scrollWidth) pour obtenir la largeur de défilement réelle du contenu, utile lorsque vous n'utilisez pas spécifiquement un conteneur comme un tableau. @simo Effort impressionnant mon pote.

0 votes

Pour clarifier, j'ai également dû modifier le code en scrollWidth pour que mon propre code fonctionne, la largeur du contenu de la division "div2" étant variable en raison du contenu dynamique côté serveur qui s'y trouve.

0 votes

Cette réponse ne crée pas de barre de défilement en haut de l'écran.

11voto

avianey Points 532

Vous pouvez utiliser un plugin jquery qui fera le travail pour vous :

Le plugin se chargera de toute la logique pour vous...

2 votes

Bien que ce plugin fasse la même chose que le plugin suwala/jquery.doubleScroll, il dispose de plus d'options comme le recalcul de la largeur lors du redimensionnement de la fenêtre.

1 votes

Ne dépend pas non plus de jquery UI.

1 votes

Je recommande ce plugin, il ressemble à une version améliorée de suwala/jquery.doubleScroll et fonctionne pour moi.

5voto

przno Points 857

En me basant sur la solution de @StanleyH, j'ai créé une Directive AngularJS , démo sur jsFiddle .

Facile à utiliser :

<div data-double-scroll-bar-horizontal> {{content}} or static content </div>

Aucun jQuery n'est requis.

39 votes

"Pas besoin de JQuery." Ouais, juste un cadre entier. Pas de problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X