본문 바로가기
샘플코드

[프론트엔드] 쇼핑몰 상품 정렬 코드샘플 (Html,Javascript,Css) Sample Code

by jinwanseo 2021. 2. 24.
728x90

쇼핑몰 상품 정렬 코드 샘플 

HTML5 , Vanilla Javascript, Css3 

 

 

1. 설명 : 온라인 쇼핑몰에서 흔히 볼수있는 상품 정렬 코드 샘플이다

 

2. 사용언어 : Javascript, Html, Css [플러그인 사용 x]

 

3. 구동 로직

- 상품 Sample 이 없어서 짱구는 못말려 케릭터로 대체

 

 (1) fetch API 를 통해 서버측의 json 데이터 Get

 (2) json파일(상품 객체 리스트) 저장

 (3) 해당 리스트 출력 

 (4) 이후 선택 옵션에 따른 filter 처리 후 출력

 

[샘플 코드 :Html]

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>짱구는 못말려</title>
    <link rel="stylesheet" href="./style.css">
    <script src="main.js" defer></script>
</head>
<body>
    <section class="main">
        <img src="https://i.ytimg.com/vi/ohtkpDDezLo/maxresdefault.jpg" alt="logo" class="logo btn" data-value="logo">
        <div class="btns">
            <button class="select-btn zzang-gu btn" data-value="zzangGu">짱구</button>
            <button class="select-btn chul-su btn" data-value="chulSu">철수</button>
            <button class="select-btn you-ri btn" data-value="youRi">유리</button>
            <button class="select-btn hoon-e btn" data-value="hoonE">훈이</button>
        </div>
        <ul class="items"></ul>
    </section>
</body>
</html>

[샘플코드 :Css]

 

:root{
    /* color */
    --color-white : #f4f9f9;
    --color-black : #0d335d;   
    --color-red : #d02947;
    --color-blue : #74e3df;
    --color-green : #8af38b;
    --color-yellow : #f0f496;
    --color-whiteBlue : #f4f9f9;

    /* size */
    --size-padding : 8px 15px;
    --size-margin : 8px 0;
    --size-img : 50px;
}

*{
    box-sizing:border-box;
    margin : 0;
    padding : 0;
}

body {
    display : flex;
    align-items: center;
    height : 100vh;
    background : var(--color-black);
}

body > .main {
    display : flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    width : 100%;
    height: 100vh;
    user-select: none;
}

.logo {
    width : 130px;
    height: auto;
    border-radius: 10%;
}

.btns > .select-btn {
    background-color: transparent;
    border : none;
    outline: none;
}

.btns {
    margin : var(--size-margin);
}

.btns > .select-btn {
    border-radius: 6%;
    padding : var(--size-padding);
}

.btns > .select-btn:nth-child(1) {
    background: var(--color-red);
}

.btns > .select-btn:nth-child(2) {
    background: var(--color-blue);
}

.btns > .select-btn:nth-child(3) {
    background: var(--color-yellow);
}
.btns > .select-btn:nth-child(4) {
    background: var(--color-green);
}

.items {
    height: 60%;
    width : 50%;
    list-style: none;
    overflow-y: scroll;
}

.items > .item{
    display : flex;
    align-items: center;
    background: var(--color-whiteBlue);
    border-radius: 5%;
    margin : 5px 0;
}

.items > .item > img {
    width : var(--size-img);
    margin : 0 15px;
}

.btn {
    transition : transform 300ms ease;
    user-select: none;
    cursor: pointer;
}

.btn:hover {
    transform: scale(1.1);
}

 

[샘플코드 :javascript]

 

let itemList = [];

//데이터 받아오기 : fetch()
async function getItems(){
    return fetch('./data/data.json')
    .then(res=>res.json());
}

//HTML Display
function displayItems(items, type){
    const ul = document.querySelector('ul.items');
    if(type)
        ul.innerHTML = items.filter(val=>val.type === type).map(parseToHTML).join('');
    else   
        ul.innerHTML = items.map(parseToHTML).join('');

}

