ส่วนหัวของตารางที่จะคงอยู่ที่ด้านบนเมื่อผู้ใช้เลื่อนออกจากมุมมองด้วย jQuery


145

ฉันกำลังพยายามออกแบบตาราง HTML ที่ส่วนหัวจะอยู่ด้านบนของหน้าเมื่อและเฉพาะเมื่อผู้ใช้เลื่อนออกจากมุมมอง ตัวอย่างเช่นตารางอาจอยู่ที่ 500 พิกเซลจากหน้าฉันจะทำอย่างไรเพื่อให้ผู้ใช้เลื่อนส่วนหัวออกจากมุมมอง (เบราว์เซอร์ตรวจพบไม่อยู่ในมุมมองหน้าต่างอีกต่อไป) มันจะอยู่ด้านบน ? ทุกคนสามารถให้โซลูชัน Javascript แก่ฉันได้หรือไม่

<table>
  <thead>
    <tr>
      <th>Col1</th>
      <th>Col2</th>
      <th>Col3</th>
    </tr>
  </thead>
  <tbody>
     <tr>
       <td>info</td>
       <td>info</td>
       <td>info</td>
     </tr>
     <tr>
       <td>info</td>
       <td>info</td>
       <td>info</td>
     </tr>
     <tr>
       <td>info</td>
       <td>info</td>
       <td>info</td>
     </tr>
  </tbody>
</table>

ดังนั้นในตัวอย่างข้างต้นฉันต้องการ<thead>เลื่อนไปที่หน้าถ้ามันออกไปจากมุมมอง

สำคัญ: ฉันไม่ได้มองหาวิธีแก้ปัญหาที่<tbody>จะมีแถบเลื่อน (ล้น: อัตโนมัติ)



ซ้ำกันที่เป็นไปได้ของส่วนหัว
Swastik Raj Ghosh

ฉันตอบคำถามนี้อีกข้อโปรดดู stackoverflow.com/a/56764334/9388978
Ersel Aktas

คำตอบ:


131

คุณจะทำสิ่งนี้โดยแตะที่scrollตัวจัดการเหตุการณ์windowและใช้อีกtableตำแหน่งหนึ่งเพื่อแสดงส่วนหัวที่ด้านบนของหน้า

HTML:

<table id="header-fixed"></table>

CSS:

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

JavaScript:

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();
    }
});

สิ่งนี้จะแสดงหัวตารางเมื่อผู้ใช้เลื่อนลงมาไกลพอที่จะซ่อนหัวตารางต้นฉบับ มันจะซ่อนอีกครั้งเมื่อผู้ใช้เลื่อนหน้าขึ้นมาไกลพออีกครั้ง

ตัวอย่างการทำงาน: http://jsfiddle.net/andrewwhitaker/fj8wM/


60
ฉันคิดถึงสิ่งนี้ แต่จะเกิดอะไรขึ้นถ้าความกว้างของคอลัมน์ส่วนหัวเปลี่ยนตามเนื้อหา หากไม่มีการแก้ไขความกว้างของคอลัมน์คุณอาจมีแถวส่วนหัวไม่ตรงกับแถวเนื้อหา แค่ความคิด
Yzmir Ramirez

16
ตัวอย่างนี้ไม่ทำงานหากชื่อส่วนหัวของคอลัมน์สั้นกว่าค่าข้อมูลคอลัมน์ ลองเปลี่ยนซอที่มีค่าเช่น infoooooooo แทนข้อมูล ฉันกำลังคิดว่าความกว้างฮาร์ดโค้ดบางอย่างที่ตั้งค่าเมื่อทำการโคลนตาราง
whiterook6

6
นี้มีข้อ จำกัด windowที่สำคัญน้อยซึ่งคือเมื่อพยายามที่จะใช้ตารางในภาชนะอื่นที่ไม่ใช่ mkoryak.github.io/floatTheadมีโซลูชันที่ใช้งานได้ทั่วไปมากกว่า
Yuck

13
สิ่งนี้อาจช่วยให้ทุกคนที่ต้องการความกว้างแบบไดนามิกเป็นสิ่งที่ฉันทำไว้มันเป็นทางแยกของ @AndrewWhitaker: jsfiddle.net/noahkoch/wLcjh/1
โนอาห์โคช์

1
@NahahKoch ส่วนหัวคงที่โดยใช้วิธีการแก้ปัญหาของคุณอาจยังไม่กว้างเท่ากับหัวเดิมเมื่อเซลล์ดั้งเดิมมีช่องว่างภายใน ฉันปรับปรุงโซลูชันของคุณเพื่อเพิ่มการขยายไปยังเซลล์ที่ทำซ้ำ ทางแยกของ JSFiddle: jsfiddle.net/1n23m69u/2
fandasson

46

ฉันพยายามทำให้ได้ผลเดียวกันโดยไม่หันไปใช้คอลัมน์ขนาดคงที่หรือมีความสูงคงที่สำหรับทั้งตาราง

ทางออกของฉันคือแฮ็ค ประกอบด้วยการทำซ้ำตารางทั้งหมดแล้วซ่อนทุกอย่างยกเว้นส่วนหัวและทำให้ตำแหน่งคงที่

HTML

<div id="table-container">
<table id="maintable">
    <thead>
        <tr>
            <th>Col1</th>
            <th>Col2</th>
            <th>Col3</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>info</td>
            <td>info</td>
            <td>info</td>
        </tr>
        <tr>
            <td>info</td>
            <td>info</td>
            <td>info</td>
        </tr>
        <tr>
            <td>info</td>
            <td>some really long line here instead</td>
            <td>info</td>
        </tr>
        <tr>
            <td>info</td>
            <td>info</td>
            <td>info</td>
        </tr>
                <tr>
            <td>info</td>
            <td>info</td>
            <td>info</td>
        </tr>
                <tr>
            <td>info</td>
            <td>info</td>
            <td>info</td>
        </tr>
        <tr>
            <td>info</td>
            <td>info</td>
            <td>info</td>
        </tr>
    </tbody>
</table>
<div id="bottom_anchor"></div>
</div>

CSS

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

จาวาสคริปต์

