рдПрдЪрдЯреАрдПрдордПрд▓ 5 рдФрд░ рдХрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЦреАрдВрдЪреЗрдВ рдФрд░ рдЫреЛрдбрд╝реЗрдВ

рдПрдЪрдЯреАрдПрдордПрд▓ 5 рдкрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЦреАрдВрдЪрдирд╛ рдФрд░ рдЧрд┐рд░рд╛рдирд╛ рдХрд┐рд╕реА рдХреЛ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдореИрдВ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ HTML5 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реБрдВрджрд░ рдЦреАрдВрдЪрдиреЗ рдФрд░ рдбреНрд░реЙрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХреЗ рд╕реЗ рдХреБрдЫ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

рдкреГрд╖реНрда рдкрд░ рдЯрд╛рдЗрдк рдП рдХреЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдпрд╛ рд╕рдореВрд╣ рдХреЛ рдЯрд╛рдЗрдк рдмреА рдХреЗ рдПрдХ рддрддреНрд╡ рдореЗрдВ рдЦреАрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╡рд╣ рдПрдХ рддрддреНрд╡ рдпрд╛ рдХрдИ рдХреЛ рдбреНрд░рдЧ рдХрд░рддрд╛ рд╣реИред рдПрдХ рддрддреНрд╡ рдХреЛ рдЦреАрдВрдЪрдирд╛ рд╕рд░рд▓ рд╣реИ, рдмрд╕ рдбреНрд░реИрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕рдВрдкрддреНрддрд┐ рдХреЛ true рд╕реЗрдЯ рдХрд░реЗрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕рднреА рдиреЗ рдХрд┐рдпрд╛ред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдШрд╕реАрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЗрдЬ рддреИрдпрд╛рд░ рд╣реИред item рд╡рд░реНрдЧ рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рдХреЛ dropzone рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рддрддреНрд╡ рдореЗрдВ рдЪреБрдирд╛ рдФрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ( dropzone рдмреЙрдХреНрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ dropzone )ред

рдмрджрд╕реВрд░рдд рдЦреАрдВрдЪреЗрдВ рдФрд░ рдбреНрд░реЙрдк рдбреЗрдореЛ

рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рддрддреНрд╡ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрдк рдХреЗрд╡рд▓ рдЪрдпрдирд┐рдд рддрддреНрд╡реЛрдВ рдХреЛ рдЦреАрдВрдЪ рдФрд░ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдПрдХ рдмрд╛рд░ рдореЗрдВ рдХрдИ рддрддреНрд╡реЛрдВ рдХреЛ рдЦреАрдВрдЪ рдФрд░ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред



рдкреГрд╖реНрда рд╕рдВрд░рдЪрдирд╛:

 <div class="items-container"> <div class="items"> <div class="item"><span>a</span></div> <div class="item"><span>b</span></div> <div class="item"><span>c</span></div> <div class="item"><span>d</span></div> <div class="item"><span>e</span></div> <div class="item"><span>f</span></div> <div class="item"><span>g</span></div> </div> </div> <div class="dropzone-container"> <div class="dropzone"></div> </div> 

рдХреЛрдб:

 // jQuery     "" , ,     HTML5 //    jQuery,      dataTransfer. jQuery.event.props.push('dataTransfer'); //   . jQuery.event.props.push('pageX'); jQuery.event.props.push('pageY'); //   . $('.item') //   / ,   draggable. .on('click', function(e) { e.preventDefault(); $(this).toggleClass('selected'); this.draggable = $(this).hasClass('selected'); }) //      , .on('dragstart', function(e) { var html = '', //    , $selectedItems = $('.items .selected'); //  HTML  . $selectedItems.each(function() { html += this.outerHTML; }); //   HTML     . //       . e.dataTransfer.setData('text/html', html); return true; }) .on('dragend', function(e) { resetUI(); }); //  $('.dropzone') //     dragover .on('dragenter', function(e) { $(this).addClass('dragover'); }) //   dragover .on('dragleave', function(e) { $(this).removeClass('dragover'); }) .on('dragover', function(e) { //      drop,       dragover if (e.preventDefault) e.preventDefault(); return false; }) //  drop .on('drop', function(e) { //  HTML   var html = e.dataTransfer.getData('text/html'); //  HTML   $(this).append(html); resetUI(); return true; }); function resetUI() { $('.selected').removeClass('selected').attr('draggable', false); $('.dragover').removeClass('dragover'); } 

рдпрджрд┐ рдЖрдкрдиреЗ рдХрдИ рддрддреНрд╡реЛрдВ рдХреЛ рдЪреБрдирдиреЗ рдФрд░ рдЦреАрдВрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рддреЛ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЗрд╕ рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдХреЗрд╡рд▓ рдПрдХ рдиреЗрддреНрд░рд╣реАрди рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рд╣рдо рдЗрд╕реЗ рдареАрдХ рдХрд░ рджреЗрдВрдЧреЗ!

