중간 결과물

메인 화면
플레이리스트
노래 가사 화면

 

 

 

구현한 것

  • 전체 페이지 레이아웃 구성
  • 간단한 CSS 작업
  • iframe을 이용한 유튜브 컨텐츠 표시

1. 메인 페이지 (main.html)

<!DOCTYPE html>
<html lang="ko">

<body>
  <!-- LOGIN 창 구현을 위한 공간입니다. 일단은 텍스트로 공간을 표현해 놓았습니다 -->
	<p style="text-align:right;">LOGIN</p>

  <!-- 검색창 구현을 위한 공간입니다 -->
  <div class='search_box' style="text-align:center;">
    <input type="text" maxlength="225" tabindex="1" />
    <button type="submit" tabindex="2">검색</button>
  </div>

  <!-- USER-A 플레이리스트를 위한 공간입니다. hr 태그로 구분선을 구현하였습니다 -->
  <hr width=90%, color="black", size=1px></hr>
	<header>
    <div>> USER-A 님의 플레이리스트</div>
    <img>
	</header>

  <!-- USER-B 플레이리스트를 위한 공간입니다 -->
  <hr width=90%, color="black", size=1px></hr>
  <header>
    <div>> USER-B 님의 플레이리스트</div>
    <img>
  </header>

  <hr width=90%, color="black", size=1px></hr>

</body>
</html>

 

 

2. 플레이리스트 페이지

(메인에서 각 플레이리스트 링크를 클릭하면 이동)

<!DOCTYPE html>
<html lang="ko">

<!-- div의 좌우배치를 위해 style 태그를 선언하였습니다 -->
<!-- left-box에 float 속성이 들어가 있으므로
right-box에 overflow 속성을 넣어주면 공간이 분리되는 것 같습니다. 곡 페이지 코드에도 해당 속성을 추가해 두겠습니다. -->
<style>
.left-box {
  float: left;
}
.right-box {
  overflow: auto;
}
.center-box {
  margin:0 auto;
}
</style>

<body>
  <!-- 임시적으로 텍스트로 표현하였습니다 -->
  <h3 style="text-align:left;"> 플레이리스트 </h3>
  <!-- 메인 화면으로 돌아가는 버튼과 곡 추가 버튼의 배치가 애매해 이번 주차에는 일단 그대로 두겠습니다. -->

  <!-- 왼쪽의 플리와 관련된 공간입니다 -->
  <div class="left-box" margin=3px>
    <img src="image.png" width="200" height="200"></img>
    <p style="text-align:left;">플레이리스트 이름</p>
    <p>노래 nn개</p>
    <p>사용자 아이디</p>
    <p style="text-align:right">수정  삭제</p>
    <!-- 추후 수정과 삭제는 a태그로 교체합니다 -->
    <hr width=90%, color="black" size=1px class="left-box"></hr><br>
    <p style="text-align:left;">플리 설명</p>
  </div>

  <!-- 오른쪽의 플레이리스트 구역입니다. 플레이리스트별 테이블을 만들면 반복문을 통해 테이블 안의 곡명들이 일제히 표시되도록 합니다. -->
  <div class="right-box" style="border:1px solid; padding:10px; margin:3px;">
    <p><img src="play.png"></img>
    example - song1</p>
    <hr width=90%, color="black" size=1px class="left-box"></hr><br>
    <p><img src="play.png"></img>
    example - song2</p>
    <hr width=90%, color="black" size=1px class="left-box"></hr><br>
    <p><img src="play.png"></img>
    example - song3</p>
    <hr width=90%, color="black" size=1px class="left-box"></hr><br>
    <p><img src="play.png"></img>
    example - song4</p>
    <hr width=90%, color="black" size=1px class="left-box"></hr><br>
  </div>
</body>
</html>

 

 

3. 노래 가사 페이지

(플레이리스트에서 노래 링크를 클릭하면 이동)

<!DOCTYPE html>
<html lang="ko">

<!-- div의 좌우배치를 위해 style 태그를 선언하였습니다 -->
<style>
.left-box {
  float: left;
}
.right-box {
  overflow: auto;
}
.center-box {
  margin:0 auto;
}
</style>

<body>
  <!-- 임시적으로 텍스트로 표현하였습니다 -->
  <h3 style="text-align:left;"> 플레이리스트 </h3>
  <!-- 왼쪽의 노래와 관련된 공간입니다 -->
  <div class="left-box" margin=3px>
    <iframe src="https://www.youtube.com/watch?v=sWMk8dwljFU" width="300" height="300"></iframe>
    <p style="text-align:left;">노래 제목</p>
    <hr width=90%, color="black" size=1px class="left-gox"></hr>
    <p style="text-align:left;">노래 설명</p>
  </div>
  <!-- 오른쪽의 가사와 관련된 공간입니다. 임시적으로 shaek it off의 가사를 넣어놓았으며 iframe과 공간 구분을 추가로 구현해야 합니다 -->
  <div style="border:1px solid; padding:10px; margin:3px;">
    I stay out too late, got nothing in my brain
    That's what people say, that's what people say
    I go on too many dates, but I can't make them stay
    At least that's what people say, that's what people say
    But I keep cruising
    Can't stop, won't stop moving
    It's like I got this music in my mind
    Saying it's gonna be alright
    I never miss a beat, I'm lightning on my feet
    And that's what they don't see, that's what they don't see
    Players gonna play, play, play, play, play
    And the haters gonna hate, hate, hate, hate, hate (haters gonna hate)
    Baby, I'm just gonna shake, shake, shake, shake, shake
    I shake it off, I shake it off
    Heartbreakers gonna break
    Fakers gonna fake
    I'm just gonna shake
    I shake it off, I shake it off
    I shake it off, I shake it off
    I, I, I shake it off, I shake it off
    I, I, I shake it off, shake it off
    I, I, I shake it off, I shake it off
    I, I, I shake it off, I shake it off
    I, I, I shake it off, I shake it off
    I, I, I, shake it off, I shake it off
    I, I, I, shake it off, I shake it off
  </div>