function moveScroll(){
    var scroll = $(window).scrollTop();
    var anchor_top = $("#maintable").offset().top;
    var anchor_bottom = $("#bottom_anchor").offset().top;
    if (scroll>anchor_top && scroll<anchor_bottom) {
    clone_table = $("#clone");
    if(clone_table.length == 0){
        clone_table = $("#maintable").clone();
        clone_table.attr('id', 'clone');
        clone_table.css({position:'fixed',
                 'pointer-events': 'none',
                 top:0});
        clone_table.width($("#maintable").width());
        $("#table-container").append(clone_table);
        $("#clone").css({visibility:'hidden'});
        $("#clone thead").css({'visibility':'visible','pointer-events':'auto'});
    }
    } else {
    $("#clone").remove();
    }
}
$(window).scroll(moveScroll); 

ดูที่นี่: http://jsfiddle.net/QHQGF/7/

แก้ไข: อัปเดตรหัสเพื่อให้ thead สามารถรับเหตุการณ์ตัวชี้ได้ (ดังนั้นปุ่มและลิงก์ในส่วนหัวยังคงใช้งานได้) วิธีนี้แก้ไขปัญหาที่รายงานโดย luhfluh และ Joe M.

ใหม่ jsfiddle ที่นี่: http://jsfiddle.net/cjKEx/


3
ฉันลองก่อนอื่นปัญหาที่เกิดขึ้นคือขนาดขององค์ประกอบในส่วนหัวขึ้นอยู่กับเนื้อหาของตาราง หากคุณมีแถวที่มีเนื้อหาใหญ่คอลัมน์ทั้งหมดรวมทั้งส่วนหัวจะเติบโต หากคุณลอกแบบ thead คุณจะสูญเสียข้อมูลนั้นและคุณจะไม่ได้รับผลที่ต้องการ ดูความคิดเห็นของ Yzmir Ramirez เกี่ยวกับคำตอบที่ยอมรับได้ นี่เป็นวิธีเดียวที่ฉันพบว่าทำงานได้โดยไม่มีคอลัมน์ความกว้างคงที่ มันไม่สะอาดฉันรู้ซึ่งเป็นวิธีที่ฉันบอกว่ามันเป็นแฮ็ค
เอนโทรปี

1
โอ้ฉันเข้าใจแล้ว วิธีนี้ดีมากเพราะใช้งานกับคอลัมน์ fluid ฉัน googled เล็กน้อยและไม่สามารถหาอันอื่นที่มีฟังก์ชั่นนั้นได้ อย่างไรก็ตามถ้าฉันทำมันเสร็จแล้วฉันจะพูดถึงมันที่นี่
M2_

1
@ luhfluh ใช่ปัญหาเกิดจากตัวชี้เหตุการณ์: ไม่มีในตารางโคลน สิ่งนี้ถูกใช้เพื่อให้การคลิกผ่านโคลนและไปยังตารางดั้งเดิม การคืนค่าในส่วนหัวของตารางที่โคลนเพื่อให้ส่วนหัว (และส่วนหัวเท่านั้น) สามารถคลิกได้ช่วยแก้ไขปัญหา ผมได้ปรับปรุงการโพสต์ของฉันที่จะสะท้อนให้เห็นถึงนี้ :)
เอนโทรปี

4
ปัญหาในการเพิ่มเส้นขอบใน <thead> <th>
Jam Ville

1
@JamVille visibility: hiddenเพราะตารางโคลนมี คุณสามารถซ่อนเท่านั้น#clone tbodyและหลังจากนั้นคุณสามารถตั้งค่าชายแดน ... ซอ: jsfiddle.net/QHQGF/1707
Lajdák Marek

46

Pure CSS (ไม่รองรับ IE11):

table th {
    position: -webkit-sticky; // this is for all Safari (Desktop & iOS), not for Chrome
    position: sticky;
    top: 0;
    z-index: 5;
    background: #fff;
}

1
ฉันไม่เห็นด้วยซ้ำว่าทำงานใน Chrome เครื่องมือที่ใช้ในการตรวจสอบแสดงเป็นค่าที่ไม่ถูกต้อง-webkit-sticky position
carmenism

@carmenism -webkit-stickyสำหรับ Safari (เดสก์ท็อปและ iOS) ไม่ใช่สำหรับ Chrome position: stickyใช้งานได้ใน Chrome จากรุ่น 56 คุณควรตั้งกฎทั้ง: -webkit-stickyและเพียงแค่stickyในลำดับเดียวกับในตัวอย่างรหัสของฉัน ได้รับ Safari webkit-stickyและเบราว์เซอร์อื่น ๆ stickyทั้งหมดที่เขียนทับด้วย
Ihor Zenich

2
ฉันไม่สามารถทำงานนี้ได้ จาก google อย่างรวดเร็วดูเหมือนว่าposition: stickyจะไม่ทำงานกับองค์ประกอบตาราง
rjh

3
การสมัครกับ th ทำงานให้ฉัน: table thead tr th {... }
nurp

1
คุณต้องใช้มันกับthเพราะมันจะไม่ทำงานบน thead หรือ tr
helado

26

ฉันเขียนปลั๊กอินที่ทำสิ่งนี้ ฉันทำงานกับมันมาประมาณหนึ่งปีแล้วและฉันคิดว่ามันใช้งานได้กับทุกมุมที่ค่อนข้างดี:

  • เลื่อนภายในภาชนะที่มีมากเกิน
  • เลื่อนภายในหน้าต่าง
  • ดูแลสิ่งที่เกิดขึ้นเมื่อคุณปรับขนาดหน้าต่าง
  • ทำให้กิจกรรมของคุณผูกพันกับส่วนหัว
  • ที่สำคัญที่สุดคือมันไม่ได้บังคับให้คุณเปลี่ยน CSS ของโต๊ะเพื่อให้มันทำงานได้

นี่คือตัวอย่างบางส่วน / เอกสาร:
http://mkoryak.github.io/floatThead/


ความพยายามอย่างมาก แต่ไม่ได้ทำงานกับ IE 10 และมีนิสัยใจคอในการปรับขนาดหน้าต่างบน firefox23 / ubuntu
Janning

2
FYI: ฉันแก้ไขปัญหาเกี่ยวกับ IE9 และ 10 ในเวอร์ชันล่าสุด
mkoryak

2
คุณสามารถสร้างเวอร์ชันที่ไม่ต้องการ jQuery ได้หรือไม่?
Curtis W

2
อาจเป็นเพราะเขาไม่ได้ใช้ jquery ... และไม่ - ฉันจะไม่ทำรุ่นที่ไม่ได้ใช้ jquery
mkoryak

1
ฉันใช้ jQery tablesorter ง่ายๆและใช้คำถามที่พบบ่อยปลั๊กอินของคุณไม่ชอบกฎ CSS ส่วนใหญ่เช่น #sortable td {.. } และอื่น ๆ ฉันพยายามปรับแต่งเล็กน้อย แต่ไม่สามารถใช้งานได้
masche

