ส่วนหัวตาราง HTML มองเห็นได้เสมอที่ด้านบนของหน้าต่างเมื่อดูตารางขนาดใหญ่


169

ฉันต้องการ "ปรับแต่ง" งานนำเสนอของตาราง HTML เพื่อเพิ่มคุณสมบัติเดียว: เมื่อเลื่อนลงไปตามหน้าเพื่อให้ตารางอยู่บนหน้าจอ แต่แถวส่วนหัวอยู่นอกหน้าจอฉันต้องการให้ส่วนหัวอยู่ มองเห็นได้ที่ด้านบนของพื้นที่ดู

นี่จะเป็นแนวคิดเหมือนกับคุณลักษณะ "หยุดบานหน้าต่าง" ใน Excel อย่างไรก็ตามหน้า HTML อาจมีหลายตารางและฉันต้องการให้เกิดขึ้นสำหรับตารางที่อยู่ในมุมมองปัจจุบันเท่านั้นในขณะที่อยู่ในมุมมอง

หมายเหตุ: ฉันเห็นวิธีแก้ไขปัญหาหนึ่งที่พื้นที่ข้อมูลของตารางสามารถเลื่อนได้ในขณะที่ส่วนหัวไม่เลื่อน นั่นไม่ใช่ทางออกที่ฉันกำลังมองหา


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

6
ฉันเพิ่งเขียนปลั๊กอินที่ทำสิ่งนี้: programmingdrunk.com/floatThead
mkoryak

1
นอกจากวิธีแก้ปัญหาที่ได้รับคะแนนสูงสุดและอนุพันธ์ของมันด้านล่างแล้วปลั๊กอินของ @mkoryak ด้านบนก็ค่อนข้างดีเช่นกัน อย่าลืมมองดูด้วยก่อนที่คุณจะ "ช็อปปิ้ง" เสร็จสิ้น
DanO

ขอบคุณแดน :) ฉันมีคุณสมบัติเตะตูดวางแผนไว้สำหรับการเปิดตัวต่อไปด้วย
mkoryak

ฉันสอง @mkoryak floatThead plugin - ฉันสามารถรวมเข้ากับมันได้อย่างรวดเร็ว ขอบคุณมากสำหรับปลั๊กอิน!
w5m

คำตอบ:


67

ลองใช้jQuery.floatThead ( ตัวอย่างที่มีอยู่ ) ซึ่งเจ๋งมากสามารถทำงานกับDataTables ได้และสามารถทำงานภายในoverflow: autoคอนเทนเนอร์ได้ด้วย


ใช่มันทำงานได้กับการเลื่อนแนวนอน, การเลื่อนหน้าต่าง, การเลื่อนภายในและการปรับขนาดหน้าต่าง
mkoryak

คุณสามารถเพิ่มซอที่มีรหัสการทำงานหรือไม่? (ฉันรู้ว่ามีอยู่ในเว็บไซต์ ... )
Michel Ayres

12
ฉันได้สร้างหน้าตัวอย่าง / เอกสารขนาดใหญ่ ทำไมคุณต้องเล่นซอ?
mkoryak

5
@MustModify stackoverflow ไม่ใช่สถานที่ที่ดีสำหรับการถามคำถาม รายงานปัญหาเกี่ยวกับ GitHub แม้ว่ามันจะเป็นเพียงคำถามเกี่ยวกับวิธีการทำงาน ป่วยตอบมักจะมีในภายใต้วัน ที่นี่ไม่ดีอาจจะตอบสนองในเวลาเพียงปีภายใต้ :)
mkoryak

1
@MustModify สำหรับสิ่งที่คุ้มค่าไม่มีคลาสใดบนตารางในตัวอย่างที่เกี่ยวข้อง ปลั๊กอินไม่ต้องการ css หรือคลาสใด ๆ ให้ทำงานตามที่เอกสารของฉันบอก
mkoryak

135

ผมได้ทำวิธีการแก้ปัญหาการพิสูจน์ของแนวคิดการใช้jQuery

ดูตัวอย่างได้ที่นี่

ฉันได้รับรหัสนี้ในที่เก็บ Mercurial bitbucketแล้ว ไฟล์หลักคือtables.htmlแฟ้มหลักคือ