</body>
</html>

 

 

 

보완/추가할 점

  • CSS 속성 추가 (심미성 보완)
  • 로그인 페이지 추가구현
  • 메인페이지에서 로그인 시 달라지는 특정 부분 미리 구현
  • 플리 페이지 우상단 곡 추가 버튼 구현
  • 플리/가사 페이지 좌상단 뒤로가기 버튼 구현

결과물

시작 화면

 

 

탭1 (투두리스트)

 

 

탭2 (성과기록)

 

 

탭3 (작업용bgm)

 

 

 

구현한 것

  • 시작화면 - (>) 버튼 추가하고 클릭하면 tab1.html로 넘어갈 수 있게 a태그 사용
  • 탭1 - input 박스에 미리보기 텍스트 삽입 (placeholder 속성 사용)
  • 탭1 - Lv 선택을 콤보박스(셀렉트박스) 형태로 변경
  • 탭1 - (+) 버튼 추가
  • js 문서 추가

 

 

코드

 

0. 시작화면 (html 코드)

<!DOCTYPE html>
<html>
  <head>
    <script src="check.js">
    </script>
    <title></title>
    <meta charset="utf-8">

    <style>
    </style>

  </head>

  <body>
    <div class="div1">
      <h1 class="start">대체 이걸 언제 다 하죠?</h1>
      <p class="start">과제1은 다음 주까지, 과제2는 이틀 내로, 과제3은 오늘 밤까지... 공부할 것도 있고 집안일도 쌓였는데!<br>
      정신없고 막막한 마음 이해해요. 하지만 못 할 것도 없죠. 우선은 적는 것부터 시작해 볼까요?</p>
      <p class="start">할일과 중요도, 마감 기한을 <strong>리스트</strong>로 적어놓으면 무엇을 먼저 처리해야 할지 알 수 있어요. 시간 배분도 쉬워지죠.<br>
      적고, 해내고, 체크하기만 하세요! 몇 개를 해냈는지 세어서 알려드릴게요.<br>
      게임에서 퀘스트를 하나씩 해결해 나가듯, 이 많은 걸 내가 다 해냈다는 보람에 취해 보세요.</p>
    </div>

    <div class="div2">
      <h2 class="start">LOGIN</h2>
      <p class="start">아이디를 입력해 주세요.</p>
      <input id = "username" type="text" class="text_input" placeholder="ID 입력" onchange = 'getName()'><br>
      <a href="tab1.html">
        <input class="go" type="button" name="redirect" value="">
      </a>

    </div>

  </body>
</html>

 

0-1. 시작화면 (CSS 코드)

      .start {
        text-align: center;
        color: white;
      }
      .div1{
        padding: 100px;
        margin-top: 50px;
      }
      .div2{
        padding: 100px;
        margin-top: 300px;
        margin-bottom: 130px;
        text-align: center;
      }

      body {
        background-image: url("start_bg2.jpg");
        background-repeat: no-repeat;
        background-position: center center;
        background-attachment: fixed;
        /*margin: 50px;*/

      }
      h1 {
        padding: 50px;
        font-size: 37px;
      }
      h2 {
        font-size: 36px;
      }
      p {
        font-size: 14px;
      }
      input{
        align-items: center;
        text-align: center;
        margin: 20px;
      }
      .text_input {
        margin-top: 50px;
      }
      div2{
        position: relative;
      }
      input.go{
        background: url(go.png) no-repeat;
        float: left;
        border: none;
        width: 64px;
        height: 64px;
        cursor: pointer;
        margin: 20px;
        margin-left: 30px;
        margin-right: 30px;
        position: absolute;
        top: 180%;
        left: 48.5%;
        transform: translate(-50%, -50%);
      }

 

1. 탭1 html 코드

<!DOCTYPE html>
<html>
  <head>
    <meta>
    <title></title>
    <style>
    </style>
    <script src = "check.js"> </script>
  </head>
  <body>

    <div class="title">
      <h1>오늘의 퀘스트</h1>
      오래 볼수록 하기 싫습니다. 자세히 보면 더 하기 싫습니다.<br>흐린 눈으로 해치우고 나면 그제서야 아름다워집니다.
    </div>

    <div class="menu">
      <span class="tab" id="current_tab"> QUEST </span>
      <a href="tab2.html" class="tab"> MYPAGE </a>
      <a href="tab3.html" class="tab"> BGM </a>
    </div>

    <form id="jobForm" action="check.js" method="post">
      <div class="input">
        <div class="attribute" id="level">
          <div class="lv_line">Lv.</div>

          <div class="lv_line">
            <form>
              <select name="Lv" onchange = "handleOnChange(this)">
                <option value="none" selected>=중요도 선택=</option>
                <option value="1">Lv.1</option>
                <option value="2">Lv.2</option>
                <option value="3">Lv.3</option>
              </select>
            </form>
          </div>

          <div class="lv_line">
            <input required id = "work_category" type="text" name="category" placeholder="할일 종류">
          </div>

        </div>
        <div class="attribute" id="work">
          <input required id="work_name" type="text" name="name" placeholder="할일 내용">
        </div>

        <div class="attribute" id="due_to">
          <div class="due_line">Due to</div>
          <div class="due_line">
            <input id = "due_input" type="text" name="due" placeholder="마감시한">
          </div>
        </div>

        <input class="plus" type="button" name="add" value="" onclick = "document.getElementById('jobForm').submit();">
      </div>
    </form>


    <div id="list">
      <div class="task">
        <input type="checkbox">
        <span class="taskSub" id="taskLv">Lv.1</span>
        <span class="taskSub" id="taskCategory">집안일</span>
        <span class="taskMain">세탁기 돌리기</span>
        <span class="taskSub" id="taskDue">오늘 오후</span>
      </div>
      <div class="task">
        <input type="checkbox">
        <span class="taskSub" id="taskLv">Lv.2</span>
        <span class="taskSub" id="taskCategory">과제</span>
        <span class="taskMain">과제 완성</span>
        <span class="taskSub" id="taskDue">토요일</span>
      </div>

    </div>

  </body>
