Faux Columns using jQuery

เคยเจอปัญหานี้กันหรือเปล่า…

ออกแบบ layout แบบสองคอลัมน์ (หรือมากกว่า) โดยใช้ div + float แต่พอเจอ content มากๆ ความสูงของ div มันกลับไม่เท่ากัน ทำให้ไม่สามารถใส่ background-color ให้กับคอลัมน์ที่สั้นกว่าได้ (ส่วนมากจะเป็น navigation menu)

Faux Columns คือนิยามของเรื่องข้างบนที่ A List Apart ให้ไว้ – เขาใช้การใส่ background image สลับข้าง คือให้เป็นพื้นหลังของข้างที่ยาวกว่า

ผมมีวิธีแก้ปัญหาอีกทางหนึ่ง โดยใช้ JavaScript เข้ามาช่วย

สมมุติว่ามีโค้ดแบบนี้

HTML

<div id="wrapper">
<h1 id="header">Site Header</h1>
<div id="main">
<div id="sidebar">
<!-- Main Navigation-->
<ul id="navigation">
...
</ul>
</div>
<div id="content">
...
</div>
<div class="clear"/>
</div>
</div>
<div id="footer">
...
</div>

CSS

#wrapper {
margin: 0 auto;
width: 780px;
}
#sidebar {
float: left;
width: 200px;
}
#content {
float: left;
padding: 20px 25px;
width: 520px;
}

หน้าตาที่ได้จะเป็นตามรูปข้างล่าง

tissues_fauxcol_1

วิธีแก้คือใช้ DOM หาค่าความสูงของคอลัมน์ที่ยาวที่สุด (ในที่นี้คือ content) จากนั้นก็ update ให้มันเท่ากันซะ

JavaScript

function equalHeight() {
var sidebarHeight = $('#sidebar').height();
var contentHeight = $('#content').height() + 40; // 40 is padding top + bottom of content

// If sidebar is shorter, update sidebar's height to equal the content panel
if(sidebarHeight < contentHeight) {
$('#sidebar').height(contentHeight);
}
}

ผลลัพธ์

tissues_fauxcol_2

ในตัวอย่างผมใช้ jQuery เพราะมันหา dimension ง่ายดี – ใครจะใช้ native DOM หาความสูงเองก็ใช้ได้เหมือนกัน

ถึงมันจะยุ่งกว่าการใช้ table นิดหน่อยแต่ก็ไม่เสีย web accessibility ล่ะนะ

Download Sample Code

6 Comments

  1. SY
    Posted March 4, 2009 at 7:39 am | #

    เยี่ยมครับ

  2. Hana
    Posted March 4, 2009 at 1:46 pm | #

    ยังมีเวลาเขียนบล๊อคอีกหรอเนี่ย ยอดมนุษย์เจรง ๆ

  3. Orbit
    Posted March 16, 2009 at 10:50 pm | #

    ผมยังไม่เข้าใจเลย ว่าทำไมเค้าไม่ให้ทำ layout ด้วย table ><

  4. Posted March 16, 2009 at 11:13 pm | #

    เอาแบบกำปั้นทุบดินคือ มันไม่ได้เกิดมาเพื่อสิ่งนี้อ่ะกิ๊ฟ >*<

    เอาแบบดีๆ

    table มีไว้แสดง tabular data (ข้อมูลที่มีหลาย attribute ใน 1 record) เช่นตารางสินค้า ตารางนู่นนี่ มันจึงไม่ได้ถูกออกแบบมาทำเลย์เอาท์ – เหมือนที่เลื่อยมีไว้ตัดต้นไม้ ไม่ได้มีไว้หั่นผัก
    table ทำลาย accessibility เช่นเวลากด tab มันจะ focus ไปยัง cell ต่อไป ทั้งๆที่เราอยากให้เริ่มจาก main menu > side bar > content แต่พอใช้ table จะมั่วไปหมด (เรื่องนี้คนอาจจะมองว่าไม่สำคัญ แต่ google เห็นสำคัญเน่อ)
    table ทำให้โหลดช้ากว่า อาจจะไม่มาก แต่ถ้า nest table เยอะๆ ประมาณว่าลากๆเอาจาก dream weaver จะเกิด code ที่ไม่จำเป็น (เราเรียกโค้ดขยะ) เยอะขึ้นเรื่อยๆ
    ลองเปิดด้วย device อื่นที่ไม่ใช่ desktop browser อย่างพวก mobile จะเห็นความสำคัญของ accessibility มากขึ้น – แล้วจะรัก table น้อยลง :)

    ส่วนนี่ความเห็นของฝรั่งเขา

  5. baLLe
    Posted March 18, 2009 at 12:45 pm | #

    อันนี้ผมมีประสบการณ์ตรงเลยฮะ ลำบากจริงๆ

    สุดท้ายผมก็…table ซิครับ เอ๊กๆ

    ปล. ส่วนตัวผมว่าถ้าต้องโหลด script มา optimize layout (แบบธรรมดา) มันดูโหดร้ายอยู่เหมอืนกันนะครับ

  6. Posted July 11, 2010 at 5:34 pm | #

    одноклассников, с которой я поеду в этот день чет как пиво перестал как обычно – вроди надо чего-то написать. Также обдуман план по

Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>