์ฌ์ดํธ๋ช
: ์นด์นด์คํ์ด์ง
์์
๊ธฐ๊ฐ: 4.5์ผ ์์
๋ผ์ด๋ธ๋ฌ๋ฆฌ: swiper, jQuery
์ ํ: PC,mobile ์ ์ํ, ํด๋ก ์ฝ๋ฉ
์ฐธ์ฌ๋: 100%
<div class="main-slide"> <ul class="swiper-wrapper"> <!-- <li class="swiper-slide"> <a href="./detailpage.html"> <div class="img-box"> <figure> <img src="./asset/images/mb/mb1.png" alt="๋ก๋งจ์ค์นํฐ"> <figcaption class="blind"> ์ฌ์ ํ์,๊ธฐ๋ค๋ฌด ๋ฐ์นญ๊ธฐ๋ , ์บ์+๊ฒฝํ ์ด๋ฒคํธ! </figcaption> </figure> </div> </a> </li> --> <!-- <li class="swiper-slide"> <a href="./detailpage.html"> <div class="img-box"> <figure> <img src="./asset/images/mb/mb1.png" alt="๋ก๋งจ์ค์นํฐ"> <figcaption class="blind"> ์ฌ์ ํ์,๊ธฐ๋ค๋ฌด ๋ฐ์นญ๊ธฐ๋ , ์บ์+๊ฒฝํ ์ด๋ฒคํธ! </figcaption> </figure> </div> </a> </li> --> </ul>
mainBanner ๋ผ๋ ๋ณ์๋ช
์ ์ง์ ํ๋ค.{ "mainBanner": [ { "link": "./detail.html", "imgSrc": "./asset/images/mb/mb1.png", "caption": "์ฌ์ ํ์,๊ธฐ๋ค๋ฌด ๋ฐ์นญ๊ธฐ๋ , ์บ์+๊ฒฝํ ์ด๋ฒคํธ!" }, { "link": "./detail.html", "imgSrc": "./asset/images/mb/mb6.png", "caption": "์นํฐ, ๊ทธ ๋ฐ๋ณด์ง์ ๋ฐ๋ก ์ด๋ ์์ ์ํ!" } ],
mainBanner๋ผ๋ ๋ณ์๋ฅผ ์ง์ ํ๊ณ json๋ฐ์ดํฐ์ mainBanner์ ์ ๊ทผํ๋ค.๋ฐฑํฑ์ ๋ฃ์ด${banner.๋ฐ์ดํฐ}๋ฅผ ์ ๋๋ค.document.querySelector์ผ๋ก html์ ์ฝ์
ํด์ค๋ค.//๋ฉ์ธ์ฌ๋ผ์ด๋ fetch("./asset/data/banner.json") .then((response) => response.json()) .then((json) => { // alert(json); const mainBanner = json.mainBanner; //mainBanner ๋ฐ์ดํฐ ์ ๊ทผ let html = ''; mainBanner.forEach(banner => { html += `<li class="swiper-slide"> <a href="${banner.link}"> <div class="img-box"> <figure> <img src=${banner.imgSrc} alt="๋ก๋งจ์ค์นํฐ"> <figcaption class="blind">${banner.caption}</figcaption> </figure> </div> </a> </li>`; }); // console.log(html); const list = document.querySelector('.sc-visual .swiper-wrapper'); list.innerHTML = html; //๋ณ์
"freeToon":[ { "imgSrc": "./asset/images/contents/free1.png", "waitFree": true, "new": true, "up": true, "view": 500000, "title": "์ฌ์ ํ์", "readIcon": "./asset/images/icon/icon_read_count.png", "viewPeople": "10.3๋ง๋ช ", "link": "./detail.html", "viewWriter": "PAMBA,์ค์ ๋ก" },
์นด์นด์คํ์ด์ง์ product json ๋ฐ์ดํฐ ์์ฑ
์ค๊ดํธ ์์ ๋ณ์๋ช
์ง์
๋๊ดํธ ์์ ํด๋นํ๋ ์์ฑ ๋ฐ ๊ฐ ์ง์
true๋ก ๋ฐ์ดํฐ์ ํด๋นํ๋ ๊ฐ๋ง ๋ฃ์๋ค ๋บ๋ค ํ ์ ์๊ฒ ์
ํ
ํ๋ค.
์กฐ๊ฑด๋ฌธ์ ๋ง๋ค๊ธฐ์ ํ์ํ ๋งํฌ๋ฑ์ ๋ณ์๋ก ์ง์ ํ๋ค.
๊ฑฐ์ ๋ชจ๋ ๊ณณ์ ์ฌ์ฉํจ์ผ๋ก ์ด๋์ ๋๋ ์๊ด์๋ค.
const ic_free = `<img src="./asset/images/icon/badge_time.png" alt="๊ธฐ๋ค๋ฆฌ๋ฉด ๋ฌด๋ฃ">`; const ic_mili = `<img src="./asset/images/icon/badge_right_million.png" alt="๋ฐ๋ฆฌ์ธํ์ด์ง" class="mp-icon"></img>`; const ic_new = `<img src="./asset/images/icon/icon_new.svg" alt="์ ๊ท" />`; const ic_up = `<img src="./asset/images/icon/icon_up.svg" alt="up" />`;
const๋ฅผ ์ด ์ด์ -> ๋๊ตฌ๋ ์ฌ์ฉํ๊ณ ๋ณํ์ง ์๊ฒ ํ๊ธฐ์ํด
์กฐ๊ฑด๋ฌธ
freeEl = (freeToon.waitFree)?ic_free:''; //โ freeToon๋ฐ์ดํฐ์์ waitFree๊ฐ ์๋ค๋ฉด const ic_free๊ฐ ๋์๋ผ ๊ทธ๋ ์ง ์๋ค๋ฉด **๋น์นธ** miliEl = (freeToon.view >= 1000000)?ic_mili:''; //โ freeToon๋ฐ์ดํฐ์์ view๊ฐ ์๊ณ 100๋ง๋ณด๋ค ํฌ๋ค๋ฉด const ic_mili๊ฐ ๋์๋ผ ๊ทธ๋ ์ง ์๋ค๋ฉด **๋น์นธ** newEl = (freeToon.new)?ic_new:''; upEl = (freeToon.up)?ic_up:'';

ํ์ํ๊ณณ์ ๋น๊ต๋ฌธ์ ๋ฃ์ด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋
${freeEl} ${miliEl}

json์ ์ธ๋ ๋ ํธํ๊ฒ ๋ณด๊ธฐ ์ํด ๊ฐ ์ด๋ฆ์ ์ฃผ์์ง๋ง ์๋๋ item์ผ๋ก ํต์ผํด์ค์ผํ๋ค.
- id ์์ฑ - ๊ณ ์ ํ ์๋ณ์ ๋ชฉ์ ์ผ๋ก ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ
->input๊ณผlabel์์ฑ- name ์์ฑ - form ์ปจํธ๋กค ์์์ ๊ฐ(value)์ ์๋ฒ๋ก ์ ์กํ๊ธฐ ์ํด ํ์ํ ์์ฑ
->name์์ฑ์์๋ฐ์คํฌ๋ฆฝํธ์์ ์์๋ฅผ ์ฐธ์กฐํ ์ ์๊ฒ ํฉ๋๋ค.
### โ ์์ผ-๋ฐ์ดํฐ ์ฐ๊ฒฐ : name-id๋ก ์ฐ๊ฒฐ

<ul class="arrayDay-list"> <li class="arrayDay-item active" name = "#monday"> <a class="today">์</a> </li> <li class="arrayDay-item" name = "#tuesday"> <a class="today">ํ</a> </li> <li class="arrayDay-item" name = "#wednesday"> <a class="today">์</a> </li> ... </ul>
<!-- ์์์ผ --> <div class="day-wrap active mon" id="monday"> <ul class="product-list column-3"> <!-- <li class="product-item"> <a href=""> <div class="img-box"> <div class="badge"> <p class="img-rank">1์</p> <img src="./asset/images/icon/bmbadge_waitfree.svg" alt=""> </div> <img src="./asset/images/contents/webtoon2.png" alt="๋๊ตด์"> </div> <div class="txt-wrap"> <div class="title-box"> <em class="title">๋๊ตด์</em> </div> <div class="view-info"> <img src="./asset/images/icon/icon_up.svg" alt="์ ๋ฐ์ดํธ" class="icon-up"> <img src="./asset/images/icon/icon_read_count.png" alt="์ฌ๋ ์์ด์ฝ"> <span class="view-people">331.9๋ง๋ช </span> </div> </div> </a> </li> </ul> <a href="" class="dayMore-box">์์ ์ฐ์ฌ ๋๋ณด๊ธฐ</a> </div>name์ผ๋ก ์ด๋ฆ(์์ผ), ๋ฐ์ดํฐํญ๋ชฉ์ id ๋ถ์ฌํ์ฌ ์ฐ๊ฒฐํ๋ค.
// ์์ผ๋ณ ํด๋ฆญ $('.sc-array .arrayDay-item').click(function(e){ e.preventDefault(); day = $(this).attr('name'); /*name ์์ฑ์ ๊ฐ */ $(this).addClass('active').siblings().removeClass('active'); $(day).addClass('active').siblings().removeClass('active'); /* ๋๋ฅผ ์ ์ธํ ํด๋์ค ์์ ๊ธฐ */ })
arrayDay-item์์ผ์ดactive๋์์ ๋, ๋ค๋ฅธ ์์ผ๋ค์active๋บ๋ค.
๐ก json์ผ๋ก ๋ค ์ฐ๊ฒฐ์์ผ์ค ์ดํ ๊ทธ ๋ฐ์ ์ ์ด์ค๋ค.
-----------------์๋ชป๋ ์ฐ๊ฒฐ๋ฒ
tab์ด ์๋ ๋ฐ์ดํฐ๊ต์ฒด๋ก ๋ง๋ค์ด์ผํ๋ค
<!-- ์์์ผ --> <div class="day-wrap active mon" > <ul class="product-list column-3"> </ul> <a href="" class="dayMore-box">์์ ์ฐ์ฌ ๋๋ณด๊ธฐ</a> </div>์์์ผ ํ ํ๋๋ง ์ค๋นํ์ฌ ul์์ ๋ฐ์ดํฐ๋ง ๋ฐ๊ฟ์ค๋ค.
id๊ฐ์ผ๋ก~~resultํน์dayResult๋ ์ด๋ฆ์ด ๋ ์ข๋ค
โ ์ด๋ถ๋ถ์์ name = "#monday"์ธ โname๊ฐ์ ์ฐ๋ฉด ์๋๋ค.โ
๊ตณ์ด ์ด๋ค๋ฉด data-name="monday"์ผ๋ก ์ฌ์ฉ
<li class="arrayDay-item active" data-name="monday"> <a class="today">์</a> </li> <li class="arrayDay-item" data-name="tuesday"> <a class="today">ํ</a> </li> ...
json๋ฐ์ดํฐ๋ ์์ ํด์ผํ๋ค.

๊ธฐ์กด ๋ ์ง๋ณ๋ก ๋ถ๋ฅํ๊ฑธ ํฐ ํ์ธ dayItems์์ ๋ฃ๋๋ค
"dayItems":[ { "rankNumber": "1์", "waitIcon": "./asset/images/icon/bmbadge_waitfree.svg", "imgSrc": "./asset/images/contents/webtoon2.png", "updateIcon": "./asset/images/icon/icon_up.svg", "title": "๋๊ตด์", "readIcon": "./asset/images/icon/icon_read_count.png", "viewPeople": "331.9๋ง๋ช ", "sort":"monday" }, { "rankNumber": "2์", "waitIcon": "./asset/images/icon/bmbadge_waitfree.svg", "imgSrc": "./asset/images/contents/webtoon1.png", "updateIcon": "./asset/images/icon/icon_up.svg", "title": "์์ค ์ ์์คํธ๋ผ", "readIcon": "./asset/images/icon/icon_read_count.png", "viewPeople": "21.6๋ง๋ช ", "sort":"monday" },"sort":"๋ฐ์ดํฐ๋ค์"๋ก ์์ผ๋ณ๋ก ๋ถ๋ฅ๋ฅผ ํด์ค๋ค.
๋ด๊ฐ ์ ํdata-name="monday"์ ์ ์ด์ฃผ๋๊ฑฐ์์์์ผ์ด๋ผ๋ฉด
"sort":"monday"
ํ์์ผ์ด๋ผ๋ฉด"sort":"tuesday"
์ค๋ฌด์์ ์์ผ๋์ ์ซ์๋ก ์ด๋ค ex)"sort": 1,"sort": 2,,,
์๋ฐ์คํฌ๋ฆฝํธ์ filter๊ฐ ํ์ํ๋ค.
์ฃผ์ด์ง ํจ์์ ํํฐ๋ฅผ ํต๊ณผํ๋ ๋ชจ๋ ์์๋ฅผ ๋ชจ์ ์๋ก์ด ๋ฐฐ์ด๋ก ๋ฐํํ๋ ๊ฒ
filter ํจ์
const result = data.filter(function (a) {return a.sort == val});
val = $(this).data('name'); const data = json.dayItems; //json์ ๋ด๊ฒจ์๋ json.dayItems๋ฅผ ๋ณ์๋ช ์ ์ ์ฅ const result = data.filter(function (a) {return a.sort == 'monday'}); // function (a)์ a๋ ์์๋ก ์ง์ , ์๋ฏธ์๋๊ฒ //๋ด๊ฐ ์ง์ ํ **sort**๊ฐ์ด **monday**๋ฉด monday๋ง ๋์๋ผ์ด๋ ๊ฒ ์ง์ ํ๋ค๋ฉด ๊ฐ์ ๋ก monday๊ฐ์ด ๋ค์ด๊ฐ์ผ๋ก ์ด๋๋ฅผ ๋๋ฌ๋ monday๊ฐ๋ง ๋์จ๋ค
function (a)์ a๋ ์์๋ก ์ง์ , ์๋ฏธ์๋๊ฒ
const result = data.filter(function (a) {return a.sort == val});๋ถ๋ฅ๋๋
sort๊ฐ์ดval = $(this).data('name');์ด ๋๊ฒ ํด์ค๋ค

๋ฐ๊พธ๋ ค๋ dotay์ ์ด๋ฆ์ ๊ฐ์ ธ์์ผํ๋ค.

dateName = $(this).find('.today').text();this์ ํด๋์ค today์ ํ ์คํธ๋ฅผ ์ฐพ์๋ผ๋ฅผ ๋ณ์๋ก ๋ง๋๋๊ฒ
$('.dayMore-box').text(${dateName} ์ฐ์ฌ ๋๋ณด๊ธฐ)text๋ถ๋ถ์ html๋ ์๊ด์์

$('.arrayDay-item').eq(0).trigger('click');์์์ ๊ฐ์ ๋ก 0๋ฒ์งธ ์ฆ ์์์ผ์ด ํด๋ฆญ๋์ด ๋ํ๋์๊ฒํ๊ธฐ
eq - ํ๊ทธ์์ ๋ช๋ฒ์งธ
w 400์ ์ฃผ๋ฉด ์๋จ, ๋ชจ๋ฐ์ผ์ ์์์ ์๋ ์ฌ์ด์ฆ

์นด์นด์คํ์ด์ง๋ ๊ณตํต๋ ๋ ์ด์์์ด ๋ง๋ค
โ ๊ณตํต์ผ๋ก ๋งํฌ์
ํ๋๊ฒ ์ข๋ค!
&.column-2{ padding: 17px 20.7px 5px; display: flex; flex-wrap: wrap; justify-content: space-between; gap: 5px; .product-item{ width: calc(50% - 5px); } }
column-2,column-3,row-1,row-2์ ๊ฐ์ด ๊ณตํต ๋ ์ด์์์ ๋ง๋ค์ด ํต์ ํด์ฃผ๋๊ฒ ์ฝ๊ณ ๋น ๋ฅด๋ค.

์ด๋ฐ์์ ๋ ์ด์์ ๋ฐ๋ณต์๋ flex๋ณด๋ค grid๋ฅผ ์ถ์ฒํ๋ค
->์ค๊ฐ์ ๋ฐ์ดํฐ๊ฐ ํ๋ ์์์ flex์ justify-content: space-between;๋ณด๋ค ํธํ๊ธฐ ๋๋ฌธ
display: grid; gap: 10px; grid-template-columns: repeat(3, minmax(0, 1fr));์ด - grid-template-columns
ํ - grid-template-rows
1fr - 1๋1, ์ฌ๊ธฐ์๋ 3๋ถ์1์ฐ๊ฒ ๋ค
grid-template-columns: 1fr 1fr 1fr;
์ด๋ ๊ฒ ์ฐ๋๊ฒ๋ณด๋ค
grid-template-columns: repeat(3,1fr);
3๋ฒ์ธ๊บผ๋ค, ์ฆ 3๋ถ์ 1๋1๋1 3๋ถ์1์ด ๋์๋ผ
px๋ ๊ฐ๋ฅํ๋ค
์ ์คฌ๋ -> ๊ธ์๊ฐ ๋๋ฌด ๊ธธ์ด์ ๋ง์ค์์ด ์๋จน์ด์ ๊ฐ์ ๋ก ์ค๊ฒ
minmaxํจ์
์ฌ์ฉ๋ฒ
minmax(0, 1fr)
minmax(์ต์๊ฐ, ์ต๋๊ฐ)
์ต์๊ฐ๊ณผ ์ต๋๊ฐ ๋ฒ์๋ด์์ ๊ฐ์ ์ ์ฐํ๊ฒ ์ฒ๋ฆฌํ๋ค.

var lastSlide = new Swiper(".sc-event .swiper", { spaceBetween: 10, freeMode: true, slidesPerView: 'auto', });
swiper์ freeMode: true๋ฅผ ์ฃผ๋ฉด ๋ถ๋๋ฝ๊ฒ ๋์ด๊ฐ

aํ๊ทธ ์ ์ฃผ์๋ฅผ ์ธ๋ /(์๋จํ์ด์ง๋ก ์ด๋)๋ง ์จ๋ ๋๋ค.
๋ค๋ง /๋ง ์ธ์ ๊นํ์์ ์ฌ์ฉํ ์์
ใ
ใ
ใ
.๊นํ.io/ํด๋๊ฒฝ๋ก/index๋ก ํด๋๊ฒฝ๋ก๊ฐ ๊ฒน์ณ์
(โ)์ ๋๊ฒฝ๋ก์ธใ
ใ
ใ
.๊นํ.io/๋ก ๋์จ๋ค.
(โญ)๊ทธ๋ ๊ธฐ์ ./ ํน์ ./index๋ผ๊ณ ์์ฑํด์ผํ๋ค.

โ img-box ํด๋์ค ์ด๋ฆ ์ฃผ์ํ ์ !!! ๊ด๋ฒ์ํ img-box์ด๋ฆ์ ์๋ฌ
img-box๋ ๋๋ฌด ๊ด๋ฒ์ํ๊ณ ๋น๋ํ ํด๋์ค์ด๋ฆ์ด๋ค.
๋ค๋ฅธ sc์์ img-box๊ฐ ์์ฒญ๋๊ฒ ๋์ฌ์์๊ณ ์ฌ์ฉํ์ง ์์ ์๋ ์๋ค.
ํ์ ์ ์์ด์ ๋ถ๊ฐ๋ฅํ ์์ค๋ค.
์น์ img-box ๋ง๋ค ๋ค๋ฅธ ์ด๋ฆ์ ์ฃผ๋๊ฒ ์ข๋ค.

์์ด์ฝ์ธ ์๊ณํ์,up, 15๋ ๊พธ๋ฏธ๋ ์ฉ๋๊ฐ ์๋๋ผ ๊ฐ ํ์ํ ์ ๋ณด๊ฐ ์๋ ์ ๋ค.
์ ๋ณด์ ๋ฌ์ด ํ์ํ ์ ์์ผ๋ก imgํ๊ทธ๋ก ๋ค์ด๊ฐ์ผํ๋ค.
โญ ์ด๋ฏธ์ง๊ฐ before๊ฐ ์๋๋ผ ์์ํ๊ทธ์ฌ์ผํ๋ค

<div class="img-box"> <div class="badge"> <img src="./asset/images/icon/badge_time.png" alt=""> </div> <img src="./asset/images/contents/challenge1.png" alt="๋ก์ด ๋ฉ๋ฆฌ์ง"> </div>
img-box์์badge๋ผ๋ ํ๊ทธ๋ฅผ ํ๋ ๋ง๋ค์ด ๋ฐ๋ณต๋๋img๋ฅผ ๊พธ๋ฉฐ์ค๋ค.
๐ค ์ vertical-align:middle๋ก ์์ค๊น??
-> ๊ธ์จ๋ ๋ด๋ ค๊ฐ๋ฉด์ ์์์ง๋๊น
์๋ก์๋ก ๊ธฐ์ค์ด๊ธฐ ๋๋ฌธ์ top์ ๊ธฐ์ค์ผ๋ก ๋๊ณ ์ด๋ฏธ์ง๋ง ๋ด๋ฆฌ๋๊ฒ ๋ง์
3.
๋ถ๋ชจ์ flex๋ฅผ ์ฃผ๊ณ ์์์ธ pํ๊ทธ์ with๋ฅผ ์ฃผ์ง ์๊ณ ๋ง์ค์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋๊ฒ์ ์ค๋ฅ!
-> flex:1;์ด๋ผ๊ณ ์
ํ
ํด์ผํจ
4.โญโญโญ ๋ฐ๋ณด๊ฐ์ ์ค์๊ธ์ง!!!

๋ค๋ก๊ฐ๊ธฐ ์ด๋ฏธ์ง ์๋์ด

scss์์ ๋ณด๋ฉด ๊ฒฝ๋ก๋ฅผ ์๋ชป์ ์ด๋จ๋ค. ๐ข
../../๋ ์์์ ์๋ ๊ฒฝ๋ก
์์ ํ๋ฉด detail.scss์ ์คฌ๋ css๋ฅผ ์ง์๋ ๋์ค๊ฒ ๋๋ค!