</html>

 

1-1. 탭1 CSS 코드

body{
        text-align: center;
        margin: 0;
      }

      .title{
        margin: 0;
        padding: 150px;
        background-image: url("tab1_back.jpg");
        background-size: cover;
        color: white;
      }

      .menu{
        margin: 30px;
        font-size: 20px;
      }
      .tab{
        color: grey;
        margin: 70px;
      }
      #current_tab{
        font-weight: bold;
        color: purple;
      }
      a{
        text-decoration: none;
      }

      .input {
        margin: 50px;
        padding-bottom: 150px;
        text-align: center;
        font-size: 24px;
        border-bottom: dotted grey 3px;
        position: relative;
      }
      .lv{
        padding: 10px;
        color: grey;
        style: bold;
      }
      .attribute{
        display: inline-block;
        padding: 50px;
      }

      input{
        text-align: center;
        width: 100px;
        height: 20px;
        color: grey;
      }
      #work_name{
        width: 500px;
        height: 50px;
        border-top: none;
        border-left: none;
        border-right: none;
        border-bottom: 3px solid black;
        font-size: 40px;
      }

      input.plus{
        background: url(add.png) no-repeat;
        background-color: white;
        float: left;
        border: none;
        width: 64px;
        height: 64px;
        cursor: pointer;
        margin: 20px;
        margin-left: 30px;
        margin-right: 30px;
        position: absolute;
        top: 70%;
        left: 48%;
        transform: translate(-50%, -50%);
      }

      .list{
        text-align: left;
        padding: 100px;
      }
      .task{
        text-align: left;
        padding: 60px;
        padding-left: 150px;
        padding-right: 150px;
        border-bottom-style: dotted;
        border-bottom-width: thin;
        border-bottom-color: grey;
      }

      .taskMain{
        padding-left: 20px;
        padding-right: 20px;
        font-size: 24px;
        color: black;
      }

      .taskSub{
        color: grey;
      }

 

2. 탭2 html 코드

<!DOCTYPE html>
<html>
  <head>
    <meta>
    <title></title>
    <style>
    </style>
  </head>
  <body>

    <div class="title">
      <h1>내가해냄</h1>
      성과에서 힘을 얻읍시다.<br>이것도 해냈는데 그거라곤 못 할까요?
    </div>

    <div class="menu">
      <a href="tab1.html" class="tab" > QUEST </a>
      <span class="tab" id="current_tab"> MYPAGE </span>
      <a href="tab3.html" class="tab"> BGM </a>
    </div>

    <div class="status">
      <img src="king.png" alt="">
      <h1>ID : (로그인 아이디)</h1>
      <h3>현재 레벨 : Lv. -</h3>
      <progress value="0" max="100">0%</progress>
    </div>

    <div class="count">
      <h2>당신이 해치움</h2>
      <div class="LvCount">
        <span class="LvC" id="Lv3"><strong>Lv.3</strong><br>-건</span>
        <span class="LvC" id="Lv2"><strong>Lv.2</strong><br>-건</span>
        <span class="LvC" id="Lv1"><strong>Lv.1</strong><br>-건</span>
      </div>
      <div class="Total">
        <span class="LvC"><strong>지금까지 해치웠음</strong><br>-건</span>
        <span class="LvC"><strong>곧 해치울 예정임</strong><br>-건</span>
      </div>
    </div>
  </body>
</html>

 

2-1. 탭2 CSS 코드

body{
        text-align: center;
        margin: 0;
      }

      .title{
        margin: 0;
        padding: 150px;
        background-image: url("tab2_back.jpg");
        background-size: cover;
        color: white;
      }

      .menu{
        margin: 30px;
        font-size: 20px;
      }
      .tab{
        color: grey;
        margin: 70px;
      }
      #current_tab{
        font-weight: bold;
        color: blue;
      }
      a{
        text-decoration: none;
      }
      .status {
        margin-left: 415px;
        margin-top: 150px;
        text-align: left;
        margin-right: 400px;
        margin-bottom: 100px;
      }
      .status img{
        float: left;
        width: 200px;
        margin-right: 150px;
      }
      .status h1{
        margin: 50px;
        padding-top: 20px;
      }

      .LvC{
        margin-left: 70px;
        margin-right: 70px;
        margin-top: 30px;
        margin-bottom: 30px;
        display: inline-block;
      }
      #Lv3{
        color: #673ab7;
      }
      #Lv2{
        color: blue;
      }
      #Lv1{
        color: green;
      }

      .count{
        margin: 200px;
        margin-top: 150px;
        padding-top: 100px;
        border-top: dotted 3px lightgrey;
      }
      .count h2{
        margin-bottom: 50px;
      }

 

