Najechanie kursorem CSS a najechanie kursorem JavaScript [zamknięte]


84

Są chwile, kiedy mam wybór między używaniem elementu CSS: hover lub JavaScript onmouseover do kontrolowania wyglądu elementów html na stronie. Rozważmy następujący scenariusz, w którym element div zawija dane wejściowe

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

Chcę, aby dane wejściowe zmieniły kolor tła, gdy kursor myszy znajdzie się nad elementem div. Podejście CSS to

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

<div><input></div>

Podejście JavaScript jest

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

Jakie są zalety i wady każdego podejścia? Czy podejście CSS działa dobrze w większości przeglądarek internetowych? Czy JavaScript jest wolniejszy niż CSS?


1
Podejście CSS nie wymaga Javascript.
pd.


3
„Czy JavaScript jest wolniejszy od CSS?” Nie zauważysz tego, ale javascript zużyje więcej zasobów i może spowolnić działanie, jeśli wiele innych skryptów działa w tym samym czasie (szczególnie w przypadku urządzeń przenośnych, witryn mobilnych), a nie do tego powinien być używany. Z drugiej strony CSS zużywają mniej zasobów i są przeznaczone dokładnie do prezentacji. Należy używać javascript tylko w celu usprawnienia nawigacji i funkcjonalności witryny, ale nadal powinien być dostępny dla użytkowników bez włączonego js. Proponuję podejście CSS: hover.
Jose Faeti

1
To stare pytanie, więc nic dziwnego, że powyższy komentarz nie jest już aktualny i mógł nigdy nie być. Jednym z powodów jest brak dobrych bibliotek JS, które zapewniają wysoką wydajność standardową (patrz Famo.us). Innym jest to, że silniki JS w nowoczesnych przeglądarkach, zarówno stacjonarnych, jak i mobilnych, są dość szybkie. Istnieje test porównawczy, który mierzy 80% wydajności skompilowanego kodu w języku C. Oczywiście są wyjątki, ale imponująca wydajność JS w przeglądarce jest nadal aktualna. Ludzie naprawdę „mają na myśli” to, że DOM jest powolny. JS jest dość szybki, po prostu nigdy nie zdawali sobie z tego sprawy.
pmont

Odpowiedzi:


59

Problem z: hover polega na tym, że IE6 obsługuje go tylko w linkach. Obecnie używam jQuery do tego typu rzeczy:

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

To znacznie ułatwia. To zadziała w IE6, FF, Chrome i Safari.


zrobiłem szybki test ... najwyraźniej IE7 nie obsługuje div: hover ??
John

Tak, IE7 obsługuje około 50% CSS2. Po części dlatego wielu projektantów stron internetowych nie może tego znieść.
Alan

ale z tymi wszystkimi trackerami, snifferami i hakerami, którzy nadużywają piaskownicy tak bardzo, jak tylko mogą, jest to po prostu zrozumiałe. nie to, że pomaga to w walce ze śledzeniem, ale zrozumiałe jest, że ludzie starają się to utrudniać. Znam ludzi, którzy nie zezwalają na pliki cookie. i mają ku temu ważne powody, wystarczy spojrzeć na ognistego owcę. Nadal zagłosowałem za twoją odpowiedzią, ponieważ bardzo bym chciał, żeby ludzie przyjechali w 2013 roku, zdali sobie sprawę, że i tak są śledzeni i włączą moją (naszą?) ulubioną zabawkę.
jascha

Zastanawiam się, czy metroui umożliwia użytkownikom wyłączenie javascript: p, ale poważnie, chromeos, os mozilla's, metroui używają javascript. HTML5, css3, webgl i javascript będą językami do tworzenia aplikacji klienckich za kilka lat. tylko bądź cierpliwy, niebawem poza przeglądarką będzie javascript, nie trzeba już go wyłączać w przeglądarce :)
jascha

32

CSS jest znacznie łatwiejszy w utrzymaniu i czytelny.


18
Jest możliwe do utrzymania, dopóki nie będziesz musiał obsługiwać IE6 na elementach innych niż <a>. Wtedy jest to uciążliwe, ponieważ musisz użyć hacka JS. Ale CSS jest nadal moją ulubioną drogą. Niech ludzie używający przeglądarki 1999 będą mieli doświadczenie z 1999 roku.
Tyson,

