Trong bài này tôi sẽ giới thiệu cách thực hiện ứng hover bằng các phương pháp mà tôi đã sử dụng qua các giai đoạn theo sự phát triển của kỹ thuật: bắt đầu bằng javascript rồi chuyển sang dùng CSS
JAVASCRIPT
Cách đây khoảng vài năm thì khi nhắc đến các hiệu ứng trên web, có lẽ người ta sẽ nghĩ ngay đến javascript.Hiệu ứng hover thực hiện bằng javascript về cơ bản chúng ta sử dụng hai image và thực hiện swap image
Hai image sử dụng cho hiệu ứng hover:home.gif và home_hover.gif


File hover.js
-
function MM_preloadImages() { //v3.0
-
var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
-
var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
-
if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
-
}
-
-
function MM_swapImgRestore() { //v3.0
-
var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
-
}
-
-
function MM_findObj(n, d) { //v4.01
-
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
-
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
-
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
-
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
-
if(!x && d.getElementById) x=d.getElementById(n); return x;
-
}
-
-
function MM_swapImage() { //v3.0
-
var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
-
if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
-
}
File hover_js_2.htm
Kết quả:
Hạn chế của javascript
Tuy nhiên, do một số trình duyệt như IE mặc định sẽ block các đoạn code javascript, do đó trong nhiều trướng hợp khi truy cập vào một số website sử dụng javascript bạn sẽ nhận được thông bào như sau:

Để khắc phục hạn chế này, các hiệu ứng về sau đều sử dụng css
CASCADE STYLE SHEET
Khi mới chuyển sang sử dụng css để thực hiện hiệu ứng, tôi vẫn dùng 2 images riêng biệt cùng với thuộc tính hover của CSS
File style.css
-
.hnav_img {
-
height:38px;
-
width:104px;
-
display:inline;
-
}
-
#hnav_menu {
-
padding:0px;
-
margin:0px;
-
}
-
-
ul#hnav_menu li span {
-
position:relative;
-
left:-9999em;
-
-
}
-
ul#hnav_menu li a{
-
height:38px;
-
width:104px;
-
float:left;
-
position:relative;
-
}
-
#hnav_trangchu {
-
background-image:url(home.gif);
-
}
-
#hnav_trangchu:hover {
-
background-image:url(home_hover.gif);
-
}
File hover_css.htm
Kết quả
Hạn chế của việc sử dụng css với 2 images riêng biệt:
Khi trang web vừa load thì chỉ có home.gif là được load lên, đến khi bạn rê chuột lên home.gif thì css mới thực hiện hiệu ứng hover và lúc đó mới load home_hover.gif. Vì thế khi lần đầu rê chuột vào home.gif bạn sẽ có cảm giác hình ảnh nhấp nháy một lúc rồi mới chuyển sang home_hover.gif. Để khắc phục điểm này, chúng ta sử dụng css với một image duy nhất
*** Theo tôi biết thì Yobanbe.com vẫn đang sử dụng hover effect với 2 image riêng biệt
Để thực hiện hover effect với 1 image thì chúng ta sẽ sử dụng thêm thuộc tính background-position.
Thuộc tình background-position có cú pháp như sau:
- background-position: x% y%
- background-position: xpos ypox
Trong đó x,y lần lượt là vị trí ngang và dọc của image được sử dụng
Image sử dụng

File style2.css
-
.hnav_img {
-
height:38px;
-
width:109px;
-
display:inline;
-
}
-
#hnav_menu {
-
padding:0px;
-
margin:0px;
-
}
-
-
ul#hnav_menu li span {
-
position:relative;
-
left:-9999em;
-
-
}
-
ul#hnav_menu li a{
-
height:38px;
-
width:104px;
-
float:left;
-
position:relative;
-
}
-
#hnav_trangchu {
-
background-image:url(menu.jpg);
-
background-position:0% -38px;
-
}
-
#hnav_trangchu:hover {
-
background-image:url(menu.jpg);
-
background-position:0% -0px;
-
}
File hover_css2.htm
Kết quả
Trên đây là cách thưc hiện hiệu ứng hover với css một cách rất đơn giản mà tôi đã tìm tòi và vẫn đang sử dụng, muồn tìm hiểu thêm về CSS, các bạn có thể truy cập các website chuyền về deisgn như:
- CSS beauty
- W3 schools
- AlistApart
Download các ví dụ sử dụng trong bài : hover_examples.zip
NDLoc,28.5.2007
likethitnguoi
Ý tưởng sử dụng 1 imgage hay lắm, thanks bạn nhiều nhé
Spirit
1 Image thì cũng có bất tiện là cái hover sẽ ko thể custom 100% dc, 1 website ko dùng bất kì js nào thì mình “hiếm” thấy ^^ cho nên mình nghĩ nên kết hợp cả 2. Ko dùng hover = js nhưng giữ lại cái js preload và dùng hover trong CSS.
Hạn chế sử dụng js sẽ giúp page load nhanh hơn nhưng nếu nói ko dùng js thì còn gì là web nữa đúng ko? (Đặc biệt là trong thời kì nhà nhà ajax, người người ajax này?)
rilwis
Cách dùng 1 ảnh để hiển thị rất tốt, vì nó ngoài ưu điểm không gây cảm giác chuyển đổi cho người đọc, còn có tác dụng làm hạn chế số lượng request đến server giúp cho web chạy nhanh hơn.
Cách dùng CSS tốt hơn JS vì nó dễ dàng chuyển đổi, code lại đơn giản, so với các đoạn mã JS thì nó dễ hiểu hơn nhiều.
dang phuong
cach cua ban lam rat tot ban con bai nao hay hay chia se cung moi nguoi nhe
Tuấn - CSS questions
Nếu ko dùng 1 hình thì có thể dùng preload cũng được. Dùng 1 hình thì nên đặt cách xa nhau tránh trường hợp co giãn text sẽ làm bể layout.
Hiệu ứng hover với CSS | VT2 Blog
[…] PLAIN TEXT […]
Icttrack
cách dùng rollover bằng js giống hệt đoạn mã do dreamweaver tạo ra. Sao bạn không tự viết một đoạn mã js với chức năng tương tự, nó cũng không quá khó.
CH
Bạn share cho mình mấy cái css làm mất hàng gạch dưới đoạn link liên kết cho mình đc chứ! Thanks so much. Gửi qua mail cho mình nhé.