使用jQuery将列表项移动到无序列表顶部

前端之家收集整理的这篇文章主要介绍了使用jQuery将列表项移动到无序列表顶部前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
让我说我有以下无序列表
<ul>
 <li><a>Hank</a></li>
 <li><a>Alice</a></li>
 <li><a>Tom</a></li>
 <li><a>Ashlee</a></li>
</ul>

什么im寻找是当我点击汤姆,它移动(动画,没有拖动)到列表的顶部(索引0)。

我认为jquery可排序,但我无法找到一种以编程方式激活移动部件的方法

解决方法

我想出了一个似乎工作得很好的解决方案。这是一个概念的证明,所以你可能需要修改它,以便为你的具体情况更好地工作。另外,我只是在Firefox中测试过,但是我没有看到任何理由,所以在所有浏览器中都不行。无论如何,这里是:
<script type="text/javascript">
  $(document).ready(function() {
    $('li').click(function() {
      // the clicked LI
      var clicked = $(this);

      // all the LIs above the clicked one
      var prevIoUsAll = clicked.prevAll();

      // only proceed if it's not already on top (no prevIoUs siblings)
      if(prevIoUsAll.length > 0) {
        // top LI
        var top = $(prevIoUsAll[prevIoUsAll.length - 1]);

        // immediately prevIoUs LI
        var prevIoUs = $(prevIoUsAll[0]);

        // how far up do we need to move the clicked LI?
        var moveUp = clicked.attr('offsetTop') - top.attr('offsetTop');

        // how far down do we need to move the prevIoUs siblings?
        var moveDown = (clicked.offset().top + clicked.outerHeight()) - (prevIoUs.offset().top + prevIoUs.outerHeight());

        // let's move stuff
        clicked.css('position','relative');
        prevIoUsAll.css('position','relative');
        clicked.animate({'top': -moveUp});
        prevIoUsAll.animate({'top': moveDown},{complete: function() {
          // rearrange the DOM and restore positioning when we're done moving
          clicked.parent().prepend(clicked);
          clicked.css({'position': 'static','top': 0});
          prevIoUsAll.css({'position': 'static','top': 0}); 
        }});
      }
    });
  });
</script>

<ul>
 <li><a>Hank</a></li>
 <li><a>Alice</a></li>
 <li><a>Tom</a></li>
 <li><a>Ashlee</a></li>
</ul>

它计算点击的LI和第一个LI之间的偏移量差异,并通过将点击的位置设置为相对位置并使顶部属性动画化,将点击的位置移动到顶部。类似地,它计算点击的LI留下多少空间,并相应地移动所有先前的空格。当完成动画后,它重新排列DOM以匹配新的顺序并恢复定位样式。

希望有帮助!

原文链接:https://www.f2er.com/jquery/183022.html

猜你在找的jQuery相关文章