4
Ludzie powinni zaktualizować to jest najlepsze rozwiązanie ... Proponuję dodać tag, który wykrywa przeglądarkę i mówi im, aby zaktualizowali, jeśli używasz IE <7
Travis Pessetto

11

Dlaczego nie oba? Użyj jQuery do animowanych efektów i CSS jako rezerwy. Daje to korzyści z jQuery z wdzięczną degradacją .

CSS:

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

jQuery (używa jQueryUI do animowania koloru):

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

próbny


1
W przypadku przejść CSS argumentowałbym, że w starszych przeglądarkach IE należy używać javascript jako rozwiązania zastępczego, gdy: Hover jest stosowany do tagów niebędących kotwicą.
Adam Youngers

Niektóre zmiany w jsbin sprawiły, że demo nie działało. Zaktualizowałem demo, aby odwoływało się do aktualnej wersji jQuery i wszystko działa ponownie.
kingjeffrey

10

Dodatkową korzyścią płynącą z robienia tego w javascript jest możliwość dodawania / usuwania efektu najechania w różnych momentach czasu - np. Najechanie kursorem na wiersze tabeli zmienia kolor, kliknięcie wyłącza efekt najechania kursorem i rozpoczyna edycję w miejscu.


dzięki - to faktycznie odpowiada na pytanie, którego szukałem! :-)
Peter S Magnusson

6

Bardzo duża różnica polega na tym, że stan „: hover” jest automatycznie dezaktywowany, gdy myszka wychodzi z elementu. W rezultacie wszelkie style zastosowane po najechaniu myszą są automatycznie odwracane. Z drugiej strony, w przypadku podejścia javascript, musiałbyś zdefiniować zarówno zdarzenia „onmouseover”, jak i „onmouseout”. Jeśli zdefiniujesz tylko „onmouseover”, style zastosowane „onmouseover” będą zachowywać się nawet po wyprowadzeniu kursora myszy, chyba że wyraźnie zdefiniowałeś „onmouseout”.


6

EDYCJA: Ta odpowiedź nie jest już prawdą. CSS jest dobrze obsługiwany, a Javascript (czytaj: JScript) jest teraz prawie wymagany do każdego doświadczenia w Internecie, a niewielu ludzi wyłącza javascript.

Oryginalna odpowiedź, jak moja opinia w 2009 roku.

Z czubka mojej głowy:

Dzięki CSS możesz mieć problemy z obsługą przeglądarki.

Dzięki JScript ludzie mogą wyłączyć jscript (to właśnie robię).

Uważam, że preferowaną metodą jest tworzenie treści w HTML, Layout z CSS i cokolwiek dynamicznego w JScript. W tym przypadku prawdopodobnie chciałbyś zastosować podejście CSS.


3
Dlaczego miałbyś wyłączyć javascript? Podoba Ci się doświadczenie sprzed tysiąclecia?
Alex

5
Ponieważ jest to zagrożenie dla bezpieczeństwa, a zbyt wiele witryn nadużywa javascript. Używam sprytnej wtyczki do Firefoksa o nazwie „NoScript”, która pozwala wybiórczo włączać tylko skrypty z wybranych witryn.
Alan

5

Jest jeszcze jedna różnica, o której należy pamiętać między nimi. W CSS :hoverstan jest zawsze dezaktywowany, gdy mysz odsuwa się od elementu. Jednak w przypadku JavaScript onmouseoutzdarzenie nie jest wywoływane, gdy mysz przesuwa się z elementu do chrome przeglądarki, a nie na pozostałą część strony.

Dzieje się tak częściej, niż mogłoby się wydawać, zwłaszcza gdy tworzysz pasek nawigacyjny u góry strony z niestandardowymi stanami najechania kursorem.


4

W przeglądarce Internet Explorer należy zadeklarować <! DOCTYPE>, aby selektor: hover działał na innych elementach niż element <a>.




0

Jeśli nie potrzebujesz 100% wsparcia dla IE6 z wyłączonym javascriptem, możesz użyć czegoś takiego jak ie7-js z komentarzami warunkowymi IE. Następnie po prostu użyj reguł css, aby zastosować efekty najechania. Nie wiem dokładnie, jak to działa, ale używa javascript, aby działać wiele reguł CSS, które normalnie nie działają w IE7 i 8.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.