3. 탭3 html 코드

<!DOCTYPE html>
<html>
  <head>
    <meta>
    <title>BGM</title>
    <style>
    </style>
  </head>

  <body>

    <div class="title">
      <h1>노동요</h1>
      이어폰을 지참하세요.<br>작업부터 휴식까지, 편안한 음악과 함께하세요.
    </div>

    <div class="menu">
      <a href="tab1.html" class="tab"> QUEST </a>
      <a href="tab2.html" class="tab"> MYPAGE </a>
      <span class="tab" id="current_tab"> BGM </span>
    </div>

    <div class="playlist">
      <div class="music">
        <img class="player" src="player.png">
        <a href="https://youtu.be/PfqRyzUuHnM" class="music_name" target="_blank">공부할 때 듣는 호그와트 ASMR</a>
        <span class="playtime">1:01:43</span>
      </div>

      <div class="music">
        <img class="player" src="player.png">
        <a href="https://youtu.be/CNXGekoqRRU" class="music_name" target="_blank">25/5 타임터너 뽀모도로</a>
        <span class="playtime">3:00:45</span>
      </div>

      <div class="music">
        <img class="player" src="player.png">
        <a href="https://youtu.be/cbuZfY2S2UQ" class="music_name" target="_blank">코딩할 때 듣는 차분한 Lo-fi</a>
        <span class="playtime">2:50:27</span>
      </div>

      <div class="music">
        <img class="player" src="player.png">
        <a href="https://youtu.be/QUXKib-jfEM" class="music_name" target="_blank">급한 마감 할 때 - 엘모의 이마트송</a>
        <span class="playtime">5:00:10</span>
      </div>

      <div class="music">
        <img class="player" src="player.png">
        <a href="https://youtu.be/dAw4pUWd6Yg" class="music_name" target="_blank">휴식이 필요할 때 - 불멍 ASMR</a>
        <span class="playtime">1:02:09</span>
      </div>

    </div>


  </body>
</html>

 

3-1. 탭3 CSS 코드

 body{
        text-align: center;
        margin: 0;
      }

      .title{
        margin: 0;
        padding: 150px;
        background-image: url("tab3_back.jpg");
        background-size: cover;
        color: white;
      }

      .menu{
        margin: 30px;
        font-size: 20px;
      }
      .tab{
        color: grey;
        margin: 70px;
      }
      #current_tab{
        font-weight: bold;
        color: blue;
      }


      .playlist{
        text-align: left;
        padding: 100px;
      }
      .music{
        padding: 60px;
        padding-left: 150px;
        padding-right: 150px;
        border-bottom-style: dotted;
        border-bottom-width: thin;
        border-bottom-color: grey;
      }
      .player{
        width: 20px;
      }
      .music_name{
        padding-left: 20px;
        padding-right: 20px;
        font-size: 24px;
        color: black;
      }
      a{
        text-decoration: none;
      }
      .playtime{
        color: grey;
      }

 

4. JS 코드

function getName(){
  var name = document.getElementById('username');
  return name;
}

var userName = getName();


function Job(name, level, due, category){
  this.name = name;
  this.due = due;
  this.category = category;
  function levelSet(lv){
    this.level = lv;
  }
}


var workCategory = document.getElementById('work_category');
var workName = document.getElementById('work_name');
var dueInput = document.getElementById('due_input');

var newJob = new Job(workName, null, dueInput, workCategory);

function handleOnChange(e){
  var value = e.value;
  newJob.level = value;
}

function makeJob(){
    /*
    newJob.name = workName;
    newJob.due = dueInput;
    newJob.category = workCategory;
    */
    console.log(newJob);
}

function makeTask(){
  const tBody = document.createElement('div')

  const chBox = document.createElement('input');
  chBox.setAttribute('type','checkbox');

  const tName = document.createElement('span');
  tBody.appendChild(tName);
  tName.setAttribute('class', 'taskMain');
  const nameText = document.createTextNode('작업 이름');
  tName.appendChild(nameText);

  const tLevel = document.createElement('span');
  tBody.appendChild(tLevel);
  tLevel.setAttribute('class', 'taskSub');
  const levelText = document.createTextNode('레벨');
  tLevel.appendChild(levelText);


  const tCategory = document.createElement('span');
  tBody.appendChild(tCategory);
  tCategory.setAttribute('class', 'taskSub');
  const cateText = document.createTextNode('카테고리');
  tCategory.appendChild(cateText);

  const tDue = document.createElement('span');
  tBody.appendChild(tDue);
  tDue.setAttribute('class', 'taskSub');
  const dueText = document.createTextNode('기한');
  tDue.appendChild(dueText);

  document.getElementById('list').appendChild(tBody);
}

makeTask();

구현 시도했던 것 (사용해본 기능 위주)

  • 시작화면에서 아이디를 입력하면 내부적으로 변수에 저장(탭2 화면에서 표시될 것을 의도)
  • 투두리스트를 객체로 빼서 리스트 항목 생성 => 객체 생성으로 이어지게끔 시도
  • 객체에 필요한 요소들(이름, 기한, 레벨, 종류 등)을 객체의 프로퍼티로 구현 시도
  • 셀렉트박스를 함수에 연결해 객체의 프로퍼티 값 초기화 시도 (성공)
  • html 요소를 만드는 createElement(), 요소 간을 부모자식 관계로 연결하는 appendChild, 만든 요소의 속성을 바꾸는 setAttribute 등의 함수를 사용해 새 체크리스트 항목을 만드는 makeTask() 함수 작성

