정구리의 우주정복

[Javascript] mouse hover 시 글씨 나오게 하기 !! 본문

STUDY/K-DIGITAL

[Javascript] mouse hover 시 글씨 나오게 하기 !!

Jungry_ 2022. 9. 4. 23:24
반응형

아무것도 없다가
마우스가 올라가면 내용 나오게끔 !!

 

 

<!DOCTYPE html>
<html lang="ko">

<head>
    <meta charset="UTF-8">
    <title>준석이네 집</title>
    <link rel="stylesheet" href="./quiz02.css">
</head>

<body>
    <div class="map">
        <div class="balcony" data-title="발코니"></div>
        <div class="room">
            <div class="room-1" data-title="침실">
                <div class="door"></div>
                <div class="window">
                    <span></span>
                    <span></span>
                    <span></span>
                    <span></span>
                </div>
            </div>
            <div class="room-2" data-title="침실/거실">
                <div class="window">
                    <span></span>
                    <span></span>
                    <span></span>
                    <span></span>
                </div>
                <div class="window window-2">
                    <span></span>
                    <span></span>
                    <span></span>
                    <span></span>
                </div>
            </div>
        </div>
        <div class="other">
            <div class="bathroom" data-title="욕실">
                <div class="door"></div>
                <div class="bath"></div>
                <div class="bathroom-block">
                    <div class="sink"></div>
                    <div class="toilet"></div>
                </div>
            </div>
            <div class="utility-room" data-title="다용도실">
                <div class="door"></div>
            </div>
            <div class="entrance" data-title="현관/입구">
                <div class="door"></div>
                <div class="wall"></div>
            </div>
            <div class="kitchen" data-title="주방/식당">
                <div class="kitchen-block">
                    <div class="kitchen-sink"></div>
                    <div class="stoves">
                        <div class="stove"></div>
                        <div class="stove"></div>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <script src="./quiz02.js"></script>
</body>
</html>

 

 

내가 만든 정답 !!

 

const map = document.querySelector('.map');
const items = map.children;
console.log(items);

for(let i=0; i<items.length; i++){
    items[i].addEventListener('mouseover',showTitle);
}

for(let i=0; i<items.length; i++){
    items[i].addEventListener('mouseout',removeTitle);
}

function showTitle(event) {
    console.log('work');
    if(event.target.hasAttribute('data-title')){ //만약 가지고 있다면 
        let value = event.target.getAttribute('data-title'); //값 가져왔음 !!!
        const span = document.createElement("span");
        span.classList.toggle('title');
        span.textContent = value;
        event.target.append(span);
        
    }
}

function removeTitle(event){
    if(event.target.hasAttribute('data-title')){
        event.target.removeChild(event.target.lastChild);
        }
    }

 

map 안에 모든 내용을 담고 

items 에 map의 자식들을 모두 담는다 (이렇게 하면 List 의 형태로 된다)

이런 형태로 만들어진것을 확인할 수 있다.

그리고 for문을 이용해서 mouseover 과 mouseout 시의 event 를 추가해준다

 

showTitle 함수는 

만약 이벤트의 대상이 (여기선 아마 items 의 요소들이 될 것이다) data-title 을 가지고 있다면 그 안의 값을 가져오고 (각 방의 정보들이 담겨져 있음) 

새로운 span 태그를 만들어 그 안에 클래스와(이 클래스는 css에 정의된 title 클래스를 사용하기 위함이다) value 도 넣어주고 event.target 에 append 해준다 => 이렇게 하면 맨 마지막에 추가가된다 !!! Remove 를 위해 기억해두자 

 

removeTitle 은 맨 마지막에 추가된 child 를 지워준다!! 이렇게 되면 아까 showTitle 에서 추가되었던 친구들이 제거가되게 된다 ~!

 

 

 

'찐 정답' (HTML 은 동일합니다)

 

function showTitle(event){
    if(event.target.dataset.title){
        //만드는 3단계 !!! data-title 자체가 dataset 이였던거임 !!!!
        const span = document.createElement('span');
        span.classList.add('title');
        span.textContent = event.target.dataset.title;
        event.target.append(span);
    }
}

function removeTitle(event){
    if(event.target.dataset.title){
        event.target.lastElementChild.remove();
    }
}

const map = document.querySelector('.map');

map.addEventListener('mouseover',showTitle);
map.addEventListener('mouseout',removeTitle);

정말 간결하다 아주 현타가 온다 ~~

 

map 을 가져와서 map 에 eventListener 를 준다 (왜 나는 child 에 for문까지 썼을까?)

그리고 data-title 이라는 것은 dataset 을 사용할 수 있는것이다 !! 그냥 attribute 가 아니였던거임 !!!! 그래서 나머지 로직은 동일하고 

textContent 를 가져올 때 event.target.dataset.title 이렇게 dataset 을 사용해서 가져오면 된다 그밖에는 동일함 !!

반응형
Comments