Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Drag & Drop objektu ve webovém prohlížeči

Ahoj,

prosím měl bych dotaz.
Jedná se mi o posunutí objektu myší na PC a na tabletu rukou ve webové stránce.

Mám to připravené na zkoušení tady:
https://codepen.io/bladnman/pen/LEWYYN

Všude to funguje až na jednu drobnost.
Když změním element DIV na IMG (obrázek), přestane to fungovat.
Jako myslím ten posun.

Chtěl bych se zeptat, proč se tak děje a jak to upravit.
Nemělo by to být složité.

Řešení:

Tak nakonec jsem se zamyslel nad různými variantami dosažení cíle.

Postup, který se mě nejvíce líbí je přes staré dobré jQuery (zdravíme moderní těžkoobratné webové vývojáře označující jej za údajně nevhodné pro velké projekty - vymřete na choleru, vy "intelektuálové" 👍).

Jquery má úplně jednoduchou funkci, jako facka -> Draggable

$(selector).draggable();

Více na odkaze s demem zde: https://jqueryui.com/draggable

Nicméně je pravda, v tabletech a na mobilech je potřeba přihrát tuto funkci, jinak to tam nejede:

  function touchHandler(event) {
      var touch = event.changedTouches[0];

      var simulatedEvent = document.createEvent("MouseEvent");
          simulatedEvent.initMouseEvent({
          touchstart: "mousedown",
          touchmove: "mousemove",
          touchend: "mouseup"
      }[event.type], true, true, window, 1,
          touch.screenX, touch.screenY,
          touch.clientX, touch.clientY, false,
          false, false, false, 0, null);

      touch.target.dispatchEvent(simulatedEvent);
      event.preventDefault();
  }

  function init() {
      document.addEventListener("touchstart", touchHandler, true);
      document.addEventListener("touchmove", touchHandler, true);
      document.addEventListener("touchend", touchHandler, true);
      document.addEventListener("touchcancel", touchHandler, true);
  }

 $( document ).ready(function() {

    init();

})

A to je celé přátelé.
Na rozdíl od jiných nabobtnalých knihoven je tento kód efektivní a netrhá se ani na pomalejších tabletech. 👍

Předmět Autor Datum
Mně to funguje.
Wikan 01.05.2023 11:57
Wikan
Ta ukázka funguje, neboť, jak píši přesouvám DIV a nikoliv IMG.
Flash_Gordon 01.05.2023 12:02
Flash_Gordon
I když to změním na IMG, tak mi to funguje.
Wikan 01.05.2023 12:04
Wikan
Tak to bude nějaké "Miss uderstanding". Element IMG má totiž jiné vlastnosti a proto to na něj nefu…
Flash_Gordon 01.05.2023 12:25
Flash_Gordon
Když nefunguje, tak co je tohle? https://codepen.io/wikancz/pen/MWPEWxW
Wikan 01.05.2023 12:35
Wikan
Element IMG je ve výchozím stavu tzv. Draggable. To znamená, když odstraníš veškerý kód a necháš pra…
Flash_Gordon 01.05.2023 12:49
Flash_Gordon
Ale mně zůstává, tam kde ho pustím. Asi pořád nechápu, co vlastně chceš.
Wikan 01.05.2023 12:54
Wikan
Aha. No ale ted jsem to test ve Firefoxu a nezůstává tam
Flash_Gordon 01.05.2023 12:59
Flash_Gordon
Aha, ve FF to nefunguje. No nicméně stačí přidat ondragstart="return false" a už to funguje i tam.
Wikan 01.05.2023 13:05
Wikan
Na to ondragstart="return false;" jsem nepřišel. Navíc jsem to zkoušel jen ve Firefoxu. :-) 👍 Ješ…
Flash_Gordon 01.05.2023 13:24
Flash_Gordon
Tak nakonec jsem se zamyslel nad různými variantami dosažení cíle. Postup, který se mě nejvíce líbí… poslední
Flash_Gordon 01.05.2023 19:19
Flash_Gordon

Tak to bude nějaké "Miss uderstanding".

Element IMG má totiž jiné vlastnosti a proto to na něj nefunguje.
Už jsem se trochu poptal jinde, a mám solution.

Musí se pracovat, tak jako je v ukázce s DIVem. Ovšem využije se jeho vlastnost "background-image"

Asi takto:

#myDiv {

display: block;
height: 140px;
width: 140px;
left: 30px;
top: 0px;
position: relative;
background-image: url("../background.png");
background-size: 100% auto;
background-repeat: no-repeat;
}

Jen nechápu, jaks to jakože udělal, že ti to chodí.
Mě to nechodí ani na tabletu, ani na PC.

Ale děkuji za zájem.
Myslím, už je to nějakým způsobem takto pořešeno.

Tak nakonec jsem se zamyslel nad různými variantami dosažení cíle.

Postup, který se mě nejvíce líbí je přes staré dobré jQuery (zdravíme moderní těžkoobratné webové vývojáře označující jej za údajně nevhodné pro velké projekty - vymřete na choleru, vy "intelektuálové" 👍).

Jquery má úplně jednoduchou funkci, jako facka -> Draggable

$(selector).draggable();

Více na odkaze s demem zde: https://jqueryui.com/draggable

Nicméně je pravda, v tabletech a na mobilech je potřeba přihrát tuto funkci, jinak to tam nejede:

  function touchHandler(event) {
      var touch = event.changedTouches[0];

      var simulatedEvent = document.createEvent("MouseEvent");
          simulatedEvent.initMouseEvent({
          touchstart: "mousedown",
          touchmove: "mousemove",
          touchend: "mouseup"
      }[event.type], true, true, window, 1,
          touch.screenX, touch.screenY,
          touch.clientX, touch.clientY, false,
          false, false, false, 0, null);

      touch.target.dispatchEvent(simulatedEvent);
      event.preventDefault();
  }

  function init() {
      document.addEventListener("touchstart", touchHandler, true);
      document.addEventListener("touchmove", touchHandler, true);
      document.addEventListener("touchend", touchHandler, true);
      document.addEventListener("touchcancel", touchHandler, true);
  }

 $( document ).ready(function() {

    init();

})

A to je celé přátelé.
Na rozdíl od jiných nabobtnalých knihoven je tento kód efektivní a netrhá se ani na pomalejších tabletech. 👍

Zpět do poradny Odpovědět na původní otázku Nahoru