在 JQUERY .hover 中转换 CSS { ul li:hover a }

发布于 2024-10-07 16:22:23 字数 1487 浏览 1 评论 0原文

我现在想知道是否有一种方法可以在 jquery .hover 中转换此 css 属性,或者通过 javascript 控制它以动态更改颜色。

CSS:

ul li:hover a {
    color: #FFF;
}

有人可以帮忙吗?

编辑:

我的问题是:

我有一个下拉菜单,我希望当我将鼠标悬停在菜单上时,文本颜色会发生变化,当我将鼠标悬停在子菜单上时,两者的悬停状态都会保持不变。

JQuery:

$("ul li").hover(function () {          
    $(this).stop().animate({ backgroundColor: "white"}, 500);
}, function () {
    $(this).stop().animate({ backgroundColor: "black"}, 400);
});

在菜单和子菜单中悬停时设置背景颜色动画。

例如,如果文本是黑色的,我想在悬停时将文本设置为白色。为此,我使用:(子菜单示例,当然,对于菜单更改选择器)

$('ul.submenu li a').hover(function () {        
    $(this).css({color:'#FFFFFF'});
}, function () {            
    $(this).css({color:'#00FF00'});
});

所有这些工作正常,但是当我悬停子菜单时,菜单返回到原始状态(因为 mouseleave 在悬停时被激活)。我想要的是,当我悬停子菜单时,菜单中的悬停状态也保持活动状态。

我尝试了很多方法,但都给我带来了问题,唯一有效的是 css,但我也需要动态控制文本颜色。

HTML 结构:

<ul class="menu">

      <li><a href="#">text</a></li>

      <li><a href="#">text</a>

        <ul class="submenu">
          <li><a href="#">text</a></li>
          <li><a href="#">text</a></li>
          <li><a href="#">text</a></li>
        </ul>

      </li>

      <li><a href="#">text</a></li>

</ul>

I want to now if there's a way to transform this css properties in a jquery .hover, or control this by javascript to change the colour dynamically.

CSS:

ul li:hover a {
    color: #FFF;
}

Can anyone Help ?

EDIT:

My problem is:

I have a drop down menu and i want that when I hover the menu the text color change and when I hover the submenu the hover state stays for both.

JQuery:

$("ul li").hover(function () {          
    $(this).stop().animate({ backgroundColor: "white"}, 500);
}, function () {
    $(this).stop().animate({ backgroundColor: "black"}, 400);
});

To animate background color on hover in menu and submenu.

For example if the text are black I want to make the text white on hover. For this I use:(Submenu example, for menu change the selector of course)

$('ul.submenu li a').hover(function () {        
    $(this).css({color:'#FFFFFF'});
}, function () {            
    $(this).css({color:'#00FF00'});
});

All This works fine, but when I hover the submenu the menu returns to the original state(because the mouseleave is activated on hover out). All I want is that when I hover submenu the hover state in menu stays active as well.

I've tried many things but all give me problems, only thing that works is css, but I need to control the text colours dynamically too.

HTML Structure:

<ul class="menu">

      <li><a href="#">text</a></li>

      <li><a href="#">text</a>

        <ul class="submenu">
          <li><a href="#">text</a></li>
          <li><a href="#">text</a></li>
          <li><a href="#">text</a></li>
        </ul>

      </li>

      <li><a href="#">text</a></li>

</ul>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

镜花水月 2024-10-14 16:22:23

请告诉我这是否符合您的要求。

我还没有完全正常工作,但看看它是否有帮助:
我的 JSFiddle

这是到目前为止的代码:

   $(document).ready(function() {
       var sm;                       // submenu
       var delay = 500;              // delay before applying changes
       var tID;                      // timeout id
       var color_on  = '#fff'
         , color_off = '#000';
       var oPrev;


       $('ul.menu > li > a').hover(
          function() {
             if (tID && $(this) === oPrev) {clearTimeout(tID);}
             oPrev = $(this);
             sm  = $(this).next('.submenu');
             if(sm){sm.stop(true, true).fadeIn('slow');}
          },
          function() {
             if (tID) {clearTimeout(tID);}
             tID = setTimeout(
                      function() {
                         sm.stop(true, true).fadeOut('slow');
                      }, delay);
          }
       );

       $('.submenu > li > a').hover(
           function() {
              if (tID) {clearTimeout(tID);}
              oPrev.css('color',color_on);
              $(this).stop(true, true).fadeIn('slow');
           },
           function() {
              if (tID) {clearTimeout(tID);}
              sm  = $(this);
              tID = setTimeout(
                       function() {
                          oPrev.css('color','');
                          sm.closest('ul').stop(true, true).fadeOut('slow');
                       }, delay);
           }
       );
   });

