Flytta ett element på skärmen

Nu vet vi hur vi ska fånga input från tangentbordet. Vi sätter det i ytterligare ett exempel som flyttar ett element på skärmen.

#html-koden

Jag utgår ifrån sandboxen och ser till så följande kod finns i html-filen:

<h1>Min Sandbox</h1>
<div id="content" class="content">
    <div class="box"></div>
</div>
<script type="text/javascript" src="js/main.js"></script>

#css-koden

För att det ska gå att flytta runt elementet behöver det ha en viss css satt:

.box {
    position: absolute;
    height: 100px;
    width: 100px;
    background-color: yellow;
    border: 2px solid black;
}

position: absolute är satt då vi ska styra elementet med css-egenskaperna top och left. De egenskaperna sätts automatiskt när “position” är satt och kan då manipuleras via JavaScript. I övrigt är det bara css för syns skull.

Vårt utgångsläge så här långt ser ut som följer:

Startläge för att flytta element.

Startläge för att flytta element.

#javascript-koden

Nu till det roliga. Vi vet hur vi fångar upp elementet att vi bland annat kan påverka dess css.

let box = document.getElementsByClassName("box")[0];

document.addEventListener("keydown", function(event) {
    let key = event.key;
    let left = box.offsetLeft;
    let top = box.offsetTop;
    let step = 10;

    console.log("Du tryckte på: ", key);
});

let key = event.key; fångar upp vilken tangent som tryckts ned.
let left = box.offsetLeft; fångar upp positionen på boxens vänstra kant i förhållande till dess förälders vänsterkant.
let left = box.offsetTop; fångar upp positionen på boxens övre kant i förhållande till dess förälders överkant.
step = 10 är antalet pixlar elementet ska förflytta sig.

Vi behöver hantera vad som ska hända vid respektive tangent. Jag tänker att piltangenterna får styra elementet.

switch (key) {
    case "ArrowUp":
        event.preventDefault();
        box.style.top = (top - step) + "px";
        break;
    case "ArrowDown":
        event.preventDefault();
        box.style.top = (top + step) + "px";
        break;
    case "ArrowLeft":
        box.style.left = (left - step) + "px";
        break;
    case "ArrowRight":
        box.style.left = (left + step) + "px";
        break;
}

event.preventDefault(); är ett sätt att motverka att man scrollar, då “ArrowUp” och “ArrowDown” kan användas för att scrolla.

Vill man kontrollera så elementet håller sig inom ett visst element kan man hämta ut clientHeight och clientWidth från elementen. Se exemplet getSize i kursrepots exempelmapp.

#Resultat

Nu fångar vi upp piltangenterna och förflyttar elemetet 10px i respektive riktning. En CodePen visar ett bättre resultat än en skärmdump:

See the Pen on CodePen.

Flytta element.

Vi går vidare och undersöker fler events.