рдкреБрд░рд╛рдиреЗ рдлреИрд╢рди рдореЗрдВ рдпрд╣ рдмрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╣рдо рдорд╛рдЙрд╕ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдорд╛рдЙрд╕ рдХреЗ рдкреАрдЫреЗ рддрддреНрд╡реЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЛ рдЦреАрдВрдЪрддреЗ рд╣реИрдВред HTML5 рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдХрдВрдзреЛрдВ рдкрд░ рдПрдиреАрдореЗрд╢рди рдХреА рджреЗрдЦрднрд╛рд▓ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдХреЗ рдЗрд╕ рджрд┐рдирдЪрд░реНрдпрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╕рдорд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╣реА рддрддреНрд╡ рдХреЗ рд╕рд╛рде рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

"рд╕рд╣реА рдЪрд┐рддреНрд░" рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддрддреНрд╡реЛрдВ рдХреЛ рдЦреАрдВрдЪрддреЗ рд╕рдордп setDragImage рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА setDragImage рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

function setDragImage(image, x, y)
image - рд╡рд╣ рддрддреНрд╡ рдЬрд┐рд╕рдХреА рдЫрд╡рд┐ рдЦреАрдВрдЪрддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдПрдЧреАред
x рдФрд░ y рдСрдлрд╕реЗрдЯ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдбреНрд░реИрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВ, рдЬрдм рд╣рдо e.dataTransfer.setData('text/html', html) рдХреЛ рдЦреАрдВрдЪрдиреЗ рдФрд░ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ setDragImage рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╛рд╕ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЪрд┐рддреНрд░ рддрддреНрд╡ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкрд╣рд▓реЗ рд╣рдо рдЙрди рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ:

 // ,   . var $draggedItem = $(e.currentTarget), draggedItemOffset = $draggedItem.offset(), // ,     . frame = getFrame($selectedItems), //  ,    . dx = e.pageX - draggedItemOffset.left + (draggedItemOffset.left - frame.lx), dy = e.pageY - draggedItemOffset.top + (draggedItemOffset.top - frame.ly), // ,     image  setDragImage. $image = $(document.createElement('div')); 

frame рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╡рд╛рдВрдЫрд┐рдд рдЖрдХрд╛рд░ рдФрд░ рдЪрд┐рддреНрд░ рддрддреНрд╡ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реЗрдЯ рдХрд░реЗрдВ:
 $image.css({ position: 'absolute', //   ,     dragstart. zIndex: -1, left: frame.lx, top: frame.ly, width: Math.abs(frame.lx - frame.rx), height: Math.abs(frame.ly - frame.ry) }); 

рдЪрдпрдирд┐рдд рддрддреНрд╡реЛрдВ рдХреА рдкреНрд░рддрд┐рдпреЛрдВ рдХреЛ $image :
 $selectedItems.each(function(i, item) { var $item = $(item), $clone = $item.clone(), itemOffset = $item.offset(); //    $image. $clone.css({ position: 'absolute', left: itemOffset.left - frame.lx, top: itemOffset.top - frame.ly }); $image.append($clone); }); 

рдЕрдВрддрд┐рдо рд░рд╛рдЧ:
 //  $image  . $('body').append($image); //  $image     . e.dataTransfer.setDragImage($image.get(0), dx, dy); //  $image  1 .   , //   setDragImage      $image. window.setTimeout(function() { $image.remove(); }, 1); 

рд╣рдо рдЖрдпрдд рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП getFrame рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЪрдпрдирд┐рдд рддрддреНрд╡ рдлрд┐рдЯ рд╣реЛрддреЗ рд╣реИрдВ:
 function getFrame($items) { var offset = $items.first().offset(), frame = { lx: offset.left, ly: offset.top, rx: offset.left, ry: offset.top }; $items.each(function() { var $this = $(this), offset = $this.offset(), width = $this.width(), height = $this.height(); if (offset.left < frame.lx) frame.lx = offset.left; if (offset.top < frame.ly) frame.ly = offset.top; if (offset.left + width > frame.rx) frame.rx = offset.left + width; if (offset.top + height > frame.ry) frame.ry = offset.top + height; }); return frame; } 

рд╕реБрдВрджрд░ рдЦреАрдВрдЪреЗрдВ рдФрд░ рдбреНрд░реЙрдк рдбреЗрдореЛ
рдЧрд┐рдЯрд╣рдм рдирдореВрдирд╛ рдХреЛрдб

Source: https://habr.com/ru/post/In187590/


All Articles