Hoạt hình - chuyển động

Bạn đã biết cách chọn một phần tử DOM, giờ tạo ra sự di chuyển động cho nó. Bắt đầu bạn thử tạo một hình vuông và cho nó di chuyển bằng sử dụng JS

<style>
    #container {
        width: 200px;
        height: 200px;
        background: green;
        position: relative;
    }
    #box {
        width: 50px;
        height: 50px;
        background: red;
        position: absolute;
    }
</style>
<div id="container">
    <div id="box"> </div>
</div>

Ví dụ trên có sử dụng CSS để định dạng, nên bạn cần biết cơ bản về CSS

Phần tử box được chứa bên trong phần tử container. Chú ý mối quan hệ vị trí: đối với containerrelate còn với boxabsolute. Điều này giúp tạo ra sự di chuyển có liên hệ với container

Tạo ra sự di chuyển của box : giờ ta làm các bước để box di chuyển từ trái qua phải

Để tạo ra các đối tượng chuyển động, bạn cần thay đổi thuộc tính của phần tử cứ mỗi một khoảng thời gian ngắn nào đó. Bạn có thể sử dụng hàm setInterval() để tạo ra hành động lặp lại (thay đổi thuộc tính phần tử) sau mỗi khoảng thời gian tính bằng mili giây xác đinh.

Ví dụ:

    var t = setInterval(move, 500);

Đoạn code trên tao ra một timer, nó gọi hàm move() sau mỗi 500 mili giây, việc của bạn là định nghĩa hàm move() cho phù hợp

<script>
    // vị trí bắt đầu
    var pos = 0; 
    //lấy hộp box
    var box = document.getElementById("box");
    
    function move() {
      pos += 1;
      box.style.left = pos+"px"; //px = pixels
    }
</script>

Hàm move() mỗi lần gọi sẽ thay đổi box.style.left thêm 1

Để dừng quá trình chuyển động (không thay đổi box.style.left) sau mỗi khoảng thời gian nữa bạn hãy gọi hàm clearInterval()

Ví dụ kiểm tra nếu tọa độ left trên 150 thì dừng lại

function move() {
  if(pos >= 150) {
    clearInterval(t);
  }
  else {
    pos += 1;
    box.style.left = pos+"px";
  }
}

Đoạn mã hoàn chỉnh để tạo ra sự di chuyển từ trái qua phải của box, bạy chạy thử nó và xem kết quả

<style>
    #container {
        width: 200px;
        height: 200px;
        background: green;
        position: relative;
    }
    #box {
        width: 50px;
        height: 50px;
        background: red;
        position: absolute;
    }
</style>
<div id="container">
    <div id="box"> </div>
</div>
var pos = 0; 
//our box element
var box = document.getElementById("box");
var t = setInterval(move, 10);

function move() {
  if(pos >= 150) {
    clearInterval(t);
  }
  else {
    pos += 1;
    box.style.left = pos+"px";
  }
}

Di chuyển qua lại

Sửa mã hàm move() sau để giá trị pos nhận từ 0 - 150, nếu đến 150 quay lại giảm về 0 ...

<script>
    var tanggiam = 1;
    var pos = 0;
    var box = document.getElementById("box");
    var t = setInterval(move, 10);

    function move() {
        if ((pos > 150) || (pos <0)) {
            tanggiam = (-tanggiam);
        }

        pos += tanggiam;
        box.style.left = pos+"px";

    }
</script>

Chạy code hoàn chỉnh sau:

<html>
    <head>
        
    <style>
        #container {
        width: 200px;
        height: 200px;
        background: green;
        position: relative;
        }
        #box {
        width: 50px;
        height: 50px;
        background: red;
        position: absolute;
        }
    </style>
    
    </head>
    <body>
        <div id="container">
            <div id="box"> </div>
        </div>
        <script>
            var tanggiam = 1;
            var pos = 0;
            var box = document.getElementById("box");
            var t = setInterval(move, 10);
        
            function move() {
                if ((pos > 150) || (pos <0)) {
                    tanggiam = (-tanggiam);
                }
        
                pos += tanggiam;
                box.style.left = pos+"px";
        
            }
        </script>
    </body>
</html>
<script>
    var tanggiam = 1;
    var pos = 0;
    var box = document.getElementById("box");
    var t = setInterval(move, 10);

    function move() {
        if ((pos > 150) || (pos <0)) {
            tanggiam = (-tanggiam);
        }

        pos += tanggiam;
        box.style.left = pos+"px";

    }
</script>

Đăng ký nhận bài viết mới