Наведення курсора на CSS проти наведення курсора на JavaScript [закрито]


84

Бувають випадки, коли у мене є вибір між використанням елемента CSS: наведення курсору або JavaScript onmouseover для контролю появи HTML-елементів на сторінці. Розглянемо наступний сценарій, коли div обертає вхідні дані

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

Я хочу, щоб введення змінило колір тла, коли курсор миші наводить курсор на div. Підхід CSS є

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

<div><input></div>

Підхід JavaScript

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

Які переваги та недоліки кожного підходу? Чи підхід CSS добре працює з більшістю веб-браузерів? JavaScript повільніший за css?


1
Підхід CSS не вимагає Javascript.
pd.

Я б порекомендував використовувати будь-що: hover : http://www.xs4all.nl/~peterned/csshover.html
cheeaun

3
"Чи є javascript повільнішим за css?" Ви цього не помітите, але javascript споживає більше ресурсів і може сповільнити роботу, якщо одночасно працює багато інших сценаріїв (особливо думайте про портативні пристрої, мобільні веб-сайти), і це не те, для чого його слід використовувати. З іншого боку, CSS використовують менше ресурсів і призначені саме для презентації. Ви повинні використовувати javascript лише для поліпшення навігації та функціональних можливостей веб-сайту, але він повинен залишатися навігаційним для користувачів без увімкненого js. Я пропоную підхід CSS: наведення.
Jose Faeti

1
Це старе запитання, тому не дивно, що наведений вище коментар вже не дійсний і, можливо, ніколи не був. Однією з причин є відсутність хороших бібліотек JS, які забезпечують високоефективний шаблон (див. Famo.us). Іншим є те, що двигуни JS у сучасних браузерах, як настільних, так і мобільних, досить швидкі. Існує орієнтир, що вимірює його на 80% від продуктивності коду, скомпільованого на C. Звичайно, є випадки винятків, але вражаюча ефективність JS у браузері все ще залишається. Люди насправді "мають на увазі" те, що DOM працює повільно. JS досить швидкий, вони просто ніколи цього не усвідомлювали.
Пмонт

Відповіді:


59

Проблема з: hover полягає в тому, що IE6 підтримує його лише на посиланнях. Сьогодні я використовую jQuery для такого роду речей:

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

Робить справи набагато простішими. Це буде працювати в IE6, FF, Chrome та Safari.


я зробив швидкий тест ... очевидно IE7 не підтримує div: hover ??
Джон,

Так, IE7 має щось на зразок 50% підтримки CSS2. Частина причини, чому багато веб-дизайнерів не витримують цього.
Алан,

але з усіма тими трекерами, сніферами та хакерами, які зловживають пісочницею настільки, наскільки це можливо, це просто зрозуміло. не те, що це допомагає проти відстеження, але зрозуміло, що люди намагаються ускладнити це. я знаю людей, які не дозволяють печиво. і у них є на це вагомі причини, просто подивіться на пожежу. я все ще підтримав вашу відповідь, тому що я б дуже хотів, щоб люди приїхали в 2013 році, зрозуміли, що їх все одно відстежують і включили мою (нашу?) улюблену іграшку.
jascha

Цікаво, чи дозволяє metroui користувачам вимикати javascript: p, але серйозно, chromeos, osilla mozilla, metroui всі використовують javascript. html5, css3, webgl та javascript стануть мовами для створення програм на стороні клієнта за кілька років. просто терпіть, незабаром поза браузером з’явиться javascript, тоді більше не потрібно його вимикати в браузері :)
jascha

32

CSS набагато більш ремонтопридатний і читабельний.


18
Це можна підтримувати, поки вам не доведеться підтримувати IE6 на елементах, що не мають <a>. Тоді це біль, бо вам доведеться використовувати JS-хак. Але CSS все ще є моїм найкращим способом. Нехай люди, які використовують браузер 1999 року, мають досвід 1999 року.
Тайсон

4
Люди повинні оновити це найкраще рішення ... Я б запропонував додати тег, який виявляє браузер і каже їм оновити, якщо використовується IE <7
Тревіс Песетто

11

Чому не обидва? Використовуйте jQuery для анімованих ефектів та CSS як запасний варіант. Це дає вам переваги jQuery з витонченою деградацією .

CSS:

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

jQuery (використовує jQueryUI для анімації кольору):

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

демо


1
З переходами CSS я б стверджував, що ви повинні використовувати javascript лише як резервний варіант, коли: Hover застосовується до неприв'язуючих тегів у старих браузерах IE.
Адам Янгерс

Деякі зміни в jsbin змусили демонстраційну програму не працювати. Я оновив демонстраційну версію, посилаючись на поточну версію jQuery, і все працює знову.
kingjeffrey

10

Ще однією додатковою перевагою виконання цього в javascript є те, що ви можете додавати / видаляти ефект наведення в різні моменти часу - наприклад, наведення курсора на рядки таблиці змінює колір, клацання вимикає ефект наведення та починає редагування в режимі місця.


спасибі - це насправді відповіло на питання, яке я шукав! :-)
Peter S Magnusson

6

Дуже велика різниця полягає в тому, що стан ": hover" автоматично деактивується, коли миша рухається з елемента. Як результат, будь-які стилі, які застосовуються при наведенні, автоматично змінюються. З іншого боку, за допомогою підходу javascript, вам доведеться визначити як події "onmouseover", так і "onmouseout". Якщо ви визначите лише "onmouseover", застосовувані стилі "onmouseover" збережуться навіть після того, як ви наведете курсор миші, якщо ви прямо не визначили "onmouseout".


6

EDIT: Ця відповідь більше не відповідає дійсності. CSS добре підтримується, і Javascript (читайте: JScript) зараз в значній мірі необхідний для будь-якого веб-досвіду, і мало хто вимикає javascript.

Оригінальна відповідь, як і моя думка в 2009 році.

Зверху голови:

У CSS у вас можуть виникнути проблеми з підтримкою браузера.

За допомогою JScript люди можуть вимкнути jscript (ось що я роблю).

Я вважаю, що найкращим методом є вміст у HTML, макет із CSS та будь-що динамічне у JScript. Тож у цьому випадку ви, мабуть, захочете застосувати підхід CSS.


3
Чому б вам відключити javascript? Вам подобається досвід до тисячоліття?
Алекс

5
Оскільки це ризик для безпеки, і занадто багато сайтів зловживають javascript. Я використовую чудовий плагін Firefox під назвою "NoScript", який вибірково дозволяє вам увімкнути лише сценарії з потрібних сайтів.
Алан

5

Є ще одна різниця, про яку слід пам’ятати. У CSS :hoverстан завжди деактивується, коли миша відсуває елемент. Однак у JavaScript onmouseoutподія не запускається, коли миша переміщує елемент на браузер Chrome, а не на решту сторінки.

Це трапляється частіше, ніж ви можете подумати, особливо коли ви створюєте панель навігації у верхній частині сторінки зі спеціальними станами наведення.


4

В Internet Explorer має бути оголошено <! DOCTYPE>, щоб селектор: hover працював з іншими елементами, крім елемента <a>.




0

Якщо вам не потрібна 100% підтримка IE6 з відключеним javascript, ви можете використати щось на зразок ie7-js з умовними коментарями IE. Тоді ви просто використовуєте правила css для застосування ефектів наведення. Я не знаю точно, як це працює, але він використовує javascript, щоб змусити працювати багато правил css, які зазвичай не працюють в IE7 та 8.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.