174 votes

En français, cela donnerait : Tableau en-tête à rester fixé en haut lorsque l'utilisateur le fait défiler hors de la vue avec jQuery

Je cherche à concevoir un tableau HTML où l'en-tête restera en haut de la page UNIQUEMENT lorsque l'utilisateur le fait défiler hors de la vue. Par exemple, le tableau peut être situé à 500 pixels de la page, comment puis-je faire en sorte que si l'utilisateur fait défiler l'en-tête hors de la vue (le navigateur détecte qu'il n'est plus visible dans la fenêtre), il restera en haut? Quelqu'un peut-il me donner une solution en Javascript à cela?

      Col1
      Col2
      Col3

      info
      info
      info

      info
      info
      info

      info
      info
      info

Donc, dans l'exemple ci-dessus, je veux que le fasse défiler avec la page s'il sort de la vue.

IMPORTANT: Je ne recherche PAS une solution où le aura une barre de défilement (overflow:auto).

2 votes

0 votes

J'ai répondu à une autre question, veuillez jeter un coup d'œil. stackoverflow.com/a/56764334/9388978

146voto

Andrew Whitaker Points 58588

Vous feriez quelque chose comme cela en vous branchant sur l'événement scroll de la window, et en utilisant un autre table avec une position fixe pour afficher l'en-tête en haut de la page.

var tableOffset = $("#table-1").offset().top;
var $header = $("#table-1 > thead").clone();
var $fixedHeader = $("#header-fixed").append($header);

$(window).bind("scroll", function() {
  var offset = $(this).scrollTop();

  if (offset >= tableOffset && $fixedHeader.is(":hidden")) {
    $fixedHeader.show();
  } else if (offset < tableOffset) {
    $fixedHeader.hide();
  }
});

#header-fixed {
  position: fixed;
  top: 0px;
  display: none;
  background-color: white;
}

      Col1
      Col2
      Col3

      info
      info
      info

      info
      info
      info

      info
      info
      info

Cela affichera l'en-tête du tableau lorsque l'utilisateur fait défiler suffisamment pour masquer l'en-tête d'origine du tableau. Il se masquera à nouveau lorsque l'utilisateur a fait défiler la page suffisamment vers le haut.

Exemple de travail: https://jsfiddle.net/andrewwhitaker/fj8wM/

62 votes

Je pensais à cela, mais que se passe-t-il si les largeurs des colonnes d'en-tête changent en fonction du contenu? À moins que les largeurs des colonnes ne soient fixes, vous pourriez constater que la ligne d'en-tête ne correspond pas aux lignes de contenu. Juste une pensée.

0 votes

Dans mon cas, la largeur du tableau est définie sur une largeur fixe, donc cela ne devrait pas poser de problème.

0 votes

@PeterBZ : Est-ce que cette réponse répond à votre question? Sinon, pourriez-vous me fournir plus de détails? Si oui, pourriez-vous accepter la réponse?

50voto

entropy Points 1883

Eh bien, j'essayais d'obtenir le même effet sans recourir à des colonnes de taille fixe ou ayant une hauteur fixe pour l'ensemble du tableau.

La solution que j'ai trouvée est un hack. Elle consiste à dupliquer l'ensemble du tableau puis à masquer tout sauf l'en-tête, et à le rendre en position fixe.

HTML

            Col1
            Col2
            Col3

            info
            info
            info

            info
            info
            info

            info
            some really long line here instead
            info

            info
            info
            info

            info
            info
            info

            info
            info
            info

            info
            info
            info

CSS

body { height: 1000px; }
thead{
    background-color:white;
}

javascript