구글링 등을 통해 여러 함수를 찾아보고 당초 기획했던 것의 일부나마 구현을 시도해보았으나

대부분 check.js:71 Uncaught TypeError: Cannot read properties of null 오류로 구현 불가.

 

 

 

결론

기획이 과했던 것인지, 처음 기획했던 것의 반도 구현하지 못했다고 생각한다. 많이 아쉬움이 남는다.

하지만 욕심부린 것을 후회하지는 않는다. 단순히 리다이렉트나 표시 기능만 사용해서 페이지를 만드는 것보다는

다양한 기능을 검색하고 배우고 적용해볼 수 있어서 좋은 시도였다고 생각한다. 많이 배웠다는 생각이 들어 만족스럽다.

 

 

 

 

 

중간결과물

(기획서에서의 탭2 화면)

  • 탭 부분 완성
  • (어느 탭에서든 현재 탭 이외의 탭 버튼을 누르면 해당 탭으로 리다이렉트)

 

구현한 것

 

: 탭2

  • 텍스트 입력, 전체 레이아웃 구성
  • 배경 이미지 삽입
  • 레벨 경험치 바 구현 (progress 태그 사용)
  • float 속성을 이용한 사진-텍스트 레이아웃 분리

 


코드

  <body>

    <div class="title">
      <h1>내가해냄</h1>
      성과에서 힘을 얻읍시다.<br>이것도 해냈는데 그거라곤 못 할까요?
    </div>

    <div class="menu">
      <a href="tab1.html" class="tab" > QUEST </a>
      <span class="tab" id="current_tab"> MYPAGE </span>
      <a href="tab3.html" class="tab"> BGM </a>
    </div>

배경 이미지 ~ 탭 메뉴 부분 (HTML)

  • 탭1과 탭3의 html 코드도 수정&추가
  • (a태그로 탭2의 링크 리다이렉트)

 

    <div class="menu">
      <span class="tab" id="current_tab"> QUEST </span>
      <a href="tab2.html" class="tab"> MYPAGE </a>
      <a href="tab3.html" class="tab"> BGM </a>
    </div>
  • 탭1의 탭메뉴 코드

 

    <div class="menu">
      <a href="tab1.html" class="tab"> QUEST </a>
      <a href="tab2.html" class="tab"> MYPAGE </a>
      <span class="tab" id="current_tab"> BGM </span>
    </div>
  • 탭3의 탭메뉴 코드

 

 

    <div class="status">
      <img src="king.png" alt="">
      <h1>ID : (로그인 아이디)</h1>
      <h3>현재 레벨 : Lv. -</h3>
      <progress value="0" max="100">0%</progress>
    </div>

    <div class="count">
      <h2>당신이 해치움</h2>
      <div class="LvCount">
        <span class="LvC" id="Lv3"><strong>Lv.3</strong><br>-건</span>
        <span class="LvC" id="Lv2"><strong>Lv.2</strong><br>-건</span>
        <span class="LvC" id="Lv1"><strong>Lv.1</strong><br>-건</span>
      </div>
      <div class="Total">
        <span class="LvC"><strong>지금까지 해치웠음</strong><br>-건</span>
        <span class="LvC"><strong>곧 해치울 예정임</strong><br>-건</span>
      </div>
    </div>
  </body>

프로필 이미지/아이디/레벨/경험치바 표시 부분

~ 완료한 일과 카운트 부분 (HTML)

  • progress 기능 사용, 추후 JS로 value에 표현식 삽입 예정.
  • status h3과 LvC 클래스들에 입력되어 있는 -(대시)에 추후 JS 표현식 삽입 예정

 

 

    <style>
      body{
        text-align: center;
        margin: 0;
      }

      .title{
        margin: 0;
        padding: 150px;
        background-image: url("tab2_back.jpg");
        background-size: cover;
        color: white;
      }

      .menu{
        margin: 30px;
        font-size: 20px;
      }
      .tab{
        color: grey;
        margin: 70px;
      }
      #current_tab{
        font-weight: bold;
        color: blue;
      }
      a{
        text-decoration: none;
      }

배경 이미지 ~ 탭 메뉴 부분 (CSS)

  • 이전 주차에 작성해 두었던 템플릿 활용.

 

.status {
        margin-left: 415px;
        margin-top: 150px;
        text-align: left;
        margin-right: 400px;
        margin-bottom: 100px;
      }
      .status img{
        float: left;
        width: 200px;
        margin-right: 150px;
      }
      .status h1{
        margin: 50px;
        padding-top: 20px;
      }

      .LvC{
        margin-left: 70px;
        margin-right: 70px;
        margin-top: 30px;
        margin-bottom: 30px;
        display: inline-block;
      }
      #Lv3{
        color: #673ab7;
      }
      #Lv2{
        color: blue;
      }
      #Lv1{
        color: green;
      }

      .count{
        margin: 200px;
        margin-top: 150px;
        padding-top: 100px;
        border-top: dotted 3px lightgrey;
      }
      .count h2{
        margin-bottom: 50px;
      }

프로필 이미지/아이디/레벨/경험치바 표시 부분

~ 완료한 일과 카운트 부분 (CSS)

  • border을 이용한 구분선
  • img float 속성을 이용해 이미지-텍스트 레이아웃 분할
  • 색상 표현은 추후 색상코드를 이용해 수정할 예정

 

 