ฉันตระหนักถึงปัญหาหนึ่งของสิ่งนี้: หากตารางมีจุดยึดและถ้าคุณเปิด URL ที่มีจุดยึดที่ระบุในเบราว์เซอร์เมื่อหน้าโหลดแถวแถวที่ยึดจะถูกบดบังโดยส่วนหัวลอย

อัปเดต 2017-12-11:ฉันเห็นว่าสิ่งนี้ไม่ทำงานกับ Firefox ปัจจุบัน (57) และ Chrome (63) ไม่แน่ใจว่าเมื่อใดและเพราะเหตุใดสิ่งนี้หยุดทำงานหรือวิธีการแก้ไข แต่ตอนนี้ฉันคิดว่าคำตอบที่ได้รับการยอมรับจาก Hendy Irawanนั้นเหนือกว่า


ฉันต้องการสิ่งนี้สำหรับสิ่งที่ฉันทำ ความช่วยเหลือที่ดีขอบคุณ กับของฉันฉันไม่ได้ใช้หน้าต่างเนื่องจากบานหน้าต่างเลื่อนเป็น div ภายใน html ดังนั้นผมจึงต้องเปลี่ยนfloatingHeaderRow.css("top", Math.min(scrollTop - offset.top, $(this).height() - floatingHeaderRow.height()) + "px");ไปfloatingHeaderRow.css("top", scrollTop + "px");เช่นเดียวกับรหัสที่คุณมีส่วนหัวของตารางก็กระโดดต่อไปลงหน้าเพื่อหายไปในที่สุดปิดหน้า
Nalum

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

อืมฉันไม่แน่ใจตามคำอธิบายของคุณ ฉันแนะนำ 1) ถ้าเป็นไปได้แสดงตัวอย่างออนไลน์; 2) ถามเป็นคำถามใน StackOverflow
Craig McQueen

