Internet Explorer là trình duyệt web phổ biến nhất do nó được tích hợp chặt chẽ với Windows, lợi thế đó cho thấy sự ích kỉ và sinh ra sự áp đặt đối với người dùng, đặc biệt là các nhà phát triển. Có những đoạn mã đúng chuẩn XHTML có thể chạy tốt trên tất cả các trình duyệt đạt chuẩn hiển thị XHTML nhưng chưa hẳn nó sẽ hiển đúng trên IE thậm chí IE còn không thèm trả lại kết quả. Dưới đây là 7 thủ thuật CSS thường dùng đối với các lỗi độc quyền của ngài IE trong quá trình thiết kế một trang Web.

1. Lỗi hiển thị khối

Sửa lỗi hiển thị cho các phiên bản IE6 về trước khi viền và khoảng cách với nội dung bao gồm cả chiều rộng của đối tượng.

padding: 4em;
border: 1em solid red;
width: 30em;
width/**/:/**/ 25em;

2. Ghi chú điều kiện

Những ghi chú này đơn giản là những ghi chú chỉ hiển thị đối với những phiên bản trình duyệt nhất định do từng phiên bản có những lỗi khác nhau.

<!--[if IE]>Mã CSS<![endif]-->

Đoạn mã trên sẽ hiển thị mã CSS tương ứng trên tất cả các phiên bản trình duyệt IE, nếu bạn chỉ muốn nó được trình duyệt IE v5.01, v5.5 và v6 đọc được thì có thể dùng đoạn mã sau:

<!--[if lte IE 6]>Mã CSS<![endif]--> 

Sau khi thử nghiệm chúng ta nên loai bỏ các đoạn mã đặc biệt trên để giảm nhẹ file CSS cũng như giảm tải cho các trình duyệt khác, để áp dụng các mã CSS đặc biệt trên cho IE thì chỉ cần thêm đoạn mã sau vào phần header là đạt yêu cầu được nạp trong IE:

<!--[if lte IE 6]>
<link rel="stylesheet" type="text/css" href="ie_hacks.css"></link>
<![endif]-->

Một vài kiểu mã điều kiện:

  • IE - Bất kỳ phiên bản nào
  • lt IE version - Phiên bản trước version
  • lte IE version - Phiên bản trước hoặc bằng với version
  • IE version - Chỉ với phiên bản version
  • gte IE version - Phiên bản từ version
  • gt IE version - Phiên bản mới hơn version.

3. Min-width và Max-width - Độ rộng lớn tối đa và tối thiểu của một đối tượng

Tất cả các phiên bản của IE đều không hiểu đoạn mã này có ý nghĩa gì, chính vì vậy chúng ta phải tạo một cách khác để nó có thể biết ta đang muốn gì dựa trên ví dụ về việc tạo một lớp có id="wrapper": Kế tiếp với đoạn mã tạo một lớp có độ rộng tối thiểu 750px:

#wrapper{
min-width: 750px;
width:expression(document.body.clientWidth < 750? "750px": "auto" );
}

Đoạn mã sau có độ rộng tối thiểu 750px và tối đa 1220px:

#wrapper{
min-width: 750px;
max-width: 1220px;
width:expression(document.body.clientWidth < 750? "750px" : document.body.clientWidth > 1220? "1220px" : "auto");
}

Một cách khác không dùng đến JS trong CSS:

selector {
min-height:500px;
height:auto !important;
height:500px;
}

Đoạn mã này cho kết quả như nhau trên các trình duyệt IE6, Mozilla/Firefox/Gecko, Opera 7.x+, Safari1.2; có lẽ là tối ưu nhất chăng ?

4. Chọn đối tượng

Tùy từng phiên bản khác nhau của IE mà lỗi chọn đối tượng được sửa theo những cách khác nhau như sau:

- IE 6 trở về trước

*html {}

- IE 7 trở về trước

*:first-child+html {}
* html {}

- IE 7

*:first-child+html {}

- IE 7 và các trình duyệt mới khác

html>body {}

- Các trình duyệt mới khác trừ IE 7

html>/**/body {}

- Các phiên bản Opera v9 trở về trước

html:first-child {}  

5. Hiệu ứng hover:

Mã :hover cho phép bạn tạo ra những hiệu ứng đặc biệt đối với các đối tượng được liệt kê dưới dạng bảng như danh sách bài viết trên diễn đàn... Phần lớn các trình duyệt hiểu và hiển thị tốt hiệu ứng này ngoại trừ IE :-L. Đây là một vấn đề phức tạp, bạn có thể xem bài viết này để biết cách xử lý vấn đề của IE

6. Hiệu ứng trong suốt của định dạng ảnh PNG

IE không hỗ trợ hiệu ứng trong suốt của định dạng ảnh PNG đơn giản bời vì định dạng PNG không phải do Microsoft hỗ trợ hay do họ tạo ra ;)) Điều đó không có nghĩa là chúng ta phải chấp nhận và chuyển qua dùng định dạng GIF có độ phân giải thấp hơn nhiều