보완/추가할 점

  • 이번 페이지는 특히나 JS가 추가되어야 할 부분이 많다. 다음 주차 구현에서 신경쓸 것.
  • 탭1에서 체크리스트 추가/완료 기능 구현 -> 탭2에서 카운트하고 변수를 통해 경험치/레벨 구현 예정
  • 시작 화면에서 스트링으로 아이디 입력받는 기능 구현 -> 탭2에서 입력받은 아이디 표시 기능 구현 예정

 

중간결과물

(기획서에서의 탭3 화면)

  • 각각의 노래 제목을 누르면 노래에 해당되는 유튜브 영상으로 리다이렉트(새 탭)
  • 'QUEST' 를 누르면 탭 1 화면으로 리다이렉트 (MYPAGE는 페이지가 미구현 상태이므로 보류)

 

(탭1 화면 - 일부 구현)

  • 탭 3에서와 마찬가지로, BGM을 누르면 탭 3으로 리다이렉트
  • 할일 종류, 할일 내용, 마감 시한 란에 각각 텍스트 입력 가능

 

 

 

구현한 것

 

: 탭3 (5주차)

  • 텍스트 입력, 전체 레이아웃 구성
  • 음표 아이콘 삽입
  • <a> 태그를 통한 링크 기능
  • 배경 이미지 삽입

 

: 탭1 (6주차)

  • 배경 이미지 삽입
  • 입력 란의 레이아웃 구성, CSS 활용해 디자인적 세부요소 가미
  • 링크 및 리다이렉트
  • JS 코드를 삽입 시를 대비하여 입력 란과 레벨 숫자에 value 부여

 

 

 

코드

  <body>

    <div class="title">
      <h1>노동요</h1>
      이어폰을 지참하세요.<br>작업부터 휴식까지, 편안한 음악과 함께하세요.
    </div>

    <div class="menu">
      <a href="tab1.html" class="tab"> QUEST </a>
      <span class="tab"> MYPAGE </span>
      <span class="tab" id="current_tab"> BGM </span>
    </div>

탭3 - 배경이미지(제목), 탭 표시 부분 (html)

 

<div class="playlist">
      <div class="music">
        <img class="player" src="player.png">
        <a href="https://youtu.be/PfqRyzUuHnM" class="music_name" target="_blank">공부할 때 듣는 호그와트 ASMR</a>
        <span class="playtime">1:01:43</span>
      </div>

      <div class="music">
        <img class="player" src="player.png">
        <a href="https://youtu.be/CNXGekoqRRU" class="music_name" target="_blank">25/5 타임터너 뽀모도로</a>
        <span class="playtime">3:00:45</span>
      </div>

      <div class="music">
        <img class="player" src="player.png">
        <a href="https://youtu.be/cbuZfY2S2UQ" class="music_name" target="_blank">코딩할 때 듣는 차분한 Lo-fi</a>
        <span class="playtime">2:50:27</span>
      </div>

      <div class="music">
        <img class="player" src="player.png">
        <a href="https://youtu.be/QUXKib-jfEM" class="music_name" target="_blank">급한 마감 할 때 - 엘모의 이마트송</a>
        <span class="playtime">5:00:10</span>
      </div>

      <div class="music">
        <img class="player" src="player.png">
        <a href="https://youtu.be/dAw4pUWd6Yg" class="music_name" target="_blank">휴식이 필요할 때 - 불멍 ASMR</a>
        <span class="playtime">1:02:09</span>
      </div>

    </div>

  </body>

탭3 - 내용(배경음악) 하이퍼링크 부분 (html)

 

  <style>
      body{
        text-align: center;
        margin: 0;
      }

      .title{
        margin: 0;
        padding: 150px;
        background-image: url("tab3_back.jpg");
        background-size: cover;
        color: white;
      }

      .menu{
        margin: 30px;
        font-size: 20px;
      }
      .tab{
        color: grey;
        margin: 70px;
      }
      #current_tab{
        font-weight: bold;
        color: blue;
      }

탭3 - 제목과 메뉴 부분 (CSS)

  • 배경이 꽉 차게 들어가야 했기에 body의 margin은 0으로.
  • margin이 필요한 부분이 있으면 각각의 부분에서 별도 지정
  • 배경 이미지가 배경에 꽉 차게 들어가게 하기 위해서 background-size: cover 사용
  • 탭 표시는 기본이 회색에 하이퍼링크 포함, 현재 탭만 색이 있는 일반 텍스트로

 

	.playlist{
        text-align: left;
        padding: 100px;
      }
      .music{
        padding: 60px;
        padding-left: 150px;
        padding-right: 150px;
        border-bottom-style: dotted;
        border-bottom-width: thin;
        border-bottom-color: grey;
      }
      .player{
        width: 20px;
      }
      .music_name{
        padding-left: 20px;
        padding-right: 20px;
        font-size: 24px;
        color: black;
      }
      a{
        text-decoration: none;
      }
      .playtime{
        color: grey;
      }

    </style>

탭3 - 본문 하이퍼링크 부분(CSS)

  • 각각의 부분에 클래스를 부여하여 관리 (전체는 playlist, 아이콘+노래제목+재생시간 표시는 한 묶음으로 하여 music, 아이콘은 player, 이름은 music_name, 재생시간은 playtime)
  • 하이퍼링크에 기본으로 들어가는 밑줄을 없애기 위해 text-decoration을 none으로 지정
  • border-bottom에 dotted 스타일의 경계선을 넣어 음악 개체끼리 구분

 

	<div class="title">
      <h1>오늘의 퀘스트</h1>
      오래 볼수록 하기 싫습니다. 자세히 보면 더 하기 싫습니다.<br>
      흐린 눈으로 해치우고 나면 그제서야 아름다워집니다.
    </div>

    <div class="menu">
      <span class="tab" id="current_tab"> QUEST </span>
      <span class="tab"> MYPAGE </span>
      <a href="tab3.html" class="tab"> BGM </a>
    </div>