//데이터 -> HTML 변환 
function parseToHTML(item){
    return `
        <li class="item">
            <img src="${item.image}"/>
            <span>${item.name}</span>
        </li>
    `;
}

//버튼 클릭시 이벤트
document.querySelector('.main').addEventListener('click',e=>{
    const dataset = e.target.dataset;
    if(!dataset.value) return;
    if(dataset.value === 'logo') displayItems(itemList);
    else displayItems(itemList,dataset.value);
});

//자동시작 (Deafult 데이터 => HTML)
window.onload = ()=>{
    getItems()
    .then(items => {
        items.items.forEach(item => itemList.push(item));
        displayItems(itemList);
    });
};

 

[샘플코드 : data.json(경로 : ./data/data.json)]

 

{
    "items" : [
        { 
            "type" : "zzangGu",
            "name" : "짱구",
            "image" : "https://upload.wikimedia.org/wikipedia/ko/thumb/4/4a/%EC%8B%A0%EC%A7%B1%EA%B5%AC.png/230px-%EC%8B%A0%EC%A7%B1%EA%B5%AC.png"
        },
        { 
            "type" : "zzangGu",
            "name" : "짱구",
            "image" : "https://item.kakaocdn.net/do/fd0050f12764b403e7863c2c03cd4d2d7154249a3890514a43687a85e6b6cc82"
        },
        { 
            "type" : "zzangGu",
            "name" : "짱구",
            "image" : "https://stickershop.line-scdn.net/stickershop/v1/product/718/LINEStorePC/main.png;compress=true"
        },
        { 
            "type" : "zzangGu",
            "name" : "짱구",
            "image" : "https://image.musinsa.com/festival/2018spao/item0_2.png"
        },
        { 
            "type" : "zzangGu",
            "name" : "짱구",
            "image" : "https://stickershop.line-scdn.net/stickershop/v1/product/1718/LINEStorePC/main.png;compress=true"
        },
        { 
            "type" : "zzangGu",
            "name" : "짱구",
            "image" : "https://stickershop.line-scdn.net/stickershop/v1/product/3312/LINEStorePC/main.png;compress=true"
        },
        { 
            "type" : "chulSu",           
            "name" : "철수",
            "image" : "https://ww.namu.la/s/a7832e1be0f0a5620f53b6761010ab29642df6cf2e8f57cb3c082337e9ba4234bcbed24dae9f6f41113b83882b23caaa067f984a0c47c03a9ec16ec2c6d1e4401032aa0efdfcca6c1bb28019e7e67de0b7d25b02c3eca1cfa5d6e804ab60bbf4"

        },
        { 
            "type" : "chulSu",           
            "name" : "철수",
            "image" : "https://image.fmkorea.com/files/attach/new/20180207/864191284/907858091/934642049/74f150c20ec8f3715c36c7b1f9dd54ae.png"
        },
        { 
            "type": "hoonE",
            "name" : "훈이",
            "image" : "https://upload3.inven.co.kr/upload/2020/11/06/bbs/i13782520128.png"
        },
        { 
            "type": "hoonE",
            "name" : "훈이",
            "image" :"https://ac.namu.la/72/7292ff2fe98597b6b2acbc415b966c33a30686f9431658a33d46da407161bbb5.png"
        },
        { 
            "type": "hoonE",
            "name" : "훈이",
            "image" : "https://articleimage.nicoblomaga.jp/image/258/2017/e/c/ec5c38a9ad0a9f62c28004c68d575b4858467dd71491889459.png"
        },
        { 
            "type" : "youRi",
            "name" : "유리",
            "image" : "https://static.miraheze.org/bigforestwiki/d/de/%EC%A2%86%EB%A6%AC.png"
        },
        { 
            "type" : "youRi",
            "name" : "유리",
            "image" : "http://data6.onnada.com/character/201806/2105852195_bd965428_14.png"
        }
    ]
}       

 

[출력 화면]

 

 

 

728x90

댓글