Skip to content

Commit ac5dae2

Browse files
authored
fix: HeroBanner 반응형 수정 (#177) (#179)
- 배너 이미지 구조 변경
1 parent 02eeae6 commit ac5dae2

4 files changed

Lines changed: 120 additions & 19 deletions

File tree

src/assets/icons/main/bannerImage.svg

Lines changed: 4 additions & 8 deletions
Loading

src/assets/main_logo_w.svg

Lines changed: 4 additions & 0 deletions
Loading

src/components/Home/BannerItem.vue

Lines changed: 93 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,108 @@
11
<template>
2-
<div class="banner-item">
3-
<img :src="banner.image" alt="배너 이미지" class="banner-image" />
2+
<div class="banner-item" :style="backgroundStyle">
3+
<div class="overlay" :class="`align-${props.banner.position}`">
4+
<p class="banner-text" v-html="formattedText"></p>
5+
<div class="icon-list">
6+
<img
7+
v-for="(icon, index) in props.banner.img.slice(1)"
8+
:key="index"
9+
:src="icon"
10+
class="icon-image"
11+
alt="아이콘"
12+
/>
13+
</div>
14+
</div>
415
</div>
516
</template>
617

718
<script setup>
8-
defineProps({
9-
banner: Object,
10-
})
19+
import { computed } from 'vue'
20+
21+
const props = defineProps({ banner: Object })
22+
23+
// 배경 스타일
24+
const backgroundStyle = computed(() => ({
25+
backgroundImage: `url(${props.banner.img[0]})`,
26+
backgroundSize: 'cover',
27+
backgroundPosition: 'center',
28+
width: '100%',
29+
height: '100%',
30+
display: 'flex',
31+
alignItems: 'center',
32+
justifyContent: getJustify(props.banner.position),
33+
padding: '0 100px',
34+
position: 'relative',
35+
}))
36+
37+
// 텍스트 줄바꿈
38+
const formattedText = computed(() => props.banner.text.replace(/\n/g, '<br>'))
39+
40+
// 정렬 함수들
41+
function getJustify(pos) {
42+
switch (pos) {
43+
case 'left':
44+
return 'flex-start'
45+
case 'right':
46+
return 'flex-end'
47+
default:
48+
return 'center'
49+
}
50+
}
1151
</script>
1252

1353
<style scoped>
1454
.banner-item {
1555
width: 100%;
1656
height: 100%;
17-
overflow: hidden;
1857
}
1958
20-
.banner-image {
21-
width: 100%;
22-
height: 100%;
23-
object-fit: cover;
59+
.overlay {
60+
display: flex;
61+
flex-direction: column;
62+
}
63+
64+
/* 위치별 텍스트 및 아이콘 정렬 */
65+
.overlay.align-left {
66+
text-align: left;
67+
align-items: flex-start;
68+
}
69+
.overlay.align-center {
70+
text-align: center;
71+
align-items: center;
72+
}
73+
.overlay.align-right {
74+
text-align: right;
75+
align-items: flex-end;
76+
}
77+
78+
/* 반응형 처리: 작은 화면에서는 무조건 가운데 정렬 */
79+
@media (max-width: 768px) {
80+
.overlay {
81+
text-align: center !important;
82+
align-items: center !important;
83+
}
84+
85+
.icon-image {
86+
height: 30px;
87+
}
88+
}
89+
90+
.banner-text {
91+
font-size: 35px;
92+
font-weight: var(--fw-semibold);
93+
color: #fff;
94+
text-shadow: 1px 1px 2px black;
95+
white-space: pre-line;
96+
margin-bottom: 12px;
97+
line-height: 1.2; /* 줄 간격을 조절 (기본은 보통 1.5~1.6) */
98+
}
99+
100+
.icon-list {
101+
display: flex;
102+
gap: 12px;
103+
}
104+
105+
.icon-image {
106+
height: 40px;
24107
}
25108
</style>

src/components/Home/HeroBanner.vue

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,25 @@ import BannerItem from './BannerItem.vue'
2727
import bannerImage1 from '@/assets/icons/main/bannerImage.svg'
2828
import bannerImage2 from '@/assets/icons/main/bannerImage2.jpg'
2929
import bannerImage3 from '@/assets/icons/main/bannerImage3.jpg'
30+
import mainLogo from '@/assets/main_logo_w.svg'
3031
31-
const banners = [bannerImage1, bannerImage2, bannerImage3].map((image) => ({ image }))
32+
const banners = [
33+
{
34+
img: [bannerImage1, mainLogo],
35+
text: '여정을 기록하는,\n 여행 커뮤니티',
36+
position: 'left',
37+
},
38+
{
39+
img: [bannerImage2, mainLogo],
40+
text: '여정을 기록하는,\n 여행 커뮤니티',
41+
position: 'right',
42+
},
43+
{
44+
img: [bannerImage3, mainLogo],
45+
text: '여정을 기록하는,\n 여행 커뮤니티',
46+
position: 'center',
47+
},
48+
]
3249
const bannersWithClone = computed(() => [...banners, banners[0]]) // 마지막에 첫 번째 배너 복제
3350
3451
const currentIndex = ref(0)
@@ -40,6 +57,7 @@ const trackStyle = computed(() => ({
4057
}))
4158
4259
function nextSlide() {
60+
if (isTransitionDisabled.value) return
4361
if (currentIndex.value < banners.length) {
4462
currentIndex.value++
4563
}

0 commit comments

Comments
 (0)