2015-04-01 56 views
-2

什么算法可以解决以下问题?我需要当你点击菜单块中的一个接收到的类活动,并在中间起床。更改点击时列表项的位置

<ul> 
    <li>1</li> 
    <li>2</li> 
    <li>3</li> 
    <li class="active">4</li> 
    <li>5</li> 
</ul> 

ul li { 
    float: left; 
    list-style: none; 
    background: red; 
    margin-left: 20px; 
    display: block; 
    padding: 20px; 
} 

.active { 
    background: orange; 
} 

Fiddle

+1

其中元素的中间 – 2015-04-01 00:50:08

+0

你要做的是...复制ul的html,编辑html,然后以你想要的方式将它附加回来。 – floor 2015-04-01 00:52:59

回答

1

对于加入活性类做下面

var liElems = document.getElementsByTagName('li'), mid = Math.floor(liElems.length/2); 
Array.prototype.forEach.call(liElems, function (item, idx) { 
    item.idx = idx; 
    item.onclick = function() { 
     document.querySelector('li.active').classList.remove('active'); 
     this.classList.add('active'); 
    }; 
}); 

演示:Fiddle


var liElems = document.getElementsByTagName('li'), 
    length = liElems.length, 
    mid = Math.floor(liElems.length/2); 
Array.prototype.forEach.call(liElems, function (item, idx) { 
    item.idx = idx; 
    item.onclick = function() { 
     document.querySelector('li.active').classList.remove('active'); 
     this.classList.add('active'); 


     if (liElems[mid].idx != mid) { 
      if (liElems[mid].idx == length - 1) { 
       this.parentNode.appendChild(liElems[mid]) 
      } else { 
       this.parentNode.insertBefore(liElems[mid], liElems[liElems[mid].idx]) 
      } 
     } 

     var pos = mid < this.idx ? mid : mid + 1; 
     this.parentNode.insertBefore(this, liElems[pos]) 

    }; 
}); 

演示:Fiddle

+0

非常感谢你的配合! – Aleksandr 2015-04-01 01:10:34