【问题标题】:Reverse order of divs in pure plain JavaScript no CSS在纯纯 JavaScript 无 CSS 中反转 div 的顺序
【发布时间】:2018-11-07 09:03:38
【问题描述】:

我在这里找不到不是基于 jQuery 的帖子,我需要一个纯 JavaScript 示例,请不要建议任何与 CSS 解决方案相关的内容。我知道有 CSS 方法可以做与此类似的事情,但出于个人原因,我需要一个 JavaScript 解决方案来代替。

好的,我需要将所有 .x 类名 div 设置为相反的顺序,这样它看起来像这样

D
C
B
A

默认是这样的

A
B
C
D

我希望页面加载时滚动条的滚动框以 .x div 的相反顺序从底部开始,就像我创建的这张照片店图像一样。

这是我目前的代码

/*???*/
#a{
  background-color: gold;
  height: 500px;
  width: 500px;
  border-radius: 8px;
  position: relative;
  color: red;
}

#b{
  background-color: orange;
  height: 90%;
  width: 90%;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  margin: auto;
  overflow-y: auto;
  overflow-x: hidden;
}

.x{
  background-color: blue;
  display: block;
  height: 200px;
  width: 100%;
 position: relative;
  border: 2px solid white;
}
<div id='a'>
  <div id='b'>
    
    <div class='x'>
      <h1>A</h1>
    </div><!--</x>-->
    <div class='x'>
      <h1>B</h1>
    </div><!--</x>-->

    <div class='x'>
      <h1>C</h1>
    </div><!--</x>-->

    <div class='x'>
      <h1>D</h1>
    </div><!--</x>-->
    
  </div><!--</b>-->
</div><!--</a>-->

【问题讨论】:

  • 这个问题已经被问到here 并且有一个基于纯 Javascript 的解决方案,应该由用户 Ayman Abdel-Rahman 为您工作。
  • 感谢您的回复我之前看到了该帖子,如果您知道如何使其与我的代码一起使用,我无法让它与我的代码一起使用,如果您可以通过该帖子举个例子如果您不知道如何使用,您就知道如何使用它。我无法让该方法与我的代码一起使用。
  • 我已经回答了你的具体问题。
  • 查看我对您问题的回答。

标签: javascript


【解决方案1】:

反转 div 的纯 javascript 解决方案

var divElems = document.getElementsByClassName('x');
var divB = document.getElementById('b');

var output = [];
for(var i =divElems.length - 1; i >= 0;i--){
  output.push(divElems[i]);
}

b.innerHTML = '';
output.forEach(function(eachDiv){
    b.appendChild(eachDiv);
});

工作演示 - https://jsfiddle.net/71kpLqne/

【讨论】:

  • 感谢 front_end_dev 的回复,反向排序效果很好,但是如何在页面加载时设置底部的滚动框?
【解决方案2】:

您可以使用document.querySelectorAll 来获取类为x 的所有元素,并且可以使用[].slice.call 将其转换为数组。然后,您可以将#b 元素的innerHTML 设置为'',这将删除其中的所有元素,并使用x 类反转元素数组,并使用forEach 将每个元素附加到#b 元素。

您可以使用elem.scrollTop = elem.scrollHeight;elem 滚动到底部。

#a{
  background-color: gold;
  height: 500px;
  width: 500px;
  border-radius: 8px;
  position: relative;
  color: red;
}

#b{
  background-color: orange;
  height: 90%;
  width: 90%;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  margin: auto;
  overflow-y: auto;
  overflow-x: hidden;
}

.x{
  background-color: blue;
  display: block;
  height: 200px;
  width: 100%;
 position: relative;
  border: 2px solid white;
}
<div id='a'>
  <div id='b'>
    
    <div class='x'>
      <h1>A</h1>
    </div><!--</x>-->
    <div class='x'>
      <h1>B</h1>
    </div><!--</x>-->

    <div class='x'>
      <h1>C</h1>
    </div><!--</x>-->

    <div class='x'>
      <h1>D</h1>
    </div><!--</x>-->
    
  </div><!--</b>-->
