Di chuột qua CSS so với di chuột qua JavaScript [đã đóng]


84

Đôi khi tôi phải lựa chọn giữa việc sử dụng một phần tử CSS: di chuột hoặc JavaScript onmouseover để kiểm soát sự xuất hiện của các phần tử html trên một trang. Hãy xem xét tình huống sau đây khi một div bao bọc một đầu vào

<div>
<input id="input">
</div>

Tôi muốn đầu vào thay đổi màu nền khi con trỏ chuột di chuột qua div. Cách tiếp cận CSS là

<style>
  input {background-color:White;}
  div:hover input {background-color:Blue;}
</style>

<div><input></div>

Cách tiếp cận JavaScript là

<div onmouseover="document.getElementById('input').style.backgroundColor='Blue';">
  <input id="input">
</div>

Ưu điểm và nhược điểm của từng cách tiếp cận là gì? Phương pháp CSS có hoạt động tốt với hầu hết các trình duyệt web không? JavaScript có chậm hơn css không?


1
Phương pháp CSS không yêu cầu Javascript.
pd.

Tôi muốn khuyên bạn nên sử dụng Dù: hover : http://www.xs4all.nl/~peterned/csshover.html
cheeaun

3
"Javascript có chậm hơn css không?" Bạn sẽ không nhận thấy điều đó, nhưng javascript sẽ tiêu tốn nhiều tài nguyên hơn và có thể làm chậm mọi thứ nếu nhiều tập lệnh khác đang chạy cùng lúc (đặc biệt dành cho thiết bị cầm tay, trang web di động) và nó không phải là thứ nên được sử dụng. Mặt khác, CSS sử dụng ít tài nguyên hơn và có ý nghĩa chính xác để trình bày. Bạn chỉ nên sử dụng javascript để nâng cao chức năng và điều hướng trang web, nhưng nó vẫn có thể điều hướng được cho người dùng mà không bật js. Tôi đề xuất phương pháp CSS: hover.
Jose Faeti,

1
Đây là một câu hỏi cũ nên không có gì ngạc nhiên khi nhận xét trên không còn giá trị, và có thể là chưa bao giờ. Một lý do là thiếu các thư viện JS tốt cung cấp bảng soạn sẵn hiệu suất cao (xem Famo.us). Một điều khác là các công cụ JS trong các trình duyệt hiện đại, cả máy tính để bàn và thiết bị di động, đều khá nhanh. Có một điểm chuẩn đo lường nó ở 80% hiệu suất của mã biên dịch C gốc. Tất nhiên, có những trường hợp ngoại lệ, nhưng hiệu suất ấn tượng của JS trong trình duyệt vẫn còn. Những gì mọi người thực sự "có nghĩa là" là DOM chậm. JS khá nhanh, họ chưa bao giờ nhận ra điều đó.
pmont

Câu trả lời:


59

Vấn đề với: hover là IE6 chỉ hỗ trợ nó trên các liên kết. Tôi sử dụng jQuery cho loại thứ này những ngày này:

$("div input").hover(function() {
  $(this).addClass("blue");
}, function() {
  $(this).removeClass("blue");
});

Làm cho mọi thứ dễ dàng hơn rất nhiều. Điều đó sẽ hoạt động trong IE6, FF, Chrome và Safari.


tôi đã làm một bài kiểm tra nhanh ... dường như IE7 không hỗ trợ div: hover ??
John

Có, IE7 có hỗ trợ 50% cho CSS2. Một phần lý do khiến nhiều nhà thiết kế web không thể chịu đựng được.
Alan

nhưng với tất cả những người theo dõi, đánh hơi và tin tặc lạm dụng hộp cát nhiều nhất có thể, điều đó có thể hiểu được. không phải là nó giúp chống lại việc theo dõi, nhưng có thể hiểu được rằng mọi người cố gắng làm cho nó khó hơn. tôi biết những người không cho phép cookie. và họ cũng có lý do chính đáng cho điều đó, chỉ cần nhìn vào tiếng bíp. Tôi vẫn ủng hộ câu trả lời của bạn, bởi vì tôi rất thích nếu mọi người đến vào năm 2013, nhận ra rằng họ luôn được theo dõi và kích hoạt món đồ chơi yêu thích của tôi (của chúng tôi?).
jascha

Tôi tự hỏi liệu metroui có cho phép người dùng tắt javascript: p hay không nhưng nghiêm túc mà nói, chromeos, mozilla's os, metroui đều sử dụng javascript. html5, css3, webgl và javascript sẽ là những ngôn ngữ để tạo ứng dụng phía máy khách trong một vài năm tới. chỉ cần kiên nhẫn, chẳng bao lâu sẽ có javascript bên ngoài trình duyệt, không cần phải vô hiệu hóa nó trong trình duyệt nữa rồi :)
Jascha

32

CSS dễ bảo trì và dễ đọc hơn nhiều.


18
Nó có thể bảo trì cho đến khi bạn phải hỗ trợ IE6 trên các phần tử không phải <a>. Sau đó, thật khó khăn vì bạn phải sử dụng JS-hack. Nhưng CSS vẫn là cách ưa thích của tôi. Hãy để những người sử dụng trình duyệt 1999 có trải nghiệm 1999.
Tyson

4
Mọi người nên cập nhật này là giải pháp tốt nhất ... Tôi sẽ đề nghị thêm một thẻ phát hiện trình duyệt và nói với họ để cập nhật nếu sử dụng IE <7
Travis Pessetto

