Changing the order of elements

前端 未结 4 1156
耶瑟儿~
耶瑟儿~ 2020-11-30 12:16

I am creating a website of floating width. The users use screens from full HD resolution to some 600px on smart phones it seems a pretty good idea. This brings up a very int

相关标签:
4条回答
  • 2020-11-30 12:59

    wouldn't swapping innerHTML also work?

    var myList = document.getElementsByTagName("ul")[0]; 
    temp = myList.getElementsByTagName("li")[0].innerHTML;
    myList.getElementsByTagName("li")[0].innerHTML = myList.getElementsByTagName("li")[1].innerHTML;
    myList.getElementsByTagName("li")[1].innerHTML = temp;
    
    0 讨论(0)
  • 2020-11-30 13:02

    In 2018 (and already a few years ago) this is possible with just CSS. Your use case would be solved by something like this:

    ul {
      display: flex;
      flex-direction: column;
    }
    
    li:nth-child(2) {
      order: -1;
    }
    
    0 讨论(0)
  • 2020-11-30 13:06

    You can use flex to change the order of the HTML elements very easily.

    flex order: 0 by changing the order value you can decide where in the column the element appears

    const ascButton= document.getElementById('asc')
    const decButton= document.getElementById('dec')
    
    //callback function for soring in ascending order
    const ascending = (a,b)=> a.innerHTML - b.innerHTML
    
    //callback function for soring in descending order
    const descending = (a,b)=> b.innerHTML - a.innerHTML
    
    let currentOrder = ascending
    
    ascButton.addEventListener('click', ()=>{
    	currentOrder = ascending
      order()
    })
    
    
    decButton.addEventListener('click', ()=>{
    	currentOrder = descending
      order()
    })
    
    
    const order  = function(){
    	const ordered = [...document.getElementsByClassName('col')].sort(currentOrder)
      ordered.forEach((elem, index)=>{
      	elem.style.order = index
      })
    }
    
    
    order()
    .row{
      display: flex;
      flex-direction: column;
    }
    .col{
      padding: 20px;
      border: 1px solid gray;
      margin: 5px;
      order:3;
    }
    <div class="row">
      <div class="col "   id="one">1</div>
      <div class="col "   id="two">2</div>
      <div class="col " id="three">3</div>
      <div class="col " id="ten">10</div>
      <div class="col "  id="four">4</div>
      <div class="col "  id="five">5</div>
    </div>
    
    <button id="asc">ASC</button>
    <button id="dec">DESC</button>

    You can find a much more complex implementation here https://jsfiddle.net/nijeesh4all/on5rsax8/

    0 讨论(0)
  • 2020-11-30 13:14

    For this simple case (swapping the only two elements), you can just use appendChild():

    (() => {
      const list = document.querySelector("ul");
      list.appendChild(list.firstElementChild);
    })();
    <ul>
      <li>List-item #1</li>
      <li>List-item #2</li>
    </ul>

    The same node cannot exist in multiple positions; so, it's removed from its current position and placed at the end of the collection.

    If you want to do more complicated sorting, you probably ought to create an array from the childNodes and get all crazy:

    (() => {
      const frag = document.createDocumentFragment();
      const list = document.querySelector("ul");
      const items = list.querySelectorAll("li");
      const sortedList = Array.from(items).sort(function(a, b) {
        const c = a.textContent,
          d = b.textContent;
        return c < d ? -1 : c > d ? 1 : 0;
      });
      for (let item of sortedList) {
        frag.appendChild(item);
      }
      list.appendChild(frag);
    })();
    <ul>
      <li>Dogs</li>
      <li>Snakes</li>
      <li>Cats</li>
      <li>Bugs</li>
    </ul>

    0 讨论(0)
提交回复
热议问题