Sử dụng một đoạn mã HTC và một file .gif trong suốt để xử lý lỗi này, có thể tải ở đây.Thêm đoạn mã sau vào file ie.css:

 img.pngfix { behavior: url(pngHack.htc); }

Komodomedia có một giải pháp khác cũng cho kết quả tương tự.

7. Phát hiện trình duyệt để sử dụng CSS tương ứng

Bằng cách sử dụng PHP để phát hiện trình duyệt dựa trên dịnh danh browser agent chúng ta có thể biết được trình duyệt nào đang tải website và đưa ra mã CSS tương ứng. Stylegala có đưa ra một phương án cho cách làm này.

Bài viết dựa trên bài Top 7 CSS hacks that we often use to solve common IE Problems. Bạn có thể xem bài viêt gốc để biết thêm.

Đình Quân


Bình luận

  • TTCN (8)
Hải Nam  30903

Một bài viết hay Smile

Lỗi 6 về PNG hình như đã được sửa, IE7 hỗ trợ cả kênh alpha lẫn hiểu được thông tin gamma của ảnh.

Còn cách thứ 7 thì tác giả hơi kém Smile Thường khi cache có 2 giải pháp:

1. Cache bằng PHP: okie, vẫn cache, nhưng trước sau khi đọc cache, thay vì trả về luôn thì làm thêm cái kiểm tra agent rồi search/replace để thay url của css thích hợp.

2. Cache bằng static html: cache này rất tốt vì không cần PHP, có 2 hướng giải quyết:

- Tạo các file static riêng ứng với mỗi trình duyệt, dùng mod_rewrite kiểm tra agent rồi redirect thích hợp

- Chung một static html, nhưng dùng PHP để hiển thị css. Script PHP này nhỏ nên cũng nhẹ nhàng.

Hải Nam  30903

Ồ vừa đọc bài viết gốc và thấy được link, Stylegala trình bày phương án giống như phương án 2b tôi đề xuất.

Đình Quân  228

Trong lỗi 6 là fix cho các trình duyệt cũ hơn IE 7, thực tế lượng người dùng IE 7 chưa vượt trội hoàn toàn nên vẫn cần có phần sửa lỗi trên Big Grin
Cách thứ 7 hơi ngoài lề so với CSS nên tớ tóm tắt như vậy cho đỡ bị loãng vì phía trên có đề cập một chút về JS trong CSS rồi 8)

Hải Nam  30903

Riêng nói IE độc quyền, cố ý không tuân theo các TR của W3C thì cũng cần xem lại. Cái khác biệt nhất giữa IE và Firefox (chính xác hơn là giữa MSIE và Gecko) là CSS, và có vẻ như W3C dùng quyền lực của mình để "chơi xấu" IE bằng CSS.

Các phiên bản IE ra đời từ trước khi W3C công bố CSS1 (tháng 12/1996, chưa đầy 1 năm trước khi Internet đến VN) rất lâu. Vậy tại sao CSS1 không làm theo giống với IE, mà để rồi cuối cùng thiên hạ loạn lạc với quirk mode và standard mode ? W3C đã "reinvent the wheel" khá nhiều, nhất là phần i18n đã được Microsoft làm từ rất lâu trước đó.

Nếu trước đây W3C chọn giải pháp thỏa hiệp thì tình hình có lẽ không tồi tệ như bây giờ. Cũng may, sau gần 10 năm, Microsoft đã bắt đầu nhượng bộ với IE7.

Đình Quân  228

Điểm này thì cũng được tranh cãi khá nhiều, tớ nghiêng về phía cạnh tranh kinh tế và thị phần hơn, đơn giản là ai cũng muốn bóp chết đối thủ, nếu không được thì gây khó khăn bằng mọi cách.
Ngoài lề một chút, tớ thích Office Open XML hơn OpenOffice XML về nhiều lý do, có rất nhiều sự ủng hộ cho định dạng này nhưng không hiểu sao không được thông qua DIS 29500, có lẽ vì Microsoft quá lớn so với họ chăng Crying

Hải Nam  30903

Đơn giản là vì các đối thủ của M$ không muốn OOXML (còn OpenOffice XML nên viết là Open Document để khỏi nhầm lẫn Smile ) được thông qua, dù M$ lớn hay nhỏ cũng vậy. Do đó họ ủng hộ phe "say NO". Các quốc gia nhiều nước cũng muốn tạo áp lực cho M$.

thanhtuc

IE7 sao e k biet sua, tu dung phan duoi no nhay len phan dau het, phan duoi no nhich ra ngoai 1 chut, la no nhay len tren, k the giai thich duoc, moi tap lam web, gap may cai nay, muon dien luon

thanhtuc

voi lai may e da co Ie7 gio muon cai them iê6, e cai truc tiep vo duoc k, hay phai cai lam sao