HTML+CSS(실습)

★2023-05-16(화) 피아노건반실습(keydown,keycode)

박성하하 2023. 5. 16. 15:00
728x90
반응형

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="../js/jquery.min.js"></script>
    <script type="text/javascript" src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
    <style>
        #wrap{
            width:500px;
            height:300px;
            background-color: rgb(36, 35, 35);
            padding-top:40px;
            padding-left:40px;
            box-sizing: border-box;
        }
        #piano{
            width:400px;
            height:200px;
            background-color: white;
            position: relative;
            border-bottom-left-radius: 10px;
            border-bottom-right-radius: 10px;
            border: 2px solid white;
            /* box-sizing: border-box; */
        }
        .a{
            border-bottom-left-radius: 10px;
            border-bottom-right-radius: 10px;
            border: 2px solid black;
            box-sizing: border-box;
            width:40px;
            height:200px;
            float:left;
            text-align: center;
            padding-top:170px;
        }
        .black{
            border-bottom-left-radius: 10px;
            border-bottom-right-radius: 10px;
            border: 2px solid black;
            box-sizing: border-box;
            width:30px;
            height:120px;
            background-color: black;
            position: absolute;
            color:white;
            text-align: center;
            padding-top:90px;
        }
        #blackA{
            left:25px;
        }
        #blackB{
            left:65px;
        }
        #blackC{
            left:145px;
        }
        #blackD{
            left:185px;
        }
        #blackE{
            left:225px;
        }
        #blackF{
            left:305px;
        }
        #blackG{
            left:345px;
        }
    </style>
    <script>
       $(document).ready(function(){
            var count
            $(document).on("keydown",keyEventFnc)
            function keyEventFnc(e){ //e에 인풋정보가 담김
                var direct="";
                switch(e.keyCode){
                    case 65:
                        direct="A";
                        count=0;
                        $('#audio').attr('src','../Audio/1.wav')
                        break;
                    case 83:
                        direct="S";
                        count=1;
                        $('#audio').attr('src','../Audio/2.wav')
                        break;
                    case 68:
                        direct="D";
                        count=2;
                        $('#audio').attr('src','../Audio/3.wav')
                        break;
                    case 70:
                        direct="F";
                        count=3;
                        $('#audio').attr('src','../Audio/4.wav')
                        break;
                    case 71:
                        direct="G";
                        count=4;
                        $('#audio').attr('src','../Audio/5.wav')
                        break;
                    case 72:
                        direct="H";
                        count=5;
                        $('#audio').attr('src','../Audio/6.wav')
                        break;
                    case 74:
                        direct="J";
                        count=6;
                        $('#audio').attr('src','../Audio/7.wav')
                        break;
                    case 75:
                        direct="K";
                        count=7;
                        $('#audio').attr('src','../Audio/8.wav')
                        break;
                    case 76:
                        direct="L";
                        count=8;
                        break;
                    case 186:
                        direct=";";
                        count=9;
                        break;
                    case 87:
                        direct="W";
                        count=10;
                        break;
                    case 69:
                        direct="E";
                        count=11;
                        break;
                    case 84:
                        direct="T";
                        count=12;
                        break;
                    case 89:
                        direct="Y";
                        count=13;
                        break;
                    case 85:
                        direct="U";
                        count=14;
                        break;
                    case 79:
                        direct="O";
                        count=15;
                        break;
                    case 80:
                        direct="P";
                        count=16;
                        break;                    
                }
                if(direct){
                    $("#name").val(direct)

                    // $("#piano>.a").css('background-color','white')
                    // $("#piano>.black").css('background-color','black')
                    // $("#piano div").eq(count).css('background-color','pink')
                    $("#piano div").eq(count).animate({
                        "background-color":"red"
                    })
                    if(count>9) {
                    $("#piano div").eq(count).animate({
                        "background-color":"black"
                    })} else{
                        $("#piano div").eq(count).animate({
                        "background-color":"white"
                    })  
                    }
                }
            }
        })  
    </script>
    <title>피아노건반</title>
</head>
<body>
    입력 : <input type="text" id="name" style="width:200px; height:50px;margin-bottom:50px; font-size: 20px;">
    <div id="wrap">
        <div id="piano">
            <div class="a abc">A</div>
            <div class="a abc">S</div>
            <div class="a abc">D</div>
            <div class="a abc">F</div>
            <div class="a abc">G</div>
            <div class="a abc">H</div>
            <div class="a abc">J</div>
            <div class="a abc">K</div>
            <div class="a abc">L</div>
            <div class="a abc">;</div>
            <div id="blackA" class="black abc">
                    W
            </div>
            <div id="blackB" class="black abc">
                    E
            </div>
                <div id="blackC" class="black abc">
                    T
            </div>
            <div id="blackD" class="black abc">
                    Y
            </div>
            <div id="blackE" class="black abc">
                    U
            </div>
            <div id="blackF" class="black abc">
                    O
            </div>
            <div id="blackG" class="black abc">
                    P
            </div>
        </div>
    </div>
    <audio id='audio' autoplay></audio>
</body>
</html>

var count → 건반div의 index를 찾기위해 카운팅

var direct → 입력된 키보드의 값 저장

keydown을 사용해 입력된 키보드값을 e.keyCode로 받아낸 후 , switch case문을 사용해 direct , count저장 및 오디오 재생

이후 if문을 사용해 키보드를 누를때마다 누르는 값이 input text에 입력되고 클릭된 건반 색상변화를 animate로 줌

728x90
반응형