ปวดหัวเหลือเกินกับคุณอี(ไออี)หก ที่ไม่ยอมสูญพันธ์เสียที บางทีเสียเวลาเกือบทั้งวันเพื่อแก้ปัญหาใน CSS ที่แสดงผลผิดเพี้ยนในไออี6 ทั้งๆที่ชาวบ้าน (ชาวบ้าน ได้แก่ ไออี 7 ขึ้นไป , firefox และ safari) เขาแสดงผลได้ปกติ จะนิ่งนอนใจก็ไม่ได้ ในเมื่อสถิติการใช้งาน ie 6 ยังครองแชมป์เป็นที่หนึ่งอยู่
ปัญหานี้ไม่ใช่เป็นปัญหาระดับรากหญ้าเฉพาะในประเทศไทยเท่านั้นนะครับ ทั่วโลกก็เป็นปัญหานี้อยู่ (ฟังดูยิ่งใหญ่มาก) ดูได้จากบทความของฝรั่งเรื่องนี้ (คลิกดูบทความดังกล่าว)
เมื่อปัญหายังไม่หมดไป และเราก็ยังต้องเจอกับมันอยู่ ก็จำเป็นอย่างยิ่งที่จะต้องนำวิธีแก้ัปัญหาคุณอีมาเผยแพร่ เพื่อเป็นแนวทาง เป็นคู่มือ เป็นที่้อ้างอิงสำหรับนักพัฒนาเว็บไซต์ ที่หันมาใช้ css ในการออกแบบกันเป็นส่วนใหญ่ (ที่ใช้ตารางวางเลย์เอาต์ คิดว่าน่าจะยังมี แต่คงน้อยเต็มที)
จากบทความของฝรั่งต่างชาติดังกล่าว ผมได้เอามาขัดเกลาเข้าสู่ภาษาแห่งสยามชาติ ดังนี้ :
Internet Explorer จัดได้ว่าเป็นหายนะ(bane) สำหรับนักพัฒนาเว็บไซต์ในยุคปัจจุบัน มากกว่า 60 เปอร์เซ็นต์ของเวลาพัฒนาเว็บไซต์ต้องหมดไปกับการมัวแก้ปัญหาคุณไอ้อี(ie) ดังนั้น วันนี้จึงอยากจะแนะนำ 9 วิธีสำหรับการแก้ปัญหา(โลกแตก) นั่น
1. Centering a Layout
การจัดวางเลย์เอาต์ให้อยู่ตรงกลาง ปกติคำสั่ง margin: auto; เลย์เอาต์ก็จะอยู่ตรงกลางอย่างว่าง่ายแล้วละ แต่จะไม่ง่ายอย่างนั้นในไอ้อี6
เรามาพิจารณาถึงคำสั่งนี้กัน :
#container{
border: solid 1px #000;
background: #777;
width: 400px;
height: 160px;
margin: 30px 0 0 30px;
}
#element{
background: #95CFEF;
border: solid 1px #36F;
width: 300px;
height: 100px;
margin: 30px auto;
}
ผลที่เราอยากได้คือแบบนี้
แต่ไออี 6 จะให้คุณแบบนี้
วิธีแก้ปัญหา
เรา ต้องอาศัยคำสั่ง text-align เข้าช่วย โดยใส่คำสั่ง text-align; center สำหรับตัวหลัก และใส่คำสั่ง text-align: left สำหรับตัวใน ก็จะได้คำสั่งแบบนี้
#container{
border: solid 1px #000;
background: #777;
width: 400px;
height: 160px;
margin: 30px 0 0 30px;
text-align: center;
}
#element{
background: #95CFEF;
border: solid 1px #36F;
width: 300px;
height: 100px;
margin: 30px 0;
text-align: left;
}
2. Staircase Effect
เรียก หัวข้อนี้ว่า ‘ผลกระทบขั้นบันได’ (เสี่ยวดีมั้ย)
หลายๆเว็บต้องมีเมนู ไม่ว่าจะเมนูซ้าย เมนูขวา หรือเมนูบน ในทีนี้เราหมายถึงเมนูบน (ภาษา css เรียกว่า navigation ซึ่งแปลว่า การเดินเรือ(หมายถึงเรือที่นำทาง เมนูก็เปรียบเป็นตัวนำทางตัวหนึ่งเช่นกัน)) โดยปกติเราจะใช้คำสั่ง ul li ในการสร้าง
<ul>
<li><a href=”#”></a></li>
<li><a href=”#”></a></li>
<li><a href=”#”></a></li>
</ul>
ul {
list-style: none;
}
ul li a {
display: block;
width: 130px;
height: 30px;
text-align: center;
color: #fff;
float: left;
background: #95CFEF;
border: solid 1px #36F;
margin: 30px 5px;
}
บราวเซอร์มาตรฐานทั่วไป ก็เป็นอย่างนี้
แต่ไอ้อีหก จะเป็นอย่างงี้
วิธีแก้ปัญหา มี 2 วิธีครับ
1. สั่ง li ให้ชิดซ้ายซะ
ul li {
float: left;
}
2. เพิ่มคำสั่ง display: inline
ul li {
display:inline;
}
3. Double Margin on Floated Elements
ปัญหาของก็ตามหัวข้อนั่นเลย double margin ใส่ไป 2 แต่มันให้มา 4 (มันในทีนี้หมายถึง ไอ้อีหก) พูดแล้วไม่เห็นภาพ มาดูตย.กันเลยดีกว่า
#element{
background: #95CFEF;
width: 300px;
height: 100px;
float: left;
margin: 30px 0 0 30px;
border: solid 1px #36F;
}
ชาวบ้านเขาเป็นแบบนี้
แต่ไอ้อีกหก..!!
ปัญหานี้แก้ได้ง่ายๆด้วยคาถามสั้นๆว่า display: inline
#element{
background: #95CFEF;
width: 300px;
height: 100px;
float: left;
margin: 30px 0 0 30px;
border: solid 1px #36F;
display: inline;
}
4. Inability to Have Elements with Small Heights
ability แปลว่า สามารถ แต่หากมี in นำหน้า ก็จะไร้ความสามารถทันที ในข้อนี้ ความหมายคือ “ความไร้ความสามารถในการจัดการความสูงในระดับเล็ก” โดยปกติถ้าเราต้องการความสูงของบ็อก เราก็แค่ใส่คำสั่ง height:xx px; อยากสูงแค่ไหนก็ใส่ค่าเข้าไป แต่ในไอ้อีหกนั้น ถ้าใส่ค่าความสูงต่ำมาก มันจะไม่ต่ำให้
#element{
background: #95CFEF;
border: solid 1px #36F;
width: 300px;
height: 2px;
margin: 30px 0;
}
ควรจะเป็นแบบนี้
แต่ไอ้อีหก..
วิธีแก้ปัญหาสามารถทำได้ 2 วิธี แล้วแต่ถนัดนะครับ
วิธีแรกคือ เพิ่มขนาดฟ้อนท์เข้าไป แล้วใส่ค่า 0
#element{
background: #95CFEF;
border: solid 1px #36F;
width: 300px;
height: 2px;
margin: 30px 0;
font-size: 0;
}
วิธีที่สอง เพิ่มคำสั่ง overflow: hidden
#element{
background: #95CFEF;
border: solid 1px #36F;
width: 300px;
height: 2px;
margin: 30px 0;
overflow: hidden;
}
5. Auto Overflow and Relatively Positioned Items
ปัญหานี้เกิดขึ้น เมื่อเราใช้คำสั่ง Overflow: auto และคำสั่ง Position:relative;
คงเคยเขียน css ให้ box ซ้อน box คือมี box ใน และ box นอก ปัญหาจะเกิดขึ้น เมื่อ boxในมีความสูงกว่า boxนอก แทนที่boxนอกจะเกิด scroll มันกลับแทงทะลุ box นอกออกมาซะงั้น ถ้ายังงง ดูภาพโค๊ดกันเลยดีฟ่า เอ้ย กว่า
<div id=”element“><div id=”anotherelement“></div></div>
#element{
background: #95CFEF;
border: solid 1px #36F;
width: 300px;
height: 150px;
margin: 30px 0;
overflow: auto;
}
#anotherelement{
background: #555;
width: 150px;
height: 175px;
position: relative;
margin: 30px;
}
ผลลัทธ์ที่ควรจะเป็น
แต่ไอ้อีหกกลับเป็นแบบนี้?
วิธีแก้ปัญหา ง่ายมากครับ(ฝรั่งเขาว่าอย่างนั้น) เพิ่ม relative position ให้กับ parent หรือ boxแม่ หรือที่ผมเรียกว่า box นอกนั่นแหละครับ
#element{
background: #95CFEF;
border: solid 1px #36F;
width: 300px;
height: 150px;
margin: 30px 0;
overflow: auto;
position: relative;
}
6. Floated Layout Misbehaving
ปัญหานี้เกิดขึ้นเมื่อเราต้องการวาง box เรียงกันมากกว่า 1 คือตั้งแต่ 2 ขึ้นไป ความต้องการคือ ให้มันวางเรียงกันในแนวขวางจากซ้ายไปขวา box แต่ละตัวก็จะถูก fix ความกว้างไว้ เมื่อมีข้อความใน box ยาวเกิดกว่า box box ก็จะไม่ขยายตาม คงสภาพความกว้างไว้ตามค่าที่ fixไว้ แต่ในไออีหก เหมือนว่าจะไม่ยอมรับกติกาข้อนี้ ดูโค๊ดกันดีกว่า คิดว่าคงเคยเจอปัญหานี้
<div id=”container“>
<div id=”element“>http://net.tutsplus.com/</div>
<div id=”anotherelement“></div>
</div>
#element, #anotherelement{
background: #95CFEF;
border: solid 1px #36F;
width: 100px;
height: 150px;
margin: 30px;
padding: 10px;
float: left; /*ส่งให้ box ทั้งสองลอยอยู่ในฝั่งซ้ายเรียงกันไป*/
}
#container{
background: #C2DFEF;
border: solid 1px #36F;
width: 365px;
margin: 30px;
padding: 5px;
overflow: auto;
}
ควรจะเป็นอย่างนี้
แต่ไอ้อีหกกลับเป็นหยั่งงี้..
วิธีแก้ก็แค่เพิ่มคำสั่ง overflow : hidden ไปใน boxใน
#element{
background: #C2DFEF;
border: solid 1px #36F;
width: 365px;
margin: 30px;
padding: 5px;
overflow: hidden;
}
7. Space Between List Items
ปัญหานี้ไม่ใช่ ปัญหาช่องว่างระหว่างวัย แต่เป็นปัญหาช่อง ว่างระหว่างลิสต์
<ul>
<li><a href=”#”>Link 1</a></li>
<li><a href=”#”>Link 2</a></li>
<li><a href=”#”>Link 3</a></li>
</ul>
ul {
margin:0;
padding:0;
list-style:none;
}
li a {
background: #95CFEF;
display: block;
}
จากโค๊ดด้านบนผลลัพธ์ควรเป็นแบบนี้
แต่ไอ้อี..6
มีแนวทางแก้ไขอยู่ 3 ทางครับ
1. แก้ปัญหาโดย fix ความกว้าง วิธีนี้อาจไม่ค่อยดีนัก เพราะถึงแก้ปัญหาข้างต้นได้ แต่อาจเจอปัญหาใหม่ คือ บางครั้งลิสต์เมนู อาจมีความกว้างกว่าค่าที่fix ไว้
li a {
background: #95CFEF;
display: block;
width: 200px;
}
หรืออีกวิธีคือไม่ fix ความกว้าง ใช้วิธี float ไว้
li a {
background: #95CFEF;
float: left;
clear: left;
}
วิธีสุดท้าย เพิ่มคำสั่งไปอีก 1 ชุดสั้นๆ
li {
display: inline;
}
บทความทั่ว่ามาทั้งหมด พร้อมภาพและโค๊ดประกอบนี้ ผมไม่ได้เขียนเอง เพียงแต่แปลจากภาษาฝรั่งเขา หากอ่านผมแปลแล้วไม่เข้าใจก็ไปอ่านต้นฉบับได้ที่ http://net.tutsplus.com/tutorials/html-css-techniques/9-most-common-ie-bugs-and-how-to-fix-them/#more-7764
ป.ล. ของฝรั่งเขามี 9 วิธีนะครับ แต่ลดทอนเหลือแค่ 7
minddezign says:
03/02/2553 at 03/02/2553
ชอบบทความนี้นักแล
mr.sing says:
05/02/2553 at 05/02/2553
อ่านบทความนี้แล้ว เหมือนได้เวลาเพิ่ม เพื่อไปทำอย่างอื่นได้อีกเยอะเลยครับ เด็ดจริงๆ ขอบคุณครับ
rensamatar says:
02/03/2553 at 02/03/2553
เอ๊ะ เคยอ่านแบบภาษาอังกฤษ
อิอิ แปลออกมาเป็นไทยด้วยคับ เยี่ยมไปเลย
manann says:
03/03/2553 at 03/03/2553
IE6 ไปตายซะไป๊
ขอบคุณมากๆเลยครับกับบทความสุดยอดแบบนี้
ToEbuT says:
04/03/2553 at 04/03/2553
ได้ความรู้ครับ ขออนุญาติไปเผยแพร่นะครับ
เด็กดี says:
24/05/2553 at 24/05/2553
แหล่มมากกกกกที่สุด
fernrary says:
09/07/2553 at 09/07/2553
บทความนี้เหมาะกับนักพัฒนาเว็บมือใหม่ทุกวัย ><
Thee says:
18/08/2553 at 18/08/2553
ขอกราบงามๆ 3 ที ขอบคุณมากครับ
CheapCamera says:
18/08/2553 at 18/08/2553
ขอกราบงามๆ 3 ที ขอบคุณมากครับ
glosgu says:
18/08/2553 at 18/08/2553
ขอบคุณสำหรับความรู้
แทน says:
10/09/2553 at 10/09/2553
สำหรับข้อ 1
1.#container {
…..
margin: 30px 0 0 30px;
….
}
ควรจะเป็นแบบนี้หรือเปล่าครับ
margin: 30px 0 30px 0px;
เป็นบมความสรุปที่ยอดเยี่ยมมากครับ รวมวิธีแก้ปัญหาสำหรับ IE6 ได้ดีมาก IE6 ผมมองว่าเป็น Browser ที่เน่าในวงการเว็บเลย จนบางครั้งทำเว็บ แทบไม่อยากจะสนใจคนที่ใช้ IE6 ไปเลย
administrator says:
10/09/2553 at 10/09/2553
margin จะมีค่ากำหนดได้ 4 ค่า คือ top right bottom left เรียงตามลำดับนี้เลย คือ กั้นบน กั้นขวา กั้นล่าง กั้นซ้าย
margin: 30px 0 0 30px; หมายความว่า กั้นบน 30 พิกเซล ไม่ต้องกั้นขวาและกั้นล่าง กั้นซ้าย 30 พิกเซล
คำสั่งด้านบนสามารถแทนได้ด้วย
margin-top:30px
margin-right:0
margin-bottom:0
margin-left:30px
การเขียนแบบนี้ margin: 30px 0 0 30px; เขาเรียกกันว่าเขียนแบบ short code
** สุดท้ายขอแก้คำครหาของ IE6 นิดนึง เห็นแก่หน้าเฮียบิลแก
IE6 เกิดมาในยุคที่ CSS ไม่ได้เฟื่องฟูอย่างในปัจจุบัน เมื่อก่อนเรานิยมวางเลเอ้าท์ด้วยตาราง ปัจจุบันบางเว็บก็ยังทำอยู่ จนเมื่อพวกเสิร์ชเอ็นจิ้นมีความสำคัญคับโลก ทุกคนจึงหันมา SEO กัน เป็นที่รู้กันว่า SEO มันต้อง CSS
ไมโครซอฟต์จึงให้ความใส่ใจในจุดนี้มากขึ้น พัฒนา IE เวอร์ชั่นใหม่ออกมา เป็น 7,8
แต่มันก็ช่างเป็นความซวยของไมโครซอฟต์ ที่คนยังนิยมใช้ IE6 ไม่ยอมเลิก ถึงขั้นเฮียบิลแกออกมาขู่ว่าจะไม่ออกแพทซ์มาแก้รูรั่วของ IE6 อีก
กระนั้นคนก็ยังไม่ได้ให้ความสนใจ ยังไถดะ IE6 ไม่ยอมเลิก เฮียแกก็คงปวดหัวพอควรเหมือนกัน หลังๆจะเห็นว่าผมแกบางลง
สู้ไฟฟ้อกไม่ได้ ออกเวอร์ชั่นใหม่พวกดีใจกันแทบตาย รีบหามาอัปเกรดกันฝุ่นตลบ
อย่างงี้แล้วไฟฟ้อกมันจะไม่ดีต่อ CSS ยังไงไหว
สงสัยต้องเขียนเป็นความบทยาว แก้ต่างให้น้าบิลแกหน่อยละม้าง…
แทน says:
12/09/2553 at 12/09/2553
margin: 30px 0 0 30px; ที่อธิบายมาข้างบนถูกต้องครับ แต่นั่นแสดงว่า #container ไม่ได้วางตรงกลางใช่ไหมครับ (ไม่ได้ตรงกลางของหน้า document เพราะห่างจากด้านบนและด้านซ้าย 30 pixel แต่ด้านขวาเรากำหนดเป็น 0) แต่ #element อยู่กึ่งกลางของ container ถูกต้องแล้วครับ