โจ ๋ง์ผ์ปฌ๋ฆฌ ์ฌ์ดํธ์ ์ํ ์์ญ์ ๋๋ถ๋ถ ๊ฐ์ ๋ ์ด์์์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ด, ๋ฐ๋ณต๋๋ ๋ฐ์ดํฐ๋ฅผ ํ๋์ product.json ํ์ผ์ ํ์ฉํ์ฌ, ํ์ํ ๋ถ๋ถ๋ง ์ถ์ถํด fetch๋ฌธ์ ์ฌ์ฌ์ฉํ์ฌ ์์ฑํ์๋ค.
{
"items":[
{
"id":0,
"sort":[1,3,7,11,12],
"cate":[1],
"snippet":{
"thumbnail":"../assets/images/product-img1.jpg",
"title": "[๋ฅด๋คํํ
๋ฅด] ํฌํฐ์ค ๋ํผ&๋ชจ๋ฐ๊ฐํ ์ดํธ 250ml",
"price":{
"discount":15,
"curr":22100,
"ori":26000
},
"badge":"์ผ์ผํน๊ฐ",
"review":5000
}
},
{
"id":0,
"sort":[3,4,7,11,12],
"cate":[16],
"snippet":{
"thumbnail":"../assets/images/product-img2.jpg",
"title": "[๋ง๋น์ค] ์น์ฝ 85mL 6์ข
์ ๋ฌผ์ธํธ (+ ํด๋์ ๋ฏผํธ ์น10ml 3๊ฐ ์ฆ์ )"
"price":{
"discount":20,
"curr":95500,
"ori":119400
},
"badge":"์ผ์ผํน๊ฐ",
"review":5000
}
},
....
]
}
function productList(frame,sortNum,cateNum){
fetch('./assets/data/product.json')
.then((response)=> response.json())
.then((json) => {
data=json.items; //๋ชจ๋ ๋ฐ์ดํฐ
var result = data.filter(function (parm) {
return parm.sort.indexOf(sortNum) >= 0
});
if(cateNum){
var result = result.filter(function (parm) {
return parm.cate.indexOf(cateNum) >= 0
});
}
let html='';
result.forEach(element => {
reviewCnt = (element.snippet.review >=999) ? '999+' : element.snippet.review;
saleEl = (element.snippet.price.ori === element.snippet.price.curr) ? 'hide':'';
html+=`<div class="swiper-slide">
<div class="img-wrap">
<a href="">
<img src="${element.snippet.thumbnail}" alt="์ํ์ด๋ฏธ์ง">
<em class="badge">${element.snippet.badge}</em>
</a>
<button class="btn-cart">
<span class="blind">์ฅ๋ฐ๊ตฌ๋</span>
</button>
</div>
<a href="" class="txt-wrap">
<p class="title">${element.snippet.title}</p>
<div class="price-box">
<div class="wrap">
<strong class="discount ${saleEl}">${element.snippet.price.discount}%</strong>
<strong class="curr">${price(element.snippet.price.curr)}์</strong>
</div>
<span class="ori ${saleEl}">${price(element.snippet.price.ori)}์</span>
</div>
<div class="review">
<div class="review-icon"></div>
<span>ํ๊ธฐ ${reviewCnt}</span>
</div> </a> </div>`;
});
$(frame).html(html);
});
}
productList('#list1',1);
productList('#list2',2);
.
.
.
fetch('./assets/data/product.json')
๋ถ๋ฌ์ฌ json ๋ฐ์ดํฐ ํ์ผ (์ค๋ฌด์์๋ ์ฃผ์๋ฅผ ๋ฐ์์ ์ฐ๋ ๋ถ๋ถ)${element.snippet.thumbnail}
- json์์ ๋ถ๋ฅํ ์์ดํ ๋ค์ ํธ์ถํ๋ ์ฝ๋.saleEl = (element.snippet.price.ori === element.snippet.price.curr) ? 'hide':'';
ํ ์ธ๊ฐ๊ฐ ์ ์ฉ๋์ง ์๋ ์๊ฐ ๊ทธ๋๋ก์ ์ํ์ผ ๊ฒฝ์ฐ [ 'ori'๊ธ์ก๊ณผ 'curr'์ ๊ธ์ก์ด ๊ฐ์ ๋ 'hide'ํด๋์ค๋ฅผ ์ถ๊ฐํด๋ผ ] ๋ผ๋ ์กฐ๊ฑด๋ฌธ์ ๊ฑธ์ด, CSS์์ .ori, .discount(%)๋ฅผ display:none; ํด์ฃผ์๋ค.reviewCnt = (element.snippet.review >=999) ? '999+' : element.snippet.review
ํ๊ธฐ๊ฐ 999๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค๋ฉด, 999+๋ก ํ๊ธฐํ๊ณ , ๊ทธ๋ ์ง ์๋ค๋ฉด ์ค์ ํ๊ธฐ ๊ฐฏ์๊ฐ ๋์ค๋ ์กฐ๊ฑด๋ฌธ.
function price(num){
let price = num;
result = price.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
return result;
}
- replace ์ ๊ทํํ์์ด ๋งค์นญ๋๋ ํญ๋ชฉ์ ""์์ ์๋ ๊ฐ์ผ๋ก ๋ณํ ์์ผ์ค๋ค.
- g(global) ๋ฌธ์์ด ๋ด์ ๋ชจ๋ ํจํด์ ๊ฒ์ํ์ฌ ์ฒ ๋จ์๋ก ์ฝค๋ง๋ฅผ ๋ฃ์ด์ค๋ค.
- ๋ฐฐ์ด์ ์์๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด์ ๋ฐํํ๋ toString() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ์ ๊ท์ ํจํด์ ์์ฑํ๋ค.
- ๊ฐ TAB ๋ฉ๋ด ๋ฒํผ์ ํด๋ฆญ ํ์ ๋ ๊ทธ์ ๋ง๋ ๋ฐ์ดํฐ๋ค์ด ์ถ๋ ฅ๋๋ค.
<ul class="tabnav">
<li><a href="#" data-cate="1">์ฑ์</a></li>
<li><a href="#" data-cate="2">๊ณผ์ผยท๊ฒฌ๊ณผยท์</a></li>
<li><a href="#" data-cate="3">์์ฐยทํด์ฐยท๊ฑด์ด๋ฌผ</a></li>
<li><a href="#" data-cate="4">์ ์กยท๊ณ๋</a></li>
<li><a href="#" data-cate="5">๊ตญยท๋ฐ์ฐฌยท๋ฉ์ธ์๋ฆฌ</a></li>
<li><a href="#" data-cate="6">์๋ฌ๋ยท๊ฐํธ์</a></li>
<li><a href="#" data-cate="7">๋ฉดยท์๋
ยท์ค์ผ</a></li>
<li><a href="#" data-cate="8">์์ยท์๋ฃยท์ฐ์ ยท์ปคํผ</a></li>
<li><a href="#" data-cate="9">๊ฐ์ยท๊ณผ์ยท๋ก</a></li>
<li><a href="#" data-cate="10">๋ฒ ์ด์ปค๋ฆฌยท์น์ฆยท๋ธ๋ฆฌ</a></li>
<li><a href="#" data-cate="11">๊ฑด๊ฐ์ํ</a></li>
<li><a href="#" data-cate="12">์์ธ</a></li>
<li><a href="#" data-cate="13">์ ํต์ฃผ</a></li>
<li><a href="#" data-cate="14">์ํ์ฉํยท๋ฆฌ๋นยท์บ ํ</a></li>
<li><a href="#" data-cate="15">์คํจ์ผ์ดยท๋ฉ์ดํฌ์
</a></li>
<li><a href="#" data-cate="16">ํค์ดยท๋ฐ๋ยท๊ตฌ๊ฐ</a></li>
<li><a href="#" data-cate="17">์ฃผ๋ฐฉ์ฉํ</a></li>
<li><a href="#" data-cate="18">๊ฐ์ ์ ํ</a></li>
<li><a href="#" data-cate="19">์ ๋ฌผํ๊ธฐ</a></li>
<li><a href="#" data-cate="20">๋ฐ๋ ค๋๋ฌผ</a></li>
<li><a href="#" data-cate="21">๋ฒ ์ด๋นยทํค์ฆยท์๊ตฌ</a></li>
<li><a href="#" data-cate="22">์ฌํยทํฐ์ผ</a></li>
</ul>
- ๊ฐ ํญ์
data-cate=""
๋ฅผ ๋ฃ์ด์ฃผ์ด ๊ฐ๊ฐ์ ์ผ์นํ๋ ๋ฐ์ดํฐ๋ค์ด ๋์ฌ์ ์๋๋ก ์ค์ ํด์ฃผ์๋ค.
$('.md-recomm .tabnav a').click(function(e){
e.preventDefault();
cateIndex = $(this).data('cate');
$('.tabnav a').removeClass('active');
$(this).addClass('active');
productList('#list12',12,cateIndex);
})
- ๋ด๊ฐ ์ ํํ
data-cate
๋ฅผ ๋ฐ์์cateIndex
๋ผ๊ณ ๋ณ์๋ฅผ ๋ฐ์ ๋๊ณ , ๋ฐ์ ๋์cateIndex
๋ฅผproductList('#list12',12,cateIndex)
์ ์ ๋ฌ์ ํด์ ๊ฐ๊ฐ์ data-cate ์ ๋ถ์ฌ๋ฐ์ ๋ฒํธ์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ค์ ๋ถ๋ฌ์จ๋ค.
$('.md-recomm .tabnav li:first-child a').trigger('click');
- ๊ฐ์ ๋ก ์ฒซ๋ฒ์งธ ํญ์ด ํด๋ฆญ์ด๋ฒคํธ๊ฐ ์คํ์ด ๋๊ฒ ํ๋ค.
// ๋ฐ์ดํฐ ํํฐ๋ง ํด์ค ํจ์
function productList(frame,sortNum,cateNum){
fetch('./assets/data/product.json')
.then((response)=> response.json())
.then((json) => {
data=json.items; //๋ชจ๋ ๋ฐ์ดํฐ
var result = data.filter(function (parm) {
return parm.sort.indexOf(sortNum) >= 0
});
if(cateNum){
var result = result.filter(function (parm) {
return parm.cate.indexOf(cateNum) >= 0
});
}
let html='';
result.forEach(element => {
reviewCnt = (element.snippet.review >=999) ? '999+' : element.snippet.review;
saleEl = (element.snippet.price.ori === element.snippet.price.curr) ? 'hide':'';
html+=`
...
`; //์ค๋ณต์ผ๋ก ์๋ต
});
$(frame).html(html);
});
}
- filter() ๋ฉ์๋๋? ์ฃผ์ด์ง ํจ์์ ํ ์คํธ๋ฅผ ํต๊ณผํ๋ ๋ชจ๋ ์์๋ฅผ ๋ชจ์ ์๋ก์ด ๋ฐฐ์ด๋ก ๋ฐํํ๋ ๋ฉ์๋์ด๋ค.
๋ฒํผ ํด๋ฆญ์ ๊ฐ ๋ฐ์ดํฐ์ ๋ง๋ ์ํ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด(sort-๋ถ๋ฅ) fetch๋ฌธ์ ํจ์์ ๋ฃ์ด์ฃผ๊ณ filter() ๋ฉ์๋๋ก ๋ฐ์ดํฐ ํํฐ๋ง์ ํ์๋ค.
<section class="sc-product">
<div class="common-inner">
<div class="group-title">
<h2 class="title">์ด ์ํ ์ด๋์?</h2>
</div>
<div class="group-product">
<div class="swiper">
<div class="swiper-wrapper" id="list1">
<!-- jsonํ์ผ ์ฌ์ฉ์ผ๋ก swiper-slide ์๋ต -->
</div>
</div>
<div class="btn-nav prev"></div>
<div class="btn-nav next"></div>
</div>
</div>
</section>
const productSlide = new Swiper('.group-product .swiper', {
slidesPerView: 4, //ํ ์ฌ๋ผ์ด๋์ ๋ณด์ฌ์ค ๊ฐฏ์
spaceBetween: 20, //์ฌ๋ผ์ด๋ ์ฌ์ด ์ฌ๋ฐฑ
navigation: { //๋ฒํผ
nextEl: ".next",
prevEl: ".prev",
},
});
- swiper slide์์๋ ์ฌ๋ผ์ด๋ ์ฌ์ด ์ฌ๋ฐฑ์ CSS์ margin ๊ฐ์ด ์๋,
spaceBetween
์์ฑ์ ํตํด ์ฌ๋ฐฑ์ ์ค๋ค.