๊ด€๋ฆฌ ๋ฉ”๋‰ด

UI Code Lab

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์Šฌ๋ผ์ด๋“œ ํ† ๊ธ€ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ (SlideUp / SlideDown) ๋ณธ๋ฌธ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธUI

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์Šฌ๋ผ์ด๋“œ ํ† ๊ธ€ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ (SlideUp / SlideDown)

๐Ÿฏ๊ฟ€์ƒ์ด๐Ÿ 2025. 6. 18. 09:32

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์Šฌ๋ผ์ด๋“œ ํ† ๊ธ€ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ

 

 

์›น ํŽ˜์ด์ง€์—์„œ ์ฝ˜ํ…์ธ ๋ฅผ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ํ‘œ์‹œํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ SlideUp ๊ณผ SlideDown ํšจ๊ณผ๋Š” ์ง๊ด€์ ์ธ UI๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” jQuery์™€ ์ˆœ์ˆ˜ JavaScript(๋ฐ”๋‹๋ผ JS)๋ฅผ ์‚ฌ์šฉํ•œ ์Šฌ๋ผ์ด๋“œ ํ† ๊ธ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ’ก jQuery๋กœ ์Šฌ๋ผ์ด๋“œ ํ† ๊ธ€ ๊ตฌํ˜„

jQuery์—์„œ๋Š” .slideUp(), slideDown(), .slideToggle() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$(document).ready(function() {
    $("#toggleButton").click(function() {
        $("#content").slideToggle(500); // 500ms ๋™์•ˆ ์Šฌ๋ผ์ด๋“œ
    });
});

 

์œ„ ์ฝ”๋“œ์—์„œ๋Š” ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ #content ์š”์†Œ๊ฐ€ ์Šฌ๋ผ์ด๋“œ๋˜๋ฉฐ ํ‘œ์‹œ๋˜๊ฑฐ๋‚˜ ์ˆจ๊ฒจ์ง‘๋‹ˆ๋‹ค.

 

๐Ÿ’ก ์ˆœ์ˆ˜ JavaScript (Pure JS)๋กœ ์Šฌ๋ผ์ด๋“œ ํšจ๊ณผ ๊ตฌํ˜„

jQuery ์—†์ด ์ˆœ์ˆ˜ JavaScript๋กœ ์Šฌ๋ผ์ด๋“œ ํšจ๊ณผ๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด CSS์™€ JavaScript๋ฅผ ํ•จ๊ป˜ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

function slideToggle(element, duration = 500) {
    let el = document.querySelector(element);
    if (!el) return;

    if (el.style.maxHeight) {
        el.style.maxHeight = null;
    } else {
        el.style.maxHeight = el.scrollHeight + "px";
    }
}

// ์‚ฌ์šฉ ์˜ˆ์‹œ
document.getElementById("toggleButton").addEventListener("click", function() {
    slideToggle("#content");
});

 

์œ„ ์ฝ”๋“œ์—์„œ๋Š” maxHeight ์†์„ฑ์„ ํ™œ์šฉํ•ด #content ์š”์†Œ์˜ ๋†’์ด๋ฅผ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์กฐ์ •ํ•˜๋ฉฐ ์Šฌ๋ผ์ด๋“œ ํšจ๊ณผ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ’ก ๋ฐ”๋‹๋ผ JavaScript๋กœ ๋ถ€๋“œ๋Ÿฌ์šด SlideUp/SlideDown ๊ตฌํ˜„

๋ฐ”๋‹๋ผ JavaScript๋ฅผ ์‚ฌ์šฉํ•ด ์ข€ ๋” ์„ธ๋ฐ€ํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. requestAnimationFrame() ์„ ํ™œ์šฉํ•˜๋ฉด ๋ณด๋‹ค ์ž์—ฐ์Šค๋Ÿฌ์šด ์›€์ง์ž„์„ ์—ฐ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function slideUp(element, duration = 300) {
    let el = document.querySelector(element);
    el.style.display = "block";
    content.style.overflow = "hidden";
    let height = "0";
    el.style.height = el.scrollHeight + "px";
    setTimeout(() => {
        el.style.transition = `height ${duration}ms ease-in-out`;
        el.style.height = height + "px";
    }, 10);
    console.log(el.scrollHeight);
}

function slideDown(element, duration = 300) {
    let el = document.querySelector(element);
    el.style.display = "block";
    content.style.overflow = "hidden";
    let height = el.scrollHeight;
    el.style.height = "0px";
    setTimeout(() => {
        el.style.transition = `height ${duration}ms ease-in-out`;
        el.style.height = height + "px";
    }, 10);
    console.log(height);
}

// ์‚ฌ์šฉ ์˜ˆ์‹œ
document.getElementById("toggleButton").addEventListener("click", function () {
    let content = document.querySelector("#content");

    if (content.style.display === "none" || content.style.height === "0px") {
        slideDown("#content");
    } else {
        slideUp("#content");
    }
});

 