</div><!--</a>-->
<script>
var container = document.querySelector('#b');
var elems = [].slice.call(document.querySelectorAll('.x'));
container.innerHTML = "";
elems.reverse().forEach(function(elem, index){
	container.appendChild(elem);
});
container.scrollTop = container.scrollHeight;
//scroll to bottom of #b div
var body = document.body,
html = document.documentElement;
var docheight = Math.max( body.scrollHeight, body.offsetHeight, 
                   html.clientHeight, html.scrollHeight, html.offsetHeight );
//get height of document cross-browser
window.scrollTo(0, docheight);
//scroll to bottom of document
</script>

JSFiddle 演示:http://jsfiddle.net/nfwcp960/embedded/result

【讨论】:

    【解决方案3】:

    我在 cmets 和这里提供了一个链接,指向以前的类似问题,其中包含许多有效答案: Previous Question

    具体针对您的问题,您可以添加以下纯 JavaScript:

    <script>
    
    window.onload = function(){
    reverseEls("b"); // Reorder your divs
    window.scrollTo(0, document.body.scrollHeight || document.documentElement.scrollHeight); // Scroll to the bottom of the page
        }
    
    function reverseEls(elem){
        elem = document.getElementById(elem);
            for (var i=0;i<elem.childNodes.length;i++) {
                elem.insertBefore(elem.childNodes[i], elem.firstChild);
            }
        }
    
    </script>
    

    这将根据需要反转您的 div 并滚动到页面底部。

    【讨论】:

    • 感谢 cmprogram 反向排序效果很好,但遗憾的是滚动框没有设置在页面底部加载任何想法为什么会这样?
    • @fsofb 显然之前的滚动不适用于所有浏览器。我已经修改了我的答案。
    【解决方案4】:

    您可以首先使用 document.querySelectorAll('.x');

    然后使用.reverse() 反转此顺序。然后,您可以使用.reduce() 将这个 DOM 元素数组转换为“字符串”DOM 元素的字符串:

    const divs = [...document.querySelectorAll('.x')];
    const new_order = divs.reverse().reduce((acc, elem) => acc+elem.outerHTML, '');
    document.querySelector('#b').innerHTML = new_order;
    #a{
      background-color: gold;
      height: 500px;
      width: 500px;
      border-radius: 8px;
      position: relative;
      color: red;
    }
    
    #b{
      background-color: orange;
      height: 90%;
      width: 90%;
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      margin: auto;
      overflow-y: auto;
      overflow-x: hidden;
    }
    
    .x{
      background-color: blue;
      display: block;
      height: 200px;
      width: 100%;
     position: relative;
      border: 2px solid white;
    }
    <div id='a'>
      <div id='b'>
        
        <div class='x'>
          <h1>A</h1>
        </div><!--</x>-->
        <div class='x'>
          <h1>B</h1>
        </div><!--</x>-->
    
        <div class='x'>
          <h1>C</h1>
        </div><!--</x>-->
    
        <div class='x'>
          <h1>D</h1>
        </div><!--</x>-->
        
      </div><!--</b>-->
    </div><!--</a>-->

    如果您改用.reduceRight(),您甚至可以将此 js 简化为单行:

    document.querySelector('#b').innerHTML = [...document.querySelectorAll('.x')].reduceRight((a, e) => a+e.outerHTML, '');
    

    【讨论】:

    • 感谢 Nick Parsons 的回复,反向排序效果很好,但是如何在页面加载时将滚动框设置在底部?
    • @fsofb 所以您不希望滚动框位于页面底部吗?没有 css 就很难做到……通过 javascript 添加 css 是一种选择吗?
    猜你喜欢
    • 2014-07-10
    • 1970-01-01
    • 2013-02-12
    • 2015-07-07
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多