🟨 JavaScript/μ‘μš©ν•˜μ—¬ μžλ™ν™”orλ¬Έμ œν•΄κ²°ν•˜κΈ°

μžλ™ν™” : νŒμ—… 높이 κ³„μ‚°ν•΄μ„œ μ•„λž˜λ‘œ μŒ“κΈ°

Zoeeey 2023. 5. 2. 14:19

상황

맀번 μƒˆλ‘œμš΄ νŒμ—…μ΄ 올라올 λ•Œλ§ˆλ‹€ 1200px μ•„λž˜μ˜ νŒμ—… top값을 κ·Έ μœ„ νŒμ—…μ˜ λ†’μ΄κ°’λ§ŒνΌ μˆ˜λ™μœΌλ‘œ μ—…λ°μ΄νŠΈν•˜κ³  있던 μƒν™©μ΄μ—ˆλ‹€.

<div id="pop_84"></div>
<div id="pop_82"></div>
<div id="pop_75"></div>
  1. μœ„μ˜ ν˜•νƒœμ˜ νŒμ—…μ΄ 있으며, 각 νŒμ—…μ€ absolute둜 ν‘œμ‹œλœλ‹€.
  2. νŒμ—… ID λ²ˆν˜ΈλŠ” μœ μ—°ν•˜λ©°, ID λ²ˆν˜ΈλŠ” 항상 변경될 수 μžˆλ‹€. (κ΄€λ¦¬μžμ‚¬μ΄νŠΈμ—μ„œ μ‚¬μš©μžμΈ ν΄λΌμ΄μ–ΈνŠΈκ°€ λ§˜λŒ€λ‘œ μ¨λ„£λŠ”λ‹€)
  3. 각 νŒμ—…μ΄ λΈŒλΌμš°μ € λ„ˆλΉ„ 1200px μ΄ν•˜λ‘œ 떨어지면 첫 번째 νŒμ—…μ΄ μœ„μ—μ„œ μ•„λž˜λ‘œ μˆœμ„œλŒ€λ‘œ λ°°μΉ˜λœλ‹€.
  4. ν•˜λ‹¨ λ°°μΉ˜λŠ” css top:npx둜 μ œμ–΄λ˜λ©°, 첫 번째 νŒμ—…μ€ top:60px둜 μ‹œμž‘ν•˜κ³  두 번째 νŒμ—…μ€ top:(μœ„μ— μžˆλŠ” νŒμ—…μ˜ 높이 κ°’ + 20px)둜 κ³„μ‚°λ˜μ–΄μ•Ό ν•œλ‹€.

1μ°¨ ν•΄κ²°

const popups = document.querySelectorAll('[id^="pop_"]');
if (window.innerWidth < 1200) {
    let currentTop = 60;
    for (let i = 0; i < popups.length; i++) {
        const popup = popups[i];
        popup.style.top = `${currentTop}px`;
        currentTop += popup.getBoundingClientRect().height + 20;
    }
}

currentTop을 κΈ°λ³Έκ°’ (첫번째 νŒμ—…μ˜ topκ°’)으둜 μ„€μ •ν•΄ λ‘” λ’€, νŒμ—…μ— cssλ₯Ό μ€€  후에 currentTop에 νŒμ—…μ˜ 높이값+20을 λ”ν•˜λŠ” λ°©μ‹μœΌλ‘œ μžλ™ν™”ν•˜μ˜€λ‹€.


문제 λ°œμƒ

νŒμ—…μ„ 닫지 μ•Šμ€ μƒνƒœμ—μ„œ λΈŒλΌμš°μ € μ‚¬μ΄μ¦ˆλ₯Ό λŠ˜μ˜€λ‹€ μ€„μ˜€λ‹€ ν–ˆμ„ λ•Œ νŒμ—… 높이값이 λ³€ν•˜μ§€ μ•ŠλŠ” λ¬Έμ œκ°€ μžˆμ—ˆλ‹€.


2μ°¨ ν•΄κ²°

const popups = document.querySelectorAll('[id^="pop_"]');
function positionPopups() {
    if (window.innerWidth < 1200) {
        let currentTop = 60;
        for (let i = 0; i < popups.length; i++) {
            const popup = popups[i];
            popup.style.top = `${currentTop}px`;
            currentTop += popup.getBoundingClientRect().height + 20;
        }
    } else {
        // windowκ°€ 1200보닀 클 μ‹œ 리셋
        for (let i = 0; i < popups.length; i++) {
            const popup = popups[i];
            popup.style.top = '';
        }
    }
}
// νŽ˜μ΄μ§€λ‘œλ“œ μ‹œ ν•¨μˆ˜ 호좜
positionPopups();
// λΈŒλΌμš°μ € λ¦¬μ‚¬μ΄μ¦ˆ μ‹œ λ‹€μ‹œ 호좜
window.addEventListener('resize', positionPopups);

ν•¨μˆ˜λ‘œ λ¬Άμ–΄μ„œ μ„ μ–Έ 후에 windowκ°€ resize될 μ‹œ ν•œλ²ˆ 더 ν˜ΈμΆœν•΄μ£Όμ—ˆλ‹€.