You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							83 lines
						
					
					
						
							1.6 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							83 lines
						
					
					
						
							1.6 KiB
						
					
					
				| var tethers = []; | |
| 
 | |
| document.addEventListener('DOMContentLoaded', function(){ | |
|   dragging = null; | |
| 
 | |
|   document.body.addEventListener('mouseup', function(){ | |
|     dragging = null; | |
|   }); | |
| 
 | |
|   document.body.addEventListener('mousemove', function(e){ | |
|     if (dragging){ | |
|       dragging.style.top = e.clientY + 'px'; | |
|       dragging.style.left = e.clientX + 'px'; | |
| 
 | |
|       Tether.position() | |
|     } | |
|   }); | |
| 
 | |
|   document.body.addEventListener('mousedown', function(e){ | |
|     if (e.target.getAttribute('data-index')) | |
|       dragging = e.target; | |
|   }) | |
| 
 | |
|   var count = 60; | |
|   var parent = null; | |
|   var dir = 'left'; | |
|   var first = null; | |
| 
 | |
|   while (count--){ | |
|     var el = document.createElement('div'); | |
|     el.setAttribute('data-index', count); | |
|     document.querySelector('.scroll').appendChild(el); | |
| 
 | |
|     if (!first) | |
|       first = el; | |
|   | |
|     if (count % 10 === 0) | |
|       dir = dir == 'right' ? 'left' : 'right'; | |
| 
 | |
|     if (parent){ | |
|       tethers.push(new Tether({ | |
|         element: el, | |
|         target: parent, | |
|         attachment: 'middle ' + dir, | |
|         targetOffset: (dir == 'left' ? '10px 10px' : '10px -10px') | |
|       })); | |
| 
 | |
|     } | |
| 
 | |
|     parent = el; | |
|   } | |
| 
 | |
|   initAnim(first); | |
| }); | |
| 
 | |
| function initAnim(el){ | |
|   var start = performance.now() | |
|   var last = 0; | |
|   var lastTop = 0; | |
|   var tick = function(){ | |
|     var diff = performance.now() - last; | |
| 
 | |
|     if (!last || diff > 50){ | |
|       last = performance.now(); | |
| 
 | |
|       var nextTop = 50 * Math.sin((last - start) / 1000); | |
| 
 | |
|       var curTop = parseFloat(el.style.top || 0); | |
|       var topChange = nextTop - lastTop; | |
|       lastTop = nextTop; | |
| 
 | |
|       var top = curTop + topChange; | |
| 
 | |
|       el.style.top = top + 'px'; | |
| 
 | |
|       Tether.position(); | |
|     } | |
| 
 | |
|     requestAnimationFrame(tick); | |
|   }; | |
| 
 | |
|   tick(); | |
| }
 |