[๐Ÿ’ป] ์‹ค์Šต - ์นด์นด์˜คํŽ˜์ด์ง€(๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ)

J-silverยท2022๋…„ 9์›” 30์ผ

web-project

๋ชฉ๋ก ๋ณด๊ธฐ
15/18

๐Ÿ“– Overview

์‚ฌ์ดํŠธ๋ช…: ์นด์นด์˜คํŽ˜์ด์ง€
์ž‘์—… ๊ธฐ๊ฐ„: 4.5์ผ ์†Œ์š”
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: swiper, jQuery
์œ ํ˜•: PC,mobile ์ ์‘ํ˜•, ํด๋ก  ์ฝ”๋”ฉ
์ฐธ์—ฌ๋„: 100%

๐Ÿ‘€ Check-point

  • sass๋กœ ์ฒ˜๋ฆฌํ• ์ˆ˜์žˆ๋Š”๊ฐ€
  • Json์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์—ฐ๋™์ด ๊ฐ€๋Šฅํ•œ๊ฐ€
  • detailํŽ˜์ด์ง€์™€ indexํŽ˜์ด์ง€์˜ ์—ฐ๋™์ด ์ž์œ ๋กœ์šด๊ฐ€

sass์…‹ํŒ… ์ •๋ฆฌ



๐Ÿ“Œ data.Json

โœ swiper ๋ฐ์ดํ„ฐ ์—ฐ๋™

  1. html swiper ๋งˆํฌ์—… ์ž‘์„ฑ
  2. json์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ๋ถ€๋ถ„์€ ์‚ญ์ œ