@ JonYork ฉันมีปัญหาเดียวกันทุกประการ ปัญหาของฉันใช้ <td> ในส่วนหัวแทน <th> ดังนั้นจึงไม่สามารถใช้ความกว้างของแต่ละคอลัมน์กับ <th> ที่ไม่มีอยู่จริง (ดู// Copy cell widths from original headerส่วนของรหัส) @ Craig McQueen โปรดแก้ไขคำตอบของคุณเพื่อให้ไม่มีใครทำผิดพลาด
aexl

@CraigMcQueen เมื่อฉันใช้รหัสที่ยอดเยี่ยมของคุณ (ขอบคุณ) มันหยุดบนตารางที่สองที่ฉันมีซึ่งอยู่หลังแท็บอื่น (ปลั๊กอินแท็บ jQuery) ความคิดใด ๆ ส่วนหัวถูกวางไว้ที่ด้านซ้ายสุดแทนที่จะติดตามคอลัมน์ตำแหน่ง แต่ทำงานได้อย่างสมบูรณ์บนโต๊ะในแท็บ jQuery แรก
Richard Żak

68

เครกฉันปรับแต่งโค้ดของคุณเล็กน้อย (ในบรรดาสิ่งอื่น ๆ ที่ตอนนี้ใช้ position: fixed) และห่อมันเป็นปลั๊กอิน jQuery

ลองที่นี่: http://jsfiddle.net/jmosbech/stFcx/

และรับแหล่งข้อมูลที่นี่: https://github.com/jmosbech/StickyTableHeaders


1
เป็นความคิดที่ดีที่จะสร้างปลั๊กอิน jQuery คำถามสองข้อ: (1) มันทำงานได้ดีกับการเลื่อนในแนวนอนหรือไม่? (2) มันทำงานอย่างไรเมื่อคุณเลื่อนลงเพื่อให้ด้านล่างของตารางเลื่อนออกจากด้านบนของหน้าต่าง ตัวอย่างไม่อนุญาตให้ทำการทดสอบในกรณีเหล่านั้น
Craig McQueen

ตัวอย่าง jsfiddle ของคุณใช้งานได้ดีกับ tablesorter แต่โค้ดบน github ไม่ได้ คุณต้องแก้ไขรหัส tablesorter หรือไม่?
ericslaw

Craig การเลื่อนในแนวนอนไม่น่าจะมีปัญหาเพราะส่วนหัวถูกจัดตำแหน่งใหม่ทั้งในแนวนอนและแนวตั้งบนการเลื่อนและปรับขนาด สำหรับคำถามที่สองของคุณ: ส่วนหัวจะถูกซ่อนเมื่อตารางออกจากวิวพอร์ต
jmosbech

เอริคมันแปลก คุณพยายามเปิด /demo/tablesorter.htm จาก Github หรือไม่? ฉันยังไม่ได้แก้ไขรหัส tablesorter แต่เพื่อที่จะทำให้มันทำงานคุณต้องใช้ปลั๊กอิน StickyTableHeader ก่อนที่ tableorter
jmosbech

2
การเลื่อนแนวขอบฟ้านั้นใช้งานไม่ได้หลังจากเลื่อนไประยะทางค่อนข้างมากตำแหน่งของ thead จะอยู่ทางด้านซ้ายเมื่อเลื่อนหน้าจอออกมากกว่าเมื่อวางตำแหน่งตามปกติเป็นส่วนหนึ่งของตาราง
Nathan Phillips

16

หากคุณกำลังกำหนดเป้าหมายเบราว์เซอร์ที่สอดคล้องกับ css3 ที่ทันสมัย ​​( การสนับสนุนเบราว์เซอร์: https://caniuse.com/#feat=css-sticky ) คุณสามารถใช้งานposition:stickyได้ซึ่งไม่จำเป็นต้องใช้ JS และจะไม่ทำลายเค้าโครงตารางที่ไม่ตรง และ td ของคอลัมน์เดียวกัน และไม่ต้องการความกว้างคอลัมน์คงที่เพื่อให้ทำงานได้อย่างถูกต้อง

ตัวอย่างสำหรับแถวส่วนหัวเดียว:

thead th
{
    position: sticky;
    top: 0px;
}

สำหรับผู้ที่มี 1 หรือ 2 แถวคุณสามารถใช้สิ่งนี้:

thead > :last-child th
{
    position: sticky;
    top: 30px; /* This is for all the the "th" elements in the second row, (in this casa is the last child element into the thead) */
}

thead > :first-child th
{
    position: sticky;
    top: 0px; /* This is for all the the "th" elements in the first child row */
}

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

วิธีแก้ปัญหาทั้งสองทำงานแม้ว่าคุณจะมีมากกว่าหนึ่งตารางในหน้าเดียวกัน: thองค์ประกอบของแต่ละคนเริ่มเหนียวเมื่อตำแหน่งด้านบนของมันเป็นหนึ่งที่ระบุไว้ในคำนิยาม css และหายไปเมื่อทุกตารางเลื่อนลง ดังนั้นหากมีตารางมากขึ้นทั้งหมดทำงานอย่างสวยงามในแบบเดียวกัน

ทำไมต้องใช้ลูกคนสุดท้ายก่อนและลูกคนแรกหลังจากใน CSS?

เนื่องจากเบราว์เซอร์มีการแสดงผลกฎ css ตามลำดับเดียวกับที่คุณเขียนลงในไฟล์ css และเนื่องจากสิ่งนี้หากคุณมีเพียง 1 แถวในองค์ประกอบ thead แถวแรกจะพร้อมกันแถวสุดท้ายพร้อมกันและกฎลูกคนแรกต้องการ เพื่อแทนที่เด็กคนสุดท้าย ถ้าไม่ใช่คุณจะมีการชดเชยของแถว 30 px จากระยะขอบบนซึ่งฉันคิดว่าคุณไม่ต้องการ

ปัญหาที่ทราบของตำแหน่ง: เหนียวคือมันไม่ทำงานในองค์ประกอบ thead หรือแถวตาราง: คุณต้องกำหนดเป้าหมายองค์ประกอบที่ การข้ามปัญหานี้จะได้รับการแก้ไขในเวอร์ชันของเบราว์เซอร์ในอนาคต


ตัวอย่างแรกไม่ทำงานใน Firefox (61) อย่างไรก็ตามถ้าตั้งค่าตำแหน่งเหนียวบน thead มันก็จะเป็นเช่นนั้น
ewh

1
คุณสามารถทำได้thead tr+tr thเพื่อกำหนดเป้าหมายแถวที่สอง
Teepeemm

5

ทางเลือกที่เป็นไปได้

JS-ลอยตารางส่วนหัว

js-floating-table-header (Google Code)

ใน Drupal

ฉันมีเว็บไซต์ Drupal 6 ฉันอยู่ในหน้า "โมดูล" ของผู้ดูแลระบบและสังเกตว่าตารางมีคุณลักษณะที่แน่นอนนี้!

tableheader.jsมองไปที่รหัสที่ดูเหมือนว่าจะดำเนินการโดยไฟล์ที่เรียกว่า sticky-enabledซึ่งจะใช้คุณลักษณะในตารางทั้งหมดกับการเรียน

สำหรับเว็บไซต์ Drupal ฉันต้องการใช้tableheader.jsโมดูลนั้นตามที่เป็นอยู่สำหรับเนื้อหาของผู้ใช้ tableheader.jsดูเหมือนจะไม่ปรากฏในหน้าเนื้อหาของผู้ใช้ใน Drupal ฉันโพสต์ข้อความในฟอรัมเพื่อถามว่าจะแก้ไขธีม Drupal ได้อย่างไร ตามการตอบสนองtableheader.jsสามารถเพิ่มชุดรูปแบบ Drupal โดยใช้drupal_add_js()ในชุดรูปแบบtemplate.phpดังนี้:

drupal_add_js('misc/tableheader.js', 'core');

ลิงก์ Google Code ของคุณมีประโยชน์มากสำหรับฉัน
Vilius Gaidelis

5

ฉันพบปัญหานี้เมื่อไม่นานมานี้ น่าเสียดายที่ฉันต้องทำ 2 ตารางหนึ่งสำหรับส่วนหัวและอีกหนึ่งสำหรับร่างกาย มันอาจไม่ใช่วิธีที่ดีที่สุด แต่ไปที่นี่:

<html>
<head>
    <title>oh hai</title>
</head>
<body>
    <table id="tableHeader">
        <tr>
            <th style="width:100px; background-color:#CCCCCC">col header</th>
            <th style="width:100px; background-color:#CCCCCC">col header</th>
        </tr>
    </table>
    <div style="height:50px; overflow:auto; width:250px">
        <table>
            <tr>
                <td style="height:50px; width:100px; background-color:#DDDDDD">data1</td>
                <td style="height:50px; width:100px; background-color:#DDDDDD">data1</td>
            </tr>
            <tr>
                <td style="height:50px; width:100px; background-color:#DDDDDD">data2</td>
                <td style="height:50px; width:100px; background-color:#DDDDDD">data2</td>
            </tr>
        </table>
    </div>
</body>
</html>

มันใช้งานได้สำหรับฉันมันอาจไม่ใช่วิธีที่หรูหรา แต่ก็ใช้ได้ดี ฉันจะตรวจสอบเพื่อดูว่าฉันสามารถทำสิ่งที่ดีกว่า แต่มันช่วยให้หลายตาราง

ไปอ่านเกี่ยวกับความเหมาะสมอย่างล้นเหลือเพื่อดูว่ามันเหมาะกับความต้องการของคุณหรือไม่


อืมไม่ทำงานผมจะพยายามแก้ไขปัญหานี้ แต่ยังคงเป็นวิธีการที่คุณจะต้องใช้หน่วยความจำล้น: Proprety อัตโนมัติ
Gab Royer

ฉันขอขอบคุณวิธีแก้ปัญหาและความเรียบง่ายของคุณ แต่ในคำถามของฉันฉันพูดว่า "หมายเหตุ: ฉันเคยเห็นวิธีแก้ปัญหาหนึ่งที่พื้นที่ข้อมูลของตารางถูกทำให้เลื่อนได้ในขณะที่ส่วนหัวไม่ได้เลื่อน
Craig McQueen

@GabRoyer หน้า w3school ที่คุณอ้างถึงไม่มีอยู่
Farhan

ดูเหมือนว่าพวกเขาจะย้ายมัน แก้ไขแล้ว
Gab Royer

ปัญหาอีกประการหนึ่งของวิธีการนี้คือถ้าคุณต้องการปรับคอลัมน์บางส่วนกับเนื้อหาอื่น ๆ คุณอาจเสี่ยงที่จะแยกการจัดตำแหน่งของพวกเขาด้วยส่วนหัวคอลัมน์ที่เกี่ยวข้อง IMHO มันจะดีกว่าที่จะเผชิญกับปัญหานี้ด้วยวิธีการที่ช่วยให้การจัดการเนื้อหาแบบไดนามิกที่ทำให้การจัดเรียงคอลัมน์และหัวสัมพันธ์สมบูรณ์แบบ ดังนั้นตำแหน่ง IMHO = เหนียวเป็นวิธีที่จะไป
willka wonka

3

นี่เป็นสิ่งที่ยุ่งยากหากมีหัวกระดาษที่เหนียวบนโต๊ะของคุณ ฉันมีความต้องการเดียวกัน แต่ด้วยasp: GridViewและจากนั้นฉันคิดว่ามันมีส่วนหัวที่เหนียวใน gridview มีวิธีแก้ไขปัญหามากมายและฉันใช้เวลา 3 วันพยายามแก้ปัญหาทั้งหมด แต่ไม่มีวิธีใดแก้ปัญหาได้

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

ด้วยวิธีแก้ปัญหาบางอย่างฉันก็มีปัญหาเรื่องการทับส่วนหัวกับสองสามแถวแรกของร่างกายซึ่งทำให้แถวร่างกายถูกซ่อนอยู่ด้านหลังส่วนหัวลอย

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

ด้านล่างเป็นตารางตัวอย่าง

<div class="table-holder">
        <table id="MyTable" cellpadding="4" cellspacing="0" border="1px" class="customerTable">
            <thead>
                <tr><th>ID</th><th>First Name</th><th>Last Name</th><th>DOB</th><th>Place</th></tr>
            </thead>
            <tbody>
                <tr><td>1</td><td>Customer1</td><td>LastName</td><td>1-1-1</td><td>SUN</td></tr>
                <tr><td>2</td><td>Customer2</td><td>LastName</td><td>2-2-2</td><td>Earth</td></tr>
                <tr><td>3</td><td>Customer3</td><td>LastName</td><td>3-3-3</td><td>Mars</td></tr>
                <tr><td>4</td><td>Customer4</td><td>LastName</td><td>4-4-4</td><td>Venus</td></tr>
                <tr><td>5</td><td>Customer5</td><td>LastName</td><td>5-5-5</td><td>Saturn</td></tr>
                <tr><td>6</td><td>Customer6</td><td>LastName</td><td>6-6-6</td><td>Jupitor</td></tr>
                <tr><td>7</td><td>Customer7</td><td>LastName</td><td>7-7-7</td><td>Mercury</td></tr>
                <tr><td>8</td><td>Customer8</td><td>LastName</td><td>8-8-8</td><td>Moon</td></tr>
                <tr><td>9</td><td>Customer9</td><td>LastName</td><td>9-9-9</td><td>Uranus</td></tr>
                <tr><td>10</td><td>Customer10</td><td>LastName</td><td>10-10-10</td><td>Neptune</td></tr>
            </tbody>
        </table>
    </div>

หมายเหตุ : ตารางถูกรวมเข้าไปใน DIV พร้อมกับแอตทริบิวต์ class เท่ากับ 'table-holder'

ด้านล่างเป็นสคริปต์ JQuery ที่ฉันเพิ่มในส่วนหัวของหน้า html ของฉัน

<script src="../Scripts/jquery-1.7.2.min.js" type="text/javascript"></script>
<script src="../Scripts/jquery-ui.min.js" type="text/javascript"></script>
<script type="text/javascript">
    $(document).ready(function () {
        //create var for table holder
        var originalTableHolder = $(".table-holder");
        // set the table holder's with
        originalTableHolder.width($('table', originalTableHolder).width() + 17);
        // Create a clone of table holder DIV
        var clonedtableHolder = originalTableHolder.clone();

        // Calculate height of all header rows.
        var headerHeight = 0;
        $('thead', originalTableHolder).each(function (index, element) {
            headerHeight = headerHeight + $(element).height();
        });

        // Set the position of cloned table so that cloned table overlapped the original
        clonedtableHolder.css('position', 'relative');
        clonedtableHolder.css('top', headerHeight + 'px');

        // Set the height of cloned header equal to header height only so that body is not visible of cloned header
        clonedtableHolder.height(headerHeight);
        clonedtableHolder.css('overflow', 'hidden');

        // reset the ID attribute of each element in cloned table
        $('*', clonedtableHolder).each(function (index, element) {
            if ($(element).attr('id')) {
                $(element).attr('id', $(element).attr('id') + '_Cloned');
            }
        });

        originalTableHolder.css('border-bottom', '1px solid #aaa');

        // Place the cloned table holder before original one
        originalTableHolder.before(clonedtableHolder);
    });
</script>

และสุดท้ายคือ CSS class สำหรับการระบายสี

.table-holder
{
    height:200px;
    overflow:auto;
    border-width:0px;    
}

.customerTable thead
{
    background: #4b6c9e;        
    color:White;
}

ดังนั้นความคิดทั้งหมดของตรรกะนี้คือการวางตารางลงใน div เจ้าของโต๊ะและสร้างโคลนของเจ้าของที่ด้านลูกค้าเมื่อโหลดหน้า ตอนนี้ซ่อนเนื้อความของตารางภายในที่ยึดโคลนและวางส่วนหัวส่วนที่เหลือไปยังส่วนหัวเดิม

โซลูชันเดียวกันยังสามารถใช้งานได้กับ asp: gridview คุณต้องเพิ่มอีกสองขั้นตอนเพื่อให้บรรลุใน gridview

  1. ในเหตุการณ์ OnPrerender ของวัตถุ gridview ในหน้าเว็บของคุณให้ตั้งค่าส่วนตารางของแถวส่วนหัวเท่ากับ TableHeader

    if (this.HeaderRow != null)
    {
        this.HeaderRow.TableSection = TableRowSection.TableHeader;
    }
  2. <div class="table-holder"></div>และห่อของคุณลงในตาราง

หมายเหตุ : หากส่วนหัวของคุณมีตัวควบคุมที่คลิกได้คุณอาจต้องเพิ่ม jQuery script เพื่อส่งเหตุการณ์ที่เกิดขึ้นในส่วนหัวที่ถูกโคลนไปยังส่วนหัวดั้งเดิม รหัสนี้มีอยู่แล้วใน jQuery ปลั๊กอินส่วนหัวที่สร้างโดยjmosbech


+1 สำหรับความพยายามที่ดี แต่สำหรับตารางขนาดใหญ่ที่มีข้อมูลจำนวนมากมันไม่ดีเลยที่จะลอกแบบทั้งหมด ... ฉันคิดว่ามันจะเพิ่มเวลาในการโหลดสองเท่า
khaverim

2

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

ดูกรอบ JavaScript ยอดนิยม (jQuery, MooTools, YUI ฯลฯ ฯลฯ ) เพื่อดูว่าพวกเขาสามารถทำสิ่งที่คุณต้องการหรือทำให้ง่ายขึ้นในการทำสิ่งที่คุณต้องการ


1
ขอบคุณสำหรับคำแนะนำ. ฉันได้แก้ปัญหาโดยใช้ jQuery - ดูคำตอบของฉัน
Craig McQueen

ฉันลองสิ่งนี้และฉันคิดว่าคุณหมายถึงตำแหน่งแทนที่จะแสดง แต่ก็ไม่ได้ทำงานให้กับ thead ใน chome
ericslaw

@ericslaw Ack - position: fixedใช่ฉันหมายถึง ขออภัยมันใช้ไม่ได้กับ Chrome
Staticsan

ทำให้ส่วนหัวของฉันยุ่งโดยเพิกเฉยสไตล์ความกว้าง
pavel_kazlou

2

หากคุณใช้ตารางแบบเต็มหน้าจอคุณอาจสนใจที่จะตั้งค่าให้แสดง: แก้ไข; และด้านบน: 0; หรือลองใช้วิธีการที่คล้ายกันมากผ่านทาง CSS

ปรับปรุง

เพียงสร้างโซลูชันที่ใช้งานได้อย่างรวดเร็วด้วย iframes (html4.0) ตัวอย่างนี้ไม่ได้เป็นไปตามมาตรฐานอย่างไรก็ตามคุณจะสามารถแก้ไขได้อย่างง่ายดาย:

outer.html

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">   
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">     
    <head>      
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />   
        <title>Outer</title>
  <body>
    <iframe src="test.html" width="200" height="100"></iframe>
    </body>
</html> 

test.html

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">   
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">     
    <head>      
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />   
        <title>Floating</title>
    <style type="text/css">
      .content{
        position:relative; 
      }

      thead{
        background-color:red;
        position:fixed; 
        top:0;
      }
    </style>
  <body>
    <div class="content">      
      <table>
        <thead>
          <tr class="top"><td>Title</td></tr>
        </head>
        <tbody>
          <tr><td>a</td></tr>
          <tr><td>b</td></tr>
          <tr><td>c</td></tr>
          <tr><td>d</td></tr>
          <tr><td>e</td></tr>
          <tr><td>e</td></tr>
          <tr><td>e</td></tr>
          <tr><td>e</td></tr>
          <tr><td>e</td></tr>
          <tr><td>e</td></tr>
        </tbody>
      </table>
    </div>
    </body>
</html> 

@ a_m0d ถูกต้อง ... แต่คำขอดูสับสนมาก ไม่ว่าเราจะเข้าใจผิดหรือผู้ถามไม่เข้าใจสิ่งที่เขาต้องการอย่างสมบูรณ์
Sampson

นี่เป็นวิธีการแก้ปัญหาโดยใช้ javascript imaputz.com/cssStuff/bigFourVersion.html
4322 merkuro

2

คำตอบที่ง่ายที่สุดเพียงใช้ CSS: D !!!

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

table thead tr th {
  /* you could also change td instead th depending your html code */
  background-color: green;
  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>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>data</td>
       <td>data</td>
       <td>data</td>
     </tr>
     <tr>
       <td>david</td>
       <td>castro</td>
       <td>rocks!</td>
     </tr>
  </tbody>
</table>


1
ขอบคุณ David มันเป็นวิธีที่ดีที่สุดที่ฉันเคยพบในคำถามนี้
Tomasz Smykowski

0

การพิสูจน์แนวคิดที่คุณทำนั้นยอดเยี่ยมมาก! อย่างไรก็ตามฉันยังพบปลั๊กอิน jQuery นี้ซึ่งดูเหมือนว่าจะทำงานได้ดีมาก หวังว่ามันจะช่วย!


รูปลักษณ์ที่ราวกับว่ามันดำเนินคุณลักษณะที่แตกต่างกัน อย่างที่ฉันพูดไว้ในคำถามเดิมของฉัน: "หมายเหตุ: ฉันเคยเห็นวิธีแก้ปัญหาหนึ่งที่พื้นที่ข้อมูลของตารางนั้นสามารถเลื่อนได้ในขณะที่ส่วนหัวไม่เลื่อนนั่นไม่ใช่วิธีที่ฉันกำลังมองหา"
Craig McQueen

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

0

เป็นเรื่องที่น่าหงุดหงิดที่สิ่งที่ใช้งานได้ดีในเบราว์เซอร์เดียวไม่สามารถทำงานได้ในเบราว์เซอร์อื่น การทำงานต่อไปนี้ใน Firefox แต่ไม่ใช่ใน Chrome หรือ IE:

<table width="80%">

 <thead>

 <tr>
  <th>Column 1</th>
  <th>Column 2</th>
  <th>Column 3</th>
 </tr>

 </thead>

 <tbody style="height:50px; overflow:auto">

  <tr>
    <td>Cell A1</td>
    <td>Cell B1</td>
    <td>Cell C1</td>
  </tr>

  <tr>
    <td>Cell A2</td>
    <td>Cell B2</td>
    <td>Cell C2</td>
  </tr>

  <tr>
    <td>Cell A3</td>
    <td>Cell B3</td>
    <td>Cell C3</td>
  </tr>

 </tbody>

</table>

4
ฉันลองใช้งานใน Firefox 8.0 และดูเหมือนจะไม่ทำอะไรเลย มันทำอะไร?
Craig McQueen

คือpxอะไร เป็นหน่วยดั้งเดิมที่ผู้คนใช้ในยุค 90 เมื่ออุปกรณ์แสดงผลเคยมีขนาด 72 dpi หรือไม่?
เซเว่น

ฉันเห็นด้วย: มันน่าผิดหวังมาก แต่น่าเสียดายที่นักพัฒนาเบราว์เซอร์ไม่เคารพมาตรฐานในทุกสถานการณ์ ... และหลายปีที่ผ่านมาก็ยิ่งแย่ลง! ตอนนี้บางประเด็นที่ได้รับการแก้ไขและอื่น ๆ พฤติกรรมเบราว์เซอร์ในทางที่ได้มาตรฐานมากขึ้น แต่จำนวนมากของขั้นตอนยังคงต้องทำยัง: ความหวังให้ของและอธิษฐาน :-)
วิลลี่วองก้า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.