25

ฉันสามารถแก้ไขปัญหาด้วยการเปลี่ยนความกว้างของคอลัมน์ ฉันเริ่มต้นด้วยวิธีแก้ปัญหาของ Andrew ด้านบน (ขอบคุณมาก!) จากนั้นเพิ่มหนึ่งห่วงเล็กน้อยเพื่อกำหนดความกว้างของ td ที่ถูกโคลน:

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

วิธีนี้จะช่วยแก้ปัญหาโดยไม่ต้องลอกแบบทั้งตารางและซ่อนตัว ฉันเป็นแบรนด์ใหม่สำหรับ JavaScript และ jQuery (และเพื่อสแต็คล้น) ดังนั้นความคิดเห็นใด ๆ ที่ชื่นชม


4
ทำงานได้ดี แต่ฉันต้องการเพิ่มบรรทัดต่อไปนี้ $ ("# header-fixed"). width ($ ("# table-1"). width ()); สำหรับคอลัมน์ที่จะจัดแถวอย่างถูกต้อง
Ilya Fedotov

17

นี่คือทางออกที่ดีที่สุดที่ฉันพบว่ามีส่วนหัวของตารางคงที่

UPDATE 5/11: แก้ไขข้อผิดพลาดในการเลื่อนแนวนอนตามที่Kerry Johnson ชี้

Codepen: https://codepen.io/josephting/pen/demELL

;(function($) {
   $.fn.fixMe = function() {
      return this.each(function() {
         var $this = $(this),
            $t_fixed;
         function init() {
            $this.wrap('<div class="container" />');
            $t_fixed = $this.clone();
            $t_fixed.find("tbody").remove().end().addClass("fixed").insertBefore($this);
            resizeFixed();
         }
         function resizeFixed() {
           $t_fixed.width($this.outerWidth());
            $t_fixed.find("th").each(function(index) {
               $(this).css("width",$this.find("th").eq(index).outerWidth()+"px");
            });
         }
         function scrollFixed() {
            var offsetY = $(this).scrollTop(),
            offsetX = $(this).scrollLeft(),
            tableOffsetTop = $this.offset().top,
            tableOffsetBottom = tableOffsetTop + $this.height() - $this.find("thead").height(),
            tableOffsetLeft = $this.offset().left;
            if(offsetY < tableOffsetTop || offsetY > tableOffsetBottom)
               $t_fixed.hide();
            else if(offsetY >= tableOffsetTop && offsetY <= tableOffsetBottom && $t_fixed.is(":hidden"))
               $t_fixed.show();
            $t_fixed.css("left", tableOffsetLeft - offsetX + "px");
         }
         $(window).resize(resizeFixed);
         $(window).scroll(scrollFixed);
         init();
      });
   };
})(jQuery);

$(document).ready(function(){
   $("table").fixMe();
   $(".up").click(function() {
      $('html, body').animate({
      scrollTop: 0
   }, 2000);
 });
});
body{
  font:1.2em normal Arial,sans-serif;
  color:#34495E;
}

h1{
  text-align:center;
  text-transform:uppercase;
  letter-spacing:-2px;
  font-size:2.5em;
  margin:20px 0;
}

.container{
  width:90%;
  margin:auto;
}

table{
  border-collapse:collapse;
  width:100%;
}

.blue{
  border:2px solid #1ABC9C;
}

.blue thead{
  background:#1ABC9C;
}

.purple{
  border:2px solid #9B59B6;
}

.purple thead{
  background:#9B59B6;
}

thead{
  color:white;
}

th,td{
  text-align:center;
  padding:5px 0;
}

tbody tr:nth-child(even){
  background:#ECF0F1;
}

tbody tr:hover{
background:#BDC3C7;
  color:#FFFFFF;
}

.fixed{
  top:0;
  position:fixed;
  width:auto;
  display:none;
  border:none;
}

.scrollMore{
  margin-top:600px;
}

