mouseover () mouseout () проблема добавления/удаления jQuery

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

7 ответов


похоже, что у вас есть 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 собака статья, он делает это, назначая значение каждой части вашего селектора, и тот, кто с самым высоким счетом выигрывает. По пунктам:

  • селектор элементов (например: "ul", "li", "table") = 1 пункт
  • селектор класса (например: ".выделять." ,"деятельный." ,"menu") = 10 баллов
  • селектор id (например: "#someItem", "#mainContent") = 100 очков

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

возвращаясь к вашей проблеме, учитывая 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 удовлетворяет этим условиям, поэтому граница должна стать серой.


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

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

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

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


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

<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>

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

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


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

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

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

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

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

Джим


вы рассматривали чистый подход css?

например:

someClass {
    border: 1px solid white;
}

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

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

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

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


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");
    }
);

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


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

#namehere { border: 1px solid #fff; }
#namehere:hover { border: 1px dashed #aaa }