HTML
<div class="up_sensor"></div>
<div id="bottomSheet" class="bottom_sheet">
<div class="bottom_sheet_handle_wrap">
<div class="bottom_sheet_handle"></div>
</div>
<div style="margin-bottom: 40px;"></div>
<div class="bottom_box">
<!-- ๋ฐํ
์ํธ ๋ด์ฉ -->
</div>
</div>
</div>
up_sensor๋ ๋ฐํ
์ํธ๋ฅผ ์ฌ๋ฆฌ๊ธฐ ์ํ ๋์์ ๊ฐ์งํ๊ธฐ ์ํ ์ผ์์ด๋ค.
์ค์ ๋ฐํ
์ํธ ์์ ๊ฐ์ธ๊ณ ์๋ ํฌ๋ช
ํ ๋ฒฝ์ผ๋ก, ๋ฐํ
์ํธ๊ฐ ์ฌ๋ผ๊ฐ๋ฉด ์ฌ๋ผ์ง๋ค.
์ผ์๋ฅผ ๋์ง ์์ผ๋ฉด ๋ฐํ
์ํธ๋ฅผ ์ฌ๋ฆฌ๋ ๊ณผ์ ์์ ์คํฌ๋กค ๋๋ฉด์ ์์ ๋ด์ฉ์ด ์คํฌ๋กค ๋๋ ๊ฒ์ ๋ฐฉ์งํด์ ๋ง๋ค์๋ค.
bottom_sheet_handle์ ์ฌ์ฉ์์๊ฒ ๋ฐํ ์ํธ๋ฅผ ์ฌ๋ฆฌ๊ณ ๋ด๋ฆด ์ ์๋ hint๋ฅผ ์ ๊ณตํ๋ค.
CSS
.bottom_sheet {
display: flex;
position: fixed;
bottom: 0;
width: 100%;
height: 10%;
border-top-left-radius: 30px;
border-top-right-radius: 30px;
background-color: #FFFFFF;
overflow-y: auto;
flex-direction: column;
align-items: center;
transition-duration: 1s;
}
.bottom_sheet_handle_wrap {
z-index: 1;
background: linear-gradient(to bottom,
rgba(255, 255, 255, 1) 20%,
rgba(255, 255, 255, 0.75) 35%,
rgba(255, 255, 255, 0.5) 60%,
rgba(255, 255, 255, 0.25) 85%,
rgba(255, 255, 255, 0) 100%);
display: flex;
justify-content: center;
align-items: flex-start;
width: 80%;
height: 40px;
margin-bottom: 10px;
position: fixed;
}
.bottom_sheet_handle {
width: 20%;
height: 10px;
background-color: #7c7979;
border-radius: 30px;
margin-top: 10px;
}
.bottom_box {
width: 80%;
height: auto;
margin-top: 10px;
margin-bottom: 10px;
padding: 5px;
border: 1px solid lightgray;
border-radius: 10px;
transition-duration: 2s;
padding-top: 20px;
padding-bottom: 20px;
}
.up_sensor {
z-index: 1;
position: absolute;
background: transparent;
width: inherit;
height: 100%;
bottom: 0;
height: 10%;
transition-duration: 1s;
}
up_sensor๋ ๋ฐํ ์ํธ๋ณด๋ค z-index๊ฐ ์ปค์ผํ๊ณ , background๊ฐ transparent์ฌ์ผ ํ๋ค.
๋ฐํ ์ํธ์ height๊ฐ์ ์ค์ ์ผ๋ก ์ฌ๋ฆฌ๊ณ ๋ด๋ฆฌ๊ธฐ ๋๋ฌธ์, height๊ฐ์ ์ค์ ์ ์ผ๋ก ๋ค๋ค์ผ ํ๋ค.
๋ฐํ ์ํธ์ transition-duration๊ฐ์ ํตํด์ ์์ฐ์ค๋ฝ๊ฒ ์ฌ๋ผ๊ฐ๊ณ ๋ด๋ ค๊ฐ์ ํํํด์ผ ํ๋ค.
JS
var handle_wrap = document.getElementsByClassName('bottom_sheet_handle_wrap')[0];
var bottom_sheet = document.getElementsByClassName('bottom_sheet')[0];
var up_sensor = document.getElementsByClassName('up_sensor')[0];
let bottom_touch_start = 0;
let bottom_scroll_start;
//up_sensor์์ ํฐ์น๊ฐ ์์ง์์ ๊ฒฝ์ฐ (๋ฐํ
์ํธ๋ฅผ ๊ฑด๋๋ ธ์ ๊ฒฝ์ฐ) -> ๋ฐํ
์ํธ๋ฅผ ์ฌ๋ฆผ
up_sensor.addEventListener("touchmove", (e) => {
bottom_sheet.style.height = 70 + "%" //๋ฐํ
์ํธ height๋ฅผ ์ฌ๋ฆฌ๊ธฐ 10% -> 70%
up_sensor.style.height = 70 + "%"; //up_sensor๋ ๋ฐ๋ผ๊ฐ๊ธฐ
setTimeout(function () {
up_sensor.style.display = "none";
}, 1000); // ๋ฐํ
์ํธ๊ฐ ์ฌ๋ผ๊ฐ ํ, up_sensor ์ฌ๋ผ์ง๊ธฐ
});
//๋งจ ์์์ ์๋๋ก ์คํฌ๋กคํ์ ๊ฒฝ์ฐ
bottom_sheet.addEventListener("touchstart", (e) => {
bottom_touch_start = e.touches[0].pageY; // ํฐ์น๊ฐ ์์๋๋ ์์น ์ ์ฅ
bottom_scroll_start = bottom_sheet.scrollTop //ํฐ์น ์์ ์ ์คํฌ๋กค ์์น ์ ์ฅ
});
bottom_sheet.addEventListener("touchmove", (e) => {
//์ ์ ๊ฐ ์๋๋ก ๋ด๋ ธ์ ๊ฒฝ์ฐ + ์คํฌ๋กค ์์น๊ฐ ๋งจ ์์ผ ๊ฒฝ์ฐ
if (((bottom_touch_start - e.touches[0].pageY) < 0) && (bottom_scroll_start <= 0)) {
//๋ฐํ
์ํธ ๋ด๋ฆฌ๊ธฐ
bottom_sheet.style.height = 10 + "%"
up_sensor.style.display = "block"; //up_sensor ๋ค์ ๋ํ๋๊ธฐ
up_sensor.style.height = "10%"; //up_sensor height ๋ค์ ์ง์
};
});
//๋งจ ์ ํธ๋ค์ ์๋๋ก ๋น๊ฒผ์ ๊ฒฝ์ฐ
handle_wrap.addEventListener("touchstart", (e) => {
bottom_touch_start = e.touches[0].pageY; // ํฐ์น๊ฐ ์์๋๋ ์์น ์ ์ฅ
});
handle_wrap.addEventListener("touchmove", (e) => {
//์ฌ์ฉ์๊ฐ ์๋๋ก ๋ด๋ ธ์ ๊ฒฝ์ฐ
if ((bottom_touch_start - e.touches[0].pageY) < 0) {
//๋ฐํ
์ํธ ๋ด๋ฆฌ๊ธฐ
bottom_sheet.style.height = 10 + "%"
up_sensor.style.display = "block"; //up_sensor ๋ค์ ๋ํ๋๊ธฐ
up_sensor.style.height = "10%"; //up_sensor height ๋ค์ ์ง์
};
});
์ฌ์ฉ์๊ฐ ์๋๋ก ๋ด๋ ธ๋์ง ๊ฒ์ฌํ๋ ๊ณผ์ ๋๋ฌธ์ ์ฝ๋๊ฐ ์ข ๊ธธ์ด์ง๋ค.
๋ฐํ
์ํธ๊ฐ ์ฌ๋ผ๊ฐ๋ ๊ฒฝ์ฐ :
- ์ฌ์ฉ์๊ฐ up_sensor๋ฅผ ์๋ก ์ฌ๋ ธ์ ๊ฒฝ์ฐ (์ค์ ์ฝ๋๋ ๊ทธ๋ฅ ์์ง์ด๊ธฐ๋ง ํด๋ ์ฌ๋ผ๊ฐ๋ค.. ์๋ก ์ฌ๋ฆฌ๋ ๊ฒฝ์ฐ๋ก ๊ตฌํํด๋ ์ข๋ค)
๋ฐํ ์ํธ๊ฐ ๋ด๋ ค๊ฐ๋ ๊ฒฝ์ฐ : - ์คํฌ๋กค ๋งจ ์์์ ์๋๋ก ์คํฌ๋กค ํ์ ๊ฒฝ์ฐ
- ๋ฐํ
์ํธ ํธ๋ค์ ์๋๋ก ๋ด๋ ธ์ ๊ฒฝ์ฐ
๊ตฌ๊ธ๋ง์ ํด๋ด๋ React๋ก ๊ตฌํํ ๊ฒฝ์ฐ๊ฐ ๋๋ค์๋ผ Vanilla JS๋ก ๊ตฌํํด ๋ณด์๋ค. ์ฝ๋๋ ๊ธธ๊ณ ๋ณต์กํ์ง๋ง ์ต๋ํ ๊ฐ๊ฒฐํ๊ฒ ์จ๋ดค๋ค!!!
'FrontEnd > HTML | JS | CSS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Vanilla JS] html, css, js ์ฌ๋ผ์ด๋ ๊ตฌํํ๊ธฐ (0) | 2023.09.02 |
---|---|
๋ทํ๋ฆญ์ค ๋์์ธ์ผ๋ก ํฌํธํด๋ฆฌ์ค ๋ง๋ค๊ธฐ (0) | 2023.09.01 |
๋ด๋ชจํผ์ฆ ์คํ์ผ๋ก ์กธ์ ์๊ฑด ๊ฒ์ฌ ์ฌ์ดํธ ์ ์ํ๊ธฐ (0) | 2023.09.01 |