탭1 - 제목과 메뉴 (html)

  • 탭3과 레이아웃 동일

 

	<div class="input">
      <div class="attribute" id="level">
        <div class="lv_line">Lv.</div>
        <div class="lv_line">
          <span class="lv">3</span>
          <span class="lv">2</span>
          <span class="lv">1</span>
        </div>
        <div class="lv_line">
          <input type="text" name="category" value="할일 종류">
        </div>
      </div>
      <div class="attribute" id="work">
        <input id="work_name" type="text" name="name" value="할일 내용">
      </div>
      <div class="attribute" id="due_to">
        <div class="due_line">Due to</div>
        <div class="due_line">
          <input type="text" name="due" value="마감시한">
        </div>
      </div>
      <!--<input class="plus" type="button" name="add" value="">
      -->
    </div>

탭1 - 입력 부분 (html)

 

  • 입력이 들어가는 세 부분을 하나의 태그 아래에 묶되,
  • 한 라인에 세 부분이 모두 들어갈 수 있도록 span 태그와 적절히 병용
  • (주석처리된 부분은 차후 보완하여 추가할 + 버튼 부분의 코드)

 

body{
        text-align: center;
        margin: 0;
      }

      .title{
        margin: 0;
        padding: 150px;
        background-image: url("tab1_back.jpg");
        background-size: cover;
        color: white;
      }

      .menu{
        margin: 30px;
        font-size: 20px;
      }
      .tab{
        color: grey;
        margin: 70px;
      }
      #current_tab{
        font-weight: bold;
        color: purple;
      }
      a{
        text-decoration: none;
      }

탭1 - 제목과 메뉴 (CSS)

  • 탭3과 레이아웃 동일

 

 

.input{
        margin: 50px;
        padding-bottom: 50px;
        text-align: center;
        font-size: 24px;
        border-bottom: dotted grey 3px;
      }
      .lv{
        padding: 10px;
        color: grey;
        style: bold;
      }
      .attribute{
        display: inline-block;
        padding: 50px;
      }

      input{
        text-align: center;
        width: 100px;
        height: 20px;
        color: grey;
      }
      #work_name{
        width: 500px;
        height: 50px;
        border-top: none;
        border-left: none;
        border-right: none;
        border-bottom: 3px solid black;
        font-size: 40px;
      }

     /* input.plus{
        background: url("add.png") no-repeat;
        background-color: white;
        float: left;
        border: none;
        width: 64px;
        height: 64px;
        cursor: pointer;
        margin: 20px;
        margin-left: 30px;
        margin-right: 30px;
        position: relative;
        top: 300px;
        left: 300px;
      }*/

탭1 - 입력 부분 (CSS)

 

  • 아래 추가될 내용과 구분할 밑줄을 dotted 속성의 border-bottom으로 구현
  • 각각의 부분에 클래스를 부여하고 간격과 크기를 조절
  • 심미성을 위해 입력창의 크기와 모양을 일부 조정하고 중앙 입력창을 밑줄 형태의 입력창으로 변형
  • (주석처리된 부분은 차후 보완하여 추가할 + 버튼 부분의 코드)

 

 

보완/추가할 점

  • 배경이미지를 약간 더 어두운 것으로 편집해 바꿔 넣으면 가독성 면에서 더 좋을 것 같다.
  • 저번에 시작 화면을 구현할 때 미처 구현하지 못했던 버튼 구현에 성공했으나, 위치 지정과 float 속성 사용에 어려움을 겪어 보류했다. 차후 이 문제가 해결되면 시작 화면에 들어가는 버튼과 함께 일괄 수정할 예정이다.
  • 탭1의 경우 입력을 받고 그 입력값을 아래에 표시해서 체크리스트를 만드는 부분이 필요하다. 해당 부분 미구현 상태이며, JS 사용에 더 능숙해지면 구현할 예정이다.

중간결과물 (스크린샷)

 

(시작 화면)

 

(-> 스크롤 다운)(페이지 아래쪽 끝)

 

코드

1) CSS (<head>)

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="utf-8">

    <style>
      .start {
        text-align: center;
        color: white;
      }
      .div1{
        padding: 100px;
        margin-top: 50px;
      }
      .div2{
        padding: 100px;
        margin-top: 300px;
        margin-bottom: 130px;
        text-align: center;
      }

      body {
        background-image: url("start_bg2.jpg");
        background-repeat: no-repeat;
        background-position: center center;
        background-attachment: fixed;
      }
      h1 {
        padding: 50px;
        font-size: 37px;
      }
      h2 {
        font-size: 36px;
      }
      p {
        font-size: 14px;
      }
      input{
        align-items: center;
        text-align: center;
        margin: 20px;
      }
      .text_input {
        margin-top: 50px;
      }
    </style>

  </head>

 

