코딩 스쿨 CSS

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

CSS Image Gallery

CSS Image Gallery: 스타일링과 반응형 디자인 적용 방법

이미지 갤러리는 웹사이트에서 이미지를 보기 좋게 배열하는 방식으로, 비주얼 콘텐츠를 효과적으로 표현할 수 있습니다. CSS를 사용해 이미지를 정렬, **격자 구조(grid layout)**로 배치하거나 호버 효과를 추가하여 인터랙티브한 갤러리를 구현할 수 있습니다.


1. 기본 이미지 갤러리 만들기

이미지 갤러리그리드 레이아웃(Grid Layout) 또는 **플렉스박스(Flexbox)**를 사용해 이미지들을 정렬하고 보기 좋게 배열할 수 있습니다. 여기서는 그리드 레이아웃을 사용해 간단한 이미지 갤러리를 구현합니다.

HTML 구조:

<div class="gallery">
    <img src="image1.jpg" alt="Image 1">
    <img src="image2.jpg" alt="Image 2">
    <img src="image3.jpg" alt="Image 3">
    <img src="image4.jpg" alt="Image 4">
    <img src="image5.jpg" alt="Image 5">
</div>

위 코드는 기본적으로 이미지 태그를 사용해 이미지 갤러리를 구성합니다. 각 이미지는 src 속성을 통해 이미지를 불러오고, alt 속성으로 대체 텍스트를 제공합니다.

CSS 스타일링:

/* 갤러리 기본 스타일 */
.gallery {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); /* 반응형 그리드 */
    grid-gap: 10px; /* 이미지 사이 간격 */
    padding: 10px;
}

.gallery img {
    width: 100%;
    height: auto;
    display: block;
    object-fit: cover; /* 이미지 잘림 방지 */
    border-radius: 8px; /* 이미지 모서리 둥글게 */
}

이 코드는 그리드 레이아웃을 사용하여 이미지 갤러리를 만들고, 자동으로 칸의 너비를 조절합니다. **grid-template-columns**는 자동으로 크기를 조정하여, 모바일 기기와 같은 좁은 화면에서도 반응형으로 동작합니다.


2. 이미지 갤러리에 호버 효과 추가

이미지 갤러리호버 효과를 추가하면, 사용자 상호작용에 따라 이미지가 강조되거나 확대되는 효과를 줄 수 있습니다. 이로 인해 갤러리가 더 인터랙티브해지고 시각적 피드백을 제공할 수 있습니다.

CSS 호버 효과 추가:

.gallery img {
    transition: transform 0.3s ease; /* 부드러운 변환 효과 */
}

.gallery img:hover {
    transform: scale(1.1); /* 호버 시 이미지 확대 */
}

위 코드는 이미지에 마우스를 올렸을 때 확대 효과를 추가합니다. **transform: scale()**을 사용해 이미지 크기를 1.1배 확대하며, **transition**을 통해 부드러운 전환 효과를 적용합니다.


3. 반응형 이미지 갤러리 만들기

반응형 디자인을 적용해 화면 크기에 따라 갤러리 레이아웃이 변경되도록 할 수 있습니다. 미디어 쿼리를 사용하여, 데스크톱모바일 환경에서 각각 다른 레이아웃을 제공할 수 있습니다.

CSS 미디어 쿼리 적용:

/* 기본 갤러리 레이아웃 */
.gallery {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
    grid-gap: 10px;
    padding: 10px;
}

/* 화면 크기가 768px 이하일 때 갤러리 레이아웃 */
@media (max-width: 768px) {
    .gallery {
        grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
    }
}

/* 화면 크기가 480px 이하일 때 갤러리 레이아웃 */
@media (max-width: 480px) {
    .gallery {
        grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
    }
}

위 코드는 미디어 쿼리를 사용해 화면 크기에 따라 이미지 갤러리의 칸 너비가 조정되도록 합니다. 데스크톱 환경에서는 더 큰 칸을 사용하고, 모바일 환경에서는 작은 이미지 칸을 사용하여 반응형 디자인을 구현할 수 있습니다.


4. 라이트박스 효과 추가

라이트박스(Lightbox) 효과를 추가하면, 이미지 갤러리에서 이미지를 클릭했을 때 이미지가 확대되어 전체 화면에 표시됩니다. 이 효과는 사용자가 이미지를 더 자세히 볼 수 있도록 해주는 유용한 기능입니다.

HTML 구조 (변경 없음)

자바스크립트로 라이트박스 구현:

<!-- 라이트박스 요소 추가 -->
<div id="lightbox" class="lightbox">
    <img src="" alt="Lightbox Image" id="lightbox-img">
</div>

CSS 라이트박스 스타일링:

/* 라이트박스 기본 스타일 */
.lightbox {
    display: none; /* 기본적으로 숨김 */
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 0.8); /* 반투명 검은 배경 */
    justify-content: center;
    align-items: center;
}

.lightbox img {
    max-width: 90%;
    max-height: 90%;
}

/* 라이트박스 활성화 시 보이기 */
.lightbox.active {
    display: flex; /* 이미지를 화면 중앙에 표시 */
}

자바스크립트로 라이트박스 작동:

// 라이트박스 기능
const galleryImages = document.querySelectorAll('.gallery img');
const lightbox = document.getElementById('lightbox');
const lightboxImg = document.getElementById('lightbox-img');

galleryImages.forEach(image => {
    image.addEventListener('click', function() {
        lightbox.classList.add('active'); // 라이트박스 활성화
        lightboxImg.src = this.src; // 클릭한 이미지 경로 설정
    });
});

lightbox.addEventListener('click', function() {
    lightbox.classList.remove('active'); // 라이트박스 닫기
});

위 코드는 라이트박스 효과를 추가한 예시입니다. 이미지를 클릭하면 해당 이미지가 전체 화면확대되어 보이며, 라이트박스 배경을 클릭하면 닫히도록 설정되었습니다.


5. 이미지 갤러리에 필터 기능 추가

이미지 갤러리에 필터링 기능을 추가하여 카테고리별로 이미지를 나누고, 사용자가 특정 필터를 선택하면 해당 이미지들만 표시되도록 만들 수 있습니다.

HTML 필터 버튼 추가:

<div class="filter-bar">
    <button class="filter-btn active" data-filter="all">All</button>
    <button class="filter-btn" data-filter="nature">Nature</button>
    <button class="filter-btn" data-filter="cities">Cities</button>
</div>

<div class="gallery">
    <img src="nature1.jpg" alt="Nature" class="nature">
    <img src="city1.jpg" alt="City" class="cities">
    <img src="nature2.jpg" alt="Nature" class="nature">
    <img src="city2.jpg" alt="City" class="cities">
    <!-- 더 많은 이미지 -->
</div>

CSS 필터 버튼 스타일링:

.filter-bar {
    margin-bottom: 20px;
    text-align: center;
}

.filter-btn {
    padding: 10px 20px;
    margin-right: 5px;
    background-color: #333;
    color: white;
    border: none;
    cursor: pointer;
}

.filter-btn.active {
    background-color: #2196F3;
}

.filter-btn:hover {
    background-color: #575757;
}

자바스크립트로 필터링 기능 추가:

const filterButtons = document.querySelectorAll('.filter-btn');
const images = document.querySelectorAll('.gallery img');

filterButtons.forEach(button => {
    button.addEventListener('click', () => {
        // 모든 버튼에서 'active' 클래스 제거
        filterButtons.forEach(btn => btn.classList.remove('active'));
        // 클릭된 버튼에 'active' 클래스 추가
        button.classList.add('active');

        const filterValue = button.getAttribute('data-filter');

        // 이미지 필터링
        images.forEach(image => {
            if (filterValue === 'all' || image.classList.contains(filterValue)) {
                image.style.display = 'block'; // 해당 카테고리의 이미지 표시
            } else {
                image.style.display = 'none'; // 나머지 이미지 숨김
            }
        });
    });
});

위 코드는 필터 버튼을 클릭할 때 이미지 갤러리가 선택된 카테고리에 따라 이미지를 필터링하는 기능을 제공합니다. 사용자가 "Nature" 또는 "Cities" 같은 카테고리를 선택하면, 해당 카테고리의 이미지만 표시되고 나머지는 숨겨집니다.


6. CSS 애니메이션을 활용한 갤러리 효과

CSS 애니메이션을 사용하여 이미지 갤러리에서 부드러운 전환 효과를 줄 수 있습니다. 예를 들어, 이미지가 나타날 때사라질 때 애니메이션을 추가해 시각적 효과를 개선할 수 있습니다.

CSS 애니메이션 추가:

/* 기본적으로 이미지를 숨김 */
.gallery img {
    opacity: 0;
    transition: opacity 0.5s ease;
}

/* 필터링된 이미지만 보이도록 설정 */
.gallery img.show {
    opacity: 1; /* 이미지가 부드럽게 나타남 */
}