11

Tại sao không phải cả hai? Sử dụng jQuery cho các hiệu ứng động và CSS làm dự phòng. Điều này mang lại cho bạn những lợi ích của jQuery với sự suy thoái duyên dáng .

CSS:

a {color: blue;}
a:hover {color: red;}

jQuery (sử dụng jQueryUI để tạo hoạt ảnh màu):

$('a').hover( 
  function() {
    $(this)
      .css('color','blue')
      .animate({'color': 'red'}, 400);
  },
  function() {
    $(this)
      .animate({'color': 'blue'}, 400);
  }
);

bản giới thiệu


1
Với các chuyển tiếp CSS, tôi tranh luận rằng bạn chỉ nên sử dụng javascript như một dự phòng khi: Hover được áp dụng cho các thẻ không liên kết trong các trình duyệt IE cũ hơn.
Adam Youngers

Một số thay đổi tại jsbin khiến bản demo không hoạt động. Tôi đã cập nhật bản trình diễn để tham chiếu phiên bản jQuery hiện tại và tất cả đều hoạt động trở lại.
kingjeffrey

10

Một lợi ích bổ sung khi làm điều đó trong javascript là bạn có thể thêm / xóa hiệu ứng di chuột tại các thời điểm khác nhau - ví dụ: di chuột qua các hàng trong bảng thay đổi màu sắc, nhấp vào tắt hiệu ứng di chuột và bắt đầu chỉnh sửa ở chế độ tại chỗ.


cảm ơn - điều này thực sự đã trả lời câu hỏi tôi đang tìm kiếm! :-)
Peter S Magnusson

6

Một sự khác biệt rất lớn là trạng thái ": hover" sẽ tự động tắt khi chuột di chuyển ra khỏi phần tử. Do đó, bất kỳ kiểu nào được áp dụng khi di chuột sẽ tự động được đảo ngược. Mặt khác, với cách tiếp cận javascript, bạn sẽ phải xác định cả sự kiện "onmouseover" và "onmouseout". Nếu bạn chỉ xác định "onmouseover", các kiểu được áp dụng "onmouseover" sẽ vẫn tồn tại ngay cả sau khi bạn di chuột ra ngoài trừ khi bạn đã xác định rõ ràng "onmouseout".


6

CHỈNH SỬA: Câu trả lời này không còn đúng nữa. CSS được hỗ trợ tốt và Javascript (đọc: JScript) hiện được yêu cầu khá nhiều cho bất kỳ trải nghiệm web nào và một số người vô hiệu hóa javascript.

Câu trả lời ban đầu, theo ý kiến ​​của tôi vào năm 2009.

Off đỉnh đầu của tôi:

Với CSS, bạn có thể gặp sự cố với hỗ trợ trình duyệt.

Với JScript, mọi người có thể vô hiệu hóa jscript (đó là những gì tôi làm).

Tôi tin rằng phương pháp ưa thích là thực hiện nội dung bằng HTML, Bố cục bằng CSS và bất kỳ thứ gì động trong JScript. Vì vậy, trong trường hợp này, bạn có thể muốn sử dụng phương pháp CSS.


3
Tại sao bạn lại tắt javascript? Bạn thích trải nghiệm tiền thiên niên kỷ?
Alex

5
Bởi vì đó là một rủi ro bảo mật và quá nhiều trang web lạm dụng javascript. Tôi sử dụng một plugin firefox tiện lợi có tên "NoScript" cho phép bạn chỉ bật các tập lệnh từ các trang web bạn muốn một cách có chọn lọc.
Alan

5

Có một sự khác biệt khác cần ghi nhớ giữa hai điều này. Với CSS, :hovertrạng thái luôn bị tắt khi chuột di chuyển khỏi một phần tử. Tuy nhiên, với JavaScript, onmouseoutsự kiện không được kích hoạt khi con chuột di chuyển khỏi phần tử trên chrome của trình duyệt thay vì vào phần còn lại của trang.

Điều này xảy ra thường xuyên hơn bạn có thể nghĩ, đặc biệt là khi bạn đang tạo thanh điều hướng ở đầu trang của mình với các trạng thái di chuột tùy chỉnh.


4

Trong Internet Explorer, phải khai báo <! DOCTYPE> để bộ chọn: hover hoạt động trên các phần tử khác ngoài phần tử <a>.



2

Liên quan đến việc sử dụng jQuery để di chuột , tôi luôn sử dụng plugin HoverIntent vì nó không kích hoạt sự kiện cho đến khi bạn tạm dừng trên một phần tử trong một khoảng thời gian ngắn ... điều này sẽ ngừng kích hoạt nhiều chuột qua các sự kiện nếu bạn vô tình chạy di chuột qua chúng hoặc đơn giản trong khi chọn một tùy chọn.


0

Nếu bạn không cần hỗ trợ 100% cho IE6 với javascript bị vô hiệu hóa, bạn có thể sử dụng một cái gì đó như ie7-js với nhận xét có điều kiện của IE. Sau đó, bạn chỉ cần sử dụng các quy tắc css để áp dụng hiệu ứng di chuột. Tôi không biết chính xác nó hoạt động như thế nào nhưng nó sử dụng javascript để làm cho nhiều quy tắc css hoạt động không bình thường trong IE7 và 8.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.