【问题标题】:How to find the width of the child ul li a如何找到孩子ul li a的宽度
【发布时间】:2012-04-03 18:19:43
【问题描述】:

我将以下无序列表包裹在 div 中,如下所示

    <div id="menuwrapper">
    <ul>
     <li>home
           <ul>
             <li><a>anchor1</a></li>
             <li><a>anchor2</a></li>
             <li><a>anchor3</a></li>
          </ul>
    </li>

    <li>school</li>
    <li>college</li>
    </ul>  
    </div>

我需要在 home 悬停时找到每个锚点的宽度,即锚点 1、锚点 2、锚点 3 标记宽度。 我有以下似乎不起作用的代码

    $(function () {

      $("#menuwrapper ul li").hover(function () {
      var maxWidth = 0;
      $(this).find("ul li a").each(function () {

          if (this.width > maxWidth)
              maxWidth = this.width;
      });

      $("#menuwrapper ul li ul li a").css("width", maxWidth);
  });
 });

提前感谢您的帮助

【问题讨论】:

    标签: jquery asp.net


    【解决方案1】:
    $(function() {
        var maxWidth = 0;
        $("#menuwrapper ul li:first-child").hover(function() {
            var $anchors = $(this).find("ul li a");
            $anchors.each(function() {    
                if ($(this).width() > maxWidth) {
                    maxWidth = $(this).width();
                }
            });
            $anchors.width(maxWidth);
        });
    });
    

    【讨论】:

    • 感谢羊驼的解决方案 :)
    【解决方案2】:

    这会让您悬停并设置宽度

    $(function () {
        // First we detect and set the widths, then we hide the subMenu
        var $maxWidth = 0,
            $anchors = $("#menuwrapper ul li ul li a");
        $anchors.each(function () {
            var $this = $(this);
            if ($this.width() > $maxWidth)
            {
                $maxWidth = $this.width();
             }
        });
        $anchors.css('width', $maxWidth)
          .closest('ul')
          .hide();
    
        // Then we add the hover actions
        $("#menuwrapper ul li").hover(
            function()
            {
                $(this).find("ul").slideDown();
            },
            function() {
                $(this).find("ul").slideUp();
            }
        );
    });
    

    这可以更好地优化,但我认为这种方式最能解释。

    【讨论】:

    • 这允许您的结构包含多个子菜单。如果你只想要一个,那么羊驼唇'li:first-child'会更有效。
    【解决方案3】:

    您的$this 应该是$(this)。或者你需要在范围内设置var $this = $(this);

    【讨论】:

    • 我不认为这是问题所在,它甚至没有达到 $(this.width...。它无法执行 "$(this).find("ul li a").each(函数()”行
    • 为什么只检查悬停时的高度?
    • 这会将 maxWidth 设置为“那个”li 的子菜单,但是每次您将鼠标悬停在不同的菜单上时它都会重新验证。您希望所有菜单都相同还是不同?
    • 基本上我想根据 maxwidth 锚设置子菜单的宽度,所以在悬停时我正在检查具有最大宽度的锚,然后将最大宽度设置为整个子菜单。希望我很清楚..?
    • 为什么要悬停呢?这个菜单应该出现/消失吗?
    猜你喜欢
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2011-03-01
    • 2023-03-10
    • 2018-03-25
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多