.up{
  cursor:pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h1>&darr; SCROLL &darr;</h1>
<table class="blue">
  <thead>
    <tr>
      <th>Colonne 1</th>
      <th>Colonne 2</th>
      <th>Colonne 3</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Non</td>
      <td>MaisMaisMaisMaisMaisMaisMaisMaisMaisMaisMaisMaisMaisMaisMaisMaisMaisMaisMaisMais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
       <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
  </tbody>
</table>

<h1 class="scrollMore">&darr; SCROLL MORE &darr;</h1>
<table class="purple">
  <thead>
    <tr>
      <th>Colonne 1</th>
      <th>Colonne 2</th>
      <th>Colonne 3</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
       <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
    <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
       <tr>
      <td>Non</td>
      <td>Mais</td>
      <td>Allo !</td>
    </tr>
  </tbody>
</table>
<h1 class="up scrollMore">&uarr; UP &uarr;</h1>


ฉันแก้ไขสคริปต์นี้เพื่อให้สามารถจัดการองค์ประกอบ <th> ที่มีเส้นขอบและช่องว่างภายใน (ไม่เช่นนั้นจะตั้งค่าความกว้างคงที่ <th> ส่วนหัวที่กว้างเกินไป) เพียงแค่เปลี่ยนouterWidthเป็นwidthในนิยามฟังก์ชั่น resizeFixed ()
alanng

คุณอาจต้องเพิ่มคุณสมบัติ CSS ของz-indexจำนวนบวกบางอย่างใน.fixedคลาสเพื่อให้วัตถุที่แสดงผลโหลดหน้าเว็บในตารางไม่ลอยอยู่ด้านบนของส่วนหัวคงที่ในขณะที่คุณเลื่อน
alanng

ง่ายและมีประโยชน์
RitchieD

วิธีจัดการกับตำแหน่งบนสุดแบบไดนามิก สมมติว่าฉันต้องเลื่อนไปด้านล่างเนื้อหาหลักคงที่ในหน้าหลักของฉัน .fixed {ด้านบน: 0;}
VijayVishnu

2
@KerryJohnson ขอบคุณสำหรับการบันทึก ฉันทำการเปลี่ยนแปลงบางอย่างดังนั้นจึงรองรับการเลื่อนแนวนอนและความกว้างคอลัมน์แบบไดนามิก
josephting

7

ทางออกที่ดีที่สุดคือการใช้ปลั๊กอิน jquery นี้:

https://github.com/jmosbech/StickyTableHeaders

ปลั๊กอินนี้ใช้งานได้ดีสำหรับเราและเราพยายามแก้ไขปัญหาอื่น ๆ อีกมากมาย เราทดสอบใน IE, Chrome และ Firefox


คุณรู้วิธีการแก้ปัญหาใด ๆ ที่ยังรักษาฟังก์ชั่นการควบคุมข้อมูลที่น่าพิศวงที่น่าพิศวงในส่วนหัว?
Csaba Toth

ไม่ได้ผลสำหรับฉัน: ส่วนหัวอยู่นอกตารางและติดที่ด้านบนสุดของเบราว์เซอร์ (หน้าต่าง) แม้จะมีตัวเลือก "scrollableArea" ฉันเห็นว่าสิ่งนี้ถูกกล่าวถึงก่อนหน้านี้โดยไม่มีความคิดเห็นเพิ่มเติม อาจจำเป็นต้องใช้ CSS ที่เขาใช้และไม่สามารถใช้งานได้
Exel Gamboa

6

มีวิธีแก้ปัญหาที่ดีมากอยู่แล้วที่นี่แล้ว แต่หนึ่งใน CSS ที่ง่ายที่สุดที่ฉันใช้ในสถานการณ์เหล่านี้คือ:

table {
  /* Not required only for visualizing */
  border-collapse: collapse;
  width: 100%;
}

table thead tr th {
  /* Important */
  background-color: red;
  position: sticky;
  z-index: 100;
  top: 0;
}

td {
  /* Not required only for visualizing */
  padding: 1em;
}
<table>
  <thead>
    <tr>
      <th>Col1</th>
      <th>Col2</th>
      <th>Col3</th>
    </tr>
  </thead>
  <tbody>
     <tr>
       <td>info</td>
       <td>info</td>
       <td>info</td>
     </tr>
     <tr>
       <td>info</td>
       <td>info</td>
       <td>info</td>
     </tr>
     <tr>
       <td>info</td>
       <td>info</td>
       <td>info</td>
     </tr>
     <tr>
       <td>info</td>
       <td>info</td>
       <td>info</td>
     </tr>
     <tr>
       <td>info</td>
       <td>info</td>
       <td>info</td>
     </tr>
     <tr>
       <td>info</td>
       <td>info</td>
       <td>info</td>
     </tr>
     <tr>
       <td>info</td>
       <td>info</td>
       <td>info</td>
     </tr>
     <tr>
       <td>info</td>
       <td>info</td>
       <td>info</td>
     </tr>
     <tr>
       <td>info</td>
       <td>info</td>
       <td>info</td>
     </tr>
     <tr>
       <td>info</td>
       <td>info</td>
       <td>info</td>
     </tr>
     <tr>
       <td>info</td>
       <td>info</td>
       <td>info</td>
     </tr>
     <tr>
       <td>info</td>
       <td>info</td>
       <td>info</td>
     </tr>
  </tbody>
</table>

เนื่องจากไม่มีข้อกำหนดสำหรับ JavaScript จึงทำให้สถานการณ์ง่ายขึ้นอย่างมาก คุณจำเป็นต้องมุ่งเน้นไปที่กฎ CSS ที่สองซึ่งมีเงื่อนไขเพื่อให้แน่ใจว่าส่วนหัวของตารางยังคงอยู่ด้านบนไม่ว่าจะเป็นพื้นที่เลื่อน

เพื่อให้รายละเอียดเกี่ยวกับกฎแต่ละอย่างละเอียด positionมีวัตถุประสงค์เพื่อระบุเบราว์เซอร์ว่าวัตถุส่วนหัวแถวและเซลล์ทั้งหมดต้องติดกับด้านบน สิ่งนี้จำเป็นต้องมีมาพร้อมกับtopซึ่งระบุไปยังเบราว์เซอร์ที่ส่วนหัวจะติดกับด้านบนของหน้าหรือวิวพอร์ต นอกจากนี้คุณสามารถเพิ่มz-indexเพื่อให้แน่ใจว่าเนื้อหาของหัวยังคงอยู่ด้านบนเสมอ

สีพื้นหลังเป็นเพียงเพื่อแสดงให้เห็นถึงจุด คุณไม่จำเป็นต้องใช้ JavaScript เพิ่มเติมเพื่อรับผลกระทบนี้ สิ่งนี้ได้รับการสนับสนุนในเบราว์เซอร์หลักส่วนใหญ่หลังจากปี 2559


1
IMO คำตอบที่ง่ายและสะอาดที่สุดมีวิธีง่าย ๆ ในการแก้ปัญหาเดียวอยู่เสมอ แม้ว่าฉันจะใช้การทำซ้ำ ng กับ angularjs มันทำงานเหมือนมีเสน่ห์
David Castro

5

ฉันพบไลบรารี jQuery ง่าย ๆ ที่ชื่อว่า Sticky Table Headers โค้ดสองบรรทัดและมันก็ทำตามที่ฉันต้องการ โซลูชันด้านบนไม่ได้จัดการความกว้างของคอลัมน์ดังนั้นหากคุณมีเซลล์ตารางที่ใช้พื้นที่มากขนาดของผลลัพธ์ของส่วนหัวถาวรจะไม่ตรงกับความกว้างของตาราง

http://plugins.jquery.com/StickyTableHeaders/

ข้อมูลการใช้งานที่นี่: https://github.com/jmosbech/StickyTableHeaders


3

ทีนี้หลังจากตรวจสอบการแก้ปัญหาที่มีทั้งหมดฉันเขียนปลั๊กอินที่สามารถตรึงแถวใด ๆ (ไม่เพียง แต่ th) ที่ด้านบนของหน้าหรือภาชนะ มันง่ายมากและเร็วมาก รู้สึกอิสระที่จะใช้มัน http://maslianok.github.io/stickyRows/


3

คุณสามารถใช้วิธีนี้ HTML บริสุทธิ์และ CSS ไม่ต้องใช้ JS

.table-fixed-header {
  display: flex;
  justify-content: space-between;
  margin-right: 18px
}

.table-fixed {
  display: flex;
  justify-content: space-between;
  height: 150px;
  overflow: scroll;
}

.column {
  flex-basis: 24%;
  border-radius: 5px;
  padding: 5px;
  text-align: center;
}
.column .title {
  border-bottom: 2px grey solid;
  border-top: 2px grey solid;
  text-align: center;
  display: block;
  font-weight: bold;
}

.cell {
  padding: 5px;
  border-right: 1px solid;
  border-left: 1px solid;
}

.cell:nth-of-type(even) {
  background-color: lightgrey;
}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>Fixed header Bin</title>
</head>
<body>
<div class="table-fixed-header">
    
    <div class="column">
      <span class="title">col 1</span>
    </div>
    <div class="column">
      <span class="title">col 2</span>
    </div>
    <div class="column">
      <span class="title">col 3</span>
    </div>
    <div class="column">
      <span class="title">col 4</span>
    </div>
    
  </div>
  
  <div class="table-fixed">
    
    <div class="column">
      <div class="cell">alpha</div>
      <div class="cell">beta</div>
      <div class="cell">ceta</div>
    </div>
    
    <div class="column">
      <div class="cell">alpha</div>
      <div class="cell">beta</div>
      <div class="cell">ceta</div>
      <div class="cell">alpha</div>
      <div class="cell">beta</div>
      <div class="cell">ceta</div>
      <div class="cell">alpha</div>
      <div class="cell">beta</div>
      <div class="cell">ceta</div>
    </div>
    
    <div class="column">
      <div class="cell">alpha</div>
      <div class="cell">beta</div>
      <div class="cell">ceta</div>
      <div class="cell">beta</div>
      <div class="cell">beta</div>
      <div class="cell">beta</div>
      
    </div>
    
    <div class="column">
      <div class="cell">alpha</div>
      <div class="cell">beta</div>
      <div class="cell">ceta</div>
    </div>
    
  </div>
</body>
</html>


3

ฉันพบวิธีแก้ปัญหาง่ายๆโดยไม่ใช้JQueryและใช้CSSเท่านั้น

คุณต้องใส่เนื้อหาคงที่ไว้ในแท็ก 'th' และเพิ่ม CSS

table th {
    position:sticky;
    top:0;
    z-index:1;
    border-top:0;
    background: #ededed;
}
   

ตำแหน่ง, ดัชนี z และคุณสมบัติยอดนิยมก็เพียงพอแล้ว แต่คุณสามารถใช้ส่วนที่เหลือเพื่อให้ดูดีขึ้น


2

ฉันประสบปัญหาเดียวกันกับการจัดรูปแบบเส้นขอบที่ไม่แสดงโดยใช้รหัสของ entrophy แต่การแก้ไขเล็กน้อยและตอนนี้ตารางสามารถขยายได้และแสดงกฎการกำหนดสไตล์ css ทั้งหมดที่คุณอาจเพิ่ม

เพื่อ css เพิ่ม:

#maintable{width: 100%}    

แล้วนี่คือจาวาสคริปต์ใหม่:

    function moveScroll(){
    var scroll = $(window).scrollTop();
    var anchor_top = $("#maintable").offset().top;
    var anchor_bottom = $("#bottom_anchor").offset().top;
    if (scroll > anchor_top && scroll < anchor_bottom) {
        clone_table = $("#clone");
        if(clone_table.length === 0) {          
            clone_table = $("#maintable").clone();
            clone_table.attr({id: "clone"})
            .css({
                position: "fixed",
                "pointer-events": "none",
                 top:0
            })
            .width($("#maintable").width());

            $("#table-container").append(clone_table);
            // dont hide the whole table or you lose border style & 
            // actively match the inline width to the #maintable width if the 
            // container holding the table (window, iframe, div) changes width          
            $("#clone").width($("#maintable").width());
            // only the clone thead remains visible
            $("#clone thead").css({
                visibility:"visible"
            });
            // clone tbody is hidden
            $("#clone tbody").css({
                visibility:"hidden"
            });
            // add support for a tfoot element
            // and hide its cloned version too
            var footEl = $("#clone tfoot");
            if(footEl.length){
                footEl.css({
                    visibility:"hidden"
                });
            }
        }
    } 
    else {
        $("#clone").remove();
    }
}
$(window).scroll(moveScroll);

วิธีนี้ใช้งานได้ดีกว่าโซลูชันของเอนโทรปีตราบใดที่การจัดรูปแบบขอบดำเนินการในส่วนหัว อย่างไรก็ตามใน Firefox ปัจจุบัน (แต่ไม่ใช่ Chrome) มันจะสร้างสิ่งประดิษฐ์เส้นขอบเซลล์ที่มองเห็นได้ด้านล่างตารางเมื่อเริ่มเลื่อน
alanng

2

นี่คือทางออกที่สร้างตามคำตอบที่ยอมรับได้ มันแก้ไขสำหรับ: ความกว้างของคอลัมน์สไตล์ตารางที่ตรงกันและเมื่อตารางถูกเลื่อนใน div คอนเทนเนอร์

การใช้

ตรวจสอบให้แน่ใจว่าตารางของคุณมี<thead>แท็กเนื่องจากเนื้อหาของ thead เท่านั้นที่จะได้รับการแก้ไข

$("#header-fixed").fixHeader();

JavaSript

//Custom JQuery Plugin
(function ($) {
    $.fn.fixHeader = function () {
        return this.each(function () {
            var $table = $(this);
            var $sp = $table.scrollParent();
            var tableOffset = $table.position().top;
            var $tableFixed = $("<table />")
                .prop('class', $table.prop('class'))
                .css({ position: "fixed", "table-layout": "fixed", display: "none", "margin-top": "0px" });
            $table.before($tableFixed);
            $tableFixed.append($table.find("thead").clone());

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

                if (offset > tableOffset && $tableFixed.is(":hidden")) {
                    $tableFixed.show();
                    var p = $table.position();
                    var offset = $sp.offset();

                    //Set the left and width to match the source table and the top to match the scroll parent
                    $tableFixed.css({ left: p.left + "px", top: (offset ? offset.top : 0) + "px", }).width($table.width());

                    //Set the width of each column to match the source table
                    $.each($table.find('th, td'), function (i, th) {
                        $($tableFixed.find('th, td')[i]).width($(th).width());
                    });

                }
                else if (offset <= tableOffset && !$tableFixed.is(":hidden")) {
                    $tableFixed.hide();
                }
            });
        });
    };
})(jQuery);