function moveScroll(){
    var scroll = $(window).scrollTop();
    var anchor_top = $("#maintable").offset().top;
    var anchor_bottom = $("#bottom_anchor").offset().top;
    if (scroll>anchor_top && scroll

`

Voir ici: http://jsfiddle.net/QHQGF/7/

Modifier: code mis à jour pour que thead puisse recevoir des événements de pointeur (donc les boutons et liens dans l'en-tête fonctionnent toujours). Cela corrige le problème signalé par luhfluh et Joe M.

Nouveau jsfiddle ici: http://jsfiddle.net/cjKEx/

`

0 votes

Bel exemple! Merci, je vais l'utiliser. Mais ne serait-il pas plus performant de cloner uniquement et de le mettre dans une balise ? Vous savez, il peut y avoir beaucoup d'éléments dans le tableau d'origine.

3 votes

J'ai d'abord essayé cela, le problème est que la taille des éléments dans l'en-tête dépend du contenu du tableau. Si vous avez une ligne avec un contenu important, toute la colonne, y compris l'en-tête, augmentera. Si vous clonez seulement le thead, vous perdez cette information et vous n'obtenez pas l'effet désiré. Voir le commentaire de Yzmir Ramirez à la réponse acceptée. C'est la seule manière que j'ai trouvée qui fonctionne sans colonnes de largeur fixe. Ce n'est pas propre, je sais, c'est pourquoi j'ai dit que c'était un hack.

1 votes

Oh, j'ai compris. Cette méthode est géniale car elle fonctionne avec des colonnes fluides, j'ai cherché un peu sur Google et je n'ai pas trouvé une autre avec cette fonctionnalité. Quoi qu'il en soit, si je réussis à le faire d'une manière ou d'une autre, je le mentionnerai ici.

33voto

mkoryak Points 18135

J'ai écrit un plugin qui fait ça. Je travaille dessus depuis environ un an maintenant et je pense qu'il gère assez bien tous les cas particuliers :

  • défilement dans un conteneur avec débordement
  • défilement dans une fenêtre
  • prendre soin de ce qui se passe lorsque vous redimensionnez la fenêtre
  • garder vos événements liés à l'en-tête
  • le plus important, il ne vous oblige pas à changer le CSS de votre tableau pour faire fonctionner

Voici quelques démos/documents :
http://mkoryak.github.io/floatThead/

0 votes

Grands efforts, mais ne fonctionne pas avec IE 10 et présente quelques bizarreries lors du redimensionnement des fenêtres sur firefox23/ubuntu.

2 votes

FYI: j'ai corrigé les problèmes avec IE9 et 10 dans la dernière version.

2 votes

Pouvez-vous créer une version qui ne nécessite pas jQuery?

27voto

rockusbacchus Points 103

J'ai pu résoudre le problème en modifiant les largeurs des colonnes. J'ai commencé avec la solution d'Andrew ci-dessus (merci beaucoup !) et j'ai ensuite ajouté une petite boucle pour définir les largeurs des td clonés :

$("#header-fixed td").each(function(index){
    var index2 = index;
    $(this).width(function(index2){
        return $("#table-1 td").eq(index).width();
    });
});

Cela résout le problème sans avoir à cloner l'ensemble du tableau et à masquer le corps. Je suis tout nouveau en JavaScript et jQuery (et sur stack overflow), donc tous les commentaires sont appréciés.

4 votes

A bien fonctionné mais j'ai dû ajouter la ligne suivante $("#header-fixed").width($("#table-1").width()); pour que les colonnes s'alignent correctement.

17voto

josephting Points 398

C’est de loin la meilleure solution que j’ai trouvé pour avoir un en-tête de table fixe.

CSS

JavaScript

Source : http://codepen.io/jgx/pen/wiIGc

0 votes

J'ai corrigé ce script afin qu'il puisse gérer les éléments qui ont une bordure et un padding (sinon il définit les largeurs des d'en-tête fixes trop larges). Changez simplement outerWidth en width dans la définition de la fonction resizeFixed().

0 votes

Vous devrez peut-être également ajouter une propriété CSS de z-index à un nombre positif sur la classe .fixed afin que les objets rendus après le chargement de la page dans le tableau ne flottent pas au-dessus de l'en-tête fixe lorsque vous faites défiler.

0 votes

Simple and useful.

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