<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>
  1. jsonํŒŒ์ผ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    mainBanner ๋ผ๋Š” ๋ณ€์ˆ˜๋ช…์„ ์ง€์ •ํ•œ๋‹ค.

  2. ๋Œ€๊ด„ํ˜ธ ์•ˆ์— ํ•ด๋‹นํ•˜๋Š” ์†์„ฑ ๋ฐ ๊ฐ’์„ ์ง€์ •ํ•œ๋‹ค.
{
    "mainBanner": [
        {
            "link": "./detail.html",
            "imgSrc": "./asset/images/mb/mb1.png",
            "caption": "์—ฌ์ œํ™”์›,๊ธฐ๋‹ค๋ฌด ๋Ÿฐ์นญ๊ธฐ๋…, ์บ์‹œ+๊ฒฝํ’ˆ ์ด๋ฒคํŠธ!"
        },
        {
            "link": "./detail.html",
            "imgSrc": "./asset/images/mb/mb6.png",
            "caption": "์›นํˆฐ, ๊ทธ ๋ฐ”๋ณด์ง“์€ ๋ฐ”๋กœ ์ด๋…€์„์˜ ์†Œํ–‰!"
        }
    ],
  1. ๊ธฐ์กด ์Šค์™€์ดํผ ์ œ์ด์ฟผ๋ฆฌ ์œ„์— ์ค‘๊ด„ํ˜ธ์•ˆ mainBanner๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜๊ณ  json๋ฐ์ดํ„ฐ์˜ mainBanner์— ์ ‘๊ทผํ•œ๋‹ค.

  2. html์— ์ ์€ ๋งˆํฌ์—…(์ฃผ์„๋œ)์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™€ ๋ฐฑํ‹ฑ์— ๋„ฃ์–ด
    ${banner.๋ฐ์ดํ„ฐ}๋ฅผ ์ ๋Š”๋‹ค.

  3. document.querySelector์œผ๋กœ html์— ์‚ฝ์ž…ํ•ด์ค€๋‹ค.

  4. json์†์„ฑ ๋ฐ‘์— swiper ์†์„ฑ์„ ์ ์–ด์ค€๋‹ค.
//๋ฉ”์ธ์Šฌ๋ผ์ด๋“œ
    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,class,name ์ฐจ์ด

  • 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์˜ ์ด๋ฆ„์„ ๊ฐ€์ ธ์™€์•ผํ•œ๋‹ค.

  1. ๋ณ€์ˆ˜๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ
dateName = $(this).find('.today').text();

this์˜ ํด๋ž˜์Šค today์˜ ํ…์ŠคํŠธ๋ฅผ ์ฐพ์•„๋ผ๋ฅผ ๋ณ€์ˆ˜๋กœ ๋งŒ๋“œ๋Š”๊ฒƒ

  1. ๋‚ด๊ฐ€ ๋ฐ”๊พธ๋ ค๋Š” ํด๋ž˜์Šค
$('.dayMore-box').text(${dateName} ์—ฐ์žฌ ๋”๋ณด๊ธฐ)

text๋ถ€๋ถ„์€ html๋„ ์ƒ๊ด€์—†์Œ


๐Ÿ“Œ ๊ฐ•์ œ๋กœ ์‹œ์ž‘ trigger

$('.arrayDay-item').eq(0).trigger('click');

์‹œ์ž‘์‹œ ๊ฐ•์ œ๋กœ 0๋ฒˆ์งธ ์ฆ‰ ์›”์š”์ผ์ด ํด๋ฆญ๋˜์–ด ๋‚˜ํƒ€๋‚˜์žˆ๊ฒŒํ•˜๊ธฐ
eq - ํƒœ๊ทธ์—์„œ ๋ช‡๋ฒˆ์งธ


๐Ÿ“Œ ๋งˆํฌ์—…

โœ width ์‚ฌ์ด์ฆˆ

w 400์„ ์ฃผ๋ฉด ์•ˆ๋จ, ๋ชจ๋ฐ”์ผ์— ์žˆ์„์ˆ˜ ์—†๋Š” ์‚ฌ์ด์ฆˆ

โœ ๊ณตํ†ต css

์นด์นด์˜คํŽ˜์ด์ง€๋Š” ๊ณตํ†ต๋œ ๋ ˆ์ด์•„์›ƒ์ด ๋งŽ๋‹ค
โ†’ ๊ณตํ†ต์œผ๋กœ ๋งˆํฌ์—…ํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค!

&.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์™€ ๊ฐ™์ด ๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ์„ ๋งŒ๋“ค์–ด ํ†ต์ œํ•ด์ฃผ๋Š”๊ฒŒ ์‰ฝ๊ณ  ๋น ๋ฅด๋‹ค.

๐Ÿ“Œ grid

์ด๋Ÿฐ์‹์˜ ๋ ˆ์ด์•„์›ƒ ๋ฐ˜๋ณต์—๋Š” 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(์ตœ์†Ÿ๊ฐ’, ์ตœ๋Œ“๊ฐ’)
์ตœ์†Ÿ๊ฐ’๊ณผ ์ตœ๋Œ“๊ฐ’ ๋ฒ”์œ„๋‚ด์—์„œ ๊ฐ’์„ ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•œ๋‹ค.


๐Ÿ“Œ swiper

โœ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์›€์ง์ด๊ธฐ

var lastSlide = new Swiper(".sc-event .swiper", {
        spaceBetween: 10,
        freeMode: true,
        slidesPerView: 'auto',
      });

swiper์‹œ freeMode: true๋ฅผ ์ฃผ๋ฉด ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋„˜์–ด๊ฐ


๐Ÿ“Œ ํŽ˜์ด์ง€ ๋งํฌ์ด๋™

โœ aํƒœ๊ทธ href

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๋ฅผ ๊พธ๋ฉฐ์ค€๋‹ค.

  • ์ œ๋ชฉ ์˜† N์ด๋ฏธ์ง€๋Š” vertical-align:top์„ ์ค„ ์ˆ˜์žˆ์ง€๋งŒ margin-top:-2px๋กœ ๋งž์ถฐ์ค„์ˆ˜์žˆ๋‹ค

๐Ÿค” ์™œ vertical-align:middle๋กœ ์•ˆ์ค„๊นŒ??

-> ๊ธ€์”จ๋„ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ ์ž‘์•„์ง€๋‹ˆ๊นŒ

์„œ๋กœ์„œ๋กœ ๊ธฐ์ค€์ด๊ธฐ ๋•Œ๋ฌธ์— top์„ ๊ธฐ์ค€์œผ๋กœ ๋‘๊ณ  ์ด๋ฏธ์ง€๋งŒ ๋‚ด๋ฆฌ๋Š”๊ฒŒ ๋งž์Œ


3.

๋ถ€๋ชจ์— flex๋ฅผ ์ฃผ๊ณ  ์ž์‹์ธ pํƒœ๊ทธ์— with๋ฅผ ์ฃผ์ง€ ์•Š๊ณ  ๋ง์ค„์ž„ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์€ ์˜ค๋ฅ˜!

-> flex:1;์ด๋ผ๊ณ  ์…‹ํŒ…ํ•ด์•ผํ•จ

4.โญโญโญ ๋ฐ”๋ณด๊ฐ™์€ ์‹ค์ˆ˜๊ธˆ์ง€!!!

๋’ค๋กœ๊ฐ€๊ธฐ ์ด๋ฏธ์ง€ ์•ˆ๋‚˜์˜ด

scss์—์„œ ๋ณด๋ฉด ๊ฒฝ๋กœ๋ฅผ ์ž˜๋ชป์ ์–ด๋†จ๋‹ค. ๐Ÿ˜ข

../../๋Š” ์žˆ์„์ˆ˜ ์—†๋Š” ๊ฒฝ๋กœ

์ˆ˜์ •ํ•˜๋ฉด detail.scss์— ์คฌ๋˜ css๋ฅผ ์ง€์›Œ๋„ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค!

profile
๋‹ฌ๋ฆฌ๋Š” ๊ฑฐ๋ถ์ด

0๊ฐœ์˜ ๋Œ“๊ธ€