Hello,

kok nae-ga ha-myun an-dweneun MAGIC...🧚

웹 프로그래밍

[ jQuery ] 미션 ( 물고기 움직이기 + 랜덤 스타일 적용하기 )

✿도담도담 2018. 7. 10. 15:45

물고기 움직이기

버튼을 누르면 물고기가 랜덤한 위치로 움직이되 패널 ( 파랑 바탕 )을 벗어나지 않도록 합니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<!DOCTYPE html>
<html>
<head>
    <title></title>
    <style type="text/css">
        button{
            margin: 10px;
        }
        .panel{
            width: 600px;
            height: 400px;
            border: 1px solid #999;
            position: relative;
            background-color: blue;
            margin: 10px;
        }
        #fish{
            position: absolute;
            left: 250px;
            top: 150px;
        }
    </style>
 
    <script  src="http://code.jquery.com/jquery-latest.min.js"> </script>
    <script type="text/javascript">
        window.onload = function(){
 
            var $fish = $("#fish");
 
            // 패널의 넓이, 높이
            var panelW = parseInt( $(".panel").css("width") );
            var panelH = parseInt( $(".panel").css("height") );
 
            // 물고기의 영역 구하기
            panelW = panelW -  parseInt( $fish.css("width") );
            panelH = panelH -  parseInt( $fish.css("height") );
 
            $("#btnStart").click(function(){
                var top = parseInt( Math.random() * panelH );
                var left = parseInt( Math.random() * panelW );
 
                $fish.css({
                    top: top,
                    left: left
                });
            });
        };
 
    </script>
</head>
<body>
<div>
    <button id="btnStart"> 클릭하면 물고기가 움직여요.</button>
</div>
<div class="panel">
    <img src="fish1.png" id="fish"/>
</div>
</body>
</html>
cs

우선 패널이 relative으로 물고기를 absoulte ( position: static 속성을 가지고 있지 않은 부모를 기준으로 움직인다. )로 설정

물고기가 패널 밖으로 나가면 안되므로 물고기의 활동 범위를 구해주어야 한다. ( 30 ~ 37 줄 )
활동 범위 = 패널의 전체 너비와 높이 - 물고기의 너비와 높이
이때 반드시 parseInt로 정수형을 만들어 줄 것

여기서 가장 중요한 부분은 ⭐ window.onload ⭐부분이다.
왜 $(document).ready 를 사용하지 않았는가? 하면
$(document).ready는 이미지가 로딩되지 않은 시점에 실행 되는 구문으로
이를 사용했을 시 물고기의 너비와 높이가 0으로 되어 정상적인 실행이 되지 않을 것이다.
따라서, 이미지가 완전히 로드되고난 후 실행 되는 window.onload를 사용해 주어야한다.


랜덤하게 스타일 적용하기

1초마다 한번씩 신규 노드를 생성한 후 글자 크기와 색이 랜덤하게 적용해 패널의 자식 노드로 추가



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<!DOCTYPE html>
<html>
<head>
    <title></title>
    <style type="text/css">
        #panel{
            width: 600px;
            overflow: visible;
            border: 1px dotted #ccc;
            font-size: 15px;
        }
    </style>
 
    <script  src="http://code.jquery.com/jquery-latest.min.js"> </script>
    <script type="text/javascript">
        var panel;
 
        $(document).ready(function(){
 
            panel = $("#panel");
            
            start();
        });
 
        function start()
        {
            var num = 1;
 
            setInterval(function(){
 
                if( num == 1)
                {
                    panel.html("");
                }
                var color = "#" + parseInt( Math.random()*0xFFFFFF ).toString(16);
                var size = parseInt( Math.random()*50 + 10 );
                var $span = $("<span> </span>");
                panel.append($span);
                $span.css({
                    color: color,
                    fontSize: size
                });
 
                $span.html(num);
                num++;
            }, 1000);
        }
    </script>
</head>
<body>
<div id="panel"> 여기에 글자 크기와 색이 랜덤하게 설정된 숫자가 동적으로 추가될 거에요. </div>
</body>
</html>
cs
위 사이트 설명을 보면 알다시피 setInterval 는 창이 닫히기 전까지 계속 실행되는 구문이다.

  "#" + parseInt( Math.random()*0xFFFFFF ).toString(16);
처음에는 rgb()를 사용하기 위해 변수 3개를 만들었으나 rgb사용이 되지 않았다...😞
따라서 책에 나와 있는 방법으로 사용 !

그리고 만든 $span을 append로 ( 뒤쪽에 추가 ) 추가해준 뒤 css를 설정해 주었다.