1
นี้ทำงานได้ดีสำหรับฉัน. สิ่งเดียวที่เป็นปัญหากับตารางที่ต้องเลื่อนในแนวนอน ฉันได้ทำการอัปเดตใน JSFiddle ที่นี่jsfiddle.net/4mgneob1/1 ฉันลบ$sp.scrollLeft()ที่ได้รับจำนวนเลื่อนจากซ้ายดังนั้นเมื่อเลื่อนลงตารางคงที่ถูกวางตำแหน่งอย่างถูกต้อง เพิ่มการตรวจสอบเมื่อเลื่อนในแนวนอนหากมองเห็นตารางที่คงที่เพื่อปรับตำแหน่งซ้าย ปัญหาอื่นที่ฉันไม่สามารถแก้ไขได้คือเมื่อตารางไปด้านบนวิวพอร์ตตารางคงที่ควรซ่อนจนกว่าผู้ใช้เลื่อนกลับขึ้น
Henesnarfel

1
รับUncaught TypeError: $table.scrollParent is not a function
karlingen

1

สิ่งนี้จะช่วยให้คุณมีส่วนหัวคงที่ซึ่งสามารถเลื่อนตามแนวนอนด้วยข้อมูล

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Shubh</title>



<script type="text/javascript">
    var lastSeen = [ 0, 0 ];
    function checkScroll(div1, div2) {
        if (!div1 || !div2)
            return;
        var control = null;
        if (div1.scrollLeft != lastSeen[0])
            control = div1;
        else if (div2.scrollLeft != lastSeen[1])
            control = div2;
        if (control == null)
            return;
        else
            div1.scrollLeft = div2.scrollLeft = control.scrollLeft;
        lastSeen[0] = div1.scrollLeft;
        lastSeen[1] = div2.scrollLeft;
    }

    window
            .setInterval(
                    "checkScroll(document.getElementById('innertablediv'), document.getElementById('headertable'))",
                    1);
