這篇文章主要介紹“這么用原生js操作dom實(shí)現(xiàn)上下左右移動(dòng)”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“這么用原生js操作dom實(shí)現(xiàn)上下左右移動(dòng)”文章能幫助大家解決問題。
下冶ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{
padding: 0;
margin:0;
}
html,body,main{
height: 100%;
width: 100%;
}
.box{
height: 20px;
width: 20px;
border-radius: 50%;
background:red;
position: absolute;
left: 0;
right: 0;
}
.lookFood{
font-size: 20px;
position: absolute;
left: 50%;
top:40px;
transform: translateX(-50%);
}
.food{
height: 20px;
width: 20px;
background: #faa;
border-radius: 50%;
position: absolute;
}
footer span{
position: absolute;
bottom: 20px;
left: 50%;
transform: translateX(-50%);
}
</style>
</head>
<body>
<main>
<div class="lookFood">獲取了<span>0</span>個(gè)food</div>
<div class="box"></div>
<div class="food"></div>
</main>
<footer>
<span>小提示:按下↑↓←→方向鍵開始收集食物吧</span>
</footer>
</body>
<script>
var box = document.getElementsByClassName("box")[0],
food = document.getElementsByClassName("food")[0],
span = document.getElementsByTagName("span")[0],
//獲取的食物個(gè)數(shù)
i = 0;
//初始化food的位置;每次吃到調(diào)用
function foodInit() {
food.style.left = Math.random() * parseInt(window.getComputedStyle(document.body).width) - 20 + "px";
food.style.top = Math.random() * parseInt(window.getComputedStyle(document.body).height) - 20 + "px";
//獲取隨機(jī)的16進(jìn)制顏色值;
food.style.background = '#' + (~~(Math.random() * (1 << 24))).toString(16);
}
//小球每次運(yùn)動(dòng)調(diào)用這個(gè)函數(shù) 判斷有沒有找到食物;
function start() {
var boxLeft = parseInt(window.getComputedStyle(box).left),
boxTop = parseInt(window.getComputedStyle(box).top),
foodLeft = parseInt(window.getComputedStyle(food).left),
foodTop = parseInt(window.getComputedStyle(food).top);
//console.log(Math.abs(boxLeft - foodLeft) + "left+" + Math.abs(boxTop - foodTop) + "top+" + parseInt(window.getComputedStyle(food).height))
if (Math.abs(boxLeft - foodLeft) < parseInt(window.getComputedStyle(food).width) && Math.abs(boxTop - foodTop) < parseInt(window.getComputedStyle(food).height)) {
span.innerHTML = ++i;
foodInit()
}
}
/**
*鍵盤上下左右觸發(fā)dom移動(dòng);
*可以同時(shí)觸發(fā)兩個(gè)方向的事件;
*傳入四個(gè)參數(shù):dom需要移動(dòng)的dom;
*main移動(dòng)的范圍容器
*speed每秒移動(dòng)速度;
*callback每次執(zhí)行觸發(fā)的函數(shù);
*/
var keyDomMove = (function() {
//通過閉包保存變量
var keyCode = {
//每次按下上下左右的將當(dāng)前按下的方向保存 為ture;
downKeyCode: function(e) {
var e = e || window.event;
//只需要用到上下左右 只保存4個(gè)鍵值;
if (e.keyCode === 37 || e.keyCode === 38 || e.keyCode === 39 || e.keyCode === 40) {
keyCode[e.keyCode] = true;
}
},
//每次彈起上下左右的將當(dāng)前彈起的方向修改為flase;
upKeyCode: function(e) {
var e = e || window.event;
if (keyCode[e.keyCode]) {
keyCode[e.keyCode] = false;
}
},
//用于保存當(dāng)前的setInterval;通過定時(shí)器增強(qiáng)小球移動(dòng)的連貫性;
time: {},
};
return function(dom, main, speed,callback) {
if (typeof speed != "number") {
speed = 1;
} else {
//速度必須大于60px每秒;每次移動(dòng)的像素小于1px瀏覽器會(huì)修正為0px;這也是因?yàn)檫\(yùn)用了定時(shí)器的缺點(diǎn);
//除以60是因?yàn)闉g覽器播放動(dòng)畫每秒60幀可以保持動(dòng)畫的流暢性;
speed = (speed/60) > 1 ? (speed/60) : 1
}
var left = parseInt(window.getComputedStyle(dom).marginLeft),
top = parseInt(window.getComputedStyle(dom).marginTop),
mainHeigeht=parseInt(window.getComputedStyle(main).height)-20,
mainWidth=parseInt(window.getComputedStyle(main).width)-20,
//用于左右 和上下穿透;
changeXY=function(xy,min,max){
if(xy<min){
xy=max;
}else if(xy>=max){
xy=min;
}
return xy;
};
document.addEventListener("keydown", function(e) {
e.preventDefault()
keyCode.downKeyCode();
if (keyCode[37] && !keyCode.time[37]) {
keyCode.time[e.keyCode] = setInterval(function() {
var x= dom.offsetLeft - left - speed ;
x=changeXY(x,0,mainWidth);
dom.style.left =x+"px";
callback&&callback();
}, 50/3)
};
if (keyCode[38] && !keyCode.time[38]) {
keyCode.time[e.keyCode] = setInterval(function() {
var y = dom.offsetTop - top - speed
y=changeXY(y,0,mainHeigeht);
dom.style.top=y+"px";
callback&&callback();
}, 50/3)
};
if (keyCode[39] && !keyCode.time[39]) {
keyCode.time[e.keyCode] = setInterval(function() {
var x= dom.offsetLeft - left + speed ;
x=changeXY(x,0,mainWidth);
dom.style.left =x+"px";
callback&&callback();
}, 50/3)
};
if (keyCode[40] && !keyCode.time[40]) {
keyCode.time[e.keyCode] = setInterval(function() {
var y = dom.offsetTop - top + speed ;
y=changeXY(y,0,mainHeigeht);
dom.style.top=y+"px";
callback&&callback();
}, 50/3)
};
//每次彈起按鍵 移除當(dāng)前方向的定時(shí)器 ;
document.addEventListener("keyup", function(e) {
keyCode.upKeyCode();
clearInterval(keyCode.time[e.keyCode]);
keyCode.time[e.keyCode] = null;
})
})
}
})()
function init() {
foodInit(food);
keyDomMove(box, document.body,500,start);
}
init()
</script>
</html>
關(guān)于“這么用原生js操作dom實(shí)現(xiàn)上下左右移動(dòng)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。
分享標(biāo)題:這么用原生js操作dom實(shí)現(xiàn)上下左右移動(dòng)
URL網(wǎng)址:http://muchs.cn/article24/ihsjje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、企業(yè)建站、軟件開發(fā)、網(wǎng)站導(dǎo)航、搜索引擎優(yōu)化、網(wǎng)站內(nèi)鏈
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源:
創(chuàng)新互聯(lián)