๊ฐ๋ฐ์ ๋ฏผ์กฑ์ ๋ฐฐ๋ฌ์ ๋ฏผ์กฑ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ด๋ค. ๋ค์ํ ์ฌ์ฉ์ ์ธต์ ๋นํด ๋ชจ๋ฐ์ผ ํ๊ฒฝ(๋ชจ๋ฐ์ผ UI)์์๋ง ์ด์ฉ ๊ฐ๋ฅํ ์๋น์ค๋ฅผ ๋ค์ํ ๋๋ฐ์ด์ค์์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ธ๋ฆฟ๋ถํฐ ํผ์จ๊น์ง์ ๋ฐ์ํ ์น ์๋น์ค๋ก ์์ ํ๋ค. ๋ํ ๋ฐฐ๋ฌ์ ๋ฏผ์กฑ ์ฑ์ ๊ฐ๋ก ๋ชจ๋๋ ํ๋ ๋ฑ์ WCAG 2.1 ๊ธฐ์ค 1๋ ๋ฒจ ํญ๋ชฉ๋ค์กฐ์ฐจ ์งํค์ง์ง ์์๊ณ ์ด์ ์น ์ ๊ทผ์ฑ์ ์ด์ ์ ๋ง์ถ์ด ์งํํ๋ค. ์ด 5๋ช ์ FE๋ก ๊ตฌ์ฑ๋ ํ ํ๋ก์ ํธ์ด๋ฉฐ ์ด 9๊ฐ์ ํ์ด์ง๋ฅผ ์ ์ํ๋ค. ๊ตฌํ๋ ๊ธฐ๋ฅ์ ์๋์ ๊ฐ๋ค.
- Carousel
- Modal
- go to top ๋ฒํผ
- tab๊ด๋ จ ์น ์ ๊ทผ์ฑ
- localStorage๋ฅผ ์ด์ฉํ ์ฅ๋ฐ๊ตฌ๋ ๋ฑ์ง ํ์
- ๋น๋์ค ์ปจํธ๋กค
- Map API
- Skeleton UI
- ๋งํฌ : https://bubobubobo.github.io/Gaemin/main.html
- ๋ผ์ด๋ธ ๋น๋์ค UI ๋ฐ ๊ธฐ๋ฅ
- ๊ธฐ๋ฅ: ๋น๋์ค ์ปจํธ๋กค ๋ฐ ์ฑํ ์ฐฝ, ํญ๊ณผ ํ์ดํ ํค๋ฅผ ์ด์ฉํ ์น ์ ๊ทผ์ฑ
- ๊นํ๋ธ: public/js/liveVideo.js
- ํ์ด์ง: https://bubobubobo.github.io/Gaemin/views/liveVideo.html
- ์ผํ ๋ผ์ด๋ธ UI
- ๊นํ๋ธ: public/js/liveShopping.js
- ํ์ด์ง: https://bubobubobo.github.io/Gaemin/views/liveShopping.html
- ์ฃผ๋ฌธ ํ์ด์ง UI
- ๊นํ๋ธ: public/js/orderDetail.js
- ํ์ด์ง: https://bubobubobo.github.io/Gaemin/views/orderDetail.html
- ์์
ํ ์น ์ ๊ทผ์ฑ
- ๋น๋์ค ์์๊ฑฐ / ํด์
- ์ด๋ค ๋ฒํผ์ธ์ง, ๋ฒํผ์ด ๋๋ ค์ง ์ฌ๋ถ๋ฅผ ์๋ ค์ค๋ค.
- ํ๋ก๊ทธ๋์ค ๋ฐ
- ๋น๋์ค์ ์ ์ฒด ์๊ฐ๊ณผ ํ์ฌ ์ฌ์๋๊ณ ์๋ ์๊ฐ์ ์๋ ค์ค๋ค.
- Tabํค๋ก ๋น๋์ค ์ปจํธ๋กค focus๋๋ ๋ถ๋ถ์ ์ค์
- 3๊ฐ ๋ฒํผ์ tab-index๊ฐ [-1, 0, -1]๋ก ์ค์
- tab-index๊ฐ 0์ธ ๊ณณ์ focus๋๊ณ ํ์ดํํค๋ฅผ ์ด์ฉํ์ฌ -1๋ก ์ด๋ํ์ฌ 0์ผ๋ก ์ค์
- ๊ธฐ์กด์ [-1, 0, -1]์์ [0, -1, -1]์ด ๋จ
- ๋ค์ Tabํค๋ก ์ด๋ํ์ ๋ focus๋๋ ๊ฒ์ 1๋ฒ์งธ ๋ฒํผ์ด ๋จ
- ๋น๋์ค ์์๊ฑฐ / ํด์
// liveVideo.js ์ค ํด๋น WAI-ARIA ๊ด๋ จ ๋ถ๋ถ๋ง ๋ฐ์ท...
// i. ๋น๋์ค ์์๊ฑฐ / ํด์
const setMuted = ({ target }) => {
// ์ด๋ค ๋ฒํผ์ธ์ง ์๋ ค์ค๋ค.
target.setAttribute('aria-label', ariaPressed ? '์์๊ฑฐ ํด์ ' : '์์๊ฑฐ');
// ๋ฒํผ์ด ๋๋ ค์๋ ์ฌ๋ถ๋ฅผ ์๋ ค์ค๋ค.
target.setAttribute('aria-pressed', !ariaPressed);
};
// ii. ํ๋ก๊ทธ๋์ค ๋ฐ
const setProgress = (videoDuration, videoCurrentTime) => {
// ๋น๋์ค์ ์ ์ฒด ์๊ฐ๊ณผ ํ์ฌ ์ฌ์๋๊ณ ์๋ ์๊ฐ์ ์๋ ค์ค๋ค.
$progress.setAttribute('aria-valuetext', `${videoDuration}์ด ์ค ${videoCurrentTime}์ด ์ฌ์ ์ค`);
};
// iii. Tabํค๋ก ๋น๋์ค ์ปจํธ๋กค focus๋๋ ๋ถ๋ถ์ ์ค์ ํด์ค๋ค.
const setTabindex = e => {
if (e.key !== 'ArrowRight' && e.key !== 'ArrowLeft') return;
const target =
e.key === 'ArrowRight' ? e.target.parentNode.nextElementSibling : e.target.parentNode.previousElementSibling;
if (target === null) return;
e.target.setAttribute('tabindex', -1);
target.querySelector('button').focus();
target.querySelector('button').setAttribute('tabindex', 0);
};
- [liveShopping] ์์ x์ถ ์ฌ๋ผ์ด๋๋ฅผ ๊ตฌํํ๋ ๊ณผ์ ์์ ๋ฒ๋ฒ ์ด๋ ์ค๋ฅ.
- ์์ธ : ๋ง์ฐ์ค ๋๋๊ทธ ์ด๋ฒคํธ ์์ ์ด ์๋ชป ์กํ์๋ค๊ณ ์ถ์ธก.
- ํด๊ฒฐ : ๋๋ด ์ค๋ฅ ์์ธ์ ์ ํํ ํ์ ํ์ง ๋ชปํ์ฌ ํด๊ฒฐํ์ง ๋ชปํ๋ค. mouse event์ ๋ํด์ ๋ ๊ณต๋ถ๋ฅผ ํด๋ณด๋ฉฐ ์์ธ์ ํ์ ํด์ผ๊ฒ ๋ค.
- [liveVideo] ์์ ๋ฐ์ดํฐ๋ก ์ฑํ ์ฐฝ ๊ตฌํ ์ค ํด๋น ๋ฐ์ดํฐ์ ๊ฐฏ์๋งํผ ๋์ค์ง ์๋ ์ค๋ฅ.
- ์์ธ : ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๋ก ๊ตฌ์ฑํ๋ฉด์ ๊ฐ์ ํค์ ๋ค๋ฅธ ๊ฐ์ ๊ฐ์ง ๋ชฉ๋ก์ ์ถ๊ฐํ์ฌ ๊ฐ์ด ๋ฎ์ด์์ด์ง๋ ๊ฐ์ฒด์ ์ฑ์ง๋ก ์ธํ ๋ฌธ์
- ํด๊ฒฐ : ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์ด๋ก ๊ตฌ์ฑํ์ฌ ์จ์ ํ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ ์ ์๋๋ก ํ์๋ค.
// ๋ณ๊ฒฝ ์
const chats = {
'๋ฐฐ๋ฏผ123': '๋ง์๊ฒ ๋ค',
'pizzang': 'ํผ์ ๋จน๊ณ ์ถ๋ค.',
'ajdi': '์ฌ์ฃ ',
'๋ฐฐ๋ฏผ123': '๋ง์๊ฒ ์๋จน๊ฒ ์ต๋๋ค.' // ์ฒซ๋ฒ์งธ๋ก ์๋ '๋ฐฐ๋ฏผ123'์ ๊ฐ์
};
// ๋ณ๊ฒฝ ํ
const chats = [
['๋ฐฐ๋ฏผ123', '๋ง์๊ฒ ๋ค'],
['pizzang', 'ํผ์ ๋จน๊ณ ์ถ๋ค.'],
['ajdi', '์ฌ์ฃ '],
['๋ฐฐ๋ฏผ123', '๋ง์๊ฒ ๋ค'],
];
ํ๊ณ ๋ก์ ๋ณด์๋ ค๋ฉด ์ฌ๊ธฐ๋ฅผ ํด๋ฆญํด์ฃผ์ธ์:)