Similar to iPhone slide to unlock. Using pure javascript to drag an object for devices with and without touch support
A Pen by JunesiPhone on CodePen.
<!--http://JunesiPhone.com--> | |
<html> | |
<head> | |
<title></title> | |
</head> | |
<body> | |
<div id="container"> | |
<div id="slider" ><div id="inner">➟</div></div> | |
</div> | |
</body> | |
</html> |
Similar to iPhone slide to unlock. Using pure javascript to drag an object for devices with and without touch support
A Pen by JunesiPhone on CodePen.
var getEL = function(el) { | |
return document.getElementById(el); | |
}; | |
var acceptsTouch = function() { | |
return 'ontouchstart' in document.documentElement; | |
}; | |
function getStyle(oElm, strCssRule){ | |
var strValue = ""; | |
if(document.defaultView && document.defaultView.getComputedStyle){ | |
strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule); | |
} | |
else if(oElm.currentStyle){ | |
strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){ | |
return p1.toUpperCase(); | |
}); | |
strValue = oElm.currentStyle[strCssRule]; | |
} | |
return strValue; | |
} | |
var drag = function() { | |
return { | |
move: function(div, xpos, ypos) { | |
div.style.left = xpos + "px"; | |
//div.style.top = ypos + "px"; //not moving y axis in this case | |
}, | |
startMoving: function(div, container, evt) { | |
evt = evt || window.event; | |
var posX = ((acceptsTouch()) ? evt.touches[0].clientX : evt.clientX), | |
posY = ((acceptsTouch()) ? evt.touches[0].clientY : evt.clientY), | |
divTop = div.style.top.replace('px', ''), | |
divLeft = div.style.left.replace('px', ''), | |
offsetX = posX - divLeft, | |
offsetY = posY - divTop; | |
if (acceptsTouch()) { | |
document.ontouchmove = function(evt) { | |
evt.preventDefault(); | |
evt = evt || window.event; | |
var posX = evt.touches[0].clientX, | |
posY = evt.touches[0].clientY, | |
cWidth = getStyle(getEL('container'),'width').replace('px',''), | |
dWidth = getStyle(getEL('slider'),'width').replace('px',''), | |
finalX = posX - offsetX, | |
finalY = posY - offsetY; | |
if (finalX < 0) {finalX = 0;} | |
if (finalY < 0) {finalY = 0;} | |
if(finalX <= cWidth - dWidth - 8){ | |
drag.move(div, finalX, finalY); | |
} | |
}; | |
} else { | |
document.onmousemove = function(evt) { | |
evt.preventDefault(); | |
evt = evt || window.event; | |
var posX = evt.clientX, | |
posY = evt.clientY, | |
cWidth = getStyle(getEL('container'),'width').replace('px',''), //container width | |
dWidth = getStyle(getEL('slider'),'width').replace('px',''), //slider width | |
finalX = posX - offsetX, | |
finalY = posY - offsetY; | |
if (finalX < 0) {finalX = 0;} | |
if (finalY < 0) {finalY = 0;} | |
if(finalX <= cWidth - dWidth - 8){ | |
drag.move(div, finalX, finalY); | |
} | |
}; | |
} | |
}, | |
stopMoving: function(div, container, evt) { | |
if (acceptsTouch()) { | |
//evt.changedTouches[0].clientX | |
div.style.left = "3px"; | |
} else { | |
document.getElementById(container).style.cursor = 'default'; | |
document.onmousemove = function() {}; | |
//evt.clientX | |
div.style.left="3px"; | |
} | |
}, | |
}; | |
}(); | |
(function(){ | |
var el = getEL("slider"); | |
if (acceptsTouch()) { | |
el.addEventListener('touchstart', function(e) { | |
drag.startMoving(this, 'container', event); | |
}, false); | |
el.addEventListener('touchend', function(e) { | |
drag.stopMoving(this, 'container', event); | |
}, false); | |
} else { | |
el.addEventListener('mousedown', function(e) { | |
drag.startMoving(this, 'container', event); | |
}, false); | |
el.addEventListener('mouseup', function(e) { | |
drag.stopMoving(this, 'container', event); | |
}, false); | |
} | |
})(); |
#container{ | |
position: absolute; | |
top:140px; | |
left:5px; | |
width: 500px; | |
height: 100px; | |
background-color:rgba(0,0,0,0.5); | |
border: 1px solid rgba(0,0,0,1); | |
border-radius: 10px; | |
} | |
#slider{ | |
border: 1px solid rgba(255,255,255,0.2); | |
position: absolute; | |
background-color: green; | |
width:140px;height:90px;top:3px;left:3px;border-radius:10px; | |
} | |
#inner{ | |
margin-left:55px; | |
line-height:100px; | |
font-size: 90px; | |
color:rgba(0,0,0,0.5); | |
text-shadow: 1px 1px rgba(255,255,255,0.2); | |
} | |
html{background:gray;} |