</script>

<style type="text/css">
#full {
    width: 400px;
    height: 300px;
}

#innertablediv {
    height: 200px;
    overflow: auto;
}

#headertable {
    overflow: hidden;
}
</style>
</head>
<body>

    <div id="full">




        <div id="headertable">
            <table border="1" bgcolor="grey" width="150px" id="headertable">
                <tr>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>

                    <td>&nbsp;&nbsp;&nbsp;</td>
                </tr>

            </table>
        </div>




        <div id="innertablediv">

            <table border="1" id="innertableid">
                <tr>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                </tr>
                <tr>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                </tr>
                <tr>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                </tr>
                <tr>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                </tr>
                <tr>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                </tr>
                <tr>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                </tr>
                <tr>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                </tr>
                <tr>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                </tr>
                <tr>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                    <td>shubh, ansh</td>
                </tr>

            </table>
        </div>
    </div>
</body>
</html>

สิ่งนี้จะช่วยให้คุณมีส่วนหัวคงที่ซึ่งสามารถเลื่อนไปตามแนวนอนด้วยข้อมูลได้
2669926

1
function fix_table_header_position(){
 var width_list = [];
 $("th").each(function(){
    width_list.push($(this).width());
 });
 $("tr:first").css("position", "absolute");
 $("tr:first").css("z-index", "1000");
 $("th, td").each(function(index){
    $(this).width(width_list[index]);
 });

 $("tr:first").after("<tr height=" + $("tr:first").height() + "></tr>");}

นี่คือทางออกของฉัน


1

สายไปงานปาร์ตี้ แต่นี่คือการใช้งานที่ทำงานกับหลายตารางในหน้าเดียวกันและ "jank" ฟรี (ใช้ requestAnimationFrame) นอกจากนี้ยังไม่จำเป็นต้องระบุความกว้างของคอลัมน์ การเลื่อนในแนวนอนก็ใช้ได้เช่นกัน

ส่วนหัวมีการกำหนดไว้ในdivดังนั้นคุณมีอิสระที่จะเพิ่มมาร์กอัปใด ๆ ที่นั่น (เช่นปุ่ม) ถ้าจำเป็น นี่คือ HTML ทั้งหมดที่ต้องการ:

<div class="tbl-resp">
  <table id="tbl1" class="tbl-resp__tbl">
     <thead>
      <tr>
        <th>col 1</th>
        <th>col 2</th>
        <th>col 3</th>
      </tr>
    </thead> 
  </table>
</div>

https://jsfiddle.net/lloydleo/bk5pt5gs/


1

ในโซลูชันนี้จะสร้างส่วนหัวแบบคงที่แบบไดนามิกเนื้อหาและสไตล์จะถูกโคลนจาก THEAD

สิ่งที่คุณต้องมีคือสองบรรทัด:

var $myfixedHeader = $("#Ttodo").FixedHeader(); //create fixed header $(window).scroll($myfixedHeader.moveScroll); //bind function to scroll event

ปลั๊กอิน jquery ของฉันคงที่ส่วนหัวและ getStyleObject ให้ไว้ด้านล่างคุณสามารถใส่ในไฟล์. js

// JAVASCRIPT



/*
 * getStyleObject Plugin for jQuery JavaScript Library
 * From: http://upshots.org/?p=112
 
Basic usage:
$.fn.copyCSS = function(source){
  var styles = $(source).getStyleObject();
  this.css(styles);
}
*/

(function($){
    $.fn.getStyleObject = function(){
        var dom = this.get(0);
        var style;
        var returns = {};
        if(window.getComputedStyle){
            var camelize = function(a,b){
                return b.toUpperCase();
            };
            style = window.getComputedStyle(dom, null);
            for(var i = 0, l = style.length; i < l; i++){
                var prop = style[i];
                var camel = prop.replace(/\-([a-z])/g, camelize);
                var val = style.getPropertyValue(prop);
                returns[camel] = val;
            };
            return returns;
        };
        if(style = dom.currentStyle){
            for(var prop in style){
                returns[prop] = style[prop];
            };
            return returns;
        };
        return this.css();
    }
})(jQuery);



   
//Floating Header of long table  PiotrC
(function ( $ ) {
    var tableTop,tableBottom,ClnH;
    $.fn.FixedHeader = function(){
        tableTop=this.offset().top,
        tableBottom=this.outerHeight()+tableTop;
        //Add Fixed header
        this.after('<table id="fixH"></table>');
        //Clone Header
        ClnH=$("#fixH").html(this.find("thead").clone());
        //set style
        ClnH.css({'position':'fixed', 'top':'0', 'zIndex':'60', 'display':'none',
        'border-collapse': this.css('border-collapse'),
		'border-spacing': this.css('border-spacing'),
        'margin-left': this.css('margin-left'),
        'width': this.css('width')            
        });
        //rewrite style cell of header
        $.each(this.find("thead>tr>th"), function(ind,val){
            $(ClnH.find('tr>th')[ind]).css($(val).getStyleObject());
        });
    return ClnH;}
    
    $.fn.moveScroll=function(){
        var offset = $(window).scrollTop();
        if (offset > tableTop && offset<tableBottom){
            if(ClnH.is(":hidden"))ClnH.show();
            $("#fixH").css('margin-left',"-"+$(window).scrollLeft()+"px");
        }
        else if (offset < tableTop || offset>tableBottom){
            if(!ClnH.is(':hidden'))ClnH.hide();
        }
    };
})( jQuery );