和 CSS:

   a
   {
       color           : #000;
       text-decoration : none;
   }
   a:hover
   {
       color           : #fff;
   }

   ul li
   {
       background      : orange;
       border          : 1px solid black;
       display         : inline-block;
       padding         : 0 1em;
       vertical-align  : top;  
   }

   .menu
   {
       background      : #ccc;
       border          : 1px solid black;
       display         : inline-block;
       padding         : .25em 1em;
       vertical-align  : top;
   }
   .submenu
   {
       border          : 1px solid black;
       border-width    : 1px 0 0 0;
       display         : none;
   }
   .submenu li
   {  
       background      : red;
       border-width    : 0;
   }
   .submenu li a:hover
   {
       color           : #fff;
   }

注意:我并不是说这是最好的答案,也不是一个完整的解决方案,但也许这里的某些内容可以帮助某人找到正确的解决方案。

Please let me know if this is along the right track of what you're asking.

I haven't got it working fully, but give this a look and see if it helps:
my JSFiddle

Here's the code so far:

   $(document).ready(function() {
       var sm;                       // submenu
       var delay = 500;              // delay before applying changes
       var tID;                      // timeout id
       var color_on  = '#fff'
         , color_off = '#000';
       var oPrev;


       $('ul.menu > li > a').hover(
          function() {
             if (tID && $(this) === oPrev) {clearTimeout(tID);}
             oPrev = $(this);
             sm  = $(this).next('.submenu');
             if(sm){sm.stop(true, true).fadeIn('slow');}
          },
          function() {
             if (tID) {clearTimeout(tID);}
             tID = setTimeout(
                      function() {
                         sm.stop(true, true).fadeOut('slow');
                      }, delay);
          }
       );

       $('.submenu > li > a').hover(
           function() {
              if (tID) {clearTimeout(tID);}
              oPrev.css('color',color_on);
              $(this).stop(true, true).fadeIn('slow');
           },
           function() {
              if (tID) {clearTimeout(tID);}
              sm  = $(this);
              tID = setTimeout(
                       function() {
                          oPrev.css('color','');
                          sm.closest('ul').stop(true, true).fadeOut('slow');
                       }, delay);
           }
       );
   });

And CSS:

   a
   {
       color           : #000;
       text-decoration : none;
   }
   a:hover
   {
       color           : #fff;
   }

   ul li
   {
       background      : orange;
       border          : 1px solid black;
       display         : inline-block;
       padding         : 0 1em;
       vertical-align  : top;  
   }

   .menu
   {
       background      : #ccc;
       border          : 1px solid black;
       display         : inline-block;
       padding         : .25em 1em;
       vertical-align  : top;
   }
   .submenu
   {
       border          : 1px solid black;
       border-width    : 1px 0 0 0;
       display         : none;
   }
   .submenu li
   {  
       background      : red;
       border-width    : 0;
   }
   .submenu li a:hover
   {
       color           : #fff;
   }

Note: I'm not saying this is the best answer, nor is it a complete solution, but maybe something in here will assist someone in finding the correct solution.

平安喜乐 2024-10-14 16:22:23
$("ul li a").hover(function() {
    $(this)
        .data("color", $(this).css("color"))
        .css("color", "#FFF");
}, function() {
    $(this).css("color", $(this).data("color"));
});

$("ul li").hover(function() {
    $(this).find("a")
        .data("color", $(this).css("color"))
        .css("color", "#FFF");
}, function() {
    $(this).find("a").css("color", $(this).data("color"));
});

更新:

假设第一个选择器(ul li a:hover)是多余的,我们可以大大简化代码:

$("li").hover(function() {
    $(this).find("a").css("color", "#FFF");
}, function() {
    $(this).find("a").removeAttr("style");
});

