[30일 챌린지 Day-15] LocalStorage

2022. 8. 11. 10:27·개발/html, css, js
728x90
반응형

1. 코드

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>LocalStorage</title>
    <link rel="stylesheet" href="style.css" />
  </head>
  <style>
    html {
      box-sizing: border-box;
      background: url("https://www.gyeongju.go.kr/upload/content/thumb/20200529/4368708A9CC649CDB1EC5DD0C389804C.jpg") center no-repeat;
      background-size: cover;
      min-height: 100vh;
      display: flex;
      justify-content: center;
      align-items: center;
      text-align: center;
      font-family: Futura, "Trebuchet MS", Arial, sans-serif;
    }

    *,
    *:before,
    *:after {
      box-sizing: inherit;
    }

    svg {
      fill: white;
      background: rgba(0, 0, 0, 0.1);
      padding: 20px;
      border-radius: 50%;
      width: 200px;
      margin-bottom: 50px;
    }

    .wrapper {
      padding: 20px;
      max-width: 350px;
      background: rgba(255, 255, 255, 0.95);
      box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1);
    }

    h2 {
      text-align: center;
      margin: 0;
      font-weight: 200;
    }

    .plates {
      margin: 0;
      padding: 0;
      text-align: left;
      list-style: none;
    }

    .plates li {
      border-bottom: 1px solid rgba(0, 0, 0, 0.2);
      padding: 10px 0;
      font-weight: 100;
      display: flex;
    }

    .plates label {
      flex: 1;
      cursor: pointer;
    }

    .plates input {
      display: none;
    }

    .plates input + label:before {
      content: "⬜️";
      margin-right: 10px;
    }

    .plates input:checked + label:before {
      content: "🌮";
    }

    .add-items {
      margin-top: 20px;
    }

    .add-items input {
      padding: 10px;
      outline: 0;
      border: 1px solid rgba(0, 0, 0, 0.1);
    }
  </style>
  <body>
    <!--
      Fish SVG Cred:
      https://thenounproject.com/search/?q=fish&i=589236
   -->

    <svg
      xmlns="http://www.w3.org/2000/svg"
      xmlns:xlink="http://www.w3.org/1999/xlink"
      version="1.1"
      x="0px"
      y="0px"
      viewBox="0 0 512 512"
      enable-background="new 0 0 512 512"
      xml:space="preserve"
    >
      <g>
        <path
          d="M495.9,425.3H16.1c-5.2,0-10.1,2.9-12.5,7.6c-2.4,4.7-2.1,10.3,0.9,14.6l39,56.4c2.6,3.8,7,6.1,11.6,6.1h401.7   c4.6,0,9-2.3,11.6-6.1l39-56.4c3-4.3,3.3-9.9,0.9-14.6C506,428.2,501.1,425.3,495.9,425.3z M449.4,481.8H62.6L43,453.6H469   L449.4,481.8z"
        />
        <path
          d="M158.3,122c7.8,0,14.1-6.3,14.1-14.1V43.4c0-7.8-6.3-14.1-14.1-14.1c-7.8,0-14.1,6.3-14.1,14.1v64.5   C144.2,115.7,150.5,122,158.3,122z"
        />
        <path
          d="M245.1,94.7c7.8,0,14.1-6.3,14.1-14.1V16.1c0-7.8-6.3-14.1-14.1-14.1C237.3,2,231,8.3,231,16.1v64.5   C231,88.4,237.3,94.7,245.1,94.7z"
        />
        <path
          d="M331.9,122c7.8,0,14.1-6.3,14.1-14.1V43.4c0-7.8-6.3-14.1-14.1-14.1s-14.1,6.3-14.1,14.1v64.5   C317.8,115.7,324.1,122,331.9,122z"
        />
        <path
          d="M9.6,385.2c5.3,2.8,11.8,1.9,16.2-2.2l50.6-47.7c56.7,46.5,126.6,71.9,198.3,71.9c0,0,0,0,0,0   c87.5,0,169.7-36.6,231.4-103.2c5-5.4,5-13.8,0-19.2c-61.8-66.5-144-103.2-231.4-103.2c-72,0-142.2,25.6-199,72.5l-50-47.1   c-4.4-4.1-10.9-5-16.2-2.2c-5.3,2.8-8.3,8.7-7.4,14.6l11.6,75L2.2,370.6C1.3,376.5,4.2,382.4,9.6,385.2z M380.9,230.8   c34.9,14.3,67.2,35.7,95.3,63.6c-10.1,10-20.8,19.2-31.9,27.5c-22.4-3.3-29.6-8.8-30.7-9.7c-4-5.7-11.8-7.7-18.1-4.4   c-6.9,3.6-9.5,12.2-5.9,19.1c1.9,3.5,7.3,10.3,22.4,16c-10.1,5.7-20.5,10.7-31.1,15.1C352.4,320.2,352.4,268.6,380.9,230.8z    M36.3,255.6l29.4,27.7c5.3,5,13.6,5.1,19.1,0.3c53.2-47.6,120.7-73.7,190-73.7c26.9,0,53.2,3.9,78.5,11.3   c-29.3,44.6-29.3,102,0,146.6c-25.3,7.4-51.6,11.3-78.5,11.3c-69,0-136.3-26-189.4-73.2c-2.7-2.4-13.4-6.3-19.1,0.3l-30.1,28.3   l5.7-40C42.2,293,36.3,255.6,36.3,255.6z"
        />
        <circle cx="398.8" cy="273.8" r="14.1" />
      </g>
    </svg>

    <div class="wrapper">
      <h2>LOCAL TAPAS</h2>
      <p></p>
      <ul class="plates">
        <li>Loading Tapas...</li>
      </ul>
      <form class="add-items">
        <input type="text" name="item" placeholder="Item Name" required />
        <input type="submit" value="+ Add Item" />
      </form>
    </div>

    <script>
      const addItems = document.querySelector(".add-items");
      const itemsList = document.querySelector(".plates");
      const items = [];
    </script>
  </body>