2) HTML (<body>)

  <body>
    <div class="div1">
      <h1 class="start">대체 이걸 언제 다 하죠?</h1>
      <p class="start">과제1은 다음 주까지, 과제2는 이틀 내로, 과제3은 오늘 밤까지... 공부할 것도 있고 집안일도 쌓였는데!<br>
      정신없고 막막한 마음 이해해요. 하지만 못 할 것도 없죠. 우선은 적는 것부터 시작해 볼까요?</p>
      <p class="start">할일과 중요도, 마감 기한을 <strong>리스트</strong>로 적어놓으면 무엇을 먼저 처리해야 할지 알 수 있어요. 시간 배분도 쉬워지죠.<br>
      적고, 해내고, 체크하기만 하세요! 몇 개를 해냈는지 세어서 알려드릴게요.<br>
      게임에서 퀘스트를 하나씩 해결해 나가듯, 이 많은 걸 내가 다 해냈다는 보람에 취해 보세요.</p>
    </div>

    <div class="div2">
      <h2 class="start">LOGIN</h2>
      <p class="start">아이디를 입력해 주세요.</p>
      <input type="text" class="text_input" ><br>
      <input type="button" class="button">
    </div>

  </body>
</html>

 

 

 

 

구현한 것

  • 백그라운드 이미지를 삽입했다. (프리소스 이미지 출처: https://www.freepik.com/vectors/planet-background'>Planet background vector created by freepik - www.freepik.com)
  • 스크롤을 내려도 백그라운드 이미지는 고정되어 있고 내용물만 움직이도록 했다. (background-attachment: fixed;)
  • <div> 태그를 이용해 기본적인 레이아웃을 나눠 보았다.
  • 입력창과 버튼을 만들고, 요소를 전체적으로 정렬해 보기 편하도록 했다.

 

 

보완할 점

  • 아직 JavaScript를 많이 배우지 못해 JS 부분은 거의 추가하지 못했다.
  • 해당 부분을 배운다면 가장 먼저 (1) 입력창에 입력되는 스트링을 사용자 아이디 변수로서 받아들이고,
  • (2) 입력값이 없을 때 버튼을 누르면 화면이 넘어가지 않고 alert 등이 뜨는 코드를 추가해야 할 것이다.
  •  
  • 버튼에 커서를 올리면 버튼에 경계선이 생기는 등 모양의 변화가 생기도록 해도 좋겠다.
  • 버튼에 대해 아쉬움이 많다. 과제 마감 시한이 임박해 더 손보지 못했지만, 버튼에 background image를 추가했는데도 크기가 너무 크게 나오거나 클릭이 되는 범위가 맞지 않는 등 미흡한 부분이 많았다.
  • 다음 화면을 구현하면 먼저 이 버튼 문제를 해결해서 버튼을 누르면 다음 페이지로 리다이렉트되도록 기능을 추가해야 할 것이다.

개요

  • 사용자가 직접 할일을 입력하여 만드는 체크리스트
  • 할일의 종류, 중요도, 마감 시한을 함께 기입하여 한눈에 볼 수 있도록 구현
  • 해결한 할일의 건수를 카운트하여 표시, 성취감을 느낄 수 있도록 함
  • 할일을 하며 들을 만한 배경음악 링크 모음 게시

 

 

1. 첫 페이지

  • 사이트 제목 화면에서 스크롤을 아래로 내려서 로그인 화면을 볼 수 있도록
  • 아이디를 입력하지 않으면 입력 칸 하단에 붉은 글씨로 '아이디를 입력해 주세요.' 출력
  • > 버튼을 누르면 다음 화면으로 리다이렉트

 

 

 

 

2. 탭1 (QUEST)

  • 첫 화면에서 > 버튼을 누르면 처음 나오는 화면
  • 위의 QUEST / MYPAGE / BGM 은 border가 없는 버튼으로 구현
  • (클릭 시 각 페이지로 이동)

 

입력 칸

  • 가운데 입력 창에 할일 내용 입력
  • Lv. 밑의 3 2 1은 각각 border 없는 버튼으로 구현해서 기본은 회색, 클릭(선택) 하면 색이 변하도록
  • 밑에는 할일 종류 (과제, 공부, 집안일 등) 간략하게 입력
  • 우측에는 마감 시한을 날짜로 입력 (날짜 선택 기능을 배우면 해당 기능으로 교체 예정)
  • + 버튼을 누르면 입력한 내용을 아래 리스트에 추가

 

  • 체크리스트
  • 좌측 체크박스는 기본이 일반 사각형, 체크하면 체크된 모양 박스로 변화
  • 선택한 Lv과 종류, 내용, 마감시한이 표시됨
  • 먼저 작성한 것이 위에 있고 아래로 하나씩 추가되는 형식

 

 

3. 탭2 (MYPAGE)

  • 간단한 아이콘과(프리소스 아이콘 사용 예정) 로그인 페이지에서 입력한 아이디 표시
  • 하단에 해결한 할일을 종류별로 출력 (레벨별 해결 건수, 총 해결 건수, 미해결 건수)
  • 현재 레벨 표시(여력이 되면 추가 구현, 해결한 과제의 수와 중요도를 합산해 일정 수치 이상이 되면 레벨이 오르게끔)

 

 

 

 

4. 탭3 (BGM)

 

  • 공부, 코딩, 휴식 등에 곁들이면 좋을 노동요 모음
  • 각 텍스트는 하이퍼링크로, 클릭하면 해당 유튜브 링크로 연결 (새 탭으로 띄움)
  • 옆에는 각 영상의 재생시간 기입

 

주차별 목표

 

4주차: 시작 화면 구현

5주차: BGM 탭 구현

6주차: 퀘스트 탭 구현

7주차: 마이페이지 탭 구현

8주차: 미구현된 기능 보완 및 수정

+ Recent posts