这个更新的代码也应该可以工作(在您ANCHOR 元素的 style 属性内没有额外的 CSS 代码)。


更新:

替代解决方案如下:

$("li").hover(function() {
    $(this).toggleClass("hover", $(this).is(":hover"));
});

使用此 CSS 代码:

ul li.hover a {
    color: #FFF;
} 

我强烈推荐此替代解决方案!

$("ul li a").hover(function() {
    $(this)
        .data("color", $(this).css("color"))
        .css("color", "#FFF");
}, function() {
    $(this).css("color", $(this).data("color"));
});

$("ul li").hover(function() {
    $(this).find("a")
        .data("color", $(this).css("color"))
        .css("color", "#FFF");
}, function() {
    $(this).find("a").css("color", $(this).data("color"));
});

Update:

Assuming that the first selector (ul li a:hover) is superfluous, we can simplify the code considerably:

$("li").hover(function() {
    $(this).find("a").css("color", "#FFF");
}, function() {
    $(this).find("a").removeAttr("style");
});

This updated code should work also (under the condition that you don't have additional CSS code inside the style attribute of the ANCHOR elements).


Update:

An alternative solution would be this:

$("li").hover(function() {
    $(this).toggleClass("hover", $(this).is(":hover"));
});

with this CSS code:

ul li.hover a {
    color: #FFF;
} 

I highly recommend this alternative solution!

多彩岁月 2024-10-14 16:22:23
$('li').hover(
    function(){
         $(this).css({color:'white'}); //mouseover
    },
    function(){
         $(this).css({color:'black'}); // mouseout
    }
);
$('li').hover(
    function(){
         $(this).css({color:'white'}); //mouseover
    },
    function(){
         $(this).css({color:'black'}); // mouseout
    }
);
请止步禁区 2024-10-14 16:22:23

试试这个(现已测试:http://jsfiddle.net/nathan/J7HLV/):

$('ul li a, ul li').hover(function () {
  $(this).add($(this).children('a')).filter('a').css('color','#fff');
},function () {
  $(this).add($(this).children('a')).filter('a').css('color','');
});

Try this (now tested: http://jsfiddle.net/nathan/J7HLV/):

$('ul li a, ul li').hover(function () {
  $(this).add($(this).children('a')).filter('a').css('color','#fff');
},function () {
  $(this).add($(this).children('a')).filter('a').css('color','');
});
硬不硬你别怂 2024-10-14 16:22:23

当然,只需使用悬停绑定即可。

$("ul li a").bind("hover", function () {
    $(this).css("color", "#FFF");
});
$("ul li").bind("hover", function () {
    $(this).children("a").css("color", "#FFF");
});

请注意,当您将鼠标移开时,此代码不会重置 CSS 属性。为此,您需要存储原始颜色值。

a 元素设置为 display: block 可能是值得的,以便它扩展到整个父 li 元素。然后您只需将鼠标悬停在其中之一上即可。

Sure, simply use the hover binding.

$("ul li a").bind("hover", function () {
    $(this).css("color", "#FFF");
});
$("ul li").bind("hover", function () {
    $(this).children("a").css("color", "#FFF");
});

Note that this code won't reset the CSS properties when you mouse out. To do that you would need to store the original color values.

It is probably worth it to set that a element to display: block so it expands to the entire parent li element. Then you only need to hover on one of them.

拒绝两难 2024-10-14 16:22:23

为li标签绑定hover函数。每当 mouseover/mouseout 位于 标记上时,事件就会冒泡到

  • $(function(){   
        $("ul li").hover(function(){
            $(this).css("color", "#fff");
        },function(){
            $(this).css("color", "#000000");
        });
    });
    

    请参阅 工作演示

    如果您可以使用 CSS 实现效果,那么为什么还要使用 javascript 解决方案。

    Bind a hover function for the li tag. Whenever mouseover/mouseout is on the <a> tag the event will bubble up to the <li>

    $(function(){   
        $("ul li").hover(function(){
            $(this).css("color", "#fff");
        },function(){
            $(this).css("color", "#000000");
        });
    });
    

    See a working demo

    If you can achieve the effect using CSS then why go for javascript solution.

    ~没有更多了~
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文