HTML5高階例項之Drag&Drop
阿新 • • 發佈:2019-01-29
var relativeX = 0;//可移動元素相對於父元素的位置
var relativeY = 0;
var mousedownX = 0;//滑鼠在可移動元素上單擊時,相對於該元素的位置 0 < x < 100
var mousedownY = 0;
var draggableEle = document.getElementById('child');
function dragstart(ev) {
//ev.dataTransfer.setData("Text",ev.target.id);//獲取拖動元素例項
}
function drag(ev) {
}
function mousedown(ev) {
//ev物件下offsetX offsetY滑鼠在該移動元素上的位置
mousedownX = ev.offsetX;
mousedownY = ev.offsetY;
}
function dragend(ev) {
//ev物件下screenX clientX pageX x都相同
//ev物件下clientY pageY y都相同,相對於可視區域的垂直位置;但screenY不同,screenY是相對於螢幕的垂直位置
//ev物件下offsetX offsetY滑鼠移動的位移+滑鼠在該移動元素上的位置
//DOM元素屬性操作方法 getAttribute()、setAttribute()、removeAttribute()
//DOM元素樣式操作方法 elm.style.color 獲取和賦值
relativeX += ev.offsetX - mousedownX;
relativeY += ev.offsetY - mousedownY;
//draggableEle.setAttribute('style','left:'+ relativeX + 'px;top:' + relativeY + 'px');//失效,因為重置了所有屬性,丟失了寬高
//水平方向
if(ev.screenX <= 20 || ev.screenX >= 620){//鼠標出界
if(ev.screenX <= 20){//父元素相對於螢幕的margin-left: 20px;
draggableEle.style.left = 0 + 'px';
relativeX = 0;//注意:此處沒有px
}else if(ev.screenX >= 620){//父元素寬600 + 20
draggableEle.style.left = 500 + 'px';//600-100
relativeX = 500;//注意:此處沒有px
}else{
draggableEle.style.left = relativeX + 'px';
}
}else{//元素出界滑鼠沒有出界
if(ev.screenX <= mousedownX + 20){
draggableEle.style.left = 0 + 'px';
relativeX = 0;//注意:此處沒有px
}else if(ev.screenX >= mousedownX + 520){//600-100+20
draggableEle.style.left = 500 + 'px';
relativeX = 500;//注意:此處沒有px
}else{
draggableEle.style.left = relativeX + 'px';
}
}
//垂直方向
if(ev.pageY <= 20 || ev.pageY >= 440){//鼠標出界
if(ev.pageY <= 40){
draggableEle.style.top = 0 + 'px';
relativeY = 0;//注意:此處沒有px
}else if(ev.pageY >= 440){
draggableEle.style.top = 340 + 'px';
relativeY = 340;//注意:此處沒有px
}else{
draggableEle.style.top = relativeY + 'px';
}
}else{//元素出界滑鼠沒有出界
if(ev.pageY <= mousedownY + 40){
draggableEle.style.top = 0 + 'px';
relativeY = 0;//注意:此處沒有px
}else if(ev.pageY >= mousedownY + 380){//400-60+40
draggableEle.style.top = 340 + 'px';
relativeY = 340;//注意:此處沒有px
}else{
draggableEle.style.top = relativeY + 'px';
}
}
}
//必須重寫dragenter事件和dragover事件,阻止這兩個事件的預設行為觸發,才能觸發drop事件
function dragenter(ev) {
ev.preventDefault();//dragenter事件的預設行為是該元素不允許其他元素放入,阻止預設行為之後,其他元素即可放入
}
function dragover(ev) {
ev.preventDefault();//dragover事件的預設行為是該元素不允許其他元素放入,阻止預設行為之後,其他元素即可放入
}
//在Firefox3.5+中,放置事件的預設行為是開啟被放到放置目標上的URL,為了相容性,需要取消drop事件的預設行為
function drop(ev) {
ev.preventDefault();
}