[WebDevCurriculum] drag


1.画面領域


  • クライアント領域:ユーザが見た
  • Page領域:ドキュメント全体が存在する領域であり、クライアント領域によってはユーザが見えない領域が存在する可能性がある.
  • ※offset領域:特定のオブジェクトまたはアクティブなオブジェクトを選択する場合、そのオブジェクトの原点に基づいて変位を示す領域
  • .

    2.座標概念


    dragを含むmouseイベントは,まず座標概念を理解する必要がある.
  • ScreenX、ScreenY:マウスX、Y値、コンピュータ画面全体の左上隅に基づいています.
  • PageX、PageY:マウスX、Y値、ドキュメント全体の左上隅に対して.
    ※スクロールバーの移動は座標値の影響を受けます.
  • ClientX,ClientY:ユーザーが見たドキュメント(Web画面)に基づくマウスX,Y値.
    ※スクロールバーの移動は座標値の影響を受けません.
  • オフセットX、オフセットY:特定のオブジェクト、イベント追加領域に基づくマウスX、Y値.
  • 3. CSS position


    座標設定(position)の概念を理解してドラッグイベント(object move)を開始します.
  • default(静的)position:オブジェクトのx、y座標を保持します.
  • 相対位置:オブジェクトの相対位置に基づいて座標を決定します.
  • 絶対位置:オブジェクトの親(親)クラスとコンポーネントの位置に基づいて座標を決定します.
  • 位置決め:全画面(Screen)を基準として座標を決定します.
  • 4.主な方法


    addEventListenerは、単一のオブジェクトにマウスイベントを追加できます.
  • mousedown:マウスをクリックすると(切断する前に)イベントが発生します.
  • mousemove:マウスをクリックして移動するとイベントが発生します.
  • mouseup:マウスを離すとイベントが発生します.
  • ※ e.target.style.Transform:選択したオブジェクトを定義した座標変化量で移動できます.
  • 4-1. 要素のドラッグロジック

    객체정의
  • イベント
  • を追加するオブジェクトを定義します.
    let section = document.querySelector('.desktop')
    let container = section.querySelector('.container');
    let box = container.querySelector('.box')
    객체에 대한 mousedown/mousemove/mouseup을 활용하여 drag logic 구현
    let isClicked = false;
    let offsetX, offsetY = 0;
    
    		container.onmousedown = function(e){
    				//box를 선택하였을때만
    			if(e.target == box){
    				isClicked = true;
                  
    				offsetX = e.offsetX;
    				offsetY = e.offsetY;
    			}
    		}
    
    				//box가 종속되어있는 부모영역(DOM)에서 움직일 경우에 반응
    				//box 객체에 대해서는 mousemove event에 반응하여 움직임
    		container.onmousemove = function(e){
    			if(isClicked){
    				box.style.position = 'absolute';
    				box.style.left = e.pageX - offsetX + 'px';
    				box.style.top = e.pageY - offsetY + 'px';
    			}else{
    				return ;
    			}
    
    		container.onmouseup = function(e){
    			isClicked = false;
    		}
    			

    4-2. イベントターゲット情報の取得の重要性

  • ビットロジックにif(e.target == box)部分が適用されると、選択されたオブジェクトのプロパティがboxであっても、最上位オブジェクト(上のブロック)にのみイベントが適用されます.
  • 選択するオブジェクトが複数ある場合は、すべてのオブジェクトを論理的に構成してイベントを有効にする必要があります.

  • 4-3. 複数の要素のドラッグロジック

    객체정의
    let section = document.querySelector('.desktop')
    let container = section.querySelector('.container');
    let box = container.querySelector('.box')
    현재 이벤트가 적용될(선택된) 객체 정보를 저장할 변수 선언
    
    let isClicked = false;
    let offsetX, offsetY = 0;
    let currentObject = null;
    currentObject를 활용하여 모든 객체에 event를 적용할 수 있도록 설정
  • ここでのコアは、mousemoveイベントの適用オブジェクトを現在選択されているターゲット(e.target)に設定することです.
  • container.onmousedown = function(e){
    		//box를 선택하였을때만
    					
    		isClicked = true;
    
    		offsetX = e.offsetX;
    		offsetY = e.offsetY;
    
    		current = e.target;
    					
    	}
    
    	//box가 종속되어있는 부모영역(DOM)에서 움직일 경우에 반응
    	//box 객체에 대해서는 mousemove event에 반응하여 움직임
    	container.onmousemove = function(e){
    		if(isClicked){
    			current.style.position = 'absolute';
    			current.style.left = e.pageX - offsetX + 'px';
    			current.style.top = e.pageY - offsetY + 'px';
    		}else{
    			return ;
    		}
    
    	container.onmouseup = function(e){
    		isClicked = false;
    	}
       }

    5.参照リンク


    要素ドラッグの深化(styleではなく変換による移動)
    https://velog.io/@altmshfkgudtjr/JS-Screen-Dragging-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0
    座標/drag event基本概念
    https://www.youtube.com/watch?v=Qzmya5CV9FA&list=RDCMUC5-ixpj8DioZqmrasj6Ihpw&start_radio=1&t=395s