//鼠標點擊開始
center[0].onmousedown = function () {
docMove();
//數據釋放
document.onmouseup = function () {
document.onmousemove = null;
document.onmouseup = null;
};
};
function docMove() {
document.onmousemove = function (e) {
var e = e || window.event;
var newX = e.clientX;
//通過newX動態(tài)設置元素css來達到改變位置的效果
//阻止冒泡
e.stopPropagation();
};
}
問題:如何通過setTimeout達到函數節(jié)流,提升性能?
PS:目前事件執(zhí)行還有一個小問題,就是在移動元素的過程中會間接性出現鼠標已經釋放但onmousemove 并未失效的問題,(實際觀感就是鼠標左鍵已經釋放,但是元素還會跟著鼠標移動)
函數節(jié)流:
var t = null
document.addEventListener('mousemove', () => {
if (t === null) {
t = setTimeout(() => {
console.log('執(zhí)行')
t = null
}, 16)
}
}, false)
為何是 16ms 間隔請參考:https://www.cnblogs.com/liuha...
鼠標釋放元素依然移動:可以在 onmousedown 時開啟元素可移動的開關,onmouseup 時關閉元素可移動的開關,onmousemove 時判斷開關的狀態(tài)決定是否執(zhí)行元素移動的回調,開關即為一個自己聲明的布爾型的變量。
var flag = false
document.addEventListener('mousedown', () => {
flag = true
}, false)
document.addEventListener('mousemove', () => {
if (flag) console.log('執(zhí)行元素移動')
}, false)
document.addEventListener('mouseup', () => {
flag = false
}, false)dom.onmousemove=function(){
if (this.time && Date.now() - this.time < 50) return
this.time = Date.now()
// you code
}
如果在移動元素的回調里節(jié)流,會導致移動卡卡的.最好不要高于16(1000/60,顯示器一般刷新率是60幀/秒)
附贈一個簡單的拖拽吧
let box = document.querySelector('.box')
document.onmousedown = function (e) {
let down = false
if (e.target === box) {
down = true
e.target.x = e.offsetX
e.target.y = e.offsetY
}
document.onmousemove = function (e) {
if (!down) return
if (this.time && (Date.now() - this.time) < 16) return
this.time = Date.now()
box.style.transform = `translate3d(${e.clientX - box.x}px,${e.clientY - box.y}px,0)`
}
document.onmouseup = clear
}
function clear() {
document.onmouseup = document.onmousemove = null
}
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數據專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產業(yè)為響應國家深化產教融合/校企合作的政策,積極推進“中國制造2025”,實現中華民族偉大復興的升級產業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經理從事移動互聯網管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經理職務負責iOS教學及管理工作。
浪潮集團項目經理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網頁制作和網頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經驗。曾經歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。