본문 바로가기

개인공부

CSS : 움직임, 클릭리스너 적용

반응형

.stage{
    overflow: hidden;
    position: relative;
    /* vw : viewport width */
    /* vh : viewport height */
    width: 100vw;
    height: 75vw;
    /* 4:3비율 */
    background-color: yellow;
}
@keyframes moving{
    from {
        transform: translateX(0);
    }
    to{
        transform: translateX(90vw);
    }
}

.among{
    position: absolute;
    width: 100px;
    height: 100px;
    background-repeat: no-repeat;
    background-position: 50% 50%;
    background-size: contain;
    
}

.among:nth-of-type(1){
    animation:moving 5s infinite alternate;
    left: 5%;
    bottom: 5%;
    background-image: url('../images/1.png');
}
.among:nth-of-type(2){
    animation:moving 9s infinite alternate;
    left: 10%;
    bottom: 3%;
    background-image: url('../images/2.png');
}
.among:nth-of-type(3){
    animation:moving 3s infinite alternate;
    left: 7%;
    bottom: 10%;
    background-image: url('../images/3.png');
}
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="css/reset.css">
    <link rel="stylesheet" href="css/02_02.css">
</head>

<body>
    <div class="stage">
        <div class="among"></div>
        <div class="among"></div>
        <div class="among"></div>
    </div>

</body>
<script>
    (function () {
        const amongGroup = document.querySelectorAll('.among');
        const stage = document.querySelector('.stage');
        function removeHandler(e) {
            stage.removeChild(e);
        }

        function clickHandler(e) {
            // removeHandler(this);
            this.parentNode.removeChild(this);
        }

        for (let i = 0; i<amongGroup.length; i++) {
            amongGroup[i].addEventListener('click', clickHandler);
        }
    })();
</script>

</html>

function 같은 경우 전역말고 지역으로 표현하귀이해서 함수를 호출해서 변수들을 선언.

이렇게하면은 외부에서 접근하지 못한다.

 

두번째로는 clickEventListener 에 this는 객체자체가된다.

따라서 this.parentNode.removeChild(this)로 현재 값을 삭제할 수 있음.

 

target을 활용해서 좀더 최적화 해보자.

    (function () {
        const stage = document.querySelector('.stage');

        function clickHandler(e) {
            if (e.target.classList.contains('among')) {
                stage.removeChild(e.target);
            }
        }
        stage.addEventListener('click', clickHandler);
    })();

stage는 among을 가지고있는 부모 컨테이너이다.

stage 자체에 click 리스너를 만들어준다음 stage안에서 클릭이벤트가 발생하면 함수를 실행시킨다.

stage 본인을 클릭할경우는 예외처리를 해주고 위처럼 작동하면 위와 같은 동작을 할 수있다.

 

위와의 차이점은 위는 자식의 수만큼 리스너에 등록한다. 즉 함수자체가 100개면 100개 등록해야되서 메모리낭비인 소리. 하지만 이처럼 하나의 등록으로 똑같은 기능을 구현할 수 있다.

반응형

'개인공부' 카테고리의 다른 글

javascript 클릭리스너 활용  (0) 2021.01.01
이벤트 위임  (2) 2020.12.30
CSS : relative 와 absolute 정복  (0) 2020.12.28
의미론적 태그  (0) 2020.12.21
caching  (0) 2020.11.15