mouseover () mouseout () jQuery добавить / удалитьClass проблема - PullRequest
7 голосов
/ 11 мая 2009

Я пытаюсь создать простой эффект при наведении курсора, используя комбинацию mouseover, mouseout, addClass и removeClass. В основном, когда пользователь наводит курсор на элемент, я хочу применить другую границу (1px пунктирная серая). Начальное состояние - «1px solid white». У меня есть класс с именем «highlight», в котором просто есть «border: 1px dashed grey». Я хочу добавить этот класс onmouseover и удалить его при onmouseout, но я не могу получить желаемый эффект, если не использую! Важный в классе "highlight".

Ответы [ 7 ]

14 голосов
/ 11 мая 2009

Звучит так, как будто у вас JavaScript работает нормально, как есть, но это всего лишь проблема со спецификой ваших правил CSS , поэтому !important заставляет его работать.

Вам просто нужно сделать свои выделенные правила CSS более конкретными, чем невыделенные правила.

#someItem ul li { /* Specificity = 102 */
    border-color: white;
}

.highlight { /* Specificity = 10 -- not specific enough! */
    border-color: grey;    
}

#someItem ul li.highlight { /* Specificity = 112 -- this will work */
    border-color: grey;    
}

Изменить с дальнейшими пояснениями:
Допустим, соответствующие части вашего HTML выглядят так:

<div id="someItem">
    <ul>
        <li>Item 1</li>
        <li>Item 2</li>
        <li>Item 3</li>
    </ul>
</div>

и у вас есть этот CSS:

#someItem ul li {
    border: 1px solid white;
}
.highlight {
    border-color: grey;
}

В настоящее время все элементы списка в ul в #someItem div будут иметь белую рамку, и ничто не имеет класса highlight, поэтому ничто не серое.

С помощью любых средств, которые вы хотите (в вашем случае, при наведении курсора в jQuery), вы добавляете класс к одному из элементов:

$(this).addClass('highlight'); 

HTML-код теперь будет выглядеть примерно так:

<div id="someItem">
    <ul>
        <li>Item 1</li>
        <li class="highlight">Item 2</li>
        <li>Item 3</li>
    </ul>
</div>

Пока ваш Javascript и HTML работают нормально, но вы не видите серую рамку! Проблема в вашем CSS. Когда браузер пытается решить, как стилизовать элемент, он просматривает все различные селекторы, которые нацелены на элемент, и стили, определенные в этих селекторах. Если есть два разных селектора, каждый из которых определяет один и тот же стиль (в нашем случае цвет границы оспаривается), то он должен решить, какой стиль применить, а какой игнорировать. Это делается с помощью того, что известно как «Специфичность», то есть насколько специфичен селектор. Как указано в статье HTML Dog , он делает это, присваивая значение каждой части вашего селектора, и выигрывает тот, кто набрал наибольшее количество очков. Очки:

  • селектор элемента (например: "ul", "li", "table") = 1 балл
  • селектор класса (например: ".highlight", ".active", ".menu") = 10 баллов
  • селектор идентификатора (например: "#someItem", "#mainContent") = 100 баллов

Есть еще несколько правил, например: ключевое слово !important, а также встроенные стили, но это в основном не имеет значения для этого, э-э ... "урок". Единственное, что вы должны знать, это то, что если два селектора имеют одинаковую специфичность, то победит тот, который определен в файле позже.

Возвращаясь к вашей проблеме, учитывая CSS, который у нас был раньше, мы можем понять, почему у него все еще нет серой границы:

#someItem ul li = id + element + element = 100 + 1 + 1 = 102 points
.highlight = class = 10 points

Как упоминалось ранее, решение заключается в создании более конкретного селектора:

#someItem ul li.highlight
   = id + element + element + class
   = 100 + 1 + 1 + 10
   = 112 points

И чтобы ответить на ваш вопрос в комментариях, вам не нужно менять какой-либо ваш JavaScript или HTML, чтобы это работало. Если вы сломаете этот селектор, он скажет:

Найдите элемент с идентификатором "someItem", внутри которого ищите элемент ul, а затем элемент li с классом "highlight".

... и теперь, с учетом простого вызова .addClass(), который вы сделали ранее, li удовлетворяет этим условиям, поэтому граница должна стать серой.

6 голосов
/ 11 мая 2009

С Jquery 1.3.3 вы сможете сделать это немного проще. Будет доступна улучшенная версия .toggleClass () , которая будет очень мощной.

Если вам не нужно разбивать это на функцию, то из 1.3.3 вы сможете просто сделать:

$(".myclass").hover(function(){ $(this).toggleClass('highlight'); });

Если вам нужно включить! Важный, то, возможно, ваш класс выделения должен быть более конкретным (см. Специфичность CSS ).

1 голос
/ 11 мая 2009

Полагаю, вы используете встроенный стиль элемента для начального стиля:

<style type="text/css">
  .hover { border: 1px dashed gray; } /* will never apply */
</style>

...

<!-- this style has priority over class styles! -->
<div style="border: 1px solid white"> 
...
</div>

Это переопределит стили, применяемые с использованием класса ... Поэтому вместо использования встроенных стилей просто используйте другой начальный класс для применения начальных стилей:

<style type="text/css">
  .normal { border: 1px solid white; }
  .hover { border: 1px dashed gray; }
</style>

...

<div class="normal">
...
</div>
0 голосов
/ 30 сентября 2010

Или вы можете просто сделать это с помощью простого CSS с помощью:

#namehere { border: 1px solid #fff; }
#namehere:hover { border: 1px dashed #aaa }
0 голосов
/ 11 мая 2009

CSS:

div.target {
    border: 1px solid #000000;
}

div.target-hover {
    border-color: #ff0000;
}

JS:

$("div.target").hover(
    function () {
        $(this).addClass("target-hover");
    },
    function () {
        $(this).removeClass("target-hover");
    }
);

Я обычно так делаю. (позволяет больше вариантов)

0 голосов
/ 11 мая 2009

Это пример наведения, которое я использовал:

$(".myclass").hover(jbhovershow,jbhoverhide);


jbhovershow = function () {
            $(this).addClass("jimtest");
          }; 

jbhoverhide = function () {
            $(this).removeClass("jimtest");
          }

вам не нужно разбивать что-то такое простое на отдельные функции.

Я подозреваю, что ваша проблема может быть связана с конфликтом в css - попробуйте просто применить свой выделенный класс, жестко его кодировав, или щелкнув мышью, и посмотрите, действительно ли он работает.

Надеюсь, что поможет

Jim

0 голосов
/ 11 мая 2009

Рассматривали ли вы метод чистого CSS?

Например:

someClass {
    border: 1px solid white;
}

someClass:hover {
    border: 1px dashed gray;
}

Псевдокласс hover даст вам желаемое поведение: когда пользователь наведет курсор на элемент, он будет использовать более низкий стиль, иначе он будет использовать первый стиль.

Примечание: как кто-то прокомментировал, это не работает для не a элементов в IE. Однако он работает для меня в Chrome, Firefox, Safari и Opera.

Он также работает для любого элемента в режиме стандартов IE8 и IE7. У меня нет IE6 для тестирования.

...