CSS-наведение и наведение курсора в JavaScript [закрыто]

84

Бывают случаи, когда у меня есть выбор между использованием элемента CSS: hover или 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.
пд.
Я бы порекомендовал использовать Whatever: hover : http://www.xs4all.nl/~peterned/csshover.html
cheeaun
3
"Является ли javascript медленнее, чем css?" Вы этого не заметите, но javascript будет потреблять больше ресурсов и может замедлить работу, если одновременно работают многие другие скрипты (особенно для портативных устройств, мобильных веб-сайтов), и это не то, для чего его следует использовать. С другой стороны, CSS используют меньше ресурсов и предназначены именно для презентации. Вы должны использовать javascript только для улучшения навигации и функциональности веб-сайта, но он по-прежнему должен быть доступен для пользователей без включенного js. Я предлагаю подход CSS: hover.
Jose Faeti
1
Это старый вопрос, поэтому неудивительно, что приведенный выше комментарий больше недействителен и, возможно, никогда не был им. Одна из причин - отсутствие хороших JS-библиотек, обеспечивающих высокопроизводительный шаблон (см. Famo.us). Во-вторых, JS-движки в современных браузерах, как настольных, так и мобильных, работают довольно быстро. Есть тест, который измеряет его производительность на 80% от производительности собственного кода, скомпилированного на C. Конечно, есть исключения, но впечатляющая производительность JS в браузере все еще сохраняется. На самом деле люди «имеют в виду» то, что DOM работает медленно. JS довольно быстр, они просто этого не осознавали.
pmont

Ответы:

59

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

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

Делает вещи намного проще. Это будет работать в IE6, FF, Chrome и Safari.

Cletus
источник
я сделал быстрый тест ... очевидно IE7 не поддерживает div: hover ??
Джон
Да, IE7 имеет что-то вроде 50% поддержки CSS2. Одна из причин, по которой многие веб-дизайнеры не могут этого вынести.
Алан
но со всеми этими трекерами, снифферами и хакерами, которые злоупотребляют песочницей, насколько это возможно, это просто понятно. не то чтобы это помогает против отслеживания, но понятно, что люди пытаются усложнить его. Я знаю людей, которые не разрешают файлы cookie. И для этого у них тоже есть веские причины, просто посмотрите на firesheep. Я все еще поддержал ваш ответ, потому что мне бы хотелось, чтобы люди приехали в 2013 году, осознали, что их все равно отслеживают, и включили мою (нашу?) любимую игрушку.
jascha
Интересно, позволяет ли metroui пользователям отключать javascript: p, но серьезно, chromeos, os mozilla, metroui используют javascript. html5, css3, webgl и javascript станут языками для создания клиентских приложений через несколько лет. просто наберитесь терпения, скоро за пределами браузера будет javascript, тогда больше не нужно отключать его в браузере :)
jascha 05
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);
  }
);

демо

Kingjeffrey
источник
1
С переходами CSS я бы сказал, что вы должны использовать javascript только в качестве запасного варианта, когда: Hover применяется к тегам без привязки в старых браузерах IE.
Адам Янгерс,
Из-за некоторых изменений в jsbin демо не работало. Я обновил демонстрацию, указав текущую версию jQuery, и все снова работает.
kingjeffrey 01
10

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

Шон Мауд
источник
спасибо - это действительно ответ на вопрос, который я искал! :-)
Питер Магнуссон
6

Очень большая разница в том, что состояние ": hover" автоматически деактивируется, когда мышь покидает элемент. В результате все стили, применяемые при наведении курсора, автоматически меняются местами. С другой стороны, с подходом javascript вам нужно будет определить события «onmouseover» и «onmouseout». Если вы определяете только «onmouseover», стили, применяемые «onmouseover», будут сохраняться даже после того, как вы уберете указатель мыши, если вы явно не определили «onmouseout».

Кунал
источник
6

РЕДАКТИРОВАТЬ: этот ответ больше не соответствует действительности. CSS хорошо поддерживается, и Javascript (читай: JScript) теперь в значительной степени требуется для любого веб-опыта, и некоторые люди отключают javascript.

Оригинальный ответ, как мое мнение в 2009 году.

С верхней части моей головы:

С CSS у вас могут возникнуть проблемы с поддержкой браузером.

С JScript люди могут отключить jscript (это то, что я делаю).

Я считаю, что предпочтительным методом является создание контента в HTML, макета с помощью CSS и всего динамического в JScript. Так что в этом случае вы, вероятно, захотите применить подход CSS.

Алан
источник
4
Зачем отключать javascript? Вам нравится опыт до тысячелетия?
Alex
5
Потому что это угроза безопасности, и слишком много сайтов злоупотребляют javascript. Я использую отличный плагин для Firefox под названием «NoScript», который выборочно позволяет вам включать только скрипты с сайтов, которые вам нужны.
Алан,
5

Между ними есть еще одно различие. С помощью CSS :hoverсостояние всегда деактивируется, когда мышь перемещается с элемента. Однако в JavaScript onmouseoutсобытие не запускается, когда указатель мыши перемещается с элемента на Chrome браузера, а не на остальную часть страницы.

Это происходит чаще, чем вы думаете, особенно когда вы создаете панель навигации вверху страницы с настраиваемыми состояниями наведения.

thismax
источник
4

В Internet Explorer должен быть объявлен <! DOCTYPE>, чтобы селектор: hover работал с другими элементами, кроме элемента <a>.

Мартин Вилла
источник
3

Используйте CSS, это значительно упрощает управление самим стилем.

Хок Крегер
источник
2

Что касается использования jQuery для наведения курсора , я всегда использую плагин HoverIntent, поскольку он не запускает событие, пока вы не остановитесь над элементом в течение короткого периода времени ... это перестает запускать много событий мыши над событиями, если вы случайно запускаете наведите указатель мыши на них или просто при выборе варианта.

Алекс
источник
0

Если вам не нужна 100% поддержка IE6 с отключенным javascript, вы можете использовать что-то вроде ie7-js с условными комментариями IE. Затем вы просто используете правила CSS для применения эффектов наведения. Я не знаю точно, как это работает, но он использует javascript, чтобы заставить работать множество правил css, которые обычно не работают в IE7 и 8.

AnnanFay
источник