var $myfixedHeader = $("#repTb").FixedHeader();
$(window).scroll($myfixedHeader.moveScroll);
/* CSS - important only NOT transparent background */

#repTB{border-collapse: separate;border-spacing: 0;}

#repTb thead,#fixH thead{background: #e0e0e0 linear-gradient(#d8d8d8 0%, #e0e0e0 25%, #e0e0e0 75%, #d8d8d8 100%) repeat scroll 0 0;border:1px solid #CCCCCC;}

#repTb td{border:1px solid black}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>


<h3>example</h3> 
<table id="repTb">
<thead>
<tr><th>Col1</th><th>Column2</th><th>Description</th></tr>
</thead>
<tr><td>info</td><td>info</td><td>info</td></tr>
<tr><td>info</td><td>info</td><td>info</td></tr>
<tr><td>info</td><td>info</td><td>info</td></tr>
<tr><td>info</td><td>info</td><td>info</td></tr>
<tr><td>info</td><td>info</td><td>info</td></tr>
<tr><td>info</td><td>info</td><td>info</td></tr>
<tr><td>info</td><td>info</td><td>info</td></tr>
<tr><td>info</td><td>info</td><td>info</td></tr>
<tr><td>info</td><td>info</td><td>info</td></tr>
<tr><td>info</td><td>info</td><td>info</td></tr>
<tr><td>info</td><td>info</td><td>info</td></tr>
</table>


1

สร้างตารางพิเศษด้วยส่วนหัวเดียวกับตารางหลัก เพียงแค่ใส่ thead ลงในตารางใหม่โดยมีหนึ่งแถวและส่วนหัวทั้งหมดอยู่ในนั้น ทำตำแหน่งที่แน่นอนและพื้นหลังสีขาว สำหรับตารางหลักวางไว้ใน div และใช้ความสูงและการเลื่อนมากเกินไป วิธีนี้ตารางใหม่ของเราจะเอาชนะส่วนหัวของตารางหลักและอยู่ที่นั่น ล้อมรอบทุกอย่างในกอง ด้านล่างเป็นรหัสคร่าวๆที่จะทำ

      <div class="col-sm-8">

        <table id="header-fixed" class="table table-bordered table-hover" style="width: 351px;position: absolute;background: white;">
        <thead>
        <tr>
            <th>Col1</th>
            <th>Col2</th>
            <th>Col3</th>
        </tr>
    </thead>
      </table>


    <div style="height: 300px;overflow-y: scroll;">
          <table id="tableMain" class="table table-bordered table-hover" style="table-layout:fixed;overflow-wrap: break-word;cursor:pointer">
<thead>
    <tr>
      <th>Col1</th>
      <th>Col2</th>
      <th>Col3</th>
    </tr>
  </thead>
  <tbody>
     <tr>
       <td>info</td>
       <td>info</td>
       <td>info</td>
     </tr>
     <tr>
       <td>info</td>
       <td>info</td>
       <td>info</td>
     </tr>
     <tr>
       <td>info</td>
       <td>info</td>
       <td>info</td>
     </tr>
  </tbody>

                                    </table>
              </div>
        </div>

1

div.wrapper {
    padding:20px;
}
table.scroll thead {
    width: 100%;
    background: #FC6822;
}
table.scroll thead tr:after {
    content: '';
    overflow-y: scroll;
    visibility: hidden;
}
table.scroll thead th {
    flex: 1 auto;
    display: block;
    color: #fff;
}
table.scroll tbody {
    display: block;
    width: 100%;
    overflow-y: auto;
    height: auto;
    max-height: 200px;
}
table.scroll thead tr,
table.scroll tbody tr {
    display: flex;
}
table.scroll tbody tr td {
    flex: 1 auto;
    word-wrap: break;
}
table.scroll thead tr th,
table.scroll tbody tr td {
    width: 25%;
    padding: 5px;
    text-align-left;
    border-bottom: 1px solid rgba(0,0,0,0.3);
}
<div class="wrapper">
    <table border="0" cellpadding="0" cellspacing="0" class="scroll">
        <thead>
            <tr>
                <th>Name</th>
                <th>Vorname</th>
                <th>Beruf</th>
                <th>Alter</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>Müller</td>
                <td>Marie</td>
                <td>Künstlerin</td>
                <td>26</td>
            </tr>
            <tr>
                <td>Meier</td>
                <td>Stefan</td>
                <td>Chemiker</td>
                <td>52</td>
            </tr>
            <tr>
                <td>Schmidt</td>
                <td>Sabrine</td>
                <td>Studentin</td>
                <td>38</td>
            </tr>
            <tr>
                <td>Mustermann</td>
                <td>Max</td>
                <td>Lehrer</td>
                <td>41</td>
            </tr>
            <tr>
                <td>Müller</td>
                <td>Marie</td>
                <td>Künstlerin</td>
                <td>26</td>
            </tr>
            <tr>
                <td>Meier</td>
                <td>Stefan</td>
                <td>Chemiker</td>
                <td>52</td>
            </tr>
            <tr>
                <td>Schmidt</td>
                <td>Sabrine</td>
                <td>Studentin</td>
                <td>38</td>
            </tr>
            <tr>
                <td>Mustermann</td>
                <td>Max</td>
                <td>Lehrer</td>
                <td>41</td>
            </tr>
            <tr>
                <td>Müller</td>
                <td>Marie</td>
                <td>Künstlerin</td>
                <td>26</td>
            </tr>
            <tr>
                <td>Meier</td>
                <td>Stefan</td>
                <td>Chemiker</td>
                <td>52</td>
            </tr>
            <tr>
                <td>Schmidt</td>
                <td>Sabrine</td>
                <td>Studentin</td>
                <td>38</td>
            </tr>
            <tr>
                <td>Mustermann</td>
                <td>Max</td>
                <td>Lehrer</td>
                <td>41</td>
            </tr>
        </tbody>
    </table>
</div>

การสาธิต: css การสาธิตส่วนหัวของตารางคงที่



0

สิ่งนี้สามารถทำได้โดยใช้การแปลงรูปแบบของคุณสมบัติ สิ่งที่คุณต้องทำคือการห่อตารางของคุณลงใน div บางส่วนที่มีความสูงคงที่และตั้งค่าโอเวอร์โฟลเป็นอัตโนมัติเช่น:

