原生JS實現(xiàn)滑動按鈕效果
利用Js制作的滑動按鈕的具體代碼,供大家參考,具體內(nèi)容如下
首先貼上效果圖

再貼上源碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div style="position: relative;width:100vw;height:100vh">
<div id="container">
<svg style="width:inherit;height:inherit">
<circle id="c" cx="25" cy="25" r="23" style="fill:white; stroke:gray; stroke-width:2;"
onmousedown="down(event)"
onmouseup="up(event)"
onmouseleave="up(event)"
/>
</svg>
</div>
</div>
<!-- <script>
setTimeout(function () {
let c = document.querySelector('circle');
console.log(c.parentNode.parentNode.style)
},500)
</script> -->
<style>
body{
margin:0;
background-color:azure;
}
#container{
position:absolute;
left: 50%; top: 50%;
transform: translateX(-50%) translateY(-50%);
width: 200px;
height: 50px;
background-color: black;
border-radius: 50px;
}
</style>
<script>
let circle = document.getElementById('c'),
clicked = false,
x = 0,y = 0;
circle.addEventListener("mousemove",function(e){
x = e.offsetX;
if(clicked){
circle.setAttribute("cx",x)
}
})
function t(e){
circle.setAttribute("cx",e.offsetX);
}
function down(e){
clicked = true;
}
function up(){
if(clicked){
let flag;
if(x <= 100)
new Promise(function(resolve,reject){
flag = setInterval(function(){
x -= 2;
circle.setAttribute("cx",x);
if(x <= 25){
circle.setAttribute("cx",25)
circle.setAttribute("style","fill:white; stroke:gray; stroke-width:2;")
resolve("ok")
}
})
}).then(res => {
clearInterval(flag)
})
else
new Promise(function(resolve,reject){
flag = setInterval(function(){
x += 2;
circle.setAttribute("cx",x);
if(x >= 175){
circle.setAttribute("cx",175);
circle.setAttribute("style","fill:black; stroke:gray; stroke-width:2;")
resolve("ok")
}
})
}).then(res => {
clearInterval(flag)
})
}
clicked = false;
}
</script>
</body>
</html>
知識點和制作思路及步驟
1、基本布局(父相子絕,left: 50%; top: 50%; transform: translateX(-50%)
translateY(-50%);)
2、svg的circle( cx )控制移動, 對于circle的cx采用setAtrribute來進(jìn)行控制。
3、**Promise.then()**用來保證結(jié)束后進(jìn)行clearInterval
4、circle監(jiān)聽了mousemove,mouseup,mousedown事件。 當(dāng)mousedown事件觸發(fā)會將cliked置為true進(jìn)而move事件會進(jìn)行reset;
5、mouseup和mouseleave會將cliked置為false;進(jìn)而無法觸發(fā)move事件的reset(停止);
6、當(dāng)停止?fàn)顟B(tài)下,判斷原點在左側(cè)還是右側(cè), 動畫: 如果在左半部分則利用setInterval進(jìn)行10ms一幀每次1.5px的移動,判斷到達(dá)開始或者結(jié)束點則停止。
7、再進(jìn)行樣式切換。
代碼本人全部原創(chuàng),請盡情抄襲,代碼寫完沒有經(jīng)過整理,可能存在無效變量,僅僅代表我的思路。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
input file的默認(rèn)value清空與賦值方法
出于安全性考慮,JS是不能直接設(shè)置File的value值的,下面是我總結(jié)出來的方法2010-09-09
JS正則表達(dá)式實現(xiàn)字符串中連續(xù)在一起的字符去重
這篇文章主要給大家介紹了關(guān)于JS正則表達(dá)式實現(xiàn)字符串中連續(xù)在一起的字符去重的相關(guān)資料,學(xué)會正則表達(dá)式對開發(fā)者而言是個非常有用的技能,很多功能可以簡單的用一句正則來實現(xiàn),需要的朋友可以參考下2023-11-11
javascript:history.go()和History.back()的區(qū)別及應(yīng)用
為提高用戶體驗度,可能會使用到刷新 前進(jìn) 后退等相關(guān)更能,本文將以此問題詳細(xì)介紹javascript:history.go()和History.back()的區(qū)別及應(yīng)用,需要的朋友可以參考下2012-11-11
實現(xiàn)抖音兩個旋轉(zhuǎn)小球的loading技巧實例
這篇文章主要為大家介紹了實現(xiàn)抖音兩個旋轉(zhuǎn)小球的loading技巧實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
jstree中的checkbox默認(rèn)選中和隱藏示例代碼
這篇文章主要介紹了jstree的checkbox默認(rèn)選中和隱藏,需要的朋友可以參考下2019-12-12

