Каков предпочтительный способ смены позиции CSS?

При настройке эффекта ролловера в HTML есть ли какие-то преимущества (или подводные камни) в его использовании в CSS по сравнению с JavaScript? Есть ли какие-либо проблемы с производительностью или ремонтопригодностью кода, о которых я должен знать при любом подходе?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
10
0
1 432
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Я бы остался на стороне CSS, но я сделал очень мало Javascript.

Кажется, что CSS легче стандартизировать для разных браузеров, чем Javascript, хотя это может измениться с появлением Chrome V8 и нового инструмента рендеринга Firefox.

Поскольку это аспект презентации, я бы сказал, что это больше стандартов, основанных на CSS. Раньше это делалось на Javascript просто потому, что мы не могли сделать это с помощью CSS (старые браузеры - отстой, и я не думаю: до CSS 2 даже добавляли hover).

Он по-прежнему будет работать в CSS, если в браузере отключен Javascript.

Реализация ролловера с помощью CSS использует псевдокласс: hover для определения стиля целевого элемента при наведении на него курсора. Это отлично работает во многих браузерах, но не в IE6, где хорошо работает только с тегом привязки (например, a: hover). Я использовал CSS hover для реализации панели навигации с вкладками, но мне пришлось использовать поведение IE, чтобы заставить его работать в IE6.

Ответ принят как подходящий

CSS подходит для ролловеров. Они реализованы в основном с помощью псевдоселектора :hover. Вот действительно простая реализация:

a{
    background-image: url(non-hovered-state.png);
}
a:hover{
    background-image: url(hovered-state.png);
}

Однако есть несколько вещей, о которых вам нужно знать:

  • IE6 поддерживает только :hover на тегах <a>
  • Изображения, указанные в CSS, но не используемые на странице, не будут загружены немедленно (это означает, что состояние ролловера может занять секунду, прежде чем появится в первый раз)

Ограничение только тегами <a> обычно не проблема, так как вы, как правило, хотите, чтобы ролловеры были интерактивными. Последнее, однако, представляет собой большую проблему. Существует метод под названием CSS-спрайты, который может предотвратить эту проблему, вы можете найти пример метода, используемого для создания опрокидывание без предварительной нагрузки.

Это довольно просто, основной принцип заключается в том, что вы создаете изображение больше, чем элемент, устанавливаете изображение в качестве фонового изображения и позиционируете его с помощью background-position, чтобы был виден только тот бит, который вы хотите. Это означает, что для отображения состояния зависания вам просто нужно изменить положение фона - никаких дополнительных файлов загружать не нужно. Вот краткий пример (в этом примере предполагается, что у вас есть элемент высотой 20 пикселей и фоновое изображение, содержащее оба состояния при наведении и отсутствии наведения - одно поверх другого (так что изображение имеет высоту 40 пикселей)):

a{
    background-image: url(rollover-sprites.png);
    background-position: 0 0; /* Added for clarity */
    height: 20px;
}
a:hover{
    background-position: 0 -20px; /* move the image up 20px to show the hovered state below */
}

Обратите внимание, что использование этой техники «спрайтов» означает, что вы не сможете использовать альфа-прозрачные PNG с IE6 (поскольку единственный способ, которым IE6 должен правильно отображать альфа-прозрачные PNG, использует специальный фильтр изображений, который не поддерживает background-position)

Вы можете заставить псевдокласс :hover работать с любым элементом в IE6, указав doctype.

Justin Poliey 06.10.2008 22:16

Технически, я думаю, что для правильной работы фоновое положение должно быть 0 -20px, но поскольку background-repeat не настроен на неповторение, это не имеет значения.

Wes P 06.10.2008 22:24

@jdp: Я не уверен, что ты прав, мой друг ... IE6 поддерживает только все: hover (без хаков) на тегах <a>. Хотя я более чем желаю, чтобы меня доказали, что он неправ .. Есть пример?

Dan 06.10.2008 22:36

@Wes P: Вы совершенно правы по обоим пунктам. Я исправлю свой код, спасибо.

Dan 06.10.2008 22:37

AFAIK, стандарты заявляют, что: hover должен работать для всех элементов, но работает только для якорей в IE6.

CJM 08.10.2008 15:53

Нет ли мнемоники для запоминания последовательности объявлений в CSS?

Да, лучший способ сделать это - cssспрайты. В IE6 возникает досадная проблема, когда браузер делает запрос каждый раз при наведении курсора на элемент. Чтобы исправить это, взгляни сюда.

Другие вопросы по теме