javascript 水平翻转具有相同 class 名称的 div

javascript flipping divs with the same class name horizontaly

我有一堆这样的 div:

我想做的是翻转 div,因此第一个元素成为最后一个元素,最后一个元素成为第一个元素,基本上翻转 div,因此 1element、2element、3element 将变为 3element、2element、1element。

我不确定这是否可行,因为没有什么可以区分这些 div,因为它们都具有相同的 ID 和 class 名称。

这个问题与这个问题类似:Javascript only - sort a bunch of DIVs 除了这里的 div 具有相同的 id,class 名称,所以它使一切变得更难。

...as there is nothing to distinguish those divs as they all have the same id and class name...

啊,但是有!他们在 parent 中的位置。您可以获得一个元素数组,反转它,然后将它们附加到 parent,这将移动它们,使它们处于相反的顺序:

var container = document.getElementById("container");
var divs = Array.from(container.children);
divs.reverse();
divs.forEach(function(div) {
    container.appendChild(div);
});

实例:

setTimeout(function() {
    var container = document.getElementById("container");
    var divs = Array.from(container.children);
    divs.reverse();
    divs.forEach(function(div) {
        container.appendChild(div);
    });
}, 800);
.ib {
    display: inline-block;
}
<div id="container"><div class="ib">1</div><div class="ib">2</div><div class="ib">3</div><div class="ib">4</div><div class="ib">5</div></div>

请注意,我在标记时非常小心,因此其中不会有任何文本节点,因为 children 集合仅包含元素,不包含文本节点。但是如果你想反转所有的 children,包括文本节点,使用 childNodes 而不是 children:

setTimeout(function() {
    var container = document.getElementById("container");
    var divs = Array.from(container.childNodes);
    divs.reverse();
    divs.forEach(function(div) {
        container.appendChild(div);
    });
}, 800);
.ib {
    display: inline-block;
}
<div id="container">
    <div class="ib">1</div>
    <div class="ib">2</div>
    <div class="ib">3</div>
    <div class="ib">4</div>
    <div class="ib">5</div>
</div>

请注意,我将代码保持在 ES5 级别(而不是 ES2015+),除了 Array.from 是更新的。你可以很容易地填充它,或者使用

var divs = Array.prototype.slice.call(container.children/*or childNodes*/);

相反。

您可以先使用 class 获取所有元素,将其转换为数组并调用翻转数组的 reverse() 函数,然后循环遍历反向数组并将子项追加回您的目标div.

示例代码

<!DOCTYPE html>
<html>
  <head>
    <title>Parcel Sandbox</title>
    <meta charset="UTF-8" />
  </head>

  <body>
    <div>
      Original: 
      <div class="test">1</div>
      <div class="test">2</div>
      <div class="test">3</div>
      <div class="test">4</div>
      <div class="test">5</div>
    </div>
    <br />
    <div id="target">
      Reversed:
      <!-- Will be created with Javascript -->
    </div>

    <script>
      const reversedDivs = Array.from(document.getElementsByClassName("test")).reverse();
      const targetDiv = document.getElementById("target");

      // Create another list in reversed order
      reversedDivs.forEach(div => {
        const newDiv = div.cloneNode(true);
        targetDiv.appendChild(newDiv);
      })

    </script>
  </body>
</html>

这是一个工作示例:https://codesandbox.io/s/html-reverse-list-u3kld?fontsize=14&hidenavigation=1&theme=dark