要素をドラッグドロップできるHTML5 APIを使って作った.まずそのAPI部分から.
<script> const allowDrop = (ev) => { ev.preventDefault(); } const drag = (ev) => { ev.dataTransfer.setData("text", ev.target.id); } const drop = (ev) => { ev.preventDefault(); let id = ev.dataTransfer.getData("text"); ev.target.appendChild(document.getElementById(id)); } </script>
関数を3つ用意した.dataTransfer
やsetData
/getData
を利用した.
※jQueryが必要です.
続いてCSS部分.
<style> #room, #ground{ width: 400px; height: 200px; display: grid; grid-template-columns: repeat(auto-fill, 100px); grid-template-rows: repeat(auto-fill, 100px); } .seat{ width: 100px; height: 100px; background: #aaa; } .child{ width: 100px; height: 100px; background: skyblue; } </style>
グレーのseat
に空色のchild
が次々座れる.room
の範囲内ならseat
がないところにも座れる.
最後にHTML部分.
<body> <div id="room" ondrop="drop(event)" ondragover="allowDrop(event)"> <div id="seat1" class="seat" draggable="true"></div> <div id="seat2" class="seat" draggable="true"></div> <div id="seat3" class="seat" draggable="true"></div> <div id="seat4" class="seat" draggable="true"></div> <div id="seat5" class="seat" draggable="true"></div> <div id="seat6" class="seat" draggable="true"></div> </div> <div id="ground" ondrop="drop(event)" ondragover="allowDrop(event)"> <div id="child1" class="child" draggable="true" ondragstart="drag(event)"></div> <div id="child2" class="child" draggable="true" ondragstart="drag(event)"></div> <div id="child3" class="child" draggable="true" ondragstart="drag(event)"></div> <div id="child4" class="child" draggable="true" ondragstart="drag(event)"></div> <div id="child5" class="child" draggable="true" ondragstart="drag(event)"></div> <div id="child6" class="child" draggable="true" ondragstart="drag(event)"></div> </div> </body>
動作は下のようになる.
ground
にondrop
イベントとondragover
イベントを書くことで,child
を戻せるようになっている.
このプログラムは座席表や予定表などで使いたくて作った.ぜひ取り入れてみてください.