</html>

2. 결과

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>LocalStorage</title>
    <style>
      html {
        box-sizing: border-box;
        background: url("https://www.gyeongju.go.kr/upload/content/thumb/20200529/4368708A9CC649CDB1EC5DD0C389804C.jpg") center no-repeat;
        background-size: cover;
        min-height: 100vh;
        display: flex;
        justify-content: center;
        align-items: center;
        text-align: center;
        font-family: Futura, "Trebuchet MS", Arial, sans-serif;
      }

      *,
      *:before,
      *:after {
        box-sizing: inherit;
      }

      svg {
        fill: white;
        background: rgba(0, 0, 0, 0.1);
        padding: 20px;
        border-radius: 50%;
        width: 200px;
        margin-bottom: 50px;
      }

      .wrapper {
        padding: 20px;
        max-width: 350px;
        background: rgba(255, 255, 255, 0.95);
        box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1);
      }

      h2 {
        text-align: center;
        margin: 0;
        font-weight: 200;
      }

      .plates {
        margin: 0;
        padding: 0;
        text-align: left;
        list-style: none;
      }

      .plates li {
        border-bottom: 1px solid rgba(0, 0, 0, 0.2);
        padding: 10px 0;
        font-weight: 100;
        display: flex;
      }

      .plates label {
        flex: 1;
        cursor: pointer;
      }

      .plates input {
        display: none;
      }

      .plates input + label:before {
        content: "⬜️";
        margin-right: 10px;
      }

      .plates input:checked + label:before {
        content: "🌮";
      }

      .add-items {
        margin-top: 20px;
      }

      .add-items input {
        padding: 10px;
        outline: 0;
        border: 1px solid rgba(0, 0, 0, 0.1);
      }
    </style>
  </head>
  <body>
    <!--
      Fish SVG Cred:
      https://thenounproject.com/search/?q=fish&i=589236
   -->

    <svg
      xmlns="http://www.w3.org/2000/svg"
      xmlns:xlink="http://www.w3.org/1999/xlink"
      version="1.1"
      x="0px"
      y="0px"
      viewBox="0 0 512 512"
      enable-background="new 0 0 512 512"
      xml:space="preserve"
    >
      <g>
        <path
          d="M495.9,425.3H16.1c-5.2,0-10.1,2.9-12.5,7.6c-2.4,4.7-2.1,10.3,0.9,14.6l39,56.4c2.6,3.8,7,6.1,11.6,6.1h401.7   c4.6,0,9-2.3,11.6-6.1l39-56.4c3-4.3,3.3-9.9,0.9-14.6C506,428.2,501.1,425.3,495.9,425.3z M449.4,481.8H62.6L43,453.6H469   L449.4,481.8z"
        />
        <path
          d="M158.3,122c7.8,0,14.1-6.3,14.1-14.1V43.4c0-7.8-6.3-14.1-14.1-14.1c-7.8,0-14.1,6.3-14.1,14.1v64.5   C144.2,115.7,150.5,122,158.3,122z"
        />
        <path
          d="M245.1,94.7c7.8,0,14.1-6.3,14.1-14.1V16.1c0-7.8-6.3-14.1-14.1-14.1C237.3,2,231,8.3,231,16.1v64.5   C231,88.4,237.3,94.7,245.1,94.7z"
        />
        <path
          d="M331.9,122c7.8,0,14.1-6.3,14.1-14.1V43.4c0-7.8-6.3-14.1-14.1-14.1s-14.1,6.3-14.1,14.1v64.5   C317.8,115.7,324.1,122,331.9,122z"
        />
        <path
          d="M9.6,385.2c5.3,2.8,11.8,1.9,16.2-2.2l50.6-47.7c56.7,46.5,126.6,71.9,198.3,71.9c0,0,0,0,0,0   c87.5,0,169.7-36.6,231.4-103.2c5-5.4,5-13.8,0-19.2c-61.8-66.5-144-103.2-231.4-103.2c-72,0-142.2,25.6-199,72.5l-50-47.1   c-4.4-4.1-10.9-5-16.2-2.2c-5.3,2.8-8.3,8.7-7.4,14.6l11.6,75L2.2,370.6C1.3,376.5,4.2,382.4,9.6,385.2z M380.9,230.8   c34.9,14.3,67.2,35.7,95.3,63.6c-10.1,10-20.8,19.2-31.9,27.5c-22.4-3.3-29.6-8.8-30.7-9.7c-4-5.7-11.8-7.7-18.1-4.4   c-6.9,3.6-9.5,12.2-5.9,19.1c1.9,3.5,7.3,10.3,22.4,16c-10.1,5.7-20.5,10.7-31.1,15.1C352.4,320.2,352.4,268.6,380.9,230.8z    M36.3,255.6l29.4,27.7c5.3,5,13.6,5.1,19.1,0.3c53.2-47.6,120.7-73.7,190-73.7c26.9,0,53.2,3.9,78.5,11.3   c-29.3,44.6-29.3,102,0,146.6c-25.3,7.4-51.6,11.3-78.5,11.3c-69,0-136.3-26-189.4-73.2c-2.7-2.4-13.4-6.3-19.1,0.3l-30.1,28.3   l5.7-40C42.2,293,36.3,255.6,36.3,255.6z"
        />
        <circle cx="398.8" cy="273.8" r="14.1" />
      </g>
    </svg>

    <div class="wrapper">
      <h2>LOCAL TAPAS</h2>
      <p></p>
      <ul class="plates">
        <li>Loading Tapas...</li>
      </ul>
      <form class="add-items">
        <input type="text" name="item" placeholder="Item Name" required />
        <input type="submit" value="+ Add Item" />
      </form>
    </div>

    <script>
      const addItems = document.querySelector(".add-items");
      const itemsList = document.querySelector(".plates");
      const items = [];
      let idNum;
      window.onload = function () {
        idNum = localStorage.getItem("idNum");
        if (idNum) {
          itemsList.innerHTML = localStorage.getItem("data");
          items.push(localStorage.getItem("data"));
        } else {
          idNum = 0;
        }
      };
      addItems.onsubmit = function () {
        let item = this.item.value;
        items.push(`
        <li>
          <input type = "checkbox" id = "${idNum}">
          <label for= "${idNum}">${item}</label>
        </li>
        `);
        idNum++;
        localStorage.setItem("idNum", idNum);
        localStorage.setItem("data", items.join(""));
        itemsList.innerHTML = localStorage.getItem("data");
        this.item.value = "";
        return false;
      };
    </script>
  </body>