.tableWrapper {
  overflow: auto;
  height: calc( 100% - 10rem );
}

และจากนั้นคุณสามารถแนบตัวจัดการ onscroll ไปที่นี่คุณมีวิธีการที่พบแต่ละตารางห่อด้วย<div class="tableWrapper"></div>:

  fixTables () {
    document.querySelectorAll('.tableWrapper').forEach((tableWrapper) => {
      tableWrapper.addEventListener('scroll', () => {
        var translate = 'translate(0,' + tableWrapper.scrollTop + 'px)'
        tableWrapper.querySelector('thead').style.transform = translate
      })
    })
  }

และนี่คือตัวอย่างการทำงานของสิ่งนี้ในการดำเนินการ (ฉันใช้ bootstrap เพื่อทำให้สวยขึ้น): ซอ

สำหรับผู้ที่ต้องการรองรับ IE และ Edge นี่คือตัวอย่าง:

  fixTables () {
    const tableWrappers = document.querySelectorAll('.tableWrapper')
    for (let i = 0, len = tableWrappers.length; i < len; i++) {
      tableWrappers[i].addEventListener('scroll', () => {
        const translate = 'translate(0,' + tableWrappers[i].scrollTop + 'px)'
        const headers = tableWrappers[i].querySelectorAll('thead th')
        for (let i = 0, len = headers.length; i < len; i++) {
          headers[i].style.transform = translate
        }
      })
    }
  }

ใน IE และ Edge scroll ค่อนข้างล้าหลัง ... แต่ก็ใช้งานได้

นี่คือคำตอบที่ช่วยให้ฉันค้นพบสิ่งนี้: คำตอบ


0

ฉันได้ลองใช้วิธีแก้ปัญหาส่วนใหญ่แล้วและในที่สุดก็พบว่า IMO เป็นทางออกที่ดีที่สุดทันสมัยที่สุด:

CSS กริด


ด้วยกริด CSS คุณสามารถกำหนด 'กริด' และในที่สุดคุณก็สามารถสร้างโซลูชันข้ามเบราว์เซอร์ที่ดีไม่มีจาวาสคริปต์สำหรับตารางที่มีส่วนหัวคงที่และเนื้อหาที่เลื่อนได้ ความสูงของส่วนหัวสามารถเป็นแบบไดนามิกได้

CSS : แสดงเป็นกริดและกำหนดจำนวนtemplate-rows:

.grid {
    display: grid;
    grid-template-rows: 50px auto; // For fixed height header
    grid-template-rows: auto auto; // For dynamic height header
}

HTML : สร้างคอนเทนเนอร์กริดและจำนวนที่กำหนดrows:

<div class="grid">
    <div></div>
    <div></div>
</div>

นี่คือตัวอย่างการทำงาน:

CSS

body {
  margin: 0px;
  padding: 0px;
  text-align: center;
}

.table {
  width: 100%;
  height: 100%;
  display: grid;
  grid-template-rows: 50px auto;
}
.table-heading {
  background-color: #ddd;
}
.table-content {
  overflow-x: hidden;
  overflow-y: scroll;
}

HTML

<html>
    <head>
    </head>
    <body>
        <div class="table">
            <div class="table-heading">
                HEADING
            </div>
            <div class="table-content">
                CONTENT - CONTENT - CONTENT <br/>
                CONTENT - CONTENT - CONTENT <br/>
                CONTENT - CONTENT - CONTENT <br/>
                CONTENT - CONTENT - CONTENT <br/>
                CONTENT - CONTENT - CONTENT <br/>
                CONTENT - CONTENT - CONTENT <br/>
            </div>
        </div>
    </body>
</html>

0

ฉันได้พยายามโดยใช้การเปลี่ยนแปลง: แปล แม้ว่ามันจะทำงานได้ดีใน Firefox และ Chrome แต่ก็ไม่มีฟังก์ชั่นใน IE11 ไม่มีแถบเลื่อนคู่ รองรับตาราง tfoot และคำอธิบาย Javascript ล้วนไม่มี jQuery

http://jsfiddle.net/wbLqzrfb/42/

thead.style.transform="translate(0,"+(dY-top-1)+"px)";

0

ฉันพบวิธีแก้ปัญหาโดยไม่มี jquery

HTML

<table class="fixed_header">
  <thead>
    <tr>
      <th>Col 1</th>
      <th>Col 2</th>
      <th>Col 3</th>
      <th>Col 4</th>
      <th>Col 5</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>row 1-0</td>
      <td>row 1-1</td>
      <td>row 1-2</td>
      <td>row 1-3</td>
      <td>row 1-4</td>
    </tr>
    <tr>
      <td>row 2-0</td>
      <td>row 2-1</td>
      <td>row 2-2</td>
      <td>row 2-3</td>
      <td>row 2-4</td>
    </tr>
    <tr>
      <td>row 3-0</td>
      <td>row 3-1</td>
      <td>row 3-2</td>
      <td>row 3-3</td>
      <td>row 3-4</td>
    </tr>
    <tr>
      <td>row 4-0</td>
      <td>row 4-1</td>
      <td>row 4-2</td>
      <td>row 4-3</td>
      <td>row 4-4</td>
    </tr>
    <tr>
      <td>row 5-0</td>
      <td>row 5-1</td>
      <td>row 5-2</td>
      <td>row 5-3</td>
      <td>row 5-4</td>
    </tr>
    <tr>
      <td>row 6-0</td>
      <td>row 6-1</td>
      <td>row 6-2</td>
      <td>row 6-3</td>
      <td>row 6-4</td>
    </tr>
    <tr>
      <td>row 7-0</td>
      <td>row 7-1</td>
      <td>row 7-2</td>
      <td>row 7-3</td>
      <td>row 7-4</td>
    </tr>
  </tbody>
</table>

CSS

.fixed_header{
    width: 400px;
    table-layout: fixed;
    border-collapse: collapse;
}

.fixed_header tbody{
  display:block;
  width: 100%;
  overflow: auto;
  height: 100px;
}

.fixed_header thead tr {
   display: block;
}

.fixed_header thead {
  background: black;
  color:#fff;
}

.fixed_header th, .fixed_header td {
  padding: 5px;
  text-align: left;
  width: 200px;
}

คุณสามารถเห็นมันทำงานที่นี่: https://jsfiddle.net/lexsoul/fqbsty3h

ที่มา: https://medium.com/@vembarrajan/html-css-tricks-scroll-able-table-body-tbody-d23182ae0fbc

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.