์œ„ ์ฝ”๋“œ์—์„œ๋Š” height ์†์„ฑ์„ ํ™œ์šฉํ•ด ์ฝ˜ํ…์ธ ๊ฐ€ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ํŽผ์ณ์ง€๊ณ  ์ ‘ํžˆ๋„๋ก ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. jQuery ์—†์ด๋„ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋ฅผ ๋”์šฑ ์ •๊ตํ•˜๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ’ก ์Šฌ๋ผ์ด๋“œ ์†๋„ ์กฐ์ ˆ

ํ˜„์žฌ๋Š” ๊ณ ์ •๋œ ์†๋„๋กœ ์Šฌ๋ผ์ด๋“œ๋˜์ง€๋งŒ, ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋”ฐ๋ผ ์†๋„๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด duration ๊ฐ’์„ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

let speed = 500; // ๊ธฐ๋ณธ ์†๋„
document.getElementById("speedControl").addEventListener("change", function(event) {
    speed = event.target.value;
});

document.getElementById("toggleButton").addEventListener("click", function() {
    slideToggle("#content", speed);
});

 

๐Ÿ’ก ์ž๋™ ์Šฌ๋ผ์ด๋“œ (์ผ์ • ์‹œ๊ฐ„ ํ›„ ์ˆจ๊น€)

ํŽ˜์ด์ง€ ๋กœ๋“œ ํ›„ ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์ž๋™์œผ๋กœ ์ฝ˜ํ…์ธ ๊ฐ€ ์ˆจ๊ฒจ์ง€๋„๋ก ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

setTimeout(() => {
    slideUp("#content", 1000);
}, 5000); // 5์ดˆ ํ›„ ์ฝ˜ํ…์ธ  ์ˆจ๊น€

 

๐Ÿ’ก ๋‹ค์ค‘ ์š”์†Œ ์Šฌ๋ผ์ด๋“œ

ํ•œ ๋ฒˆ์˜ ๋ฒ„ํŠผ ํด๋ฆญ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์†Œ๋ฅผ ๋™์‹œ์— ์Šฌ๋ผ์ด๋“œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

document.getElementById("toggleButton").addEventListener("click", function() {
    document.querySelectorAll(".slide-item").forEach(item => {
        slideToggle(item, 500);
    });
});

 

๐Ÿ’ก ๋ถ€๋“œ๋Ÿฌ์šด ํŽ˜์ด๋“œ ํšจ๊ณผ ์ถ”๊ฐ€

์Šฌ๋ผ์ด๋“œ์™€ ํ•จ๊ป˜ opacity ๋ฅผ ์กฐ์ •ํ•˜์—ฌ ๋ถ€๋“œ๋Ÿฌ์šด ํŽ˜์ด๋“œ ํšจ๊ณผ๋ฅผ ์ค„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

function slideFadeToggle(element, duration = 500) {
    let el = document.querySelector(element);
    if (!el) return;

    el.style.transition = `height ${duration}ms ease-in-out, opacity ${duration}ms ease-in-out`;
    if (el.style.opacity == 0 || el.style.display === "none") {
        el.style.display = "block";
        el.style.opacity = 1;
        el.style.height = el.scrollHeight + "px";
    } else {
        el.style.opacity = 0;
        el.style.height = "0px";
        setTimeout(() => {
            el.style.display = "none";
        }, duration);
    }
}

// ์‚ฌ์šฉ ์˜ˆ์‹œ
document.getElementById("toggleButton").addEventListener("click", function() {
    slideFadeToggle("#content");
});

 

๐Ÿ’ก ์Šคํฌ๋กค ์œ„์น˜์— ๋”ฐ๋ฅธ ์ž๋™ ์Šฌ๋ผ์ด๋“œ

์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ์œ„์น˜๊นŒ์ง€ ์Šคํฌ๋กคํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ฝ˜ํ…์ธ ๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ฑฐ๋‚˜ ์‚ฌ๋ผ์ง€๊ฒŒ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

window.addEventListener("scroll", function() {
    let content = document.querySelector("#content");
    if (window.scrollY > 200) {
        slideDown("#content");
    } else {
        slideUp("#content");
    }
});

 

์ด๋Ÿฌํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์กฐํ•ฉํ•˜๋ฉด ๋”์šฑ ์ง๊ด€์ ์ด๊ณ  ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐Ÿ˜Š

 

๐Ÿ’ก ๋งˆ๋ฌด๋ฆฌ

์Šฌ๋ผ์ด๋“œ ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒํ•œ UI๋ฅผ ์ œ์ž‘ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

jQuery๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ,

์ˆœ์ˆ˜ JavaScript์™€ ๋ฐ”๋‹๋ผ JavaScript๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ข€ ๋” ์„ธ๋ฐ€ํ•œ ์กฐ์ž‘์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž์ถฐ ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜์„ธ์š”!