2011-12-27 3 views
2

ИТАК Heres мой вопрос: я получил следующий HTML:Jquery/JS код Hover/CSS

<ul> 
    <li class="normal">Item1</li> 
    <li class="normal">Item2</li> 
    <li class="special">Item3</li> 
    <li class="normal">Item4</li> 
    <li class="normal">Item5</li> 
</ul> 

Так что теперь я хочу знать, как получить каверзный парения эффект:

  • Когда вы наводите «.normal»: текст красным цветом.
  • Когда вы наведите «.normal» и «special» перед ним: «.normal» цвета красный и «.специальный» цвет зеленый.
  • Когда вы наводите '.normal' и 'special' после этого: '.normal' colors красный и '.special' цвет синий.

Я думаю, что это возможно с JS/Jquery, но я не знаю, с чего начать.

Спасибо за любую помощь по этому вопросу.

P.S. Для всех, кто задается вопросом, где я буду использовать это: http://dl.dropbox.com/u/4281191/weboutfit/index.html

+0

вы, вероятно, может сделать что-то с помощью CSS только с помощью [смежно одноуровневых селекторы] (HTTP: // WWW. w3.org/TR/CSS2/selector.html#adjacent-selectors). дайте это читать – petervaz

+0

@petervaz: Я думал, что CSS не поддерживает обратный ход. – drudge

+0

@jnpcl - грубая. back-traversal еще не поддерживается, но вы можете сделать намного более простой пример с JQuery + CSS, отправив ответ за несколько минут. – sascha

ответ

2

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

.red { 
    color: red; 
} 
.blue { 
    color: blue; 
} 
.green { 
    color: green; 
} 

Код парения будет как:

$('.normal').hover(function() { 
    $(this).addClass('red'); 
    if($(this).prev().hasClass('special') { 
     $(this).prev().addClass('blue'); 
    } 
    else if($(this).next().hasClass('special') { 
     $(this).next().addClass('green'); 
    } 
}, function() { 
    $('.normal').removeClass().addClass('normal'); 
    $('.special').removeClass().addClass('special'); 
}); 
+0

Я дам ваш код: D – seahorsepip

+0

Я пробовал и не работал на моем сайте:/ он даже не прошел проверку ... Итак, я отредактировал код и исправил некоторые вещи проверки: http: //dl.getdropbox.com/u/4281191/sdfhgxdhtgfchyjcyfgk.txt , но он все еще не работает:/ – seahorsepip

+0

Вот пример использования вашего кода: http://dl.getdropbox.com/u/4281191/test.html Как вы видите, это не work :( – seahorsepip

0

Я сделал это немного проще с CSS комбинации/JS

CSS:

.normal, .special { 
    color: red; 
} 

.special + li:hover { 
    color: green; 
} 

JS:

$('.special').prev().hover(function() { 
    $(this).css('color', 'green'); 
}, function() { 
    $(this).css('color', 'red'); 
}); 

Демонстрация: http://jsfiddle.net/gn96t/

+0

Вместо '.css()' вы также можете использовать '.addClass()' и '.removeClass()', как это сделал techfoobar в его ответе. – sascha

+0

Хм, я тоже это пробовал, но это сбивает с толку:/ И работает ли он по крайней мере в IE7? так как мне действительно нужно работать даже в этом старом браузере ... – seahorsepip

+0

Что именно? CSS делает раскраску элемента AFTER .special, а JS-код - перед специальным. – sascha

3

Это решение для чистого jQuery для вас, оно выполняет все ваши 3 требования.

Смотрите рабочую демо:http://jsfiddle.net/usmanhalalit/Rn3jR/2/

$(function(){ 
    $('.normal').hover(function(){ 
     $(this).css('color','red'); 
     var $prev=$(this).prev(); 
     var $next=$(this).next(); 
     if($prev.hasClass('special')) 
      $prev.css('color','green'); 
     if($next.hasClass('special')) 
      $next.css('color','blue'); 
    },function(){ 
     $(this).css('color','black');   
     $('.special').css('color','black');   

    }); 
}) 
+1

Этот код работает идеально и действует: D спасибо большое! Что мне нравится в вашем коде, так это то, что он действительно и предыдущий в то же время;) – seahorsepip

+1

Вы наиболее востребованы :) – Usman

1

JQuery решение: http://jsfiddle.net/mQWsP/1/

$('.normal').hover(function() { 
var that = $(this), 
    special = $('.special'); 

that.addClass('red'); 

if (that.prev('li').hasClass('special')) { 
    special.addClass('green'); 
} else { 
    if (that.next('li').hasClass('special')) { 
     special.addClass('blue'); 
    } 
} 
}, 
function() { 
    $('.special').removeClass().addClass('special'); 
    $(this).removeClass().addClass('normal'); 
}); 
+0

Этот код работает идеально и действует, но менее чист, чем код из @Usman, поскольку он отображает после и прежде чем не в то же время. Итак, я перехожу с кодом из Usman, но большинство других опубликованных ответов тоже замечательно: D – seahorsepip

+0

если «чистым» вы подразумеваете бессмысленную проверку как prev, так и следующей, опуская фигурные скобки и имея плохие интервалы, тогда да, его код чистый". – jbabey

+0

Я имею в виду использование else, если вместо другого, если это делает 2 части кода запускаемыми друг за другом одновременно. И он был слишком раньше: P – seahorsepip

Смежные вопросы