</html>

3. 리뷰

 

먼저 idNum를 선언해주고 이를 id값으로 설정해주면서 인덱스의 역할을 하게끔 1씩 더해줬다.

그리고 만든 li태그들을 join으로 문자열형식으로 data라는 이름으로 localStorage에 담아줬다.

그리고 그값을 그대로 innerHTML로 받아온다.

 

윈도우가 로드할때 idNum를 통해 로컬스토리지가 비어있는지 확인한후 

비어있다면 idNum에 0을 대입하고

데이터가 들어있다면 그 데이터를 불러와서 innerHTML로 받아온다.

 

728x90
반응형

'개발 > html, css, js' 카테고리의 다른 글

[30일 챌린지 Day-17] 관사 제외하고 정렬하기  (0) 2022.08.11
[30일 챌린지 Day-16] Mouse Move Shadow  (0) 2022.08.11
[30일 챌린지 Day-13] scroll event  (0) 2022.08.09
[30일 챌린지 Day-12] hidden key  (2) 2022.08.09
[30일 챌린지 Day-10] shift 클릭  (0) 2022.08.09
'개발/html, css, js' 카테고리의 다른 글
  • [30일 챌린지 Day-17] 관사 제외하고 정렬하기
  • [30일 챌린지 Day-16] Mouse Move Shadow
  • [30일 챌린지 Day-13] scroll event
  • [30일 챌린지 Day-12] hidden key