자바스크립트 수정:

filterButtons.forEach(button => {
    button.addEventListener('click', () => {
        filterButtons.forEach(btn => btn.classList.remove('active'));
        button.classList.add('active');

        const filterValue = button.getAttribute('data-filter');

        images.forEach(image => {
            image.classList.remove('show');
            if (filterValue === 'all' || image.classList.contains(filterValue)) {
                setTimeout(() => {
                    image.style.display = 'block';
                    image.classList.add('show');
                }, 100); // 이미지가 서서히 나타나는 효과
            } else {
                image.style.display = 'none';
            }
        });
    });
});

위 코드는 이미지가 필터링될 때 부드러운 전환 효과를 적용합니다. CSS 애니메이션을 통해 이미지가 나타나고 사라지는 과정자연스럽게 표현할 수 있습니다.


7. 레이아웃에 그리드 및 플렉스박스 적용

그리드 레이아웃플렉스박스를 함께 사용해 더 복잡한 갤러리 레이아웃을 만들 수 있습니다. 이를 통해 고정 크기의 칸이 아니라, 다양한 크기의 이미지를 포함한 비대칭 갤러리를 만들 수 있습니다.

HTML 구조 (변경 없음)

CSS 스타일링 (그리드 및 플렉스박스 결합):

/* 갤러리 그리드 레이아웃 */
.gallery {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); /* 자동 크기 조정 */
    grid-gap: 10px;
    padding: 10px;
}

/* 이미지 크기를 조정하여 비대칭 레이아웃 생성 */
.gallery img {
    width: 100%;
    height: auto;
    border-radius: 8px;
    transition: transform 0.3s ease;
    object-fit: cover;
}

.gallery img.large {
    grid-column: span 2; /* 큰 이미지 */
    grid-row: span 2;
}

.gallery img:hover {
    transform: scale(1.05); /* 마우스 호버 시 확대 */
}

위 코드는 이미지 크기를 다르게 설정하여 비대칭적 갤러리를 만드는 예시입니다. 일부 이미지는 그리드 칸을 두 개 차지하며, 플렉스박스와 결합하여 유연한 배치를 구현합니다.


8. 이미지 갤러리의 웹 접근성 향상

웹 접근성을 고려한 이미지 갤러리는 모든 사용자, 특히 시각 장애인이나 키보드 사용만으로 내비게이션하는 사용자에게도 사용하기 쉬워야 합니다.

8.1 대체 텍스트 추가

모든 이미지에 적절한 alt 속성을 추가하여 대체 텍스트를 제공하는 것이 중요합니다. 이 텍스트는 스크린 리더에서 읽히며, 이미지를 볼 수 없는 경우에도 이미지 내용을 설명할 수 있습니다.

<img src="nature1.jpg" alt="A beautiful forest in the morning light">

8.2 키보드 내비게이션 지원

키보드 사용자가 탭 키를 통해 이미지 갤러리를 탐색할 수 있도록 포커스 스타일을 명확히 해야 합니다.

/* 포커스된 이미지에 스타일 적용 */
.gallery img:focus {
    outline: 2px solid #2196F3;
    transform: scale(1.05); /* 포커스 시에도 확대 효과 적용 */
}

위 코드는 키보드로 이미지에 포커스될 때 시각적 피드백을 제공합니다. 스크린 리더 사용자가 이미지 내용을 쉽게 인식할 수 있도록 대체 텍스트포커스 관리를 통해 접근성을 향상시킬 수 있습니다.


CSS 이미지 갤러리는 웹 페이지에서 비주얼 콘텐츠효과적으로 정리하고 시각적 효과를 통해 사용자 경험을 강화하는 중요한 요소입니다. 그리드 레이아웃플렉스박스를 사용해 이미지 배열을 유연하게 구성하고, 호버 효과, 라이트박스, 필터링 기능 등을 통해 인터랙티브한 갤러리를 구현할 수 있습니다.

또한 반응형 디자인을 적용하여 모바일 환경에서도 최적화된 갤러리를 제공하고, 애니메이션을 사용해 부드러운 시각적 전환을 구현할 수 있습니다. 마지막으로, 웹 접근성을 고려하여 모든 사용자가 편리하게 사용할 수 있도록 대체 텍스트포커스 스타일을 제공하는 것이 중요합니다.

이와 같은 방식으로 CSS 이미지 갤러리를 구현하여 사용자 친화적인 웹 경험을 만들어보세요!


copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com