จาก entry คราวที่แล้วเรื่องทำตารางสลับสีแบบง่ายๆ ก็เลยเกิดความสงสัยขึ้นมาว่า ถ้าจะทำตารางสลับสีแนวตั้งละ มันจะทำได้ไหม ถ้าคิดอะไรไม่ออกก็คงต้องใช้ php ลงสีเอาอีกแน่ๆ
แบบนี้แหละที่เราต้องการ ถ้าเขียนโค๊ดก็คงประมาณนี้
<table width="100%" border="1" cellspacing="0" cellpadding="0">
<tr>
<td>COL1</td>
<td bgcolor="#CCCCCC">COL2</td>
<td>COL3</td>
<td bgcolor="#CCCCCC">COL4</td>
<td>COL5</td>
</tr>
<tr>
<td>01</td>
<td bgcolor="#CCCCCC">11</td>
<td>21</td>
<td bgcolor="#CCCCCC">31</td>
<td>41</td>
</tr>
<tr>
<td>02</td>
<td bgcolor="#CCCCCC">12</td>
<td>22</td>
<td bgcolor="#CCCCCC">32</td>
<td>42</td>
</tr>
<tr>
<td>03</td>
<td bgcolor="#CCCCCC">13</td>
<td>23</td>
<td bgcolor="#CCCCCC">33</td>
<td>43</td>
</tr>
</table>
ซึ่งมันดู… ธรรมดามากๆ แถมยังแก้ไขยากอีก ถ้าต้องการเปลี่ยนสีจาก CCC เป็นสีอื่นละ แล้วถ้ามันมีสัก 500 เซล… งานงอกกันทีเดียว
วิธีแก้ปัญหา ไม่ยากเลย ใช้ tag <col> ที่มีมากับ HTML ตั้งแต่แรกแล้ว แต่เราไม่ค่อยได้ใช้กันน่ะสิ วิธีการก็แทรกหลังจาก <table> ก่อนที่จะเริ่ม <tr> เข้าไปตามจำนวคอลั่มที่เรามีแล้วก็กำหนดสีตรง <col> แทน พูดไปไม่ค่อยเข้าใจลองดูตัวอย่างดีกว่า
<table width="100%" border="1" cellspacing="0" cellpadding="0">
<colgroup>
<col />
<col style="background-color:#CCC;" />
<col />
<col style="background-color:#CCC;" />
<col />
</colgroup>
<tr>
<td>COL1</td>
<td>COL2</td>
<td>COL3</td>
<td>COL4</td>
<td>COL5</td>
</tr>
<tr>
<td>01</td>
<td>11</td>
<td>21</td>
<td>31</td>
<td>41</td>
</tr>
<tr>
<td>02</td>
<td>12</td>
<td>22</td>
<td>32</td>
<td>42</td>
</tr>
<tr>
<td>03</td>
<td>13</td>
<td>23</td>
<td>33</td>
<td>43</td>
</tr>
</table>
จากตัวอย่างมีคอลั่มอยู่ห้าแถว เราก็สร้าง <col> มาห้าอัน ส่วน <colgroup> จะใส่หรือไม่ใส่ก็ได้ แต่ผมใส่เพื่อให้ง่ายต่อการเข้าใจว่า <col> เริ่มตรงไหน แล้วจบตรงไหน จากนั้นเราก็ทำการเขียน style เข้าไปในแต่ละคอลั่มเลย ผลลัพธ์ก็เหมือนข้างบนเป๊ะๆ
แต่ถ้ามีหลายคอลั่มละ เราก็ต้องสร้าง style มาเท่ากับจำนวนคอลั่มที่เราต้องการใส่สีเลยสิ มันก็มีปัญหาตอนเราแก้ไขเหมือนเดิม อ่ะ ใช้ style sheet คุมมันอีกทีก็ได้ ลองดูตัวอย่างกัน
<style type="text/css">
.col-table col:nth-child(2n+1) {
background-color:#9F0;
}
.col-table col:first-child {
background-color:#CCC;
}
</style>
<table width="100%" border="1" cellspacing="0" cellpadding="0" class="col-table">
<colgroup>
<col />
<col />
<col />
<col />
<col />
<col />
<col />
<col />
</colgroup>
<tr>
<td>COL0</td>
<td>COL1</td>
<td>COL2</td>
<td>COL3</td>
<td>COL4</td>
<td>COL5</td>
<td>COL6</td>
<td>COL7</td>
<td>COL8</td>
</tr>
<tr>
<td>01</td>
<td>11</td>
<td>21</td>
<td>31</td>
<td>41</td>
<td>51</td>
<td>61</td>
<td>71</td>
<td>81</td>
</tr>
<tr>
<td>02</td>
<td>12</td>
<td>22</td>
<td>32</td>
<td>42</td>
<td>52</td>
<td>62</td>
<td>72</td>
<td>82</td>
</tr>
<tr>
<td>03</td>
<td>13</td>
<td>23</td>
<td>33</td>
<td>43</td>
<td>53</td>
<td>63</td>
<td>71</td>
<td>83</td>
</tr>
</table>
เราก็จะได้ผลลัพธ์แบบนี้
แล้วทำไมแถวสุดท้ายถึงไม่เปลี่ยนสี ลองดูตรง <col> สิครับ ผมใส่ไปแค่แปดอันแต่จำนวนแถวมีเก้าแถว เพราะฉะนั้นเราจำเป็นจะต้องใส่ <col> ให้ครบตามจำนวนแถวที่เรามี ส่วน (2n+1) เป็นสมาการง่ายๆ ถ้าหากเราแทนที่ n ด้วยจำนวน 0,1,2,3 … ผลลัพธ์ก็จะเป็นเลขคี่ ซึ่งก็คือหมายเลขของ <col> ที่เราต้องการเท่านั้นเอง ส่วนสาเหตุที่ต้องใส่ first-child ไปด้วยนั้น เพราะสมาการ 2n+1 ถ้า n=0 จะหมายถึงแถวแรกนั่นเอง แต่ถ้าไม่ต้องการเปลี่ยนสีแถวเราก็ไม่จำเป็นต้องใส่
ถ้าเราแทนที่ตัวเลขเข้าไปในสมาการเลย ก็จะเป็นการระบุตำแหน่งของ <col> ไปเลยก็สามารถทำได้เหมือนกัน
<style type="text/css">
.col-table col:nth-child(2n+1) {
background-color:#9F0;
}
.col-table col:first-child {
background-color:#CCC;
}
.col-table col:nth-child(4) {
background-color:#F00;
}
.col-table col:nth-child(6) {
background-color:#99FFFF;
}
</style>
เห็นไหมไม่ยากเลย แถมโค๊ดยังดูสะอาดเรียบร้อยอีก เราสามารถประยุกต์ใช้งานกับ tag อื่นๆ อย่าง <li> ได้อีกไม่รู้จบเลย แล้วเจอกันใหม่คราวหน้าครับ 🙂


