javascript - <li>元素根据宽度添加.class,但添加.class后宽度也发生变化

标签 javascript jquery css

您可以在 http://jsfiddle.net/6gnAF/1/ 上查看问题

我的列表元素没什么问题。

我正在使用非常简单的无序列表;

<div>
  <ul>
    <li class='button'>Element 1</li>
    ...
    <li class='button'>Element N</li>
  </ul>
</div>

(列表元素的数量,N,每页不同。)

包含 uldiv696 px 宽度。列表元素 li 水平对齐,当它们到达 div 宽度的末端时,它们会换行。

我想在每行的第一个 li 中添加 class .left,在最后一行添加 class .right

    $('li').each(function() {
        var liWidthOut = $(this).width();
        totalWidth += liWidthOut;
        if (totalWidth >= divWidth) {
            $(this).addClass("left");
            $(this).prev().removeClass("middle").addClass("right");
            totalWidth = liWidthOut;
        }
        else {
            $(this).addClass("middle");
        }
     });

我用 Jquery 解决了这个问题,但我遇到了一个小问题。

您可以在 http://jsfiddle.net/6gnAF/1/ 上查看问题

问题是.left.right 类改变了添加的li 元素的宽度到,所以有时他们会创建新行,最后的 li 元素成为第一个具有 .right 类的元素,而不是 .left

我该如何解决这个问题?

(抱歉语法错误)

最佳答案

我将方法更改为跟踪 top 位置而不是计算宽度,似乎工作正常。将 width() 与填充和边框等一起使用不太可靠。

$('li')
    // Add classes first, so we calculate on the right styles
    .addClass("middle")
    .addClass("button")
    .each(function() {
        // Compare with last position
        if (lastPos != $(this).position().top) {
            $(this).removeClass("middle").addClass("left")
                .prev().removeClass("middle").addClass("right");
        }
        // Store last position
        lastPos = $(this).position().top;
    });

http://jsfiddle.net/2qydM/6/

关于javascript - <li>元素根据宽度添加.class,但添加.class后宽度也发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13070464/

相关文章:

javascript - 下拉菜单因引用而不起作用

javascript - 如何将单击事件委托(delegate)给 jQuery 元素数组的子元素?

javascript - 如何在 Jquery 中选择 html 元素的特定实例?

java - 如何在 JQuery Ajax 中使用 Struts 2 token ?

jquery - HTML 范围输入中的样式化步骤

javascript - MVC knockout 选择标签值赋值

javascript - fancybox 3 内的图像文件名

jquery - 打印一个 div 内容并隐藏所有剩余的主体

javascript - 关闭和打开 jquery popUps 添加多个按钮

javascript - ng-repeat 与动态数组 : view not updated