TeTedo.
TeTedo.
  • TeTedo.
    TeTedo 개발 일기
    TeTedo.
  • 전체
    오늘
    어제
    • 분류 전체보기 (319)
      • 개발 (274)
        • Article (4)
        • 정리 (21)
        • Spring Boot (17)
        • JPA (2)
        • JAVA (6)
        • Database (4)
        • 자료구조 (11)
        • 알고리즘 (32)
        • React (20)
        • Docker (10)
        • node.js (18)
        • Devops (11)
        • Linux (4)
        • TypeScript (3)
        • Go (10)
        • HyperLedger (4)
        • BlockChain (43)
        • html, css, js (48)
        • CS (3)
        • AWS (3)
      • 모아두고 나중에 쓰기 (3)
      • 팀프로젝트 (18)
        • SNS(키보드워리어) (9)
        • close_sea (9)
      • 개인프로젝트 (1)
        • Around Flavor (1)
        • CHAM (13)
        • ethFruitShop (5)
      • 독서 (0)
        • 스프링부트와 AWS로 혼자 구현하는 웹 서비스 (0)
  • 블로그 메뉴

    • 홈
    • 개발일기
    • CS
    • 실습
    • 코딩테스트
    • 웹
    • Go
    • node.js
    • 팀플
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    js
    도커
    블록체인
    ERC721
    하이퍼레저
    명령어
    html
    30일챌린지
    node.js
    컨테이너
    nodejs
    go언어
    erc20
    node
    30일 챌린지
    프로그래머스
    React
    mysql
    CSS
    go
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
TeTedo.
[30일 챌린지 Day-15] LocalStorage
상단으로

티스토리툴바