| 4 | 1 <!doctype html> | 
|  | 2 <html> | 
|  | 3 	<head> | 
|  | 4 		<meta name="viewport" content="width=device-width, initial-scale=1"> | 
|  | 5 		<style> | 
|  | 6 			@import "/site.css"; | 
|  | 7 			@import "/dad.css"; | 
|  | 8 | 
|  | 9 			span[handle] { | 
|  | 10 				display: inline-block; | 
|  | 11 				background-color: LightGreen; | 
|  | 12 				padding: 8px; | 
|  | 13 			} | 
|  | 14 			span[outer] { | 
|  | 15 				display: inline-block; | 
|  | 16 				background-color: LightBlue; | 
|  | 17 				padding: 8px; | 
|  | 18 				position: relative; | 
|  | 19 			} | 
|  | 20 		</style> | 
|  | 21 		<script src="/dad.js"></script> | 
|  | 22 		<script> | 
|  | 23 			dad.whatToDrag = function(draggable) { | 
|  | 24 				return draggable.parentNode; | 
|  | 25 			}; | 
|  | 26 | 
|  | 27 			dad.onDrop = function(event) { | 
|  | 28 				let draggable = event.draggable; | 
|  | 29 				let style = draggable.style; | 
|  | 30 				let left = style.left ? parseInt(style.left) : 0; | 
|  | 31 				let top = style.top ? parseInt(style.top) : 0; | 
|  | 32 				let rectDragged = event.dragged.getBoundingClientRect(); | 
|  | 33 				let rectDraggable = draggable.getBoundingClientRect(); | 
|  | 34 				left += rectDragged.x - rectDraggable.x; | 
|  | 35 				top += rectDragged.y - rectDraggable.y; | 
|  | 36 				style.left = left + 'px'; | 
|  | 37 				style.top = top + 'px'; | 
|  | 38 			}; | 
|  | 39 | 
|  | 40 			function init() { | 
|  | 41 				let span = document.querySelector('span[handle]'); | 
|  | 42 				dad.setDraggable(span); | 
|  | 43 			} | 
|  | 44 		</script> | 
|  | 45 	</head> | 
|  | 46 	<body> | 
|  | 47 		<h1>Handle</h1> | 
|  | 48 		<p> | 
|  | 49 			<span outer> | 
|  | 50 				<span handle>drag me</span> | 
|  | 51 				along for the ride | 
|  | 52 			</span> | 
|  | 53 		</p> | 
|  | 54 		<p>bottom</p> | 
|  | 55 	</body> | 
|  | 56 	<script> init(); </script> | 
|  | 57 </html> |