<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>JLog🦖</title>
        <link>https://velog.io/</link>
        <description>늘 새로운 배움을 추구하는 개린이 🌱</description>
        <lastBuildDate>Mon, 04 Oct 2021 13:54:24 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>JLog🦖</title>
            <url>https://images.velog.io/images/jiyoon_jeong2005/profile/dc9e4e12-dc28-4641-8840-fed00ecff5ac/ZEPETO_-8585726549930360208.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. JLog🦖. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jiyoon_jeong2005" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[대구AI스쿨 실무 프로젝트]]></title>
            <link>https://velog.io/@jiyoon_jeong2005/%EB%8C%80%EA%B5%ACAI%EC%8A%A4%EC%BF%A8-%EC%8B%A4%EB%AC%B4-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</link>
            <guid>https://velog.io/@jiyoon_jeong2005/%EB%8C%80%EA%B5%ACAI%EC%8A%A4%EC%BF%A8-%EC%8B%A4%EB%AC%B4-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</guid>
            <pubDate>Mon, 04 Oct 2021 13:54:24 GMT</pubDate>
            <description><![CDATA[<p>제작 사이트 링크 : <a href="http://hangdongkinder.com/">http://hangdongkinder.com/</a></p>
<p>약 한 달 간의 대구AI스쿨 마지막 실무 프로젝트가 9월로 끝이났다. 개발자로서의 첫 발자취라 할 수 있는 이번 프로젝트에 대한 진행 과정을 기록해 보고자 한다. 😚</p>
<h2 id="📕-프로젝트-개요">📕 프로젝트 개요</h2>
<ul>
<li>프로젝트 명칭 : &lt;구로 항동 발도르프 킨더교육원&gt; 사이트 구축</li>
<li>사이트 목적 : 기관 홍보</li>
<li>총 개발기간 : 21년 9월 6일 ~ 21년 9월 27일</li>
</ul>
<h2 id="📙-웹-개발-스터디">📙 웹 개발 스터디</h2>
<p>** 참고 : 
(1) <a href="http://plandas.kr/ui-ux-design/uxui-5/">http://plandas.kr/ui-ux-design/uxui-5/</a> 
(2) <a href="http://fureweb.com/web-development-process-from-planning-to-deploy/">http://fureweb.com/web-development-process-from-planning-to-deploy/</a>**</p>
<p> 일반적으로 웹 사이트 구축은 크게 기획, 디자인, 퍼블리싱, 개발이라는 4단계를 거쳐서 진행된다.</p>
<p> ** 요구분석 &gt; <span style='background-color: #fff5b1'>기획 &gt; 디자인 &gt; 퍼블리싱 &gt; 개발</span> &gt; 테스트 &gt; 디버깅 &gt; 오픈 **</p>
<p>이러한 단계를 기준으로 클라이언트와 프로젝트 진행자와 <strong>Kick off Meeting</strong>(프로젝트 구축 시작 미팅)을 시작으로 기획자, 디자이너, 퍼블리셔, 개발자의 협업을 통해 프로젝트가 진행된다. 일반적으로 일정에 따라 각 분야별로 겹쳐지면서 병행하여 진행되며 클라이언트의 요청에 의해 다양한 변수를 가져올 수 있다.</p>
<h3 id="기획">기획</h3>
<p> 일반적으로 계약을 통한 개발을 진행하게 된다면 클라이언트와의 미팅 후 요구사항을 정리하여 어떤 기능들이 존재해야하며 어떻게 사용자에게 보여져야하는지 정의하는 시기를 거치게 된다. 이때 화면, 기능, 프로세스 및 데이터베이스 등을 설계하게 된다.</p>
<p> ** 사이트맵 작성 -&gt; 화면설계(스토리보드) -&gt; 화면별 프로세스 설계 -&gt; 데이터베이스 설계 **</p>
<h3 id="디자인">디자인</h3>
<p> 화면이 설계되고 페이지 범위가 확정되면 front-end라고 하는 사용자가 보는 페이지를 전부 제작한다. </p>
<p> 웹사이트 전략에 따른 디자인 컨셉을 수립하고, 다양한 미디어와 시각적 요소를 활용하여 디자인 시안을 제작하며 클라이언트의 컨펌과정을 통해 완성해간다. 기획자와 원활한 소통을 통해 클라이언트와 사용자 입장을 고려하여 <strong>UX/UI 전략을 수립</strong>하고 컨셉을 설정한다. 이를 통해 시안을 제작하고 확정이 되면 실제 디자인을 진행한다. PC웹, Mobile웹 등의 범위에서 적응형, 반응형, 하이브리드 형으로 사용성을 고려하여 제작한다.</p>
<h3 id="퍼블리싱">퍼블리싱</h3>
<p> 완료된 UX/UI 디자인을 HTML페이지로 코딩하는 과정 (디자인된 이미지를 실제로 웹 프로그램에 사용할 수 있도록 코딩을 해 주는 직군) 실제로 웹에 적용되는 표준을 잡아주는 직업이므로, HTML, CSS, 자바, 웹 표준, 웹 접근성, 심지어는 웹디자인에 대한 폭넓은 이해가 필요하다.</p>
<h3 id="개발">개발</h3>
<p> 개발단계는 웹을 구현하는 전문적인 프로그램 개발자가 진행하며 PHP, ASP, JSP, JQuery, Javascript 등 다양한 언어로 제작되어 진다. 기능 구현 등</p>
<h2 id="📒-기획-단계">📒 기획 단계</h2>
<p> 우리팀은 &#39;구로 항동 발도르프 킨더교육원&#39;을 담당해 <span style='background-color: #fff5b1'>기관 홍보</span> 페이지를 제작하도록 요청받았다.</p>
<p> 2주라는 짧은 개발기간과 백엔드 구현의 한계로 인해 전체 코딩을 하는 것이 아닌, <span style="background-color: #fff5b1">웹빌더</span>를 이용한 작업을 진행하기로 했다. 따라서 가장 먼저 사이트 제작에 쓰일 웹빌더를 선정했다. 처음에는 공부한 HTML, CSS, JS를 많이 다룰 수 없어서 아쉬웠지만, 클라이언트 측에 전문가가 없어 사후 관리를 위해서라도 웹빌더를 사용하는 편이 나을 것 같다고 판단했다.</p>
<p> 전달 받은 기획서에 간략한 홈페이지 레이아웃이 있어서 <span style="background-color: #fff5b1">사이트맵과 스토리 보드</span>를 우선 제작했다.</p>
<p> <img src="https://images.velog.io/images/jiyoon_jeong2005/post/f6657513-8b9e-4f60-8364-f049deb9f3f6/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/df5bc134-6a56-4feb-99b6-761bdf1a1cec/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/bc7c043b-7f9d-4fa2-bfa8-22643444fd28/image.png" alt=""></p>
<p> 후에 <span style="background-color: #fff5b1">기능 요구사항 정의서</span>를 작성해 클라이언트 측에게 게시했다.</p>
<p> <img src="https://images.velog.io/images/jiyoon_jeong2005/post/8c3b629e-3d55-4a89-9143-2f60aed0e8a3/image.png" alt=""></p>
<h2 id="📗-디자인·퍼블리싱·개발-단계">📗 디자인·퍼블리싱·개발 단계</h2>
<p> 웹빌더를 사용했기 때문에 위의 모든 단계를 통합해서 진행했다. </p>
<p> 디자인을 담당하는 전문가가 따로 없었기 때문에 로고는 텍스트로 간단하게 삽입하였고, &#39;유치원&#39;과 &#39;무지개&#39;의 테마를 기본으로 잡고 산뜻하고 발랄한 분위기의 컨셉을 방향으로 잡았다. 또한 전체적으로 작업한 뒤 클라이언트에게 반복적으로 피드백을 받으며 수정해나갔다.</p>
<p> 전체 폰트 서체 적용은 HTML과 CSS를 이용해 작업해 주었다. <code>@font-face</code>지시어로 사용할 웹폰트들을 호출하고, 개발자 도구를 이용해 각 요소의 클래스명을 찾아 속성값을 주었다.</p>
<pre><code class="language-css"> &lt;style&gt;

  /* 웹폰트 호출 */
  @font-face {
    font-family: &#39;Yuni_ddingddang&#39;;
    src: url(&#39;https://cdn.jsdelivr.net/gh/projectnoonnu/naverfont_11@1.0/Yuni_ddingddang.woff&#39;) format(&#39;woff&#39;);
    font-weight: normal;
    font-style: normal;
  }

  @font-face {
    font-family: &#39;Bareun_hipi&#39;;
    src: url(&#39;https://cdn.jsdelivr.net/gh/projectnoonnu/naverfont_01@1.0/Bareun_hipi.woff&#39;) format(&#39;woff&#39;);
    font-weight: normal;
    font-style: normal;
  }

  @font-face {
    font-family: &#39;Mingyung&#39;;
    src: url(&#39;https://cdn.jsdelivr.net/gh/projectnoonnu/naverfont_08@1.0/Mingyung.woff&#39;) format(&#39;woff&#39;);
    font-weight: normal;
    font-style: normal;
  }

  @font-face {
    font-family: &#39;SlowSlow&#39;;
    src: url(&#39;https://cdn.jsdelivr.net/gh/projectnoonnu/naverfont_10@1.0/SlowSlow.woff&#39;) format(&#39;woff&#39;);
    font-weight: normal;
    font-style: normal;
  }

  @font-face {
    font-family: &#39;Amsterdam&#39;;
    src: url(&#39;https://cdn.jsdelivr.net/gh/projectnoonnu/naverfont_01@1.0/Amsterdam.woff&#39;) format(&#39;woff&#39;);
    font-weight: normal;
    font-style: normal;
  }

  @font-face {
    font-family: &#39;White_angel&#39;;
    src: url(&#39;https://cdn.jsdelivr.net/gh/projectnoonnu/naverfont_11@1.0/White_angel.woff&#39;) format(&#39;woff&#39;);
    font-weight: normal;
    font-style: normal;
  }

  /* 폰트 적용 */
  /* 로고 */
  .doz_sys #logo_w20210914f4117f905bcd5.logo .logo_title a {
    font-family: 나눔 손글씨 백의의 천사, White_angel;
    font-size: 77px;
  }

  .inline-col-group {
    overflow: visible;
    text-overflow: unset;
     white-space: nowrap;
  }

  /*모바일 로고*/
  .doz_sys #logo_w202109143cf3f9f8faa58.logo .logo_title a {
    font-family: 나눔 손글씨 백의의 천사, White_angel;
    font-size: 37px;

    display: flex;
    flex-wrap: nowrap;
  }

  /* 상단메뉴 및 서브메뉴*/
  #w20210914f39aca5df7dc5 .viewport-nav {
    font-family: 나눔 손글씨 백의의 천사, White_angel;
  }

  #w20210914f39aca5df7dc5 .viewport-nav &gt; li.dropdown &gt; .notranslate a, #w20210914f39aca5df7dc5 .viewport-nav &gt; li.dropdown &gt; a {
    font-size: 26px;
    font-weight: bold;
  }

  #w20210914f39aca5df7dc5 .dropdown-menu {
    font-size: 22px;
    font-weight: bold;
  }

  /* 모바일 상단 메뉴 및 서브메뉴 */
  .mobile_carousel_nav .nav-item &gt; a {
    font-size: 22px;
    font-family: 나눔 손글씨 백의의 천사, White_angel;
    font-weight : bold;
  }

  .mobile_carousel_nav .mobile_nav_depth {
    text-align : center;
  }

  /* 킨더소개 왼쪽 메뉴바 */
  #w20210914f55ab45c8a159 .nav li a {
    font-family : 나눔 손글씨 암스테르담, Amsterdam;
    font-weight : bold;
    font-size : 29px;
  }

  #w20210914a8dedae817be5 .nav li a {
    font-family : 나눔 손글씨 암스테르담, Amsterdam;
    font-weight : bold;
    font-size : 29px;
  }

  #w20210914bcd79fe66f9c9 .nav li a {
    font-family : 나눔 손글씨 암스테르담, Amsterdam;
    font-weight : bold;
    font-size : 29px;
  }

  #w20210914aa5cfd410d744 .nav li a {
    font-family : 나눔 손글씨 암스테르담, Amsterdam;
    font-weight : bold;
    font-size : 29px;
  }

  #w2021091493fe48dd07f7a .nav li a {
    font-family : 나눔 손글씨 암스테르담, Amsterdam;
    font-weight : bold;
    font-size : 29px;
  }

  /* 교육과정 왼쪽 메뉴바 */
  #w20210924c835367293320 .nav li a {
    font-family : 나눔 손글씨 암스테르담, Amsterdam;
    font-weight : bold;
    font-size : 29px;
}

  #w20210915521aedf839750 .nav li a {
    font-family : 나눔 손글씨 암스테르담, Amsterdam;
    font-weight : bold;
    font-size : 29px;
  }

  #w20210915e63148a6ee74c .nav li a {
    font-family : 나눔 손글씨 암스테르담, Amsterdam;
    font-weight : bold;
    font-size : 29px;
  }

  #w202109150d6fca91b5328 .nav li a {
    font-family : 나눔 손글씨 암스테르담, Amsterdam;
    font-weight : bold;
    font-size : 29px;
  }

  /* 킨더소식 왼쪽 메뉴바 */
  #w2021091583a5354cb1e97 .nav li a {
    font-family : 나눔 손글씨 암스테르담, Amsterdam;
    font-weight : bold;
    font-size : 29px;
  }

  #w2021091535095b3c9f776 .nav li a {
    font-family : 나눔 손글씨 암스테르담, Amsterdam;
    font-weight : bold;
    font-size : 29px;
  }

  #w2021091566d274b94d5a7 .nav li a {
    font-family : 나눔 손글씨 암스테르담, Amsterdam;
    font-weight : bold;
    font-size : 29px;
  }

  /* 입학 왼쪽 메뉴바 */
  #w2021091672d937a4958b8 .nav li a {
    font-family : 나눔 손글씨 암스테르담, Amsterdam;
    font-weight : bold;
    font-size : 29px;
  }

  #w2021091618c3f69fd7055 .nav li a {
    font-family : 나눔 손글씨 암스테르담, Amsterdam;
    font-weight : bold;
    font-size : 29px;
  }


/* 배너 폰트 */  
h4.banner {
  font-family: Bareun_hipi !important;
    font-size: 50px;
    line-height: 1.2;
}

p.banner-txt {
  font-family: Bareun_hipi !important;
  font-size: 37px;
}

span.author {
  font-size: 29px
}

&lt;/style&gt;</code></pre>
<p>pc버전으로 작성해 자동으로 제작된 모바일 버전의 일부 레이아웃이 틀어지는 현상이 발생해, 모바일 버전의 틀어지는 요소들을 제거하고 모바일 버전으로만 새로 삽입하였다. </p>
<h2 id="📘-디버깅-단계">📘 디버깅 단계</h2>
<h3 id="1-교육활동--리듬활동-페이지에-overlay로-삽입한-아이콘의-크기-축소">1. &#39;교육활동 &gt; 리듬활동&#39; 페이지에 overlay로 삽입한 아이콘의 크기 축소</h3>
<p> 웹빌더에 내장된 기본 위젯으로 마우스 hover 애니메이션으로 아이콘을 삽입했으나, 아이콘의 크기가 전체 이미지를 덮을 만큼 커져서 줄어들지 않았다. <code>background-size: 100px !important;</code>를 삽입해 고정해주었다. 동일 클래스에 다른 <code>background-size</code>의 영향을 받고 있어서 그랬던 것 같다.</p>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/f0ffcc1c-2153-4f91-a0d3-db6ff839fa20/image.png" alt=""></p>
<pre><code>&lt;style&gt;

/* 교육활동 hover 이미지 설정 */
.hover_img{
  position: relative;
  margin: -270px auto auto; 
  width: 270px; 
  height: 270px; 
  background-image: url(&amp;quot;https://cdn.imweb.me/thumbnail/20210927/e55db235cbfac.png&amp;quot;);   
  background-size: 100px !important; 
  background-repeat: no-repeat;
  background-position: 50% 50%; 
  top: 0px;   
  left: 0px;
}

&lt;/style&gt;</code></pre><h3 id="2-pc버전에서-모바일-버전으로-브라우저-사이즈-축소시-텍스트로-삽입한-로고-틀어짐">2. pc버전에서 모바일 버전으로 브라우저 사이즈 축소시, 텍스트로 삽입한 로고 틀어짐</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/251b41f2-54d4-4a6c-9aef-e262f156c51d/image.png" alt=""></p>
<ul>
<li><p>1차 수정
<code>min-width</code>, <code>display: flex;</code>, <code>flex-wrap: nowrap;</code>을 적용했으나 먹히지 않음</p>
</li>
<li><p>2차 수정
<code>flex-wrap: nowrap</code>이 먹히지 않는 이유가 <code>display: table-cell;</code>일 것으로 추정, 가장 하위 클래스를 찾아 아래 값을 삽입</p>
<pre><code class="language-css">.inline-col-group {
overflow: visible; text-overflow: unset; white-space: nowrap;</code></pre>
<p>=&gt; 디버깅 완료</p>
</li>
</ul>
<h2 id="📚-review">📚 Review</h2>
<p> 프로젝트 전체 소스 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/project%20_team9">💾</a></p>
<p> 처음해보는 웹 개발을 웹빌더로 작업한다는 것이 처음에는 마냥 당황스럽고, 3개월간 공부했던 코딩 요소들을 자유롭게 활용할 수 없다는 것에 불만이 많았다. 하지만 결국 웹개발에 있어서 최종 목표는 클라이언트가 해당 사이트를 잘 이용할 수 있게 하는 것이고, 내 실력을 뽐내는 장이 아니라는 것이다. 백엔드를 배우지 않은 나의 한계점을 인정하고 클라이언트의 요구사항에 맞게 개발 기간안에 작업을 끝마쳐야 한다는 것이 최우선사항이라는 것을 이번 프로젝트를 통해 깊이 깨달았다. 
 또한 웹빌더를 사용하는 과정에서 오로지 마우스로 드래그앤 드롭을 한것만이 아니라, 개발자 도구를 이용해 해당 기능을 어떻게 구현했는지를 면밀히 살피면서 오히려 자습이 되었다. 실제로 웹빌더를 이용해 사용은 하지 못했지만 Github 브랜치를 공부해 개발자들이 협업하는 방법을 익히기도 했다. 결과적으로 해당 프로젝트를 맡은 팀들 중에 우리팀의 사이트가 선정되었고, 프론트엔드 개발자로서 한 단계 성장한 것 같아 뿌듯하다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[210907 개발일지]]></title>
            <link>https://velog.io/@jiyoon_jeong2005/210907-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@jiyoon_jeong2005/210907-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Tue, 07 Sep 2021 14:45:57 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-학습한-내용">📌 학습한 내용</h1>
<hr>
<h3 id="전체-코드--💾">전체 코드 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/jQuery">💾</a></h3>
<h2 id="jquery-라이브러리">jQuery 라이브러리</h2>
<ul>
<li><p>라이브러리 : 반복적인 기능에 대해 미리 작성해둔 코드</p>
</li>
<li><p>production (압축된 버전, minify -&gt; 파일의 용량을 줄여, 사이트의 로딩 속도를 줄임) </p>
</li>
<li><p><em>vs*</em> 
development (압축이 안된 버전, javascript로 작성) ✔</p>
</li>
</ul>
<h3 id="jquery-기본구조">jQuery 기본구조</h3>
<p>: 아래와 같은 구조를 만든 뒤, 안쪽에 jquery관련 코드 기입</p>
<pre><code class="language-js">// 과거 버전
// html문서를 다 가져온 다음 jquery 코드를 실행
$(document).ready(function() {

});

// 3. 버전에서 간소화
$(function() {
    // console.log(&quot;Hello World&quot;);
})</code></pre>
<h3 id="jquery-선택자">jQuery 선택자</h3>
<p>: querySelector와 동일한 접근 방법 사용(css와 동일)</p>
<pre><code class="language-js">// $(&#39;디자인 또는 기능을 적용할 영역&#39;)
$(&#39;header&#39;).css(&#39;background-color&#39;, &#39;yellow&#39;);
$(&#39;#masthead-id&#39;).css(&quot;color&quot;, &quot;red&quot;);
$(&#39;.,masthead-heading&#39;).css(&quot;color&quot;, &quot;blue&quot;);

// 해당 요소를 개별적으로 가져올 수도 있음
console.log($(&quot;#masthead-id&quot;));

// 가져온 영역을 자바스크립트 변수 안에다가 할당 가능
// -&gt; 암묵적으로 변수명 앞에 $기호로 변수명을 시작 
// -&gt; (jQuery 라이브러리를 이용해 할당시킨 값임을 명시적으로 표기)
var $masthead = $(&quot;#masthead-id&quot;);
console.log(masthead);</code></pre>
<ul>
<li><p>부모 자식관계로도 요소에 접근 가능</p>
<pre><code class="language-js">$(&#39;header #masthead-id&#39;).css(&#39;color&#39;, &#39;red&#39;);
$(&#39;header #masthead-id.masrhead-subheading&#39;).css(&#39;color&#39;, &#39;red&#39;);</code></pre>
</li>
<li><p>선택자가 존재하지 않을 때
: 비어있는 형태로 반환</p>
<pre><code class="language-js">console.log($(&quot;#test&quot;));</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/bdb7a5b6-47be-4faa-88eb-3acaa11f0aad/image.png" alt=""></p>
</li>
</ul>
<h3 id="jquery-가상-선택자">jQuery 가상 선택자</h3>
<ul>
<li>코드는 항상 0부터 시작</li>
<li><code>:even</code> : 인덱스 넘버에 따라 홀수 선택</li>
<li><code>:odd</code> : 인덱스 넘버에 따라 짝수 선택</li>
<li><code>:eq(index)</code> : 원하는 영역에 디자인 가능, 인덱스 넘버에 해당하는 요소에 적용<pre><code class="language-js">$(&#39;.nav-item:even&#39;).css(&#39;background-color&#39;, &#39;blue&#39;);
$(&#39;.nav-item:odd&#39;).css(&#39;background-color&#39;, &#39;green&#39;);
$(&#39;.nav-item:eq(3)&#39;).css(&#39;background-color&#39;, &#39;pink&#39;);</code></pre>
</li>
</ul>
<p>👉 라이브러리를 이용할 때, html에 <code>&lt;script&gt;</code>의 작성 순서에 주의해야 한다. 위에서 부터 아래로 코드가 실행되는 것을 명심!</p>
<h3 id="jquery-event">jQuery event</h3>
<ul>
<li><code>.mouseenter()</code> : 마우스를 오버하면 이벤트 작동 후 지속</li>
<li><code>.mouseleave()</code> : 마우스 오버 후, 해당 영역을 벗어나면 이벤트 작동 후 지속</li>
<li><code>.click()</code> : 해당 요소를 클릭하면 이벤트 작동 후 지속</li>
<li><code>.on({})</code> : 하나의 영역에 여러 개의 이벤트 적용, 객체로 전달<pre><code class="language-js">// 기본 작성
$(&quot;header #masthead-id&quot;).mouseenter(function() {
  // $(&quot;header #masthead-id&quot;).css(&#39;background-color&#39;, &#39;yellow&#39;);
  $(this).css(&#39;background-color&#39;, &#39;yellow&#39;);
  });
</code></pre>
</li>
</ul>
<p>$(&quot;header #masthead-id&quot;).mouseleave(function() {
    // $(&quot;header #masthead-id&quot;).css(&#39;background-color&#39;, &#39;blue&#39;);
    $(this).css(&#39;background-color&#39;, &#39;blue&#39;);
    })</p>
<p>// .on사용 간소화
$(&quot;header #masthead-id&quot;).on({
    mouseenter: function() {
        $(this).css(&#39;background-color&#39;, &#39;yellow&#39;)
        },
    mouseleave: function() {
        $(this).css(&#39;background-color&#39;, &#39;blue&#39;)
        }
    })</p>
<pre><code>
* `fadeTo(속도, opacity값, function())` : opacity의 강도를 조절하는 메서드
```js
$(&quot;header #masthead-id&quot;).on({
    mouseenter: function() {
        $(this).fadeTo(&#39;fast&#39;, 1);
    },
    mouseleave: function() {
        $(this).fadeTo(&#39;fast&#39;, 0.5);
    }
})</code></pre><h3 id="display-none-관련-메서드"><code>display: none;</code> 관련 메서드</h3>
<ul>
<li><code>.hide()</code> : 화면에서 보이지 않게 함, <code>display: none;</code> 적용</li>
<li><code>.show()</code> : <code>display: none</code> 제거</li>
<li><code>toggle()</code> : 화면에 보이고 있을 경우 <code>.hide()</code> 수행, 화면에 보이지 않고 있을 경우 <code>.show()</code> 수행</li>
</ul>
<ul>
<li><code>.slideDown()</code> : 슬라이드 되면서 화면에 노출</li>
<li><code>.slideUp()</code> : 슬라이드 되면서 화면에서 감춤</li>
<li><code>.slideToggle()</code> : <code>display: none;</code>의 유무에 따라 슬라이드 되면서 화면에 노출/숨김</li>
</ul>
<ul>
<li><code>.fadeIn()</code>/<code>.fadeOut()</code> : 투명/선명해지면서 숨김/노출</li>
</ul>
<h3 id="클래스-제어-코드">클래스 제어 코드</h3>
<ul>
<li><code>.addClass(&#39;추가할 클래스명&#39;)</code> : 클래스 추가</li>
<li><code>.removeClass(&#39;추가할 클래스명&#39;)</code> : 클래스 제거</li>
</ul>
<h4 id="toggleclass-구현"><code>.toggleClass()</code> 구현</h4>
<pre><code class="language-js">var $id = $(&quot;#masthead-id&quot;);

$(&quot;.btn-one&quot;).click(function() {
    if($id.hasClass(&#39;blue&#39;)) {
        $id.removeClass(&#39;blue&#39;);
    } else {
        $id.addClass(&#39;blue&#39;);
    }
      // $id.toggleClass(&#39;blue&#39;);
})</code></pre>
<h2 id="실습">실습</h2>
<h3 id="1-체크-박스">1. 체크 박스</h3>
<p>: 클릭 시, 선택한 영역의 박스만 색상 변경</p>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/4bf68077-5eb9-4846-b327-f9ff0a709e4d/check%20box.gif" alt=""></p>
<pre><code class="language-html">&lt;i class=&quot;favorite_icon&quot;&gt;&lt;/i&gt;
&lt;i class=&quot;favorite_icon&quot;&gt;&lt;/i&gt;
&lt;i class=&quot;favorite_icon&quot;&gt;&lt;/i&gt;</code></pre>
<pre><code class="language-js">var $favoriteIcon = $(&#39;.favorite_icon&#39;);

$favoriteIcon.click(function() {
    // 선택한 영역에 대해서만 이벤트를 발동하기 위해 $favoriteIcon 대신 $(this)를 넣어줌
    if($(this).hasClass(&#39;on&#39;)) {
        $(this).removeClass(&#39;on&#39;);
    } else {
        $(this).addClass(&#39;on&#39;);
          // $(this).toggleClass(&#39;on&#39;);  
    };
});</code></pre>
<h3 id="2-체크-박스-ver2">2. 체크 박스 ver.2</h3>
<p>: 클릭시 체크 박스가 나타나고, 다른 영역 클릭시 기존에 있던 체크박스는 사라지고 해당 영역에 체크박스가 나타나는 기능</p>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/b99a3385-1aac-4dc5-b433-ef52e623c7d8/check%20box2.gif" alt=""></p>
<h4 id="방법-1">방법 1</h4>
<pre><code class="language-html">&lt;ul&gt;
    &lt;li class=&quot;select one&quot;&gt;
        &lt;i class=&quot;check_icon&quot;&gt;&lt;/i&gt;
    &lt;/li&gt;
    &lt;li class=&quot;select two&quot;&gt;
        &lt;i class=&quot;check_icon&quot;&gt;&lt;/i&gt;
    &lt;/li&gt;
    &lt;li class=&quot;select three&quot;&gt;
        &lt;i class=&quot;check_icon&quot;&gt;&lt;/i&gt;
    &lt;/li&gt;
&lt;/ul&gt;</code></pre>
<pre><code class="language-js">var $select = $(&#39;.select&#39;);

$select.click(function() {

    // 전체 요소에 대해 on 클래스를 삭제하고, 선택한 요소에 대해서만 on클래스 삽입 
    // -&gt; 아래의 순서를 바꿨을 때, 제대로 작동 x
    $select.removeClass(&#39;on&#39;);
    $(this).addClass(&#39;on&#39;);
});</code></pre>
<h4 id="방법-2">방법 2</h4>
<ul>
<li><code>.siblings()</code> : 선택한 영역을 제외한 모든 형제 요소들을 반환</li>
</ul>
<pre><code class="language-js">$select.click(function() {
    // 나를 제외한 형제 요소들에 대해 on클래스 제거
     $(this).addClass(&#39;on&#39;).siblings().removeClass(&#39;on&#39;);
})</code></pre>
<h3 id="3-프로필-정보창-띄우기">3. 프로필 정보창 띄우기</h3>
<p>: 프로필 사진에 마우스 오버시, 프로필 사용자의 상세 정보를 팝업창으로 띄우기</p>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/06536677-f725-435b-8164-69abef5ddefa/profile.gif" alt=""></p>
<h4 id="방법-1--부모-경유">방법 1 : 부모 경유</h4>
<ul>
<li><code>parent()</code> : 바로 위의 부모 태그에 접근</li>
<li><code>find()</code> : 인자로 받은 클래스 혹은 아이디를 찾는 메서드 </li>
</ul>
<pre><code class="language-js">var $profile = $(&#39;.profile&#39;);
var $profilePopup = $(&#39;.profile-popup&#39;);

$profile.on({
    // 마우스 오버시 이벤트
    mouseenter: function() {
        // $profile.parent().find(&#39;.profile-popup&#39;).css(&#39;display&#39;, &#39;block&#39;);
        // $profile.parent().find(&#39;.profile-popup&#39;).show();

        // 클래스로 선택한 요소가 여러 개 있을 경우, 선택한 요소에서만 이벤트를 작동하기 위해 this 사용
        $(this).parent().find(&#39;.profile-popup&#39;).show();
    },

    // 마우스 뗐을 때 이벤트
    mouseleave: function() {
        // $profilePopup.css(&#39;display&#39;, &#39;none&#39;);
        $profilePopup.hide();
    }
})</code></pre>
<h4 id="방법-2--부모-경유-x">방법 2 : 부모 경유 x</h4>
<ul>
<li><code>next()</code> : 다음에 나오는 형제 태그 선택</li>
<li><code>preve()</code> : 이전에 나오는 형제 태그 선택</li>
</ul>
<pre><code class="language-js">var $profile = $(&#39;.profile&#39;);

$profile.on({
    mouseenter: function() {
        $(this).next().show();
    },
    mouseleave: function() {
        $(this).next().hide();
    }
})</code></pre>
<h3 id="4-리스트-모두-접기펴기--accordion-기능">4. 리스트 모두 접기/펴기 + Accordion 기능</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/a13a1288-40ed-4299-a6ce-acc51ec91f51/accordion.gif" alt=""></p>
<h4 id="1-리스트-모두-접기펴기">1. 리스트 모두 접기/펴기</h4>
<pre><code class="language-js">var $close_text = $(&quot;.close_text&quot;);
var $open_text = $(&quot;.open_text&quot;);
var $list_title_wrap = $(&#39;.list_title_wrap&#39;);
var $list_article_wrap = $(&#39;.list_article_wrap&#39;);

// Close All을 누르면 해당 버튼이 사라지고 Open All이 보여짐
// + 리스트 본문 영역 감추기
$close_text.click(function() {
    $close_text.hide();
    $open_text.show();
    $list_article_wrap.addClass(&#39;hide&#39;);
});

// Open All을 누르면 해당 버튼이 사라지고 Close All이 보여짐
// + 리스트 본문 영역 펼치기
$open_text.click(function() {
    $open_text.hide();
    $close_text.show();
    $list_article_wrap.removeClass(&#39;hide&#39;);
});</code></pre>
<h4 id="2-리스트-개별적으로-접기펴기">2. 리스트 개별적으로 접기/펴기</h4>
<p><strong>방법 1</strong></p>
<pre><code class="language-js">$list_title_wrap.click(function() {
    if($(this).parent().find(&quot;.list_article_wrap&quot;).hasClass(&#39;hide&#39;)) {
        $(this).parent().find(&#39;.list_article_wrap&#39;).removeClass(&#39;hide&#39;)
    } else {
        $(this).parent().find(&#39;.list_article_wrap&#39;).addClass(&#39;hide&#39;)
    };
});</code></pre>
<p><strong>방법 2 : slideToggle()</strong></p>
<pre><code class="language-js">$list_title_wrap.click(function() {
    $(this).next().slideToggle();
})</code></pre>
<p><strong>방법 2 사용시 버그 발생</strong></p>
<p>-&gt; <code>hide</code> 클래스와 <code>slideToggle()</code> 메서드에 내장 되어 있는 <code>none: block</code> 속성이 충돌, 둘 중 어떤 것을 기준으로 할지 정해야 함</p>
<pre><code class="language-js">$list_title_wrap.click(function() {
    $(this).next().toggleClass(&#39;hide&#39;);
})</code></pre>
<h4 id="3-리스트를-개별적으로-모두-접었을-때-close-all로-바꾸기">3. 리스트를 개별적으로 모두 접었을 때, Close All로 바꾸기</h4>
<pre><code class="language-js">$list_title_wrap.click(function() {
    $(this).next().toggleClass(&#39;hide&#39;);

    //`hide` 클래스가 존재하는 요소의 개수에 따라 분기처리
    var hideLength = $(&#39;.list_article_wrap.hide&#39;).length;

    if(hideLength === 4); {
        $open_text.show();
        $close_text.hide();
    } 

    if(hideLength === 0) {
        $close_text.show();
        $open_text.hide();
    };

});</code></pre>
<h1 id="📌-학습내용-중-어려웠던-점">📌 학습내용 중 어려웠던 점</h1>
<hr>
<ol>
<li>마지막 실습 부분에서 <code>hide</code> 클래스와 <code>none: block;</code> 속성이 충돌하는 데에 버그가 발생하고 그 원인을 파악하는 부분이 헷갈렸다.</li>
</ol>
<h1 id="📌-해결방법">📌 해결방법</h1>
<hr>
<ol>
<li>반복해서 강의를 듣고 정리해서 이해했다.</li>
</ol>
<h1 id="📌-학습소감">📌 학습소감</h1>
<hr>
<p>jQuery 라이브러리를 이용해서 훨씬 작업이 편해진 것도 있지만, 동시에 각 메서드, 요소 간의 충돌이 발생해서 100% 완벽할 수는 없다는 것을 깨달았다. 각 메서드들에 대한 충분한 이해가 필요한 듯 싶다. 😣</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[210906 개발일지]]></title>
            <link>https://velog.io/@jiyoon_jeong2005/210906-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@jiyoon_jeong2005/210906-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Mon, 06 Sep 2021 13:27:57 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-학습한-내용">📌 학습한 내용</h1>
<hr>
<h3 id="전체-코드--💾">전체 코드 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/js-Project">💾</a></h3>
<h2 id="snackbar">Snackbar</h2>
<p>: show 버튼 클릭 시, 아래쪽에 alert 창(부분적인 팝업)을 띄워준 뒤 일정 시간 후에 사라짐.</p>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/db7faf70-e637-49c3-b228-0184019b9562/snackbar.gif" alt=""></p>
<h3 id="animation-사용"><code>animation</code> 사용</h3>
<ul>
<li><code>animation-fill-mode: forwards;</code> : 애니메이션 동작이 종료된 후, 마지막 to 상태를 유지</li>
</ul>
<pre><code class="language-css">#snackbar.show {
    visibility: visible;
    animation: fadeIn 0.5s, fadeOut 0.5s 2.5s forwards; /* 입력된 순서대로 동작 */
}

@Keyframes fadeIn {
    from { bottom: 0; opacity: 0; }
    to { bottom: 30px;  /* 원래 있던 위치 */
         opacity: 1;
    }
}
@Keyframes fadeOut {
    from { bottom: 30px; opacity: 1; }
    to { bottom: 0; opacity: 0; }
}</code></pre>
<h3 id="show-클래스-추가삭제-구현">show 클래스 추가/삭제 구현</h3>
<ul>
<li><p><code>setTimeout(function() {}, timer)</code> : timer가 만료된 뒤 함수나 지정된 코드를 실행하는 타이머를 설정 </p>
</li>
<li><p>show 버튼을 누르면 팝업창을 띄우고, 사라지게 하는 이벤트를 js에서 작성 후, html에 <code>onclick</code>의 속성값으로 넣어줌</p>
</li>
<li><p><code>onclick</code> : html 마우스 클릭 이벤트 속성, 속성값으로 전달 받은 함수는 &#39;호출 기호()&#39;를 붙인 상태(호출된 상태)로 입력해 줘야 함 (모든 html태그에 사용 가능)</p>
</li>
</ul>
<pre><code class="language-html">&lt;button type=&quot;button&quot; onclick=&quot;snackBarFunc()&quot;&gt;Show&lt;/button&gt;</code></pre>
<pre><code class="language-js">function snackBarFunc() {
    var snackbar = document.querySelector(&#39;#snackbar&#39;);
    snackbar.classList.add(&#39;show&#39;);

    setTimeout(function() {
        snackbar.classList.remove(&#39;show&#39;);
    }, 3500) // 전체 애메이션이 발동하는 시간
}</code></pre>
<h2 id="accordion">Accordion</h2>
<p>: 클릭 시 펼쳐지는 기능 (QnA 페이지에서 주로 사용)</p>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/35b9c588-307e-4438-b964-8d8e68a1ad1d/accordion.gif" alt=""></p>
<h3 id="초기-화면-설정">초기 화면 설정</h3>
<ul>
<li><p><code>max-height</code> 의 속성값으로 0을 입력해 초기 화면에서 보이지 않도록 함</p>
<pre><code class="language-css">.panel {
  overflow: hidden;
  width: 67.45%;
  margin: 0 auto;

  padding: 0 18px;
  color: #000000;

  max-height: 0;
  transition: max-height 0.2s linear;
}</code></pre>
</li>
</ul>
<h3 id="max-height-속성을-추가제거"><code>max-height</code> 속성을 추가/제거</h3>
<ul>
<li><p><code>toggle()</code> 메서드로 active 클래스가 존재하지 않을 시 삽입, 존재할 시 제거</p>
</li>
<li><p><code>.nextElementSibling</code> : 선택한 태그 바로 다음에 있는 형제 태그를 반환 (다음다음을 원하면 <code>nextElementSibling</code>을 이어서 써주면 된다)</p>
</li>
<li><p><code>.scrollHeight</code> : 스크롤바를 움직이지 않는 해당 요소의 높이값 반환</p>
</li>
</ul>
<pre><code class="language-js">var btns = document.querySelectorAll(&#39;.accordion&#39;); 
// accordian 클래스 명을 가진 모든 html 태그를 유사 배열 형식으로 반환

btns.forEach(function(btn) {
    btn.addEventListener(&#39;click&#39;, function() {
        // console.log(this); -&gt; btn객체 자체
        this.classList.toggle(&#39;active&#39;);

        var panel = this.nextElementSibling;
        console.log(panel.scrollHeight);

        // maxHeight 존재 여부로 분기 처리
        if(panel.style.maxHeight) {
            panel.style.maxHeight = null;
        } else {
            // maxHeight = 0 일 경우
            panel.style.maxHeight = panel.scrollHeight + &quot;px&quot;; 
        }
    })
})</code></pre>
<h2 id="slide">Slide</h2>
<p>: 하나의 이미지 영역에 서로다른 이미지가 교체가 되면서 fade out- fade in으로 나타내는 기능</p>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/686606f5-859d-4c8f-bd33-3c99fa6ac6c8/slide.gif" alt=""></p>
<h3 id="animation-사용-1"><code>animation</code> 사용</h3>
<ul>
<li><code>transition-timing-function</code> :  전환(transition) 효과의 시간당 속도를 설정</li>
<li><code>transition-timing-function:  ease-in-out;</code> : 전환(transition) 효과가 천천히 시작되어, 천천히 끝난다.</li>
</ul>
<p>(참고 사이트 : <a href="http://tcpschool.com/css/css3_transform_transition">http://tcpschool.com/css/css3_transform_transition</a>) </p>
<pre><code class="language-css">#slider .item {
    overflow: hidden;
    position: absolute;
    width: 100%;
    height: 500px;

    top: 0;
    left: 0;

    opacity: 0;

    transition: all 0.5s ease-in-out;
    transform: scale(0.9);

    z-index: 0;
}

#slider .item.show {
    opacity: 1;
    z-index: 10;
    transform: scale(1);
}</code></pre>
<h3 id="show-클래스-추가삭제">show 클래스 추가/삭제</h3>
<ul>
<li><p>css에서 적용하는 방식 그대로 <code>querySelector()</code>에서 가상 선택자 적용 가능</p>
</li>
<li><p><code>setInterval(function() {}, time)</code> : 두 번째 인수로 받은 시간이 될 때마다, 첫 번째 인수로 전달한 함수 호출</p>
</li>
</ul>
<h4 id="1-첫-번째-슬라이드">1. 첫 번째 슬라이드</h4>
<pre><code class="language-js">var firstSlide = document.querySelector(&#39;.item:first-child&#39;);</code></pre>
<h4 id="2-슬라이드-이벤트">2. 슬라이드 이벤트</h4>
<pre><code class="language-js">function slide() {
    // show 클래스가 들어가 있는 슬라이드(현재 보여지는 슬라이드)
    var currentSlide = document.querySelector(&#39;show&#39;);

    // 현재 show의 유무에 따라 분기 처리
    if(currentSlide) {
        currentSlide.classList.remove(&#39;show&#39;);
        var nextSlide = currentSlide.nextElementSibling;

        // 다음 슬라이드의 유무에 따라 분기 처리
        if(nextSlide) {
            nextSlide.classList.add(&#39;show&#39;);

        } else {
        // 다음 슬라이드가 없을 시, 처음 슬라이드로 돌아감
            firstSlide.classList.add(&#39;show&#39;);
        }

    } else {
          // 현재 show를 가진 슬라이드가 없을 시, 첫 번째 슬라이드로 이동 
        firstSlide.classList.add(&#39;show&#39;);
    }
}</code></pre>
<h3 id="3-자동화-트리거">3. 자동화 트리거</h3>
<ul>
<li><code>setInterval(function() {}, time)</code> : 두 번째 인자로 넣은 시간마다 함수를 실행
ㅊㅇ<pre><code class="language-js">slide(); // 앞서 만든 slide 함수 최초 호출
setInterval(slide, 2000);</code></pre>
</li>
</ul>
<h1 id="📌-학습내용-중-어려웠던-점">📌 학습내용 중 어려웠던 점</h1>
<hr>
<ol>
<li><code>setTimeout()</code>과 <code>setInterval()</code> 의 차이가 모호</li>
</ol>
<h1 id="📌-해결방법">📌 해결방법</h1>
<hr>
<ol>
<li>여러 블로그를 통해 정리해 보았다. 둘 다 주기적인 실행을 위한 메서드이다. </li>
</ol>
<ul>
<li><p><code>setInterval()</code> 
일정한 시간을 간격으로 코드를 반복 실행 </p>
</li>
<li><p><code>setTimeout()</code>
일정한 시간 후에 작업을 딱 한 번만 실행해준다. 일정한 시간을 기다린 후 작업이 실행되고, 또 다시 일정한 시간을 기다린 후 작업이 실행되는 형식 </p>
</li>
<li><p>둘 다 set 대신 clear을 더하면 중지할 수 있음 (실행하고 있는 것을 중지하는 것이 아닌 해당 함수의 실행자체가 되지 않는 것) </p>
</li>
</ul>
<p>(참고 사이트 : <a href="https://blog.naver.com/kiera_j/222295866883">https://blog.naver.com/kiera_j/222295866883</a>) </p>
<h1 id="📌-학습소감">📌 학습소감</h1>
<hr>
<p>실습을 하는 동안 css와 html로 간단한 작업도 포함되어 있었는데, <code>animation</code> 속성을 잠시 잊고 있어서 이렇게도 활용이 될 수 있구나 새삼 배웠다. 요 며칠간 계속 js에만 신경썼더니 앞쪽 부분에 대해 살짝씩 잊어가는 부분이 있어서, 복습을 돌려야겠다. 😂</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[210903 개발일지]]></title>
            <link>https://velog.io/@jiyoon_jeong2005/210903-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@jiyoon_jeong2005/210903-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Fri, 03 Sep 2021 07:50:36 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-학습한-내용">📌 학습한 내용</h1>
<hr>
<h3 id="전체-코드--💾">전체 코드 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/js-Project">💾</a></h3>
<h2 id="to-do-list">To-do List</h2>
<p>: 입력된 값을 리스트에 추가하고, 삭제 버튼으로 삭제, 완료 버튼으로 리스트 하단으로 이동
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/3e725af8-e0b2-415d-a7eb-da627751127d/todo%20list.gif" alt=""></p>
<h3 id="1-html-css로-디자인">1. html, css로 디자인</h3>
<ul>
<li><p><a href="https://meyerweb.com/eric/tools/css/reset/">reset.css</a> 로 디폴트값들 초기화</p>
</li>
<li><p><code>text-indent</code> : 값이 양수이면 들여쓰기, 값이 음수이면 내어쓰기 적용, 디폴트값은 0
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/55250b54-5f59-4083-b4aa-3be20cd62b08/text-indent.gif" alt=""></p>
</li>
<li><p>html파일에서 <code>&lt;li&gt;</code>는 주석처리</p>
</li>
<li><p><code>&lt;inpu&gt;</code>의 <code>placeholder</code> 디자인 (일부 브라우저에서만 지원 -&gt; prefix 넣어주기)</p>
<pre><code class="language-css">header input::-webkit-input-placeholder {
  color: #ffffff;
}</code></pre>
</li>
</ul>
<h3 id="2-add버튼-클릭-시-리스트에-추가">2. add버튼 클릭 시 리스트에 추가</h3>
<pre><code class="language-js">// add 객체에 접근
var addBtn = document.getElementById(&#39;add&#39;); 

// add 버튼 &#39;클릭&#39; 시 이벤트
addBtn.addEventListener(&#39;click&#39;, function() { 
    var value = document.getElementById(&#39;txt&#39;).value;

    // if 문으로 입력된 값이 있는 경우/없는 경우 분기처리
    if(value) {
        addListTodo(value);
        document.getElementById(&#39;txt&#39;).value = &quot;&quot;;
    }
});</code></pre>
<ul>
<li><p><code>.value</code>로 <code>&lt;input&gt;</code>에 입력된 값 가져옴</p>
</li>
<li><p>(입력된 값을 리스트로 추가한 후에,) <code>&lt;input&gt;</code>창 비워주기
(1) <code>&lt;form&gt;</code> 안에 <code>&lt;input&gt;</code>이 존재할 때, <code>reset()</code>메서드 사용해 이전 상태로 돌려주기
(2) <code>&lt;input&gt;</code> 사용 시, <code>getElementById</code>로 <code>&lt;input&gt;</code>영역에 <code>value</code>지정 후, 빈 문자열 재할당 ✔</p>
</li>
</ul>
<h3 id="3-입력된-값-리스트에-추가">3. 입력된 값 리스트에 추가</h3>
<pre><code class="language-js">function addListTodo(text) {

    // 함수 호출 시, todo 영역을 가져오고 &lt;li&gt; 생성
    var list = document.getElementById(&#39;todo&#39;);
    var item = document.createElement(&#39;li&#39;);
    // &lt;input&gt;에 입력한 글자를 `&lt;li&gt;`의 값으로 할당
    item.textContent = text;

    // 버튼 영역을 감싸는 &lt;div class=&quot;buttons&quot;&gt; 생성 
    var buttons = document.createElement(&#39;div&#39;);
    buttons.classList.add(&#39;buttons&#39;);

    // 리스트 삭제/완료 버튼 생성
    var remove = document.createElement(&#39;button&#39;);
    remove.classList.add(&#39;remove&#39;);
     // removeList 이벤트와 연동
    remove.addEventListener(&#39;click&#39;, removeList); 

    var complete = document.createElement(&#39;button&#39;);
    complete.classList.add(&#39;complete&#39;);
     // completeList 이벤트와 연동
    complete.addEventListener(&#39;click&#39;, completeList);

    // 조립 (안쪽에서 부터 바깥쪽으로)
    buttons.appendChild(remove);
    buttons.appendChild(complete);
    item.appendChild(buttons);

    // 가장 마지막에 입력한 값이 리스트의 최상단에 위치되게 하기
    // childNodes[0] - 가장 먼저 나오는 &lt;li&gt;?의 위치(인덱스)
    list.insertBefore(item, list.childNodes[0]);
}</code></pre>
<ul>
<li><p><code>createElement()</code> : 인수로 넣은 html 태그를 만들어 반환</p>
</li>
<li><p><code>부모.insertBefore()</code> : 첫 번째 인수로 삽입할 요소를 전달, 해당 요소가 들어갈 위치</p>
</li>
</ul>
<h3 id="4-remove-버튼-클릭-시-리스트에서-삭제">4. remove 버튼 클릭 시, 리스트에서 삭제</h3>
<pre><code class="language-js">// 1. 클릭한 영역의 &lt;li&gt; 삭제
// 2. 클릭한 영역 가져오기

function removeList() {
    // this = remove 객체
     // parentNode를 활용해 remove 객체의 부모의 부모인 &lt;li&gt; 선택
    var item = this.parentNode.parentNode; 
    var parent = item.parentNode;  // &lt;ul&gt; 선택

    parent.removeChild(item);
}</code></pre>
<ul>
<li><code>.parentNode</code> : 해당 요소의 부모태그를 반환</li>
</ul>
<h3 id="4-complete-버튼-클릭-시-리스트-하단으로-이동">4. complete 버튼 클릭 시, 리스트 하단으로 이동</h3>
<pre><code class="language-js">function completeList() {

    var item = this.parentNode.parentNode;
    var parent = item.parentNode;

    var id = parent.id;
    // 삼항 연산자 사용 -&gt; &lt;li&gt;가 어떤 &lt;ul&gt;안에 있는가에 따라 달라짐
    var target = (id === &#39;todo&#39;)
            ? document.getElementById(&#39;completed&#39;)
            : document.getElementById(&#39;todo&#39;);

    // 삭제 기능
    parent.removeChild(item);

    // 최신 값을 최상단에 배치
    target.insertBefore(item, target.childNodes[0]);
}</code></pre>
<p>*<code>.id</code> : 해당 요소의 <code>id</code>의 속성값 반환 프로퍼티</p>
<h2 id="mouse-animation">Mouse Animation</h2>
<p>: 마우스의 움직임에 따라 이미지가 이동
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/c0169e33-823d-404a-8a58-7fdaa34bf16d/ezgif.com-gif-maker.gif" alt=""></p>
<h3 id="1-html-css로-디자인-1">1. html, css로 디자인</h3>
<pre><code class="language-css">.page-container {
    position: fixed;
    width: 100%;
    height: 100%;
    background-color: #ffffff;
}

.page-back {
    position: absolute;
    height: 120%;
    width: 120%;  
    /* 자식의 크기가 부모보다 더 크게 만들어줌 */

    left: -10%;
    top: -10%;
    background-size: cover;
    background-position: center;
    background-image: url(bg.jpg);
}</code></pre>
<ul>
<li>상하좌우 모든 영역에 10% 만큼 화면보다 크게 설정</li>
</ul>
<h3 id="2-마우스-움직일-시-이벤트-추가">2. 마우스 움직일 시, 이벤트 추가</h3>
<pre><code class="language-js">// 필요한 요소 및 객체 호출
var pageContainer = document.querySelector(&#39;.page-container&#39;);
var pageBack = document.querySelector(&#39;.page-back&#39;);

var windowWidth = window.innerWidth;
var windowHeight = window.innerHeight; 

// 이벤트 추가
pageContainer.addEventListener(&#39;mousemove&#39;, function(e) {

    // 마우스의 현재 좌표를 가져오기 위해 이벤트 객체 e 활용 -&gt; pageX, pageY
    // console.log(&#39;e.pageX&#39;, e.pageX);
    // console.log(&#39;e.pageY&#39;, e.pageY);

    // 마우스 좌표값 수치를 축소한 x, y 값을 생성
    var moveX = ((windowWidth / 2) - e.pageX) * 0.1;
    var moveY = ((windowHeight / 2) - e.pageY) * 0.1;
    // 해당 수치를 이용해 background-back 이 움직이는 효과 생성

    pageBack.style.marginLeft = moveX + &quot;px&quot;;
    pageBack.style.marginTop = moveY  + &quot;px&quot;;

      // 템플릿 리터럴 사용 가능
      pageBack.style.marginLeft = `${moveX}px`;
    pageBack.style.marginTop = `${moveY}px`;
})</code></pre>
<ul>
<li><code>mousemove</code> : <code>addEvenetListener</code>의 첫 번째 인자 중 하나, 마우스 움직임이 있을 때</li>
<li><code>window.innerWidth</code> : 화면(브라우저) 안쪽의 width값 반환</li>
<li><code>window.innerHeught</code> : 화면(브라우저) 안쪽의 height값 반환</li>
</ul>
<ul>
<li>움직임이 있는 애니메이션은 gpu를 활용하는 <code>transform</code>,<code>translate</code> 속성을 사용하는 것이 성능면에서 효율적(css3) -&gt; 부드러운 애니메이션 동작 처리</li>
<li>margin, top 등은 연산을 처리하는 cpu를 활용<pre><code class="language-js">pageBack.style.transform = `translate(${moveX}px, ${moveY}px)`;</code></pre>
</li>
</ul>
<h2 id="scroll-top">Scroll Top</h2>
<p>: 스크롤 동작에 따라, 상단 네비게이션의 배경색과 글자색 변경</p>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/b5595c5c-da10-4c8f-b125-b4812d64e717/scroll%20top.gif" alt=""></p>
<h3 id="1-html-css-디자인">1. html, css 디자인</h3>
<pre><code class="language-css">nav {
    position: fixed;
    width: 100%;
    background-color: #000000;

    border-bottom: solid 1px rgba(0, 0, 0, .1);

    padding: 22px 100px;
    transition: all 0.5s;

    display: flex;
    justify-content: space-between;
    align-items: center;
}</code></pre>
<ul>
<li><code>transition: all</code> : 모든 속성이 transition 효과를 갖게 된다.</li>
</ul>
<h3 id="2-스크롤-시-이벤트-추가">2. 스크롤 시, 이벤트 추가</h3>
<h4 id="스크롤-접근-방법-모두-같은-효과를-담당">스크롤 접근 방법 (모두 같은 효과를 담당)</h4>
<ol>
<li><code>window.addEventListener(&#39;scroll&#39;)</code> ✔</li>
<li><code>winddow.onscroll = function () {스크롤 발생시 동작되는 기능}</code></li>
<li><code>document.addEventListener(&#39;scroll&#39;)</code></li>
</ol>
<h4 id="방법1-일정-위치-이상-스크롤이-내려가면-색-변경">방법1. 일정 위치 이상 스크롤이 내려가면 색 변경</h4>
<pre><code class="language-js">// 스크롤 감지 property
window.addEventListener(&#39;scroll&#39;, function () {
    var top = window.scrollY // explore 제외 모든 브라우저 지원
        || window.pageYOffset // explore 9 이상부터 지원
        || document.documentElement.scrollTop // explore 8 이하 가능, chrome x
        || document.body.scrollTop // chrome, safari, opera, edge 가능

    // 스크롤 위치가 내려갈 때, .active 클래스 추가
    // 한 줄짜리 if문은 삼항연산자 사용
    (top &gt; 50)
        ? fixedNav.classList.add(&#39;active&#39;)
        : fixedNav.classList.remove(&#39;active&#39;);
});</code></pre>
<ul>
<li><p>top 변수를 생성해 스크롤 좌표를 감지하는 여러 property를 ||(or 연산자, vertical bar)로 연결해줌 -&gt; 브라우저마다 호환되는 속성이 다르기 때문(크로스 브라우징)</p>
</li>
<li><p><code>&lt;nav&gt;</code> 영역이 자연스럽게 fade in/out 되는 이유는 <code>transition: all</code>을 css에 미리 적용했기 때문</p>
</li>
</ul>
<h4 id="방법2-스크롤이-내려가는-상태올라가는-상태인지에-따라-색-변경">방법2. 스크롤이 내려가는 상태/올라가는 상태인지에 따라 색 변경</h4>
<ul>
<li>기존 스크롤 위치로 기준점을 잡고, 기준점에 스크롤의 현재 위치를 빼준 결과값에 따라 스크롤의 상태를 구분</li>
</ul>
<pre><code class="language-js">var fixedNav = document.querySelector(&#39;nav&#39;);

var oldVal = 0; // 기준점

// 스크롤 위치 감지
window.addEventListener(&#39;scroll&#39;, function () {
    var newVal = window.scrollY
            || window.pageYOffset
            || document.documentElement.scrollTop
            || document.body.scrollTop

    // 스크롤을 내린 상태
    if(oldVal - newVal &lt; 0) {
        fixedNav.classList.add(&#39;active&#39;);
    }

    // 스크롤을 올린 상태
    if(oldVal -newVal &gt; 0) {
        fixedNav.classList.remove(&#39;active&#39;);
    }

    oldVal = newVal</code></pre>
<h4 id="방법3-브라우저가-스크롤의-상태-파악-권장-x">방법3. 브라우저가 스크롤의 상태 파악 (권장 x)</h4>
<ul>
<li>이벤트 객체 e를 사용해 <code>e.wheelDelata</code> 값이 양수냐 음수냐에 따라, 현재 스크롤이 내려간 상태인지 올라간 생태인지를 파악할 수 있다.</li>
</ul>
<p>(참고 사이트: <a href="https://cometome1004.tistory.com/63">https://cometome1004.tistory.com/63</a>)</p>
<pre><code class="language-js">var fixedNav = document.querySelector(&#39;nav&#39;);

window.addEventListener(&#39;wheel&#39;, mouseWheelEvt);
window.addEventListener(&#39;DOMMouseScroll&#39;, mouseWheelEvt);

function mouseWheelEvt(e) {
    var index = e.wheelDelta ? e.wheelDelta : -e.detail;

    (index &lt; 0)
        ? fixedNav.classList.add(&#39;active&#39;)
        : fixedNav.classList.remove(&#39;active&#39;);
}</code></pre>
<ul>
<li><p>브라우저마다 <code>wheelDelta</code>의 존재여부가 다르기 때문에 삼항연산자를 사용</p>
</li>
<li><p>단 해당 코드는 Firefox에서는 동작하지 x -&gt; <code>addEvenetListern</code>의 첫 번째 인자로 <code>DOMMouseScroll</code>을 넣어줘야 한다.</p>
</li>
</ul>
<h4 id="접속한-브라우저의-종류를-파악해-eventlistner의-첫-번째-인자값-구분">접속한 브라우저의 종류를 파악해 EventListner의 첫 번째 인자값 구분</h4>
<ul>
<li><p><code>navigator.userAgent</code> : 현재 접속한 브라우저의 종류를 문자열로 반환
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/053bef29-6fed-4b91-a246-5723d452cb63/image.png" alt=""></p>
</li>
<li><p><code>.indexOf()</code> : 문자열에서 사용 가능한 메서드, 인자로 받은 값이 존재하면 해당 글자의 좌표값을 , 존재하지 않으면 -1을 반환</p>
</li>
</ul>
<pre><code class="language-js">var isFirefox = (navigator.userAgent.indexOf(&#39;Firefox&#39;) !== -1);
var wheelEvt = isFirefox ? &#39;DOMMousScroll&#39; : &#39;wheel&#39;;

window.addEventListener(wheelEvt, mouseWheelEvt);

function mouseWheelEvt(e) {
    var index = e.wheelDelta ? e.wheelDelta : -e.detail;

    (index &lt; 0)
        ? fixedNav.classList.add(&#39;active&#39;)
        : fixedNav.classList.remove(&#39;active&#39;);
};</code></pre>
<h2 id="modal">Modal</h2>
<p>: 버튼 클릭 시 (반투명한 레이어가 깔려있는 팝업창) modal창을 띄우고, 닫기 버튼 혹은 창이 아닌 곳을 클릭하면 modal 창이 닫히는 효과</p>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/2890e81e-9374-4e48-916e-5efd740eb47b/modal.gif" alt=""></p>
<h3 id="1-html-css로-디자인-2">1. html, css로 디자인</h3>
<p><strong>&lt;해당 객체를 보이거나 보이지 않게 처리하는 css속성&gt;</strong></p>
<ul>
<li><code>visibility: hidden &lt;-&gt; visible;</code> : 영역은 차지한 상태로 사용자 눈에만 보이지 않음.  </li>
<li><code>display: none &lt;-&gt; block</code> : 공간의 크기를 인식하지 x,  보이지도 않고 해당 공간도 존재하지 않게 됨, 삭제의 개념</li>
</ul>
<pre><code class="language-css">.modal {
    position: fixed;
    visibility: hidden;

    top: 0;
    left: 0;
    right: 0;
    bottom: 0;

    opacity: 0;

    z-index: 999999;

    transition: all 0.5s;    
}

.modal.active {
    visibility: visible;
    opacity: 1;
}</code></pre>
<ul>
<li><code>visibility: hidden;</code>으로 최소상태에서의 modal창을 숨김 처리 하고, <code>.active</code> 클래스를 삽입했을 시 보이는 형태로 넣어준다.</li>
</ul>
<h3 id="2-버튼-클릭시-modal창-띄우기">2. 버튼 클릭시 modal창 띄우기</h3>
<pre><code class="language-js">// 필요한 객체 불러오기
var btnModal = document.querySelector(&#39;.btn-modal&#39;);
var modal = document.querySelector(&#39;.modal&#39;);
var btnClose = document.querySelector(&#39;.modal .btn-modal&#39;);

btnModal.addEventListener(&#39;click&#39;, function() {
    modal.classList.add(&#39;active&#39;);
});</code></pre>
<h3 id="3-close-버튼-클릭시-modal창-닫기">3. Close 버튼 클릭시 modal창 닫기</h3>
<pre><code class="language-js">btnClose.addEventListener(&#39;click&#39;, function() {
    modal.classList.remove(&#39;active&#39;);
});</code></pre>
<h3 id="4-modal창-외부-클릭-시-modal-창-닫기">4. modal창 외부 클릭 시, modal 창 닫기</h3>
<ul>
<li><code>e.target</code> : 이벤트 발동 시, 참조된 태그 반환</li>
<li><code>.contains</code> : 문자열 포함 여부 확인</li>
</ul>
<pre><code class="language-js">modal.addEventListener(&#39;click&#39;, function(e) {
    var target = e.target; 
      // 클릭한 영역에 &#39;modal-layer&#39;가 포함되어 있다면 작동
    var isLayer = target.classList.contains(&#39;modal-layer&#39;);

    if(isLayer) {
        modal.classList.remove(&#39;active&#39;);
    }
});</code></pre>
<h1 id="📌-학습내용-중-어려웠던-점">📌 학습내용 중 어려웠던 점</h1>
<hr>
<h1 id="📌-해결방법">📌 해결방법</h1>
<hr>
<h1 id="📌-학습소감">📌 학습소감</h1>
<hr>
<p>반복해서 작업하다 보니 자주 쓰는 객체와 메서드는 눈에 익었다. 확실히 처음 실습때 보다 따라가는 속도도 빨라졌고, 약간이지만 디자인도 넣을 수 있을 정도로는 여유가 생긴 것 같다. 😊</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[210902 개발일지]]></title>
            <link>https://velog.io/@jiyoon_jeong2005/210902-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@jiyoon_jeong2005/210902-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Thu, 02 Sep 2021 12:10:56 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-학습한-내용">📌 학습한 내용</h1>
<hr>
<h3 id="전체-코드--💾">전체 코드 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/js-bootstrap">💾</a></h3>
<h2 id="dom-객체">DOM 객체</h2>
<p>: 문서 객체 모델(The Document Object Model)로 XML이나 HTML 문서에 접근하기 위한 일종의 인터페이스. 문서 내의 모든 요소를 정의하고, 각각의 요소에 접근하는 방법을 제공.
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/524e8482-8efc-4be3-b0a9-cc01092d7deb/image.png" alt="">
(이미지 출처 : <a href="https://www.w3schools.com/js/js_htmldom.asp">https://www.w3schools.com/js/js_htmldom.asp</a>)</p>
<ul>
<li><p><strong>element(html태그), text(html태그 사이에 들어가는 글자 정보), attribute(html태그의 속성)</strong></p>
</li>
<li><p>새로운 html 태그를 생성해서 html에 문서에 삽입 가능</p>
</li>
<li><p>기존 html 문서 안에 있는 태그를 JS로 삭제 가능</p>
</li>
<li><p>기존 html 태그 안에 새로운 속성 할당 가능</p>
</li>
<li><p>css변경/제거 가능</p>
</li>
<li><p>html 태그에 이벤트 추가 가능</p>
</li>
</ul>
<h2 id="html에-접근하는-법">html에 접근하는 법</h2>
<h3 id="getelement">getElement*</h3>
<ul>
<li><p><code>document.getElementsByTagName(태그);</code> 
: 태그를 기준으로 html 정보를 가져올 때(정보에 접근) 사용되는 메서드 -&gt; 유사 배열 형태로 반환 (HTMLCollection = <strong>유사배열</strong> : 배열과 유사한 형태, 배열에 존재하는 메서드들 중에서 일부 메서드는 활용 불가)</p>
</li>
<li><p><code>document.getElementsByClassName(class);</code> 
: class를 기준으로 html 정보를 가져올 때 -&gt; 유사 배열 형태로 반환</p>
</li>
<li><blockquote>
<p> 특정 섹션 내부에 있는 class에 접근 하는 방법</p>
</blockquote>
<pre><code class="language-js">var services = document.getElementById(&quot;services&quot;);
var serviceContainer = services.getElementsByClassName(&quot;container&quot;);
</code></pre>
</li>
</ul>
<p>console.log(container);</p>
<pre><code>
* `document.getElementById(id);` 
: id를 기준으로 html 정보를 가져올 때 -&gt; 해당 id를 가진 하나의 영역 반환

### querySelector*

* `document.querySelector(&quot;태그/#id/.class&quot;)`
: css에서 html에 접근하는 방식과 동일하게 js에서 접근 가능 (getElement* 보다 간편)

* 가장 먼저 나오는 태그/class만 하나만 반환

* 특정 섹션 내부에 있는 class에 접근 하는 방법
```js
var servicesContainer = document.querySelector(&quot;#services .container&quot;);
console.log(servicesContainer);</code></pre><ul>
<li><p>html에 문서에 접근하는 속도 <code>getElement*</code> &gt; <code>querySelector*</code>
편의성 <code>getElement*</code> &lt; <code>querySelector*</code></p>
</li>
<li><p><code>querySelectorAll()</code> : 해당되는 모든 태그, class 객체 모두 반환 </p>
</li>
<li><blockquote>
<p>유사 배열 형태로 반환(NodeList)</p>
</blockquote>
</li>
<li><blockquote>
<p><strong>반복문과 결합하여 일괄적인 디자인 적용이 가능</strong></p>
</blockquote>
<pre><code class="language-js">for(var i = 0; i &lt; container.length; i++) {
   // console.log(container[i]);  // 각각의 container에 접근
   container[i].style.backgroundColor = &quot;yellow&quot;
} </code></pre>
</li>
</ul>
<h2 id="html-컨텐츠-정보-변경-및-추가">html 컨텐츠 정보 변경 및 추가</h2>
<h3 id="innerhtml-outerhtml">innerHTML, outerHtml</h3>
<p>: <strong>태그가 포함된 형태(작동하는 형태)로 전달</strong></p>
<ul>
<li><p><code>element.innerHTML</code> : 요소 안에 있는 내용물을 문자열 형태로 반환</p>
</li>
<li><p><code>element.outerHTML</code> : 자기 자신을 포함해 요소 안에 있는 내용물을 문자열 형태로 반환</p>
</li>
</ul>
<p><strong>👉 특정 영역에 접근할 수 있으면 변경도 가능하다.</strong></p>
<ul>
<li>요소 안의 내용물을 모두 지우고 새로운 데이터를 삽입 가능<pre><code class="language-js">var header = document.querySelector(&quot;.masthead&quot;);
//console.log(header.innerHTML);
//console.log(header.outerHTML);
</code></pre>
</li>
</ul>
<p>header.innerHTML = &quot;<h1>Hello World</h1>&quot;</p>
<pre><code>![](https://images.velog.io/images/jiyoon_jeong2005/post/a71a0ef5-c574-4094-b48c-6acf3af84a66/%EC%A0%9C%EB%AA%A9%20%EC%97%86%EC%9D%8C.png)

### textContent, innerText
: **순수 글자 정보만 기입(태그도 단순 글자 정보로 인식)**
* `element.textContent` : element 내부에 작성된 텍스트(html에 작성된 그 상태)에 접근, 변경 가능

* `element.innerText` : css가 적용된 형태로 element 내부에 작성된 텍스트를 반환

## html 태그 작성 및 삽입
### html 태그 생성
#### createElement()
: 생성할 태그를 인수로 받는다. 코드상으로만 존재하는 상태(삽입 전)
```js
var h3Test = document.createElement(&quot;h3&quot;);
h3Test.textContent = &quot;Helow World!&quot;;</code></pre><h3 id="html-태그-삽입">html 태그 삽입</h3>
<h4 id="appendchild">appendChild()</h4>
<p>: 자식 태그를 추가함, <code>부모.appendChild(삽입할 태그)</code></p>
<pre><code class="language-js">var masthead = document.querySelector(&#39;.masthead&#39;);
masthead.appendChild(h3Test);</code></pre>
<ul>
<li>삽입되는 태그는 부모 태그 내에서 가장 뒤쪽에 삽입이 된다.
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/f9158392-0624-4a29-b541-668b1c835e71/image.png" alt=""></li>
</ul>
<p>👉 <strong><code>appendChild()</code> 사용 시 주의점</strong>
: 공통된 형제를 갖고 있는 영역에 동시에 <code>appendChild()</code>를 적용할 경우, 마지막 자식에게만 적용이 된다.</p>
<pre><code class="language-js">
var subHeading = document.querySelector(&#39;.masthead-subheading&#39;);
var heading = document.querySelector(&#39;.masthead-heading&#39;);
var btn = document.querySelector(&#39;.masthead .btn&#39;);

subHeading.appendChild(h3Test);
heading.appendChild(h3Test);
btn.appendChild(h3Test);</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/fb622685-bacc-41cc-adf4-8366af4a5fce/%ED%99%94%EB%A9%B4%20%EC%BA%A1%EC%B2%98%202021-09-03%20224604.png" alt=""></p>
<h4 id="insertadjacenthtml">insertAdjacentHTML()</h4>
<p>: 원하는 위치에 태그 삽입 가능</p>
<ul>
<li><code>element.insertAdjacentHTML(&#39;position&#39;, text);</code>
: 어떤 태그를 기준으로.inserAdjacentHTML(어느 위치에 삽입, 삽입되는 값)<ul>
<li>position에 들어 갈 수 있는 값 :<pre><code class="language-html">&lt;!-- beforebegin - element의 열린태그 앞 --&gt;
&lt;p&gt;
&lt;!-- afterbegin - element의 열린태그, 닫힌태그 사이 --&gt;
foo
&lt;!-- beforeend - element의 닫힌태그 앞 --&gt;
&lt;/p&gt;
&lt;!-- afterend - element 뒤에 --&gt;</code></pre>
(참고 사이트 : <a href="https://developer.mozilla.org/ko/docs/Web/API/Element/insertAdjacentHTML">https://developer.mozilla.org/ko/docs/Web/API/Element/insertAdjacentHTML</a>)</li>
</ul>
</li>
</ul>
<h3 id="html-태그-삭제">html 태그 삭제</h3>
<h4 id="removechild">removeChild()</h4>
<p>: 부모를 기준으로(경유해서) 태그 삭제, <code>삭제할 태그의 부모.removeChild(삭제할 태그)</code></p>
<ul>
<li><code>.parentElement</code> : 해당 태그의 부모 태그 반환</li>
</ul>
<pre><code class="language-js">var headContainer = document.querySelector(&quot;.masthead .container&quot;); // 부모 태그
var heading = document.querySelector(&quot;.masthead-heading&quot;); // 삭제할 태그

// headContainer.removeChild(heading); -&gt; 부모를 경유해서 삭제
heading.parentElement.removeChild(heading); 
// 위와 같은 의미</code></pre>
<h4 id="remove">remove()</h4>
<p>: 부모 태그 호출 필요없이, 해당 요소 바로 삭제</p>
<pre><code class="language-js">heading.remove();</code></pre>
<h3 id="html-자식-요소-선택">html 자식 요소 선택</h3>
<ul>
<li><p><code>부모.firstElementChild</code> : 부모 요소의 여러 자식 요소 중에서 가장 처음에 나오는 요소를 반환</p>
</li>
<li><p><code>부모.lastElementChild</code> : 부모 요소의 여러 자식 요소 중에서 가장 마지막에 나오는 요소를 반환</p>
</li>
</ul>
<h2 id="css-제어적용">css 제어(적용)</h2>
<h3 id="stylecss속성">style.css속성</h3>
<ul>
<li><p>css 속성은 camel case로 작성</p>
</li>
<li><p>JS로 css 적용 시, style 속성을 이용해 태그에 직접적으로 할당이 되므로, 캐스케이딩으로 인해 css에 적용한 속성값 보다 우선순위가 높아짐</p>
</li>
</ul>
<pre><code class="language-js">heading.style.color = &quot;red&quot;;
heading.style.backgroundCoor = &quot;greenyellow&quot;;
heading.style.fontSize = &quot;25px&quot;;</code></pre>
<h3 id="stylecsstext">style.cssText</h3>
<ul>
<li>오타 발생시 찾기 어려움</li>
</ul>
<pre><code class="language-js">heading.style.cssText = &quot;color : red; background-color: greenyellow; font-size: 25px&quot;;</code></pre>
<h3 id="setattribute">setAttribute()</h3>
<ul>
<li><p>JS에서 html의 태그 속성을 attrubute라고 칭함</p>
</li>
<li><p><code>element.setAttribute(&quot;추가할 속성&quot;, &quot;속성값&quot;);</code></p>
<pre><code class="language-js">heading.setAttribute(&quot;id&quot;, &quot;test&quot;);
heading.setAttribute(&quot;style&quot;, &quot;color : red; background-color: greenyellow; font-size: 25px&quot;);</code></pre>
</li>
<li><p>새로운 id를 추가한 후, 해당 id를 <code>querySelector</code>이용해 디자인을 적용할 수 있다.</p>
<pre><code class="language-js">heading.setAttribute(&quot;id&quot;,&quot;heading-test&quot;);
document.querySelector(&quot;#heading-test&quot;).style.backgroundColor = &quot;greenyellow&quot;;</code></pre>
</li>
</ul>
<h2 id="css-class-접근">css class 접근</h2>
<h3 id="classname">className</h3>
<ul>
<li><p>해당 요소에 있는 모든 클래스 자체를 하나의 긴 문자열로 가져옴</p>
</li>
<li><p>개별 클래스에 접근하기 위해 <code>split()</code>메서드 사용 필요</p>
</li>
<li><p><code>.split()</code> : 전달된 인수를 기준으로 규칙을 만들고, 규칙하에 글자를 잘라내고 배열 형태로 바꿀 때 사용.</p>
<pre><code class="language-js">var heading = document.querySelector(&quot;.masthead-heading&quot;);
var headingClass = heading.className;
var HeadingArr = headingClass.split(&quot; &quot;); // 공백 기준
</code></pre>
</li>
</ul>
<p>console.log(HeadingArr);
console.log(HeadingArr[0]);
console.log(HeadingArr[1]);</p>
<pre><code>![](https://images.velog.io/images/jiyoon_jeong2005/post/d4cd06a6-c4ad-413e-821e-7cbcc3e52e9c/image.png)

* 새로운 클래스 추가 가능 -&gt; 단, 기존 클래스들은 삭제됨
```js
heading.className = &quot;test&quot;;
heading.className = &quot;masthead-heading text-uppercase test&quot; // 기존 클래스를 함께 넣어줘야 유지됨</code></pre><h3 id="classlist">classList</h3>
<ul>
<li><p><code>DOMTokenList</code>라는 유사 배열 형태로 반환</p>
</li>
<li><p><code>split()</code> 메서드를 사용할 필요 x</p>
</li>
<li><p>개별 클래스에 접근하기 위해 인덱스로 접근하는 방식은 동일</p>
<pre><code class="language-js">var heading = document.querySelector(&quot;.masthead-heading&quot;);
var headingClass = heading.classList;
</code></pre>
</li>
</ul>
<p>console.log(headingClass);</p>
<pre><code>![](https://images.velog.io/images/jiyoon_jeong2005/post/72861b3f-ccb5-4c72-a633-e0172718f284/image.png)

#### class 추가, 삭제
* `classList.add()` : 기존 클래스는 유지한 상태로 인수에 받은 새로운 클래스를 추가함 (여러 개 동시에 가능)

* `classList.remove()` : 기존 클래스 삭제
* `classList.toggle()` : 선택한 요소에 인수에 해당하는 클래스가 없을 경우 추가, 있을 경우 삭제

```js
heading.classList.add(&quot;test&quot;, &quot;test2&quot;, &quot;test3&quot;);
heading.classList.remove(&quot;text-uppercase&quot;);
heading.classList.toggle(&quot;test&quot;);</code></pre><h4 id="contains">contains()</h4>
<p>: 해당 영역에 인자로 받은 클래스의 유무를 확인, true/false로 반환</p>
<pre><code class="language-js">console.log(heading.classList.contains(&quot;text-uppercase&quot;));  // true</code></pre>
<h2 id="eventlistener">EventListener()</h2>
<h3 id="addeventlistener">addEventListener()</h3>
<ul>
<li><p><code>element.addEventListener(&quot;이벤트의 종류&quot;, &quot;호출할 함수&quot;)</code>: 인수에 지정한 이벤트가 대상에 전달될 때마다 호출할 함수를 설정</p>
<ul>
<li>이벤트의 종류
: click, submit, keyup/keydown(키보드 입력시 상태값 인식) 등 </li>
<li>참고 사이트 :                 <a href="https://www.w3schools.com/jsref/dom_obj_event.asp">https://www.w3schools.com/jsref/dom_obj_event.asp</a></li>
</ul>
</li>
</ul>
<pre><code class="language-js">// 1. 콜백 함수
var heading = document.querySelector(&quot;.masthead-heading&quot;);
heading.addEventListener(&quot;click&quot;, function() {
    console.log(&quot;Click&quot;);
})

// 2. 생성한 함수
var heading = document.querySelector(&quot;.masthead-heading&quot;);
function test() {
    console.log(&quot;클릭&quot;);
}
heading.addEventListener(&quot;click&quot;, test); // 두 번째 인수로 함수명만 전달해줘야 함 (콜백함수)</code></pre>
<h3 id="removeeventlistener">removeEventListener()</h3>
<p>: add로 추가한 이벤트를 제거할 때 사용</p>
<ul>
<li><code>removeEventListener()</code>를 활용하기 위해서는 <code>addEventListener()</code>의 상태값과 동일하게 적용되어 있어야 한다. 단, 함수는 참조형 데이터 타입이기 때문에 값이 동일해도 주소값이 다르면 다른 객체로 취급된다. 따라서 <strong>별도의 함수를 생성</strong>(위의 2번 방법)해서 그 함수명만 각각 두 번째 인수로 전달해야 한다.<pre><code class="language-js">heading.addEventListener(&quot;click&quot;, function test() {
 console.log(&quot;클릭&quot;);
});
heading.removeEventListener(&quot;click&quot;, function test() {
 console.log(&quot;클릭&quot;);
});
</code></pre>
</li>
</ul>
<p>// =&gt; removeEventListener가 제대로 작동하지 x, 
// 콜백 함수는 같더라도 저장된 주소값이 다름</p>
<p>function test() {
    console.log(&quot;클릭&quot;);
}
heading.addEventListener(&quot;click&quot;, test);
heading.removeEventListener(&quot;click&quot;, test);</p>
<pre><code>---
### 해당 코드 : [💾](https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/js-prevent)

## preventDefault
: html 태그가 가지고 있는 본연의 기능을 막아줌
-&gt; 원래 해당 태그가 갖고 있는 이벤트에 접근해야 함

* 콜백함수의 매개변수로 &#39;e(이벤트 객체)&#39; 전달
```html
&lt;body&gt;
    &lt;a id=&quot;btn&quot; href=&quot;#box2&quot;&gt;Box2&lt;/a&gt;
    &lt;div id=&quot;box1&quot; style=&quot;width: 100%; height: 800px; background: pink;&quot;&gt;&lt;/div&gt;
    &lt;div id=&quot;box2&quot; style=&quot;width: 100%; height: 800px; background: yellow;&quot;&gt;&lt;/div&gt;
    &lt;script src=&quot;main.js&quot;&gt;&lt;/script&gt;
&lt;/body&gt;</code></pre><pre><code class="language-js">var btn = document.querySelector(&quot;#btn&quot;);
btn.addEventListener(&quot;click&quot;, function(e) {
    // console.log(e);
    e.preventDefault();
});</code></pre>
<h1 id="📌-학습내용-중-어려웠던-점">📌 학습내용 중 어려웠던 점</h1>
<hr>
<ol>
<li><p><code>appendChild()</code>와 <code>removeChild()</code>, <code>eventListener()</code> 적용 도중 Uncaught TypeError: Cannot read property &#39;appendChild&#39; of null 에러가 계속해서 발생</p>
</li>
<li><p>일지를 작성하던 중, 인수와 인자의 차이가 헷갈렸다.</p>
</li>
</ol>
<h1 id="📌-해결방법">📌 해결방법</h1>
<hr>
<ol>
<li><p>대게는 ;이 빠진 경우였고, 오타가 없을 때 에러가 났을 경우는 다시 작성하니 해결되었다.</p>
</li>
<li><p>따로 서칭을 해본 결과 <strong>인수</strong>는 argument, <strong>인자</strong>는 parameter라고 칭한다.</p>
</li>
</ol>
<p><strong>인수</strong>는 전달인자라고도 하며 매개변수와 달리 고정되어 있지 않고, 호출할 때마다 수시로 변하는 값(Value)이기 때문에 변수가 아닌 값(Value)으로 정의한다.
<strong>인자</strong>는 함수 내부에 있는 인자로써, 특정한 값으로 정해져 있는 것이 아니라, 함수가 호출하면서 건네준 argument의 값이<strong>변수(Variable)</strong>에 담기게 된다. 들어오는 인자가 매개체 역할을 하기 때문에 매개변수라고도 한다.
( 참고 사이트 : <a href="https://velog.io/@colki/JS-parameter-%EC%99%80-argument-%EC%9D%98-%EC%B0%A8%EC%9D%B4-%EC%9D%B8%EC%88%98-%EC%9D%B8%EC%9E%90">https://velog.io/@colki/JS-parameter-%EC%99%80-argument-%EC%9D%98-%EC%B0%A8%EC%9D%B4-%EC%9D%B8%EC%88%98-%EC%9D%B8%EC%9E%90</a> )</p>
<h1 id="📌-학습소감">📌 학습소감</h1>
<hr>
<p>여태껏 해왔던 자바스크립트 문법과 실습을 하면서 &#39;그냥 이런게 있구나&#39; 하고 넘어갔던 부분들에 대해서 확실히 짚고 넘어갔다. 확실히 메서드 하나하나의 기능을 알고 사용하니 훨씬 이해가 잘 됐다. 😋</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[210901 개발일지]]></title>
            <link>https://velog.io/@jiyoon_jeong2005/210901-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@jiyoon_jeong2005/210901-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Wed, 01 Sep 2021 03:28:59 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-학습한-내용">📌 학습한 내용</h1>
<hr>
<h3 id="전체-코드-1--💾">전체 코드 1 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/js-ex-5">💾</a></h3>
<h2 id="생성자-함수-클래스">생성자 함수 (클래스)</h2>
<p>: 공통된 요소들을 묶어내는 일종의 박스</p>
<ul>
<li><p>객체지향 프로그래밍 (OOP - Object Oriented Programming)과 밀접한 관계</p>
</li>
<li><p>(기능을 만들 때 사용하는) 일반 함수와 구분하기 위해 첫 글자를 대문자로 작성</p>
</li>
</ul>
<pre><code class="language-js">// 생성자 함수 (붕어빵 틀에 비유)
function Heroes(name, age) {
    this.name = name;
    this.age = age;
} // this 자체가 인스턴스를 가리키고 있는 것

// 인스턴스 = new 생성자 함수명(매개변수) 
var superMan = new Heroes(&#39;슈퍼맨&#39;, 30);
var blackWidow = new Heroes(&#39;블랙위도우&#39;, 34);</code></pre>
<ul>
<li>인스턴스 : <code>new</code> 키워드를 이용해 생성자 함수를 호출한 결과값이 담겨진 결과물 (붕어빵에 비유)</li>
</ul>
<h3 id="생성자-함수-내에서-메서드-정의">생성자 함수 내에서 메서드 정의</h3>
<pre><code class="language-js">function Person(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;

      // 인스턴스가 활용할 메서드 정의
    this.fullName = function() {
        console.log(this.firstName + &quot; &quot; + this.lastName);
    }
}

var jeong = new Person(&quot;Jane&quot;, &quot;Jeong&quot;);
var park = new Person(&quot;David&quot;, &quot;Park&quot;);

console.log(jeong);
console.log(park);

jeong.fullName();
park.fullName();</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/3aff75af-fd96-4655-a3a9-182a469bb851/image.png" alt=""></p>
<ul>
<li>인스턴스 자체도 객체와 같은 구조를 가지고 있음</li>
</ul>
<h2 id="프로토타입-prototype">프로토타입 (Prototype)</h2>
<p>: 생성자 함수 안에서 모든 인스턴스에 공통적으로 적용되는 메서드가 존재할 경우 사용</p>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/90c8cf9a-45e5-4df2-9c6e-096b02727b9a/image.png" alt=""></p>
<p>각각의 jeong과 park이라는 인스턴스에서는 firstName과 lastName에 서로 다른 키값이 들어가 있다. 하지만 fullName에 대해서는 동일한 값을 가지고 있다. 
-&gt; 같은 코드가 반복적으로 노출되는 상황
-&gt; 불필요한 메모리를 차지</p>
<p>👉 ** Person 생성자 함수를 만들 때, <code>Person.prototype</code> 객체가 같이 생성된다.**</p>
<pre><code class="language-js">// 조상 (Person.prototype)  
function Person(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
}

//Person.prototype 객체에 &#39;fullName&#39; 이라는 메서드를 추가한 것 (조상에게 기술을 부여한 것)
Person.prototype.fullName = function() { 
    console.log(this.firstName + &quot; &quot; + this.lastName);
}

// 후손(인스턴스 자체) - 조상에게 부여한 기술을 가져다 사용o , 가지고 있는 것은 x -&gt; 불필요한 메모리를 가지지 x
var jeong = new Person(&quot;Jane&quot;, &quot;Jeong&quot;);
var park = new Person(&quot;David&quot;, &quot;Park&quot;);

jeong.fullName();
park.fullName();</code></pre>
<h3 id="인스턴스가-어떤-프로토타입으로-부터-영향을-받는-것인지-식별하는-방법">인스턴스가 어떤 프로토타입으로 부터 영향을 받는 것인지 식별하는 방법</h3>
<pre><code class="language-js">// 배열을 만드는 방법
var arr1 = [];
var arr2 = new Array();  </code></pre>
<ul>
<li><code>Array()</code> : 자바스크립트에서 만들어 놓은 배열을 만드는 생성자 함수, 데이터가 들어갈 자리를 미리 만들어 놓음 (비어있는 데이터)</li>
</ul>
<pre><code class="language-js">// 문자열을 만드는 방법
var str1 = &quot;Hello&quot;;
var str2 = new String(&quot;Nice&quot;);</code></pre>
<ul>
<li><code>String()</code> : 자바스크립트에서 만들어 놓은 문자열을 만드는 생성자 함수. 단, 만들어진 데이터 타입은 객체.
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/62eb92d0-1532-4f40-9d73-24d9d12c01f6/image.png" alt=""></li>
</ul>
<pre><code class="language-js">//함수를 만드는 방법
var func1 = function() {
}
var func2 = new Function(&quot;x, y&quot;, &quot;return x * y&quot;);
console.log(func2);</code></pre>
<ul>
<li><code>Function()</code> : 자바스크립트에서 만들어 놓은 문자열을 만드는 생성자 함수.</li>
</ul>
<p>=&gt; <code>arr2</code>, <code>str2</code>, <code>func2</code> = 인스턴스</p>
<ul>
<li><code>console.dir()</code> : 인자의 내부 구조를 좀 더 디테일하게 확인하고자 할 때 사용</li>
</ul>
<h4 id="__proto__"><code>__proto__</code></h4>
<p>: 인스턴스의 조상(프로토타입 객체)을 알아낼 때 사용되는 프로퍼티</p>
<pre><code class="language-js">var person = new Object();
console.log(person);

person.name = &quot;Jane&quot;;  // 새로운 프로퍼티 추가 가능
person.sayHi = function() {
    console.log(&quot;hi&quot;); 
}  // 새로운 메서드 추가 가능

console.log(person);
console.log(person.__proto__ === Object.prototype);
// -&gt; person의 조상이 Object.prototype 객체가 맞는가?
// output = true</code></pre>
<ul>
<li><code>Object.prototype</code> : 모든 자바스크립트 객체의 조상</li>
</ul>
<h4 id="constructor">constructor</h4>
<p>: 인스턴스의 생성자 함수를 알아낼 때 사용되는 프로피터</p>
<ul>
<li><p>모든 생성자 함수의 프로토타입 객체는 <code>Function.prototype</code> 객체</p>
</li>
<li><p><code>.prototype</code>객체가 들어가 있는 것은 객체, 생성자 함수 명만 있는 것은 생성자 함수</p>
<pre><code class="language-js">Person.prototype // 프로토타입 객체
Person // 생성자 함수</code></pre>
<h4 id="전체-정리">전체 정리</h4>
<pre><code class="language-js">// 생성자 함수
function Person(firstName, lastName) {
  this.firstName = firstName;
  this.lastName = lastName;
}
</code></pre>
</li>
</ul>
<p>// 인스턴스 
var jeong = new Person(&quot;Jane&quot;, &quot;Jeong&quot;)</p>
<p>console.log(jeong);
console.log(jeong.<strong>proto</strong> === Person.prototype);  // true
console.log(Person.prototype.<strong>proto</strong> === Object.prototype);  // true
console.log(jeong.<strong>proto</strong> === Object.prototype);  // false -&gt; 중간 단계의 조상을 띄어넘는 것은 x</p>
<p>console.log(Person.<strong>proto</strong> === Function.prototype); // true 모든 생성자 함수의 직계 조상은 Function.prototype 객체
console.log(Function.prototype.<strong>proto</strong> === Object.prototype); // true</p>
<p>console.log(jeong.constructor === Person);  // true
console.log(Person.prototype.constructor === Person);  // true</p>
<pre><code>
## this
: this가 어디에 포함되어 있는가에 따라서 가리키는 대상이 매번 달라짐 (코드를 간소화 하기 위해 주로 사용)

### 1. 일반 함수 this / 중첩 함수 this : window (브라우저)
* 중첩으로 들어가 있는 함수 안에서의 this는 무조건 window
```js
function a() {
    function b() {
        console.log(this);
    }
    b();  // window
}
a();  // window</code></pre><p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/1597946f-097b-441b-b1a8-460651a8503a/image.png" alt=""></p>
<h3 id="2-이벤트에서의-this--이벤트-객체">2. 이벤트에서의 this : 이벤트 객체</h3>
<pre><code class="language-js">var prevBtn = document.querySelector(&#39;.prevBtn&#39;);

prevBtn.addEventListener(&#39;click&#39;, function() {
    console.log(this);  // prevBtn
})</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/64ed1f54-e0eb-465f-84dd-abd0e7bf8938/image.png" alt=""></p>
<h3 id="3-객체안에-있는-메서드-안에서의-this--객체">3. (객체안에 있는) 메서드 안에서의 this : 객체</h3>
<pre><code class="language-js">var obj = {
    age: 100,
    sum: function() {
             console.log(this);  // obj 자체
    }
}
obj.sum();</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/3432f113-f2d3-4b93-8c8c-fd1798b4be46/image.png" alt=""></p>
<h3 id="4-메서드-안에-함수중첩함수가-들어가-있는-경우-this--window브라우저">4. 메서드 안에 함수(중첩함수)가 들어가 있는 경우 this : window(브라우저)</h3>
<pre><code class="language-js">var obj = {
    age: 100,
    sum: function() {
             // console.log(this);  // obj 자체

               function a() {
        console.log(this); // window 
         }
        a();
    }
}
obj.sum();</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/a9e8f519-e41e-4735-b749-f606a004e547/image.png" alt=""></p>
<h3 id="5-중첩-함수안의-this도-obj객체를-가리키게-하고-싶을-때--변수-that에-this를-저장">5. 중첩 함수안의 this도 obj(객체)를 가리키게 하고 싶을 때 : 변수 that에 this를 저장</h3>
<pre><code class="language-js">var obj = {
    age: 100,
    sum: function() {
        var that = this; // sum 안에서의 this는 obj를 가리킴 -&gt; that에는 obj가 들어가게 됨
        function a() {
            console.log(that); 
        }
        a();
    }
}
obj.sum();</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/3e4cf3d5-f4b1-40b9-8e8e-c15a1850ba6a/image.png" alt=""></p>
<h2 id="템플릿-리터럴-template-literal">템플릿 리터럴 (Template Literal)</h2>
<p>: `(벡틱)으로 문자열을 만들 수 있음, 변수 안의 값을 특정 문자열 안에 다이렉트로 삽입하고자 할 때 사용 (ES6 버전부터 도입)</p>
<ul>
<li>백틱 안 문자열을 쓰고, ${}안에 자바스크립트 일부 코드(변수)를 작성할 수 있다.<pre><code class="language-js">var name = &quot;jane&quot;;
</code></pre>
</li>
</ul>
<p>console.log(&quot;내 이름은&quot; + &quot; &quot; + name + &quot;입니다.&quot;);
console.log(<code>내 이름은 ${name}입니다.</code>);</p>
<pre><code>
## 실습
### 1. 생성자 함수 활용하기

![](https://images.velog.io/images/jiyoon_jeong2005/post/f4be393b-7687-4de5-a700-ee2a707fc2fa/js%EC%8B%A4%EC%8A%B51.gif)

* _&#39;210831 개발일지&#39;_ 의 4번 실습 코드 중, 이미지 정보 리스트를 생성자 함수로 생성

```js
var arr = [];
var i = 0;

// 생성자 함수
function PuppyPicture(name, img, txt) {
    this.name = name;
    this.img = img;
    this.txt = txt;  // 매개변수 값 할당
}

function creatPuppyPicture(name, img, txt) {
    var fullImg = `img/img-${img}.jpg`;
    var puppy = new PuppyPicture(name, fullImg, txt);  // 이미지 인스턴스
    arr.push(puppy); // 객체 결과물을 배열 안쪽의 데이터로 넣어줌
}

creatPuppyPicture(&quot;puppy 1 name&quot;, 0, &quot;puppy 1 description&quot;);
creatPuppyPicture(&quot;puppy 2 name&quot;, 1, &quot;puppy 2 description&quot;);
creatPuppyPicture(&quot;puppy 3 name&quot;, 2, &quot;puppy 3 description&quot;);
creatPuppyPicture(&quot;puppy 4 name&quot;, 3, &quot;puppy 4 description&quot;);  // 위의 매개변수에 각각 할당

console.log(arr);</code></pre><p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/6cff4fab-732d-429a-80b9-c250b338370f/image.png" alt=""></p>
<hr>
<h3 id="전체-코드-2--💾">전체 코드 2 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/js-typing">💾</a></h3>
<h3 id="2-무한-루프">2. 무한 루프</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/5151c3ad-93b5-4e1e-a016-f83c3adbb4e2/js%EC%8B%A4%EC%8A%B52.gif" alt=""></p>
<ul>
<li><p>% (나머지 반환) 특성을 이용해 &#39;current&#39;가 배열의 인덱스값 안에서 무한 반복되도록 설정</p>
</li>
<li><p><code>setTimeout(함수, 시간)</code> : 타이머가 만료된 지정된 함수 실행</p>
</li>
</ul>
<pre><code class="language-js">unction loop() {

    var current = index % arr.length;  // 최초값 0 % 3 = 0, arr.length = 고정값
    console.log(arr[current]);
    index++ // 호출될 때 마다 index값은 1씩 증가

    setTimeout(function() {
        loop();
    }, 1000); // 1초마다 function()이 실행되게 함
}

loop(); // 최초 loop는 실행</code></pre>
<h3 id="3-배열-안의-텍스트-데이터-한-글자씩-생성삭제-반복">3. 배열 안의 텍스트 데이터 한 글자씩 생성/삭제 반복</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/bb5c22e2-2b5f-4a61-a69f-17b0abc090b4/js%EC%8B%A4%EC%8A%B53.gif" alt=""></p>
<h4 id="1-html-작성-후-js-파일-연결---작업할-html-태그와-노출시킬-텍스트-리스트-작성">1. html 작성 후, js 파일 연결 -&gt; 작업할 html 태그와 노출시킬 텍스트 리스트 작성</h4>
<pre><code class="language-html">&lt;body&gt;
    &lt;h1 id=&quot;txt&quot;&gt;&lt;/h1&gt;
    &lt;script src=&quot;js/main.js&quot;&gt;&lt;/script&gt;
&lt;/body&gt;</code></pre>
<pre><code class="language-js">// 이벤트를 설정할 html 태그 가져오기
var txtElement = document.getElementById(&#39;txt&#39;);
// 이벤트 실행시 호출할 함수 생성
var words = [&quot;엔드게임&quot;, &quot;인피니티 워&quot;, &quot;에이지 오브 울트론&quot;];</code></pre>
<h4 id="2-생성자-함수-생성-호출">2. 생성자 함수 생성, 호출</h4>
<pre><code class="language-js">//생성자 함수
function TypeWriter(txtElement, words) {
    this.txtElement = txtElement;  // txt
    this.words = words;  // words 함수

    // 글자가 하나씩 완성되는 영역
    this.txt = &quot;&quot;; // 출력될 글자들이 들어갈 위치
    this.wordsIndex = 0; // 기준점
    this.isDeleting = false;
  // 기준점2 - 현재 상태(삭제중/작성중), 처음에는 작성 중이기 때문에 false 기본값으로 넣어줌

    this.type();
}

TypeWriter.prototype.type = function() {
}

new TypeWriter(txtElement, words); 
// 생성자 함수 호출시, 인스턴스가 반드시 필요한 것은 x</code></pre>
<h4 id="3-type-메서드-생성">3. type 메서드 생성</h4>
<p>1) 현재 배열안에 있는 데이터 가져오기</p>
<pre><code class="language-js">TypeWriter.prototype.type = function() { 

    var current = this.wordsIndex % this.words.length; 
    // 최초값 0 % 3 = 0
    var fullTxt = this.words[current]; 
    // 현재 current에 있는  값을 기준으로 배열 안의 데이터를 가져온다</code></pre>
<p>2) <code>this.isDeleting = true / false</code> 로 분기처리</p>
<ul>
<li><code>substring(시작점, 끝점)</code> : string 객체의 시작 인덱스로 부터 종료 인덱스 전 까지 문자열의 부분 문자열을 반환
<code>substring(n)</code> : n번째부터 시작하는 부분 잘라내서 반환</li>
</ul>
<pre><code class="language-js">if(this.isDeleting) {
    // 엔드게임 -&gt; 엔드게
    // 엔드게 -&gt; 엔드 ...
    this.txt = fullTxt.substring(0, this.txt.length - 1);

} else {
    // &quot;&quot; -&gt; 엔
    this.txt = fullTxt.substring(0, this.txt.length + 1); // 0번째 부터 txt현 상태에 대한 length에 +1 까지
}

this.txtElement.textContent = this.txt; //h1 태그에 노출</code></pre>
<p>3) 텍스트가 완성되었을 때 / 텍스트가 모두 삭제되었을 때로 분기처리</p>
<pre><code class="language-js">if(!this.isDeleting &amp;&amp; this.txt === fullTxt) {    
    this.isDeleting = true;

}  else if(this.isDeleting &amp;&amp; this.txt === &quot;&quot;) {
    this.isDeleting = false;
    this.wordsIndex++ // 다음 텍스트로 넘어가기
}</code></pre>
<p>4) 0.4초 마다 자기자신 호출</p>
<pre><code class="language-js">var that = this 
// this.type(); 이 window를 가리키는 것을 막기 위해 
// (중첩 함수의 this의 대상을 해당 객체자체로 바꾸기 위해)

// 자기자신(TypeWriter.prototype.type) 다시 호출
setTimeout(function() {  
        that.type();

    }, 400);</code></pre>
<h1 id="📌-학습내용-중-어려웠던-점">📌 학습내용 중 어려웠던 점</h1>
<hr>
<ol>
<li><code>__proto__</code> 와 <code>[[prototype]]</code>의 차이점 
강사님과 동일하게 작성한 코드를 개발자 도구에서 확인했을 때, <code>__proto__</code> 가 아닌 <code>[[prototype]]</code>으로 나타남.
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/a70bbee3-3281-4c49-a2c2-a1478616cfa3/%ED%99%94%EB%A9%B4%20%EC%BA%A1%EC%B2%98%202021-09-02%20192701.png" alt=""></li>
</ol>
<h1 id="📌-해결방법">📌 해결방법</h1>
<hr>
<ol>
<li>인터넷 서칭 결과 
<code>[[prototype]]</code>이 Prototype Object이고 <code>__proto__</code>는 Prototype Link라고 한다.
(참고 사이트 : <a href="https://okayoon.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85Prototype%EC%9D%B4%EB%9E%80-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85%EB%A7%81%ED%81%ACPrototype-Link%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85%EA%B0%9D%EC%B2%B4Prototype-Object">https://okayoon.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85Prototype%EC%9D%B4%EB%9E%80-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85%EB%A7%81%ED%81%ACPrototype-Link%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85%EA%B0%9D%EC%B2%B4Prototype-Object</a>)</li>
</ol>
<h1 id="📌-학습소감">📌 학습소감</h1>
<hr>
<p>오늘은 일지 정리를 하는 데에도 고민을 많이 했다. 특히 마지막 실습에서는 배운 내용들이 모두 등장했는데 어떤식으로 나눠서 작업해야 다시 봤을 때 이해할 수 있을지 생각했다. html이나 css에서는 등장하는 개념들이 어려운 부분은 많이 없었는데, 자바스크립튼는 개념 자체와 단어가 명확하게 정의되지 않아서 더 헷갈리는 것 같아. 😵 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[210831 개발일지]]></title>
            <link>https://velog.io/@jiyoon_jeong2005/210831-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@jiyoon_jeong2005/210831-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Tue, 31 Aug 2021 13:10:36 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-학습한-내용">📌 학습한 내용</h1>
<hr>
<h3 id="전체-코드-1--💾">전체 코드 1 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/js-tutorial-2">💾</a></h3>
<h2 id="javascript-기본-실습">JavaScript 기본 실습</h2>
<h3 id="1-버튼-클릭시-랜덤으로-배경-색상-변경--해당-헥스코드-노출">1. 버튼 클릭시 랜덤으로 배경 색상 변경 &amp; 해당 헥스코드 노출</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/320db739-ea2a-41da-acdb-c264f0c375b9/js%EC%8B%A4%EC%8A%B51.gif" alt=""></p>
<h4 id="1-html코드-먼저-작성-후-script로-js파일-연결하기-html이-우선-존재해야-js에서-불러올-수-있음">1) html코드 먼저 작성 후, <code>&lt;script&gt;</code>로 js파일 연결하기 (html이 우선 존재해야 js에서 불러올 수 있음)</h4>
<pre><code class="language-js">&lt;body&gt;
    &lt;!-- 버튼 클릭시 body의 배경색 변경, 해당 색상코드 반환 --&gt;
    &lt;h1&gt;HEX Color : &lt;span id=&quot;hex&quot;&gt;&lt;/span&gt;&lt;/h1&gt;
    &lt;button id=&quot;btn&quot; type=&quot;button&quot;&gt;Click Here!&lt;/button&gt;

    &lt;!-- html 코드를 작성한 뒤, js에서 작업할 태그를 가져오는 순서  --&gt;
    &lt;script src=&quot;js/main.js&quot;&gt;&lt;/script&gt;
&lt;/body&gt;</code></pre>
<h4 id="2-js에서-작업할-영역-가져오기-이벤트-발생-지점-선택">2) js에서 작업할 영역 가져오기 (이벤트 발생 지점 선택)</h4>
<pre><code class="language-js">var hex = document.getElementById(&#39;hex&#39;);
var btn = document.getElementById(&#39;btn&#39;); </code></pre>
<h4 id="3-이벤트-설정">3) 이벤트 설정</h4>
<pre><code class="language-js">// 두 번째 인수로 익명 함수를 전달해 다이렉트로 기능 만들기 
btn.addEventListener(&#39;click&#39;, function() {
})</code></pre>
<h4 id="4-이벤트-실행시-호출할-함수-생성">4) 이벤트 실행시, 호출할 함수 생성</h4>
<pre><code class="language-js">var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, &quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot;, &quot;f&quot;] 
// 헥스코드 조합에 필요한 요소들로 배열 만들기
var color = &#39;#&#39;;  // 고정값

    for(var i = 0; i &lt; 6; i++) {
        var random = Math.floor(Math.random() * arr.length);
                 // arr 배열 내에서 랜덤한 숫자를 뽑는 변수 생성 (arr의 길이를 곱해줌으로써 램덤 숫자의 범위를 0 ~ arr 데이터 길이 까지로 설정)
        color += arr[random];
               // 6번 반복으로 color값 뽑아내기
    }
});</code></pre>
<h4 id="4-생성된-color값을-html-태그에-적용">4) 생성된 color값을 html 태그에 적용</h4>
<pre><code class="language-js">// &lt;body&gt;에 color값 적용
document.body.style.backgroundColor = color;
// #hex 요소 에 글자 삽입
hex.textContent = color;</code></pre>
<ul>
<li><code>textContent</code> : js를 이용해 html에 문서에 글자를 삽입할 때 사용하는 프로퍼티</li>
</ul>
<h4 id="추가-방법-실무형">추가 방법 (실무형)</h4>
<p>: 버튼 클릭시, 두 번째 인수로 전달한 함수를 호출 (호출 기호 x, 결과적으로는 콜백함수로 볼 수 있음)</p>
<pre><code class="language-js">btn.addEventListener(&#39;click&#39;, createColor);

function createColor() {

    var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, &quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot;, &quot;f&quot;]
    var color = &#39;#&#39;;

    for(var i = 0; i &lt; 6; i++) {
        var random = Math.floor(Math.random() * arr.length);
        color += arr[random];
    }

    document.body.style.backgroundColor = color;
    hex.textContent = color;
}</code></pre>
<hr>
<h3 id="전체-코드-2--💾">전체 코드 2 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/js-ex-2">💾</a></h3>
<h3 id="2-버튼-클릭시-랜덤한-인용문구-출력하기">2. 버튼 클릭시 랜덤한 인용문구 출력하기</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/dd1c490c-e42a-4eaa-b792-a9b47d2d5b22/js%EC%8B%A4%EC%8A%B52.gif" alt=""></p>
<ul>
<li>1번 실습과 유사</li>
</ul>
<pre><code class="language-js">var quote = document.getElementById(&#39;quote&#39;)
var author = document.getElementById(&#39;author&#39;)
var btn = document.getElementById(&#39;btn&#39;);

btn.addEventListener(&#39;click&#39;, function() {

    var random = Math.floor(Math.random() * arr.length);

    // 배열에 접근하는 공식과 객체에 접근하는 공식 결합
    quote.textContent = arr[random].quote;
    author.textContent = arr[random].author;

});</code></pre>
<hr>
<h3 id="전체-코드-3--💾">전체 코드 3 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/js-ex-3">💾</a></h3>
<h3 id="3-사용자가-input-입력한-결과-화면에-출력-글자가-없는-경우-error문구-출력">3. 사용자가 <code>&lt;input&gt;</code> 입력한 결과 화면에 출력, 글자가 없는 경우 error문구 출력</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/67553d8b-9d51-4def-adbb-e06c24222b87/js%EC%8B%A4%EC%8A%B53.gif" alt=""></p>
<h4 id="1-이벤트-발생지점-선택">1) 이벤트 발생지점 선택</h4>
<pre><code class="language-html">&lt;form id=&quot;form&quot;&gt;
    &lt;input type=&quot;text&quot; id=&quot;msg&quot;&gt;
    &lt;button type=&quot;submit&quot; id=&quot;btn&quot;&gt;입력&lt;/button&gt;
&lt;/form&gt;

&lt;h1 class=&quot;feedback&quot;&gt;Input 값을 입력하세요.&lt;/h1&gt;
&lt;h2 id=&quot;txt&quot;&gt;입력된 텍스트가 출력되는 영역&lt;/h2&gt;</code></pre>
<pre><code class="language-js">var form = document.getElementById(&#39;form&#39;);
var input = document.getElementById(&#39;msg&#39;);

var feedback = document.querySelector(&#39;feedback&#39;);
var txt = document.getElementById(&#39;txt&#39;);</code></pre>
<ul>
<li><code>querySelector(&#39;태그명/#id/.class&#39;)</code> : 자바스크립트에서 css의 요소 접근 방식으로 접근하기 위한 방식 </li>
</ul>
<h4 id="2-이벤트-설정">2) 이벤트 설정</h4>
<pre><code class="language-js">form.addEventListener(&#39;submit&#39;, function(e) {
    e.preventDefault();

      var msg = input.value
    //value 프로퍼티: &lt;input&gt;에 입력되는 글자만을 가져올 때 사용
})</code></pre>
<ul>
<li><p><code>&lt;form&gt;</code>에 <code>type=&quot;submit&quot;</code> 속성을 가진 버튼이 있다면 js의 <code>&#39;sbmit&#39;</code> 이벤트가 작동.</p>
</li>
<li><p>단, <code>&#39;submit&#39;</code> 이벤트는 동작이 됌과 동시에 브라우저를 새로고침하는 기능을 갖고 있다. </p>
</li>
<li><blockquote>
<p>해당 기능을 꺼주기 위해 두 번째 인수로 전달한 콜백함수에 <code>e</code> (a, b, c... 관계x) 라고 하는 매개변수를 전달 후, 이벤트 객체에 내장된 <code>e.preventDefault()</code>메서드 적용 </p>
</blockquote>
</li>
<li><p><code>e</code> : 이벤트 객체 ?</p>
</li>
</ul>
<h4 id="3-input으로-입력받은-값-분기처리">3) <code>&lt;input&gt;</code>으로 입력받은 값 분기처리</h4>
<ol>
<li><p>입력받은 텍스트가 있는 경우 / 비어있는 경우
: 문자열이 빈 값이 아니라면 <code>true</code> / 빈 문자열은 <code>false</code>로 처리되는 특성을 이용해 if로 경우의 수를 나눔</p>
<pre><code class="language-js">if(msg) {
// true인 경우(텍스트가 있는 경우)
} else {
// false인 경우(텍스트가 없는 경우)
}</code></pre>
</li>
<li><p><strong>입력받은 텍스트가 있는 경우</strong>, 해당 텍스트를 표시한 후 <code>form.reset()</code>으로 <code>&lt;form&gt;</code> 안의 모든 <code>&lt;input&gt;</code>을 초기화</p>
<pre><code class="language-js">if(msg) {
  txt.textContent = msg;
  form.reset()  // 입력받은 텍스트 초기화
}</code></pre>
</li>
<li><p><strong>입력받은 텍스트가 비어있는 경우</strong>, &#39;feedback&#39; 부분에 class를 추가해 노출했다가 1초후에 class를 다시 삭제해 화면에 보이지 않게 함</p>
<pre><code class="language-js">else {
   // 빈 값인 경우 feedback에 .show 클래스 추가
 feedback.classList.add(&#39;show&#39;);

   // 2초 후에 .show 클래스 삭제
 setTimeout(function() {
     feedback.classList.remove(&#39;show&#39;);
     }, 2000);
}</code></pre>
</li>
</ol>
<ul>
<li><p><code>classList.add()</code> : 특정 영역에 class를 추가할 때 사용</p>
</li>
<li><p><code>classList.remove()</code> : 특정 영역에 class를 제거할 때 사용 </p>
</li>
<li><p><code>setTimeout(콜백함수, 시간)</code> 메서드 : 타이머가 만료된 뒤, 함수나 지정된 코드를 실행하는 타이머를 설정 (1000ms = 1sec)</p>
</li>
</ul>
<hr>
<h3 id="전체-코드-4--💾">전체 코드 4 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/js-ex-4">💾</a></h3>
<h3 id="4-좌우-버튼-클릭-시-이미지와-설명-변경">4. 좌/우 버튼 클릭 시, 이미지와 설명 변경</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/7c90670f-7aec-4324-b5e6-fc180b78e5c2/js%EC%8B%A4%EC%8A%B54.gif" alt=""></p>
<h4 id="1-btn-클래스를-가진-모든-요소-호출">1) btn 클래스를 가진 모든 요소 호출</h4>
<pre><code class="language-js">document.querySelectorAll(&#39;.btn&#39;).forEach(function(element, index) {
    element.addEventListener(&#39;click&#39;, function(e) {
        e.preventDefault();
    });
});</code></pre>
<ul>
<li><p><code>document.querySelectorAll(&#39;.btn&#39;)</code>
: .btn이라는 클래스명을 가진 모든 영역을 배열과 같은 형태로 가져옴
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/faa4358d-63ff-4e53-ab6c-f6369a95befe/image.png" alt=""></p>
</li>
<li><p>가져온 각각의 개체에 이벤트를 적용하기 위해 <code>forEach</code>를 사용</p>
</li>
<li><p><code>&lt;a&gt;</code>가 가진 본연의 기능을 막아주기 위해 <code>e.preventDefault()</code> 메서드 적용</p>
</li>
</ul>
<h4 id="2-가져온-버튼-구분-prevnext">2) 가져온 버튼 구분 prev/next</h4>
<pre><code class="language-js">// 클릭한 영역에 어떤 클래스가 있는지 분기 처리
if(e.target.classList.contains(&#39;prevBtn&#39;)) {
    console.log(&quot;prev&quot;);
} // 선택한 요소가 prevBtn 클래스를 가지고 있음

if(e.target.classList.contains(&#39;nextBtn&#39;)) {
    console.log(&quot;next&quot;);
} //선택한 요소가 nextBtn 클래스를 가지고 있음</code></pre>
<ul>
<li><code>e.target</code> : 클릭한 영역을 호출</li>
<li><code>classList</code> : html태그의 클래스 목록을 가져온다.</li>
<li><code>contains()</code> : 인수에 들어간 요소(class)가 포함되어 있는지의 여부를 논리값(boolean)으로 반환</li>
</ul>
<h4 id="3-버튼에-따른-페이지-변경-설정">3) 버튼에 따른 페이지 변경 설정</h4>
<ol>
<li><p>이미지와 이미지 정보를 담은 객체들을 배열로 저장</p>
<pre><code class="language-js">var arr = [
 {
     img : &quot;img/img-0.jpg&quot;,
     name : &quot;puppy 0&quot;,
     txt : &quot;puppy description 0&quot;
 },
 {
     img : &quot;img/img-1.jpg&quot;,
     name : &quot;puppy 1&quot;,
     txt : &quot;puppy description 1&quot;
 },
 {
     img : &quot;img/img-2.jpg&quot;,
     name : &quot;puppy 2&quot;,
     txt : &quot;puppy description 2&quot;
 },
 {
     img : &quot;img/img-3.jpg&quot;,
     name : &quot;puppy 3&quot;,
     txt : &quot;puppy description 3&quot;
 },
];</code></pre>
</li>
<li><p>객체에 접근할 인덱스를 저장할 변수 생성</p>
<pre><code class="language-js">var i = 0; // 기준점</code></pre>
</li>
<li><p>prev/next 에 따라 인덱스 값 조정</p>
<pre><code class="language-js">if(e.target.classList.contains(&#39;prevBtn&#39;)) {
 // console.log(&quot;prev&quot;);

     if(i === 0) {
         i = arr.length;
           // 현재 배열의 length 는 4
     }
         i--;

           document.getElementById(&#39;img&#39;).src = arr[i].img;
         document.getElementById(&#39;name&#39;).textContent = arr[i].name;
         document.getElementById(&#39;txt&#39;).textContent = arr[i].txt;
     }
</code></pre>
</li>
</ol>
<p>if(e.target.classList.contains(&#39;nextBtn&#39;)) {
    // console.log(&quot;next&quot;);</p>
<pre><code>    if(i === arr.length -1) {
            i = -1;
        }

        i++; // 이 지점에서 i가 0으로 감

        document.getElementById(&#39;img&#39;).src = arr[i].img;
        document.getElementById(&#39;name&#39;).textContent = arr[i].name;
        document.getElementById(&#39;txt&#39;).textContent = arr[i].txt;

    }
});</code></pre><p>});</p>
<p>```</p>
<h1 id="📌-학습내용-중-어려웠던-점">📌 학습내용 중 어려웠던 점</h1>
<hr>
<ol>
<li>3, 4번째 실습에서 원리가 이해가 되지 않는 부분이 많았다. <h1 id="📌-해결방법">📌 해결방법</h1>
</li>
</ol>
<hr>
<ol>
<li><a href="https://pythontutor.com/visualize.html#mode=edit">https://pythontutor.com/visualize.html#mode=edit</a> 해당 사이트를 이용해 코드가 어떤 식으로 작동하는지 다시 한 번 공부해야겠다.</li>
</ol>
<h1 id="📌-학습소감">📌 학습소감</h1>
<hr>
<p>아직까지 객체와 메서드 들의 기능을 확실하게 이해하지 못해서 어려운 부분이 가장 크다. 전체적으로 자바스크립트 강의들을 따라간 뒤에 다시 한 번 처음부터 복습하는 것이 이해에 도움이 될 듯 하다. 또한 이번 개발일지를 작성하면서 다른 참가자들의 일지를 많이 참고 했다. 다른 사람이 이해한 내용과 비교해가며 들으니 시간은 조금 더 걸렸지만 훨씬 도움이 된 것 같다. 그래도 아직까지는 여전히 어려운 자바스크립트 화이팅 😂</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[210830 개발일지]]></title>
            <link>https://velog.io/@jiyoon_jeong2005/210830-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@jiyoon_jeong2005/210830-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Mon, 30 Aug 2021 14:06:48 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-학습한-내용">📌 학습한 내용</h1>
<hr>
<h3 id="전체-코드--💾">전체 코드 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/js-tutorial-2">💾</a></h3>
<h2 id="반복문">반복문</h2>
<p>: <strong>고정값</strong>이 존재하고, <strong>일정한 규칙을 갖고 있는</strong> 가변값이 존재하는 경우 사용</p>
<h3 id="while">while</h3>
<pre><code class="language-js">var num = 1; // 시작점

while (num &lt; 10) { // 범위(조건) -&gt; 참이면 실행, 거짓이 되는 순간 반복 종료
    console.log(2 * num)
    num++; // 기존의 num 값에 +1
}</code></pre>
<p>👉 무한 루프에 빠지는 것을 막기 위해 반복문이 <strong>거짓이 되는 순간</strong>을 만들어 줘야 한다.</p>
<h3 id="do--while">do ~ while</h3>
<p>: 최초 한 번의 실행을 보장, 그 다음에 조건을 따짐</p>
<pre><code class="language-js">var i = 12;

do {
    console.log(i);
    i++
} while (i &lt; 10);</code></pre>
<h3 id="for">for</h3>
<p>: 가장 많이 사용</p>
<pre><code class="language-js">for (가변값의 시작점; 조건; 규칙) {
    console.log(2 * i); // 고정값, 가변값
}</code></pre>
<h3 id="중첩-반복문">중첩 반복문</h3>
<pre><code class="language-js">for(var i = 2; i &lt; 10; i++) {
    for(var j = 1; j &lt; 10; j++) {
        console.log(i * j);
    } // 안쪽의 반복문이 끝나야 바깥쪽의 반복문이 실행
}</code></pre>
<h3 id="break와-continue">break와 continue</h3>
<p>: 반복문에서 특정 값을 찾아내거나, 제외하기 위해 사용</p>
<pre><code class="language-js">for (var i = 1; i &lt; 10; i++) {

    if(i === 5) {
        break; 
    }

    console.log(2 * i);
}</code></pre>
<ul>
<li><p><code>break</code> : 숫자 5가 되는 순간 반복문을 종료시킴, 아래쪽의 코드는 출력되지 x </p>
</li>
<li><p><code>continue</code> : 숫자 5의 결과값은 스킵하고 진행</p>
</li>
</ul>
<h3 id="반복문-응용-배열-반복문">반복문 응용 (배열 반복문)</h3>
<pre><code class="language-js">var arr = [&#39;바나나&#39;, &#39;사과&#39;, &#39;수박&#39;];
console.log(arr);
console.log(arr.legth);

// 고정값 : console.log(arr[]) ;
// 가변값 : 0, 1, 2, 3

for (var i = 0; i &lt; arr.length; i++) {
    console.log(arr[i]);
}</code></pre>
<ul>
<li><code>arr.length()</code> : 배열안에 들어있는 데이터의 갯수를 반환하는 property</li>
</ul>
<h3 id="for--in">for ~ in</h3>
<p>: 범위 지정이 따로 필요 없음</p>
<pre><code class="language-js">var arr = [&#39;바나나&#39;, &#39;사과&#39;, &#39;수박&#39;];
for (var i in arr) {
    console.log(i);  // 배열의 인덱스
    console.log(arr[i]);
}</code></pre>
<h3 id="배열에-내장된-메서드">배열에 내장된 메서드</h3>
<h4 id="foreach">forEach</h4>
<p><code>.forEach()</code> : 주어진 함수를 배열 요소 각각에 대해 실행, 인수로 무조건 함수를 전달해야 함 (매게변수의 순서 중요)</p>
<ul>
<li>return 사용 불가</li>
<li>인수로 전달된 해당 함수 자체도 callback함수 인 것</li>
<li>callback함수(익명함수, 콜백함수) : 특정 조건에 도달하면 호출되는 함수, 함수명이 없음</li>
</ul>
<pre><code class="language-js">var arr = [&#39;바나나&#39;, &#39;사과&#39;, &#39;수박&#39;];
arr.forEach(function(element, index) {
    console.log(element);
    console.log(index);
})</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/61e854e8-7d6e-40d5-8970-47fcaf2979e5/image.png" alt=""></p>
<h4 id="map">map</h4>
<p><code>.map()</code> : <code>forEach</code>와 유사, 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환</p>
<ul>
<li>return 사용 가능 -&gt; .map으로 돌린 어떤 값을 변화시켜서 다른 변수에다 전달 가능<pre><code class="language-js">var result = arr.map(function(element, index) {
  return element + &quot; &quot; + &quot;10&quot;;
})
console.log(result);</code></pre>
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/67847804-08b6-4e52-80a4-711b6d4a22be/image.png" alt=""></li>
</ul>
<h3 id="객체-반복문-for--in">객체 반복문 for ~ in</h3>
<pre><code class="language-js">var student = {
    name: &quot;Jane&quot;,
    age: 23,
    skills : [&quot;자바스크립트&quot;, &quot;HTML&quot;, &quot;CSS&quot;],
    sum: function(num1, num2) {
        console.log(num1 + num2);
    }
}

for (var prop in student) { // prop = 키값, 데이터가 들어가는 좌표
    console.log(prop);
    console.log(student[prop]);
}</code></pre>
<h2 id="문자열-properties--methods">문자열 properties &amp; methods</h2>
<p>(참고 사이트 : <a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String">https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String</a>)</p>
<ul>
<li><code>length</code> : 공백 포함 문자열의 길이 반환</li>
<li><code>trim()</code> : 문자열 앞, 뒤의 공백을 제거, 문자열 내부의 공백은 제거 x</li>
<li><code>chartAt(index)</code> : 문자열에서 특정 인덱스에 위치하는 하나의 문자를 반환 (공백도 문자로 인식)</li>
<li><code>slice(시작점, 끝점)</code> : 문자열의 일부를 추출(시작점 이상 끝점 미만), 끝점도 시작점과 마찬가지로 맨 앞에서 부터 시작됨
<code>slice(index)</code> : 해당 인덱스 이상부터 있는 모든 글자를 추출</li>
<li><code>split()</code> : 일정한 규칙으로 문자를 잘라 배열안에 담아서 반환 -&gt; 데이터 타입이 변경됨(문자열 -&gt; 배열)<pre><code class="language-js">var str = &quot;Nice to meet you abc&quot;;
console.log(str.split(&#39; &#39;)); // 공백을 기준으로 자름
</code></pre>
</li>
</ul>
<p>var str = &quot;Nice to meet/you abc&quot;;
console.log(str.split(&#39;/&#39;)); // /를 기준으로 자름</p>
<pre><code>![](https://images.velog.io/images/jiyoon_jeong2005/post/435c9ef0-b907-492b-9efe-bc12d093b2b9/image.png)

* `replace(&#39;바꿀 단어&#39;, &#39;변경할 단어&#39;)` : 일부 또는 모든 부분이 교체된 새로운 문자열을 반환 (바꿀 단어 -&gt; 변경할 단어)
* `imdexOf()` : 호출한 객체에서 주어진 값과 일치하는 첫 번째 인덱스를 반환, 일치하는 값이 없으면 -1을 반환, 대소문자 구분
* `toUpperCase` : 문자열을 모두 대문자로 전환해서 반환
* `toLoweCase` : 문자열을 모두 소문자로 전환해서 반환
```js
var search = prompt(&quot;검색어를 입력해 주세요.&quot;);

if(search.toLowerCase() === &quot;apple&quot;) {
  // 사용자에게 입력받은 값을 모두 소문자로 전환
    console.log(&quot;사과 데이터를 출력한다.&quot;)
} else {
    console.log(&quot;false&quot;)
}</code></pre><h2 id="배열-properties--methods">배열 properties &amp; methods</h2>
<p>(참고 사이트 : <a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array">https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array</a>)</p>
<ul>
<li><p><code>length</code> : 배열의 길이(배열 안의 데이터 갯수)를 반환</p>
</li>
<li><p><code>push(추가할 데이터)</code> : 배열의 끝에 하나 이상의 데이터를 추가</p>
</li>
<li><p><code>unshift(추가할 데이터)</code> : 새로운 데이터를 배열의 맨 앞쪽에 추가</p>
</li>
<li><p><code>pop()</code> : 배열에서 마지막 요소를 제거하고 그 요소를 반환</p>
</li>
<li><p><code>shift()</code> : 배열에서 첫 번째 요소를 제거하고 그 요소를 반환</p>
</li>
<li><p><code>join()</code> : 배열의 모든 요소를 특정 규칙에 따라 연결해 하나의 문자열로 만들어서 반환</p>
<pre><code class="language-js">var arr1 = [&quot;사과&quot;, &quot;배&quot;, &quot;바나나&quot;];
var str1 = arr1.join(&#39;, &#39;);
console.log(str1)</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/21b5974f-db61-4f85-b4af-f6d7ccea2776/image.png" alt=""></p>
</li>
<li><p><code>기존배열.concat(합칠배열)</code> : 인자로 주어진 배열이나 값들을 기존 배열에 합쳐서 새 배열을 반환</p>
</li>
</ul>
<h1 id="📌-학습내용-중-어려웠던-점">📌 학습내용 중 어려웠던 점</h1>
<hr>
<h1 id="📌-해결방법">📌 해결방법</h1>
<hr>
<h1 id="📌-학습소감">📌 학습소감</h1>
<hr>
<p>오늘은 단순히 수업 내용을 따라가면 되어서 특별히 어렵다할만한 점은 없었다. 하지만 배열 데이터 타입의 메서드를 공부하면서 return에 대한 개념이 다시 등장했는데, 아직까지 완전히 이해한 것 같지 않아 return의 개념과 활용에 대한 복습이 다시 필요할 것 같다. 🤔</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[210827 개발일지]]></title>
            <link>https://velog.io/@jiyoon_jeong2005/210827-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@jiyoon_jeong2005/210827-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Thu, 26 Aug 2021 13:43:47 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-학습한-내용">📌 학습한 내용</h1>
<hr>
<h3 id="전체-코드--💾">전체 코드 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/js-tutorial-2">💾</a></h3>
<h2 id="if-조건문">IF 조건문</h2>
<ul>
<li>소괄호() 안의 문장이 <strong>참</strong>일때만, 중괄호{} 안의 식이 출력된다.<pre><code class="language-js">if(조건식) {
  실행문
} else if(조건식) {
  실행문
} else if(조건식) {
  실행문
} else {
//(앞의 조건식이 (모두) 거짓일 경우) 
실행문
}</code></pre>
</li>
<li>여러 조건들 중에서 여러 개의 참이 존재한다면, 가장 먼저 나오는 참만 실행시킴</li>
</ul>
<h3 id="중첩-if문">중첩 IF문</h3>
<p>: if조건문을 보완하기 위함 (if문 안에 if문을 넣는 것)</p>
<pre><code class="language-js">if(a !== b) {
    if (a &gt; b) {
        console.log(&quot;a는 b보다 크다.&quot;);
    } else {
        console.log(&quot;a는 b보다 작다.&quot;);
    }
} else {
    console.log(&quot;a와 b는 같다.&quot;);
}</code></pre>
<h3 id="거짓이-되는-상황">거짓이 되는 상황</h3>
<p>: 조건식에 아래의 값들이 들어가면 거짓이 된다.
<code>false, &quot;&quot;(빈 문자열), 0, null, undefined</code></p>
<h3 id="삼항-연산자">삼항 연산자</h3>
<p>: 조건문과 유사하게 동작 (조건문이 단순할 경우 사용)</p>
<p><code>var 변수명 = (조건식) ? &quot;조건이 참일 경우 실행 결과&quot; : &quot;조건이 거짓일 경우 실행 결과&quot;</code></p>
<pre><code class="language-js">if(age &gt;= 18) {
    console.log(&quot;성인&quot;);
} else {
    console.log(&quot;어린이&quot;);
}

// 위와 동일한 결과값을 반환
var result = (age &gt;= 18) ? &quot;성인&quot; : &quot;어린이&quot;;
console.log(result)</code></pre>
<h3 id="조건문-응용">조건문 응용</h3>
<ul>
<li><code>prompt</code> : 브라우저에서 사용자에게 값을 전달받기 위한 팝업창을 띄우는 메서드. 모든 브라우저에서 사용 가능하며 팝업창의 형태와 디자인은 브라우저 마다 다름. <strong>해당 메서드로 전달 받은 값은 모두 문자(string) 타입으로 저장됨</strong><pre><code class="language-js">var userId = prompt(&quot;아이디를 입력해 주세요.&quot;);
var userPw = prompt(&quot;비밀번호를 입력해 주세요.&quot;);
</code></pre>
</li>
</ul>
<p>console.log(userId);
console.log(userPw);</p>
<pre><code>![](https://images.velog.io/images/jiyoon_jeong2005/post/97256b55-69e5-4687-ab7b-856c288140fa/image.png)
(chrom 브라우저 기본 팝업창)

* `alert` : 브라우저에서 사용자에게 정보 전달만을 수행하는 메서드.
* `parseInt` : 문자 데이터 타입으로 전달된 숫자를, 숫자 데이터 타입(정수형)으로 바꿔줌.
```js
if(userId === &quot;jane&quot; &amp;&amp; parseInt(userPw) === 12345) {
    alert(&quot;로그인되었습니다.&quot;);
} else {
    alert(&quot;아이디 또는 비밀번호가 틀렸습니다.&quot;)
}</code></pre><p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/4f9f0645-6b90-485e-9c96-5407d133f705/image.png" alt=""></p>
<h2 id="전역변수--지역변수">전역변수 &amp; 지역변수</h2>
<p>: (과거)<strong>함수를 기준(중괄호x)</strong>으로 구분</p>
<ul>
<li><p>전역변수 : 함수 바깥쪽에 위치하면서 함수 안쪽/바깥쪽 모두에 영향력을 발휘 o</p>
</li>
<li><p>지역변수 : 함수 안쪽에서 만들어진 변수 자체, 함수 안에서만 영향력을 발휘 o</p>
</li>
<li><p>(최신) 자바스크립트 버전에서는 변수 생성시,<code>var</code>가 아니라 <code>let</code>, <code>const</code> 등을 이용해 변수 생성이 가능 -&gt; 전역변수, 지역변수 구분기준이 달라짐.</p>
</li>
<li><p>모든 전역변수는 window라는 객체에 property(key)로 할당된다.
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/cd8b5b1d-c9c3-4f6f-aaae-e87449719f0e/%ED%99%94%EB%A9%B4%20%EC%BA%A1%EC%B2%98%202021-08-31%20122626.png" alt=""></p>
</li>
</ul>
<h2 id="스코프-scope">스코프 (Scope)</h2>
<p>: 변수가 영향력을 발휘할 수 있는 범위 (전역변수와 지역변수를 구분짓는 역할)</p>
<ul>
<li><p>전역 스코프 : 모든 영역에 영향력을 발휘할 수 있는 스코프</p>
</li>
<li><p>지역 스코프 : 함수 안에서만 영향력을 발휘할 수 있는 스코프</p>
</li>
</ul>
<p>👉 ** 함수는 서로의 스코프에 접근할 수 없다. (렉시컬 스코핑 (lexical scoping))**</p>
<pre><code class="language-js">function a() {
    var apple = &quot;사과&quot;;
}   
// apple이 영향력을 발휘할 수 있는 범위는 함수 호출과 관계없이 여기까지

function b() {
    console.log(apple);
}
// 함수b 내부에는 apple이 존재 x, 하지만 전역변수로 apple이 존재하는 것도 x =&gt; error

b();</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/d1295480-cd59-4027-ab0b-2e6ff4c0b25d/image.png" alt=""></p>
<h3 id="스코프-체인-scope-chain">스코프 체인 (Scope Chain)</h3>
<p>: 안쪽에서 부터 바깥쪽을 탐색하는 구조 (바깥쪽에서 안쪽을 탐색하는 것은 불가능)</p>
<pre><code class="language-js">var a = 10;  // -&gt; 전역 변수, 전역 스코프

function func1() {
    var b = 20;

    function func2() {
        var c = 30;

        console.log(a + b + c);
    }

    func2();

}

func1();</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/51418bb6-88dd-419d-ad43-ebb3f6480109/image.png" alt=""></p>
<h2 id="호이스팅-hoisting">호이스팅 (Hoisting)</h2>
<p>: 끌어올리다, 함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위의 최상단에 선언하는 것</p>
<h3 id="변수-호이스팅">변수 호이스팅</h3>
<p>: 변수 및 함수 선언문 보다 앞서 호출을 해도 정상작동이 되는 현상 (변수가 끌어올려 짐)</p>
<ul>
<li>끌어올리는 기능은 초기화에서는 발생 x, 변수를 선언한 상태에서만 호이스팅 발생. </li>
</ul>
<pre><code class="language-js">console.log(a);  // 값을 할당하기 이전 상태이기 때문에 undefined 출력

var a;
a = &quot;나는 A다.&quot;;  // 초기화

console.log(a);</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/64c299ea-aa02-46a6-b8bc-049546cf4425/image.png" alt=""></p>
<h3 id="함수-호이스팅">함수 호이스팅</h3>
<p>: 함수 호출을 먼저 하고, 함수를 만들어도 작동 가능</p>
<ul>
<li>변수 안에 함수를 할당시키지 않는 방식으로 함수를 만들었을 때 가능, 변수 안에 함수를 할당한 경우에는 함수 호이스팅은 발생 하지 않는다. </li>
</ul>
<pre><code class="language-js">/*
function func1() {
    console.log(&quot;Func1 함수다.&quot;);
*/ // 호이스팅
func1();

function func1() {
    console.log(&quot;Func1 함수다.&quot;);
}

func2();
var func2 = function () {
  // 변수는 값을 할당하기 이전에 호이스팅으로 인해 이미 undefined가 들어가 있다.
    console.log(&quot;Func2 함수다.&quot;);
}

// func2();</code></pre>
<h2 id="자주-사용되는-객체와-메서드">자주 사용되는 객체와 메서드</h2>
<h3 id="math-객체">Math 객체</h3>
<p>(참조 사이트 : <a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math">https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math</a>)</p>
<pre><code class="language-js">// console.log(Math);
Math.abs() // 절댓값 반환
const num1 = Math.abs(-3);
console.log(num1);  // 3

Math.ceil() //무조건 올림 처리
const num2 = Math.ceil(0.43);
console.log(num2); // 1

Math.floor() // 무조건 내림 처리
const num3 = Math.floor(10.9);
console.log(num3); // 10

Math.random() // 0에서 1 사이 랜덤으로 숫자를 뽑아냄
const num4 = Math.random();
console.log(num4); // 0 ~ 1 사이 랜덤</code></pre>
<h3 id="parse-메서드">parse 메서드</h3>
<ul>
<li><code>parseInt()</code> : 문자열을 정수형으로 변환 소수점 아래는 버린다.</li>
<li><code>parseFloat()</code> : 문자열을 실수형으로 변환</li>
</ul>
<h1 id="📌-학습내용-중-어려웠던-점">📌 학습내용 중 어려웠던 점</h1>
<hr>
<ol>
<li>스코프와 호이스팅의 개념이 아직 정확하게 이해가 되지 않는다.</li>
</ol>
<h1 id="📌-해결방법">📌 해결방법</h1>
<hr>
<ol>
<li>처음 접하는 부분이라 반복하는 것이 가장 좋은 방법이라 생각한다. 본 강의 뿐만 아니라 유튜브 강의와 서칭을 통해 찾은 포스팅을 통해 이해하려 노력해야겠다. </li>
</ol>
<h1 id="📌-학습소감">📌 학습소감</h1>
<hr>
<p>꽤 오랜 시간에 걸쳐서 강의를 들었다. 강의 자체는 재생 시간이 그리 길지 않았는데, 중간중간 이해가 가지 않는 부분을 되감아 듣고, 검색을 하는 등 시간이 많이 소모됐다. 특히 스코프와 호이스팅의 개념은 생소해서, 이해하는 데 시간이 걸렸다. 아직 몇 번 더 반복해야 완전히 내 것이 될 듯 하다. 😵</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[210825-26 개발일지]]></title>
            <link>https://velog.io/@jiyoon_jeong2005/210825-26%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@jiyoon_jeong2005/210825-26%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Wed, 25 Aug 2021 14:16:31 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-학습한-내용">📌 학습한 내용</h1>
<hr>
<h3 id="전체-코드--💾">전체 코드 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/js-start">💾</a></h3>
<h2 id="javascript">JavaScript</h2>
<p>: 웹 사이트의 주요 기능들, 주요 애니메이션 효과를 구현할 때 사용되는 high level 언어.</p>
<ul>
<li><p>이전에는 웹사이트 영역에 대해서만 활용이 가능했지만 현재는 <strong>하이브리드 앱</strong>을 제작할 수 있을 정도로 발전</p>
</li>
<li><p><a href="http://terms.tta.or.kr/dictionary/dictionaryView.do?word_seq=062067-4">하이브리드 앱</a> : HTML, CSS, JavaScript 세 가지 언어를 기반으로 안드로이드 앱(Java, Kotlin) 또는 아이폰 앱(Swift, Objective-C)을 제작</p>
</li>
<li><p>** Node.js** : JavaScript 언어로 구성되어 있는 <strong>서버개발</strong>을 도와주는 도구(tool)</p>
</li>
<li><p>IoT(사물인터넷) 개발에도 사용 가능</p>
</li>
</ul>
<h3 id="javascript의-세-분류">JavaScript의 세 분류</h3>
<p>1) <strong>자바스크립트 코어</strong>
: 자바스크립트의 문법적인 특징을 공부하는 영역</p>
<p>2) <strong>클라이언트 측 자바스크립트</strong> 
: 브라우저를 제어할 때 사용되는 자바스크립트
(스크롤의 위치, 마우스의 위치, 브라우저의 크기등을 가져오고 싶을 때, 자바스크립트를 이용해 HTML, CSS에 접근해 변화를 주고 싶을 때) </p>
<p>3) <strong>서버 측 자바스크립트</strong>
: Node.js 영역, 서버 개발에 용이</p>
<h3 id="javascript-언어를-html에-적용하는-방법">JavaScript 언어를 HTML에 적용하는 방법</h3>
<p>1) HTML 문서에 <code>&lt;script&gt;</code>를 이용해 코드(javascrip 언어)를 직접 입력</p>
<pre><code class="language-html">&lt;script&gt;
    console.log(&quot;Hello&quot;);
 //()안쪽에 입력된 정보를 console 탭에 출력하는 명령어
&lt;/script&gt;</code></pre>
<p>-&gt; 하나의 html 문서 안에 html 언어와 javascript 언어가 혼재된 상태 (코드분량이 길어져 가독성이 떨어짐)</p>
<p>2) <code>&lt;Script src=&quot;&quot;&gt;&lt;script&gt;</code>를 이용해 javascript 파일 경로를 입력</p>
<pre><code class="language-html">&lt;script src=&quot;js/main.js&quot;&gt;&lt;/script&gt;</code></pre>
<p>👉 위의 두 가지 방법중 하나만 사용해야 함
(파일 경로를 입력한 <code>&lt;script&gt;</code>에 직접 입력하는 방식으로 작성하면 작동 x)</p>
<p>👉 JavaScript 코드도 html, css와 마찬가지로 위에서부터 아래로 순차적으로 실행된다.</p>
<h3 id="javascript-주석처리-방법">JavaScript 주석처리 방법</h3>
<p>1) css와 동일 (전체 주석 처리) - 전체 주석 안에 전체 주석을 넣을 수 없음.</p>
<pre><code class="language-html">&lt;script&gt;
    /*
    console.log(&quot;Welcome&quot;);
    console.log(&quot;Hello&quot;);
    */
&lt;/script&gt;</code></pre>
<p>2) // 한 줄 주석 처리 - 전체 주석 안에 한 줄 주석을 넣을 수 있음.</p>
<pre><code class="language-html">&lt;script&gt;
  /*
    // console.log(&quot;Welcome&quot;);
    // console.log(&quot;Hello&quot;);
  */
     // console.log(&quot;AAA&quot;);
&lt;/script&gt;</code></pre>
<h2 id="javascript-문법">JavaScript 문법</h2>
<h3 id="변수-선언">변수 선언</h3>
<ul>
<li>변수 : 데이터를 저장하는 공간</li>
</ul>
<pre><code class="language-js">// comic 박스 생성
// 변수 선언
var comic;

// comic 박스 안에 원피스 데이터를 할당한 상태
// 변수 초기화
comic = &quot;원피스&quot;;

//변수 선언과 동시에 초기화 진행
var apple = &quot;사과&quot;; 


//변수 동시 선언
var a, b, c;
var a,
    b,
    c;

//변수 동시 초기화
var d = 10, e = 20, f = 30;
var d = 10,
    e = 20,
    f = 20;</code></pre>
<p><strong>👉 모든 변수는 선언과 동시에 <code>undefined</code> 가 자동으로 할당된다.</strong>
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/4412402b-2608-4c52-bdf8-6cc5580b1f69/image.png" alt=""></p>
<ul>
<li>변수안에 들어가는 데이터는 언제든 <strong>변경</strong>할 수 있다.<pre><code class="language-js">var house;
house = &quot;집&quot;;
console.log(house);
</code></pre>
</li>
</ul>
<p>house = &quot;아파트&quot;;
console.log(house);</p>
<pre><code>
* 최초 변수를 선언하고, 최초 초기화를 했을 때, undefined 에서 할당된 데이터로 변경되는 것.
```js
var house;
console.log(house);

//undefined -&gt; 집
house = &quot;집&quot;
console.log(house);</code></pre><h3 id="변수명-작성법">변수명 작성법</h3>
<p>: 일반적으로 변수명 작성시, 최소한 <strong>두 개의 명사</strong>를 이어서 작성 
-&gt; 구체적으로 명시를 해줘야 이해가 명확해진다.</p>
<pre><code class="language-js">var mathScoreStudent = 10;  // camelCase
var math_score_student = 10;  //snake_case</code></pre>
<h4 id="변수명-작성시-주의점">&lt;변수명 작성시 주의점&gt;</h4>
<ol>
<li>하이픈(-) 사용불가 -&gt; error로 취급<pre><code class="language-js">var math-score-student = 100;  //kebab case</code></pre>
</li>
<li>_, $를 제외한 특수문자는 변수의 첫 글자로 사용 불가</li>
<li>숫자는 변수 첫 글자로 사용 불가</li>
<li>변수명은 값을 유추할 수 있도록 최대한 자세히 작성</li>
<li>예약어는 변수명으로 사용 불가</li>
</ol>
<h3 id="데이터-타입--데이터-종류">데이터 타입 (= 데이터 종류)</h3>
<p>: 8개의 타입과 2가지 진영</p>
<p><strong>1. 원시 타입(Primitive Type)</strong>
문자열(String), 숫자(Number), 논리(Boolean, 참/거짓), undefined, null</p>
<p><strong>2. 참조 타입(Reference Type)</strong>
배열(Array), 함수(Function), 객체(Object)</p>
<h4 id="문자열string">문자열(String)</h4>
<p>: 두 가지 형식으로 작성 가능 (혼용x)</p>
<pre><code class="language-js">var msg1 = &quot;Hellow World&quot;;
var msg2 = &#39;Welcome&#39;;</code></pre>
<ul>
<li>문자열에 &#39;/&quot;가 들어가는 경우<pre><code class="language-js">var msg4 = &quot;She&#39;s girl&quot;;
var msg5 = &#39;She\&#39;s girl&#39;;</code></pre>
=&gt; 검은색 텍스트로 출력됨</li>
</ul>
<h4 id="숫자number">숫자(Number)</h4>
<p>정수, 실수, 연산작업 모두 가능 </p>
<pre><code class="language-js">var num1 = 10;
var num2 = -3.14;

console.log(num1 + num2);
console.log(num1 + num3);</code></pre>
<p>=&gt; 파란색 텍스트로 출력됨</p>
<h3 id="👉-연산자">👉 연산자</h3>
<h4 id="1--숫자-사칙연산">1)  숫자 사칙연산</h4>
<pre><code class="language-js">var a = 20;
var b = 10;

console.log(a + b);
console.log(a - b);
console.log(a * b);
console.log(a / b);
console.log(a % b);  // 나머지</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/1148daf1-df6f-474d-b04b-ea034ca15da1/image.png" alt=""></p>
<h4 id="2-문자열-연산">2) 문자열 연산</h4>
<p>: <strong>덧셈을 제외</strong>하고는 사칙연산 일부 작업이 가능 </p>
<pre><code class="language-js">var str1 = &quot;20&quot;;
var str2 = &quot;10&quot;;

console.log(str1 + str2);
// 글자를 이어붙인다
console.log(str1 - str2);
console.log(str1 * str2);
console.log(str1 / str2);
console.log(str1 % str2);</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/946d1dbf-01cb-4da6-8a8f-16b9b648d7a7/image.png" alt=""></p>
<p>-&gt; 이러한 특성을 이용해 아래와 같은 작업이 가능 (공백을 문자로 인식, html과 차이점)</p>
<pre><code class="language-js">var firstName = &quot;Jane&quot;
var lastName = &quot;Jeong&quot;

console.log(firstName + &quot;       &quot; + lastName)</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/dfe4dd05-2762-49da-89b1-1dd6aacb91f6/image.png" alt=""></p>
<h4 id="3-----연산자">3) ++, -- 연산자</h4>
<p>: +1 / -1 씩 증가 / 감소 시킬 때 사용</p>
<pre><code class="language-js">var num10 = 10;

// num10 = num10 - 1;
// console.log(num10);
console.log(--num10); // 9
console.log(--num10); // 8

console.log(++num10); // 11
console.log(++num10); // 12</code></pre>
<p>-&gt; 등호 데이터는 뒤에서 부터 해석하는 것이 좋음 (10이라는 데이터가 들어있는num10에서 -1을 한 데이터(9)를 다시 자기자신에 업데이트 한 것)</p>
<p>👉 연산자를 앞/뒤, 어디에 붙이느냐에 따라 그 결과값은 달라짐</p>
<pre><code class="language-js">var num10 = 10;

console.log(num10--);
console.log(num10);
// -&gt; 우선 num10의 값을 출력하고, -1을 차감하는 것 (후차감)

console.log(--num10);
console.log(num10);
// -&gt; -1을 차감한 상태로 값을 업데이트를 해서 나타내는 것 (선차감)</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/6399d36b-a92b-4089-b716-c305f07ae63b/image.png" alt="">
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/efcf592c-db02-4fab-b4b7-743a588b6d43/image.png" alt=""></p>
<h4 id="4------">4) +=, -+, *=, /+. %=</h4>
<p>: 자기자신에 대해 새로운 값을 업데이트(재할당) 할 때 사용</p>
<pre><code class="language-js">var num20 = 20;

// num20 = num20 + 10;
num20 += 10;

console.log(num20);</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/ab4812a9-a35c-4960-8036-3fe3c4fbbb29/image.png" alt=""></p>
<h4 id="5-비교연산자">5) 비교연산자</h4>
<p>: &gt;, &lt;, ==, ===, !=, !==, &lt;=, &gt;=</p>
<ul>
<li><p>결과값으로 항상 논리값(Boolean)이 나온다.</p>
</li>
<li><p><code>==</code> : 값만 동일하면 true</p>
</li>
<li><p><code>===</code> : 값과 데이터타입 모두 동일해야 true</p>
<pre><code class="language-js">var num10 = 10;
var num20 = 20;
</code></pre>
</li>
</ul>
<p>var str10 = &quot;10&quot;;
var str20 = &quot;20&quot;;</p>
<p>console.log(num10 == str10);
console.log(num10 === str10);</p>
<pre><code>![](https://images.velog.io/images/jiyoon_jeong2005/post/05eba398-43a4-4141-9d59-2225f25a746f/image.png)

#### 6) 논리연산자: AND (&amp;&amp;), OR(||)

* `&amp;&amp;` : 모든 조건이 참이어야 true 반환
* `||` : 하나라도 참이면 true 반환

#### 논리값(Boolean) : true/false
: 결과값이 true/false 로 나타나는 상황 자체, 일반적으로 논리 연산자와 결합해 사용
```js
console.log(true);
console.log(false);
console.log(1 === 2);
console.log(10 &lt; 20);
console.log(10 === 10 || 20 === 30)</code></pre><p>ex) 사이트에 로그인 하는 경우 아이디와 비밀번호 입력시, 하나라도 틀리면 로그인이 되지 않게 함</p>
<h4 id="null-undefiend">null, undefiend</h4>
<p>: 양쪽 모두 값이 없는 상태</p>
<ul>
<li><code>null</code> : 등호 사용, 변수 초기화로 <strong>명시적으로</strong> 빈 값을 변수 안에 할당한 상태</li>
<li><code>undefined</code> : 변수를 선언만 한 상태</li>
</ul>
<p><strong>&lt;null과 undefined 차이점&gt;</strong></p>
<ul>
<li><p><code>typeof a</code> : a 의 데이터 타입을 반환 </p>
<pre><code class="language-js">console.log(typeof 10);
console.log(typeof &quot;Hello World&quot;);</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/b32c4491-3b2b-4be1-8235-bb3d9500929c/image.png" alt=""></p>
</li>
<li><p><code>typeof null</code> -&gt; <code>object</code> : null 이 태생적으로 갖고 있는 <strong>버그</strong>때문</p>
</li>
<li><p><code>typeof undefined</code> -&gt; <code>undefined</code></p>
</li>
<li><p><code>null == undefined</code> -&gt; <code>true</code> : 값이 없음
<code>null === undefined</code> -&gt; <code>false</code> : 데이터타입 다름</p>
</li>
</ul>
<p><strong>&lt;null과 undefined의 사칙연산&gt;</strong></p>
<ul>
<li>숫자 + null = 숫자 : null이 0으로 바뀌게 됨</li>
<li>숫자 + undefined = NaN
  NaN (Not a Number) : 숫자가 아님, 연산 불가능한 값을 전달했을 때 발생하는 오류</li>
</ul>
<h4 id="-부정문">! 부정문</h4>
<p>: 반대값으로 반환</p>
<ul>
<li><p><code>!true</code> -&gt; <code>false</code> / <code>!false</code> -&gt; <code>ture</code></p>
</li>
<li><p><code>!null</code> -&gt; <code>true</code>
<code>!!null</code> -&gt; <code>false</code> : 이미 <code>ture</code>로 반환된 값을 다시 <code>!ture</code> 한 것으로 취급되어 <code>false</code>가 됨, undefined도 동일한 결과를 가짐</p>
</li>
</ul>
<hr>
<h3 id="함수-function">함수 (Function)</h3>
<h4 id="기본-구조">기본 구조</h4>
<pre><code class="language-js">// 함수 선언 : 기능을 만든 상태
// 매개변수 : a, b
function 함수명(a, b) {

    console.log(a + b);
}

//함수 호출 : 만들어진 기능의 스위치를 켜는 행위 자체 
// 인수 : 10, 20
함수명(10, 20);</code></pre>
<ul>
<li><code>Parameter</code> (매개변수) : 함수 작동 시 필요로 하는 값 선언</li>
<li><code>Argument</code> (인수) : (인자), 함수 호출 시 전달되는 값</li>
<li>매개변수를 지정 후, 인수 전달 시 누락된 매개변수가 있을 경우 해당 매개변수에는 undefined가 할당되어 있는 상태</li>
<li>매개변수와 전달된 인수는 항상 쌍을 이루고 있는 상태로 함수를 호출해줘야 함</li>
<li><strong>자바스크립트의 모든 데이터 타입은 매개변수로 전달할 수 있다.</strong></li>
</ul>
<h4 id="return">return</h4>
<p>: 함수를 호출했을 때, 호출된 시점에 return 안에 들어가있는 값을 반환</p>
<ul>
<li>다른 변수에 값을 전달할 경우<pre><code class="language-js">function sum(num1, num2) {
  return num1 + num2;
}
</code></pre>
</li>
</ul>
<p>var result = sum(10, 20);
console.log(result);</p>
<pre><code>* return으로 전달받은 값으로 새로운 공식에 대입할 경우
```js
function area(hor, ver) {
    return hor * ver; 
}

var volume = area(10, 20) * 100; // 200을 갖고 있는 상태
console.log(volume);</code></pre><p>(참고 사이트 : <a href="https://brunch.co.kr/@brunch92ny/9">https://brunch.co.kr/@brunch92ny/9</a>)</p>
<h3 id="배열-aarray">배열 (Aarray)</h3>
<pre><code class="language-js">var alphabet = [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;];
console.log(alphabet);</code></pre>
<p>-&gt; 각각의 좌표값(<strong>index</strong>)
   0: &quot;a&quot;
   1: &quot;b&quot;
   2: &quot;c&quot;</p>
<pre><code class="language-js">console.log(alphabet[2]);  // c
console.log(alphabet[1]);  // b</code></pre>
<p>-&gt; 특정 데이터에 접근 가능</p>
<ul>
<li><strong>인덱스를 이용해 데이터를 변경 가능</strong><pre><code class="language-js">alphabet[2] = &quot;d&quot;;
consle.log(alphabet); 
</code></pre>
</li>
</ul>
<p>// =&gt; [&quot;a&quot;, &quot;b&quot;, &quot;d&quot;]</p>
<pre><code>* `length` : 배열안에 들어가있는 데이터의 갯수

* **자바스크립트의 모든 데이터타입을 배열에 삽입 가능**

#### 👉 배열을 작성할 때 주의점
1) 배열 안의 데이터는 가능한 **동일한 데이터 타입**을 갖고 있어야 함.
```js
var num = [10, 20, 30, 3.14]; // o
var num = [10, 20, 30, &quot;Hello World&quot;]; // x</code></pre><p>2) 배열 안의 데이터는 가능한 <strong>동일한 성격</strong>을 갖고 있어야 함. </p>
<pre><code class="language-js">var fruit = [&quot;사과&quot;, &quot;배&quot;, &quot;바나나&quot;, &quot;멜론&quot;];  // o
var fruit = [&quot;사과&quot;, &quot;배&quot;, &quot;바나나&quot;, &quot;양상추&quot;];  // x</code></pre>
<h4 id="배열-안에-있는-배열-데이터에-접근하는-방법">배열 안에 있는 배열 데이터에 접근하는 방법</h4>
<pre><code class="language-js">var score = [[10, 20, 30], [100, 200, 300]];

console.log(score);
console.log(score[1]);
console.log(score[1][2]);</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/47f45163-f554-4f12-bc50-421067a62b97/image.png" alt=""></p>
<h3 id="객체-object">객체 (Object)</h3>
<p>: 베열과 유사, 여러 개의 데이터를 한 곳에 넣고자 할 때(항목들을 받아내는 영역)</p>
<pre><code class="language-js">var student = {
    name: &quot;Jane&quot;,
    age: 23,
    skills: [&quot;JS&quot;, &quot;HTML&quot;, &quot;CSS&quot;]
}

console.log(student);</code></pre>
<ul>
<li><code>key</code> : name, age, skills</li>
<li><code>value</code> : &quot;Jane&quot;, 23, [&quot;JS&quot;, &quot;HTML&quot;, &quot;CSS&quot;]</li>
</ul>
<p>=&gt; <code>property</code></p>
<h4 id="객체-안에-있는-데이터에-접근하는-방법">객체 안에 있는 데이터에 접근하는 방법</h4>
<p>1) <code>consloe.log(변수명.데이터 key)</code></p>
<pre><code class="language-js">console.log(student.name);
// =&gt; Jane</code></pre>
<p>2) <code>console.log(변수명[&#39;데이터key&#39;]);</code></p>
<pre><code class="language-js">console.log(student[&#39;name&#39;]);
// =&gt; Jane</code></pre>
<h4 id="객체-안에-있는-특정-배열-데이터에-접근하는-방법">객체 안에 있는 특정 배열 데이터에 접근하는 방법</h4>
<pre><code class="language-js">console.log(studet.skills[1]);
// -&gt; HTML</code></pre>
<h4 id="기존-객체-안에-없는-새로운-데이터를-추가하는-방법">기존 객체 안에 없는 새로운 데이터를 추가하는 방법</h4>
<p><code>객체명.새로운key값 = &quot;value&quot;</code> 직접적으로 추가</p>
<h4 id="자바스크립트의-모든-데이터타입을-객체에-삽입-가능">자바스크립트의 모든 데이터타입을 객체에 삽입 가능</h4>
<pre><code class="language-js">var student = {
    name: &quot;Jane&quot;,
    age: 23,
    skills: [&quot;JS&quot;, &quot;HTML&quot;, &quot;CSS&quot;],

    test1: true,
    test2: null,
    test3: undefined,
    test4: {color: &quot;red&quot;},

      //메서드
    sum: function (num1, num2) {  
    // sum이라는 키값 자체가 함수명을 대체
        return num1 + num2
    }
};

var result = student.sum(10, 20);
console.log(result);   // =&gt; 30</code></pre>
<ul>
<li>메서드 : 객체 안쪽에서 만들어진 함수</li>
<li>함수 : 객체 바깥쪽에서 만들어진 함수</li>
</ul>
<pre><code class="language-js">student.sum(10, 20);
// student라는 객체 안에 있는 sum이라는 에서드를 이용한 것.

console.log(&quot;Hellow World&quot;);
// console이라는 객체 안에 있는 log 라는 메서드를 아용한 것.</code></pre>
<h3 id="원시-타입primitive과-참조-타입reference의-차이점">원시 타입(Primitive)과 참조 타입(Reference)의 차이점</h3>
<p>(참고 사이트 : <a href="https://brunch.co.kr/@brunch92ny/10">https://brunch.co.kr/@brunch92ny/10</a>)</p>
<ul>
<li><p>원시 타입 
: 원본과 복사본의 개념이 존재, 서로 독립적
(원본을 수정하든, 복사본을 수정하든, 서로의 데이터에는 영향을 미치지 x)</p>
</li>
<li><p>참조 타입 
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/3cc08321-3650-41ce-b34e-040355902ea7/%EC%B0%B8%EC%A1%B0%20%ED%83%80%EC%9E%85%20%EC%84%A4%EB%AA%85.png" alt=""></p>
</li>
</ul>
<p>-&gt; Obj1이 가리키고 있는 주소를 Obj2도 가리키게 되는 것으로, 주소를 공유하고 있는 것. 따라서 주소 안의 데이터가 변경되면 양쪽 모두의 데이터가 바뀌게 되는 것이다.</p>
<h2 id="배운-것-적용하기">배운 것 적용하기</h2>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/843ec94d-2f91-4a17-b60a-d7c776ec7ade/js%20start2.gif" alt=""></p>
<pre><code class="language-html">&lt;div id=&quot;color-bg&quot;&gt;
    &lt;button id=btn type=&quot;button&quot;&gt;클릭&lt;/button&gt;
&lt;/div&gt;</code></pre>
<pre><code class="language-js">var colors = [
    &#39;yellow&#39;, 
    &#39;green&#39;, 
    &#39;pink&#39;, 
    &#39;#dc143c&#39;, 
    &#39;rgba(123, 123, 123, 0.5)&#39;
];

var bg = document.getElementById(&#39;color-bg&#39;);
var btn = document.getElementById(&#39;btn&#39;);

btn.addEventListener(&#39;click&#39;, function() {

    // 0 ~ 4
    var random = Math.floor(Math.random() * 5) 
    // console.log(random);
    console.log(colors[random]);

    bg.style.backgroundColor = colors[random];
})</code></pre>
<ul>
<li><code>document</code> : html문서에 영향력을 미치는 객체 (클라이언트 측 자바스크립트 - html 문서를 제어, 브라우저를 제어)</li>
<li><code>getElementById</code> : document 객체 안에 있는 메서드</li>
</ul>
<ul>
<li><p><code>addEventListener(&#39;이벤트의 종류&#39;, function()&#39; {})</code>
: 이벤트를 실행했을 때, 두 번째로 만들어 놓은 함수를 자동으로 호출</p>
<pre><code class="language-js">btn.addEventListener(&#39;click&#39;, function() {
  console.log(&quot;Hello&quot;);
})</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/58bc252b-1a36-4e24-a4d7-7aafb85b2d29/js%20start1.gif" alt=""></p>
</li>
<li><p><strong>익명 함수</strong> : 함수 이름이 없는 함수</p>
</li>
<li><p><strong>콜백 함수</strong> : 호출 기호 없이 특정 조건 하에 자동으로 호출이 되는 함수</p>
</li>
<li><p><code>Math.random()</code> : 0을 포함해 1미만까지의 숫자를 실수형태로 랜덤하게 표현할 때 사용하는 메서드</p>
</li>
<li><p><code>Math.floor()</code> : 소수점 이하는 버림</p>
</li>
</ul>
<h3 id="추가-설명">추가 설명</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/a98469b2-fab1-475f-a113-f6d8c6f591f8/image.png" alt="">
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/a5bf1e41-aabe-4881-8d5c-f65b5f39295f/image.png" alt=""></p>
<ul>
<li><p>여러 개의 js 파일을 html에 연동할 때도, 작성된 순서 대로 결과값을 반환한다.</p>
</li>
<li><p>하나의 js파일에서 생성한 변수를 다른 js파일에서 호출할 수 있다.</p>
</li>
<li><p>하나의 js파일에서 생성한 함수를 다른 js파일에서 호출할 수 있다. 단, html파일에 연동시키는 순서는 항상 주의해야 한다. (먼저 존재하는 파일을 연동 시키고, 사용할 파일을 그 후에 연동시켜야 한다)</p>
</li>
</ul>
<h1 id="📌-학습내용-중-어려웠던-점">📌 학습내용 중 어려웠던 점</h1>
<hr>
<h1 id="📌-해결방법">📌 해결방법</h1>
<hr>
<h1 id="📌-학습소감">📌 학습소감</h1>
<hr>
<p>오늘부터 드디어 자바스크립트를 시작했다! 오늘은 자바스크립트 코어(문법) 영역을 중점적으로 공부했다. Python을 몇 번 다뤄 본적이 있어서 변수명과 데이터 타입에 대해서는 금방 따라갈 수 있었다. 하지만 실습에서 html과 css 그리고 자바스크립트를 연동해 다양한 객체와 메서드를 불러와서 작업할 때는 어질어질했다. 처음 접하는 작업이니 그럴 수 있다고 생각하다가도 얼른 이해해버리고 다음 단계로 넘어가야지하는 의욕이 생긴다. 오랜만에 실습이 아닌 개념 공부를 하니까 또한 재미있었다.😋 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[210824 개발일지]]></title>
            <link>https://velog.io/@jiyoon_jeong2005/210824-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@jiyoon_jeong2005/210824-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Tue, 24 Aug 2021 13:06:30 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-학습한-내용">📌 학습한 내용</h1>
<hr>
<h2 id="네이버-모바일-실습-2">네이버 모바일 실습 2</h2>
<h3 id="전체-코드--💾">전체 코드 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/m_naver_copycat(0823-0824)">💾</a></h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/9d7e40f4-cd00-4b77-8550-81ada4678b67/naver%20m%202.gif" alt=""></p>
<h3 id="이벤트-채널">이벤트 채널</h3>
<ul>
<li>좌우의 공통된 영역을 뽑아 우선적으로 작업하고, 왼쪽영역의 일부를 수정해서 오른쪽 영영을 만들어 주었다.</li>
</ul>
<h3 id="👉-float의-특징">👉 <code>float</code>의 특징</h3>
<p>: 부모가 갖고 있는 공간의 크기보다 <code>float</code>을 사용한 자식들의 공간의 크기의 합이 더 크다면, 레이어가 어긋나는 현상 발생 </p>
<ul>
<li>내부 요소들이 (자식태그들이) 모두 <code>float</code>으로 3차원적 특징을 가지기 때문에 <code>&lt;ul&gt;</code>가 자식들의 높이값을 인지하지 못하는 현상이 발생
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/a7a8edbc-232c-4d16-89d5-cba367d0e42e/image.png" alt=""></li>
<li><blockquote>
<p><code>&lt;ul&gt;</code>에 <code>overflow: hidden;</code>을 적용해 자식의 높이값을 인식할 수 있도록 함 </p>
</blockquote>
</li>
</ul>
<h3 id="오늘-네이버">오늘 네이버</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/2f6d637f-aa8f-4616-ac53-758d909aa478/image.png" alt=""></p>
<h3 id="하단-영역">하단 영역</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/7b47e6d2-51bf-47e3-a2bd-374308ab9aba/image.png" alt=""></p>
<h1 id="📌-학습내용-중-어려웠던-점">📌 학습내용 중 어려웠던 점</h1>
<hr>
<h1 id="📌-해결방법">📌 해결방법</h1>
<hr>
<h1 id="📌-학습소감">📌 학습소감</h1>
<hr>
<p>드디어 html, css 관련 실습이 끝이 났다. 네이버 모바일 버전이 생각한 것 보다 간단하기도 했고, &#39;이벤트 채널&#39; 영역을 작성할 때, 공통된 부분을 잘 뽑아내서 클래스화 시킨 것 같다. 내일부터는 드디어 자바스크립트를 시작한다. 여태껏 실습해온 페이지들에 이것 저것 기능을 적용시켜 좀 더 화려해질 수 있다고 생각하니, 정말 기대가 된다. 😆</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[210823 개발일지]]></title>
            <link>https://velog.io/@jiyoon_jeong2005/210823-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@jiyoon_jeong2005/210823-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Mon, 23 Aug 2021 13:06:23 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-학습한-내용">📌 학습한 내용</h1>
<hr>
<h2 id="네이버-모바일-실습">네이버 모바일 실습</h2>
<h3 id="전체-코드--💾">전체 코드 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/m_naver_copycat(0823-0824)">💾</a></h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/70282e34-a8e4-4b73-b67e-ba74133a10d1/naver%20m%201.gif" alt=""></p>
<h3 id="👉-모바일-버전-작업시-반드시-넣어줘야-하는-코드">👉 모바일 버전 작업시 반드시 넣어줘야 하는 코드</h3>
<pre><code class="language-html">&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;</code></pre>
<p>-&gt; 디바이스 화면 크기에 맞춰서 비율을 자동으로 확대/축소 해줌</p>
<ul>
<li><p><code>overflow-x: hidden;</code> : x축으로 영역을 벗어나는 요소를 숨김</p>
</li>
<li><p><code>overflow-y: auto;</code> : y축으로 영역을 벗어나는 요소가 있을 시 스크롤 생성 (없으면 스크롤 생성 x)</p>
</li>
<li><p><code>vh(viewpoint height)</code> : 기기 화면의 높이값을 기준으로 맞춤 (100vh = 기기 높이의 100%)</p>
</li>
</ul>
<h3 id="상단-네비게이션">상단 네비게이션</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/31bf7941-62b1-4c74-a24c-29aff8e5266d/m_naver%20nav.gif" alt=""></p>
<ul>
<li><code>overflow-x: auto;</code> : 가로 스크롤 생성</li>
<li>flex를 이용해 x축 정렬 + 줄바꿈 없이 옆으로 넘어가게 하기 위해 <code>flex-wrap: nowrap</code>, <code>white-space:nowrap</code>으로 줄바꿈 없애줌<pre><code class="language-css">#main-nav {
  overflow: hidden;
  background-color: rgb(7, 189, 120);
}   
</code></pre>
</li>
</ul>
<p>#main-nav ul {
    overflow-x: auto;</p>
<pre><code>display: flex;
flex-wrap: nowrap;
align-items: center;

white-space: nowrap;</code></pre><p>} </p>
<pre><code>### 👉 스크롤 감추기 
```css
#main-nav ul {
    -ms-overflow-style: none; 
    scrollbar-width: none;
}

#main-nav ul::-webkit-scrollbar {
    display: none;
}</code></pre><ul>
<li><code>-ms-</code> : explore, edge 브라우저에 영향을 미치는 pre-fix</li>
<li><code>scrollbar-width</code> : firefox에서 사용 가능한 css</li>
<li><code>::-webkit-scrollbar { display: none; }</code> 
: <code>-webkit-</code> : chrom, safari, opera 브라우저에서 사용하는 가상선택자
=&gt; 위의 세 가지의 코드는 스크롤바에 영향을 미치는 css 속성</li>
</ul>
<h3 id="상단-헤더">상단 헤더</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/9c91b19a-b850-4df4-a831-e167e6ba18bc/image.png" alt=""></p>
<h3 id="banner">banner</h3>
<ul>
<li><p>이미지의<code>width</code>를 설정해주면 <code>height</code>도 자동으로 비율에 맞춰 조정됨</p>
</li>
<li><p>전체적으로 배너는 이미지를 사용해서 넣어줬다. <strong>&#39;banner-4&#39;</strong> 영역은 실제 화면보다 큰 이미지를 사용했다.</p>
</li>
<li><blockquote>
<p><code>overflow: hidden;</code>을 사용해 해당 영역을 벗어나는 부분을 감추고, x축 중앙정렬 공식으로 정중앙으로 배치</p>
</blockquote>
<pre><code class="language-css">#banner-4 {
   overflow: hidden;
   background-color: #ffffff;
   margin-top: 10px;
}
</code></pre>
</li>
</ul>
<p>#banner-4 .banner-wrap {
    width: 100%;
    height: 155px;
}</p>
<p>#banner-4 .banner-wrap img {
    position: relative;</p>
<pre><code>height: 100%;

left: 50%;
transform: translate(-50%);</code></pre><p>}</p>
<pre><code>![](https://images.velog.io/images/jiyoon_jeong2005/post/0fcf2fa0-9453-4a70-b52c-81c19cdb6241/%EC%A0%9C%EB%AA%A9%20%EC%97%86%EC%9D%8C.png)

### 일기예보
![](https://images.velog.io/images/jiyoon_jeong2005/post/bcd313a1-5c5c-40a1-916a-215116a8b7ed/image.png)

### NOW.

* 영역 하단의 버튼에 대해 `:before` 가상선택자를 지정할 때, &#39;|&#39;의 위치 조정
1) `display: inline-block;` 설정시
```css
#now .btn-wrap .btn-shopping:before {
    display: inline-block;
    content: &quot;&quot;;
    width: 1px;
    height: 14px;

    margin-top: 15px;
    background-color: rgba(125, 127, 133, .2);

    vertical-align: top;
}</code></pre><p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/9fe3e3d8-26fd-45d0-bb9d-d5c9c775acf5/image.png" alt="">
-&gt; 동일 선상에 배치됨</p>
<p>2) &#39;|&#39;를 해당 영역 안에서 왼쪽 끝으로 넣어주어야 하므로, <code>float: left;</code>를 사용 -&gt; float을 사용하면 3차원 속성을 일부 가지게 되기 때문에 <code>display</code>를 이용해 배치작업을 하지 않아도 된다.
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/00a4f17e-9432-427f-bf69-4f71d89c558a/image.png" alt=""></p>
<ul>
<li><code>&lt;ul&gt;</code>이 슬라이드 되는 영역을 왼쪽 끝까지로 하기 위해 <code>margin-left: 20px;</code>이 아니라 <code>padding-left: 20px;</code>로 적용
1) <code>margin-left</code> 적용시
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/69d2c639-5e91-4036-8298-316d4786e14c/margin.gif" alt=""></li>
</ul>
<p>2) <code>padding-left</code> 적용시
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/4ee4af3d-1f15-43dc-a1ee-04208595b16b/padding.gif" alt=""></p>
<h3 id="코로나19">코로나19</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/8ba98343-c2f0-437d-8f18-9710f287b74a/image.png" alt=""></p>
<ul>
<li><p><code>:before</code> 가상선택자에 <code>position: absolute;</code>를 사용할 경우, 가상선택자 바로 앞의 태그를 기준으로 움직이기 위해 해당 태그에 <code>position: relative;</code>를 적용해주어야 한다.</p>
<pre><code class="language-css">#corona .corona-wrap a {
  position: relative;

  display: flex;
  flex-wrap: wrap;
  align-items: center;

  padding: 20px 0;
}
</code></pre>
</li>
</ul>
<p>#corona .corona-wrap a.right-corona {
    padding-left: 11px;
}</p>
<p>#corona .corona-wrap a.right-corona:before {
    display: inline-block;
    content: &quot;&quot;;</p>
<pre><code>position: absolute;
width: 1px;
height: 42px;
background-color: #efeff0;

top: 20px;
left: 0;</code></pre><p>}</p>
<pre><code>
### QR 체크인 안내
![](https://images.velog.io/images/jiyoon_jeong2005/post/7cf36214-2bc9-4fdb-9161-6f90bdd9a384/image.png)

* 실제 네이버 모바일에서는 높이값을 고정값으로 잡아주었지만, `padding` 값을 넣어주는 것으로 대체

# 📌 학습내용 중 어려웠던 점
---
1. 상단 네비게이션 바에서 &#39;홈&#39; 영역의 아래쪽에 `border-bottom` 넣기

# 📌 해결방법
---
1. 평소에 자주 했던 부분인데 조금 헤맸다. 실제 네이버 모바일 페이지의 상단바와 동일하게 `border-bottom`을 넣어주기 위해, 
(1) `&lt;a&gt;`에 `display: block;`을 넣어 `height: 100%;`를 인식할 수 있게 함.
(2) 강의에서는 `&lt;a&gt;`에 작성했던 `padding: 0 10px;`을 `&lt;li&gt;`로 옮겨줌.
(3) 해당 영역의 모든 `&lt;a&gt;`에 `border-bottom: solid 3px transparent;`을 적용 후, `class=&quot;on&quot;` 선택자를 가진 `&lt;li&gt;`의 `&lt;a&gt;`의 `border-bottom`의 색을 변경해줌.

# 📌 학습소감
---

모바일 버전은 오랜만에 만들었다. 네이버는 pc 버전과 모바일 버전을 하나의 html 파일로 만들지 않고 완전히 다르게 사용했다. 이는 디자인에서 많은 차이가 나기 때문이다. 모바일 버전은 실제 pc 버전보다 요소들이 간소화 되어 있고, 이미지로만 이루어진 배너가 대부분을 이루어 꽤 쉽게 작업했다. 😗</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[210820 개발일지]]></title>
            <link>https://velog.io/@jiyoon_jeong2005/210820-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@jiyoon_jeong2005/210820-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Fri, 20 Aug 2021 07:51:33 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-학습한-내용">📌 학습한 내용</h1>
<hr>
<h2 id="유튜브-채널-페이지-실습">유튜브 채널 페이지 실습</h2>
<h3 id="전체-코드--💾">전체 코드 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/youtube_copycat(0819-0820)">💾</a></h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/25c78854-9f02-45da-9be8-2db7289f13a1/youtube%20sub%20complete.gif" alt=""></p>
<h3 id="상단-영역--왼쪽-영역">상단 영역 &amp; 왼쪽 영역</h3>
<ul>
<li>유튜브 메인 페이지와 동일한 코드 사용</li>
</ul>
<h3 id="배너-영역">배너 영역</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/63a21ae2-327b-46aa-9973-4760147ce7dc/image.png" alt=""></p>
<h3 id="채널-헤더-영역">채널 헤더 영역</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/2bfe3c75-62e0-44c1-a8ec-fbd931aa356f/youtube%20sub%20content%20header.gif" alt=""></p>
<ul>
<li>실제 YouTube 사이트에서는 input에 해당하는 영역이 button을 누르면 나타나게 되는데, 이는 자바스크립트 기능이 필요한 부분으로 border가 나타나는 형식으로만 변경했다.<pre><code class="language-css">#channel-nav .search-wrap input:focus {
  border-bottom: solid 2px #ffffff;
  color: #ffffff;
}</code></pre>
</li>
</ul>
<h3 id="최근-영상-영역">최근 영상 영역</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/d5d973b0-9acc-4b4f-8592-677165891165/image.png" alt=""></p>
<ul>
<li>강의 화면과의 차이가 많아 실제 사이트와 유사하게 개인적으로 작업했다. 오른쪽의 텍스트 영역이 전체적으로 봤을 때, 윗쪽을 기준으로 맞춰져 있어서 <code>align-items: flex-start;</code>를 적용했다.</li>
</ul>
<h2 id="유튜브-탐색-페이지-실습">유튜브 탐색 페이지 실습</h2>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/8003a779-7d79-480a-a3fb-c7530aca5ba5/youtube%20explore%20complete.gif" alt=""></p>
<h3 id="상단-영역--왼쪽-영역-1">상단 영역 &amp; 왼쪽 영역</h3>
<ul>
<li>유튜브 메인 페이지와 동일한 코드 사용</li>
</ul>
<h3 id="메인-상단-네비게이션-영역">메인 상단 네비게이션 영역</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/bf521b93-2407-48b0-aef6-f6ef6f5bddbc/youtube%20explore%20nav%20bar.gif" alt=""></p>
<ul>
<li>화면 비율이 강사님의 노트북과 차이가 나, <code>&lt;main&gt;</code>의 <code>width</code> 값을 다르게 적용했다. 때문에 상단 네비게이션 영역을 실제 Youtube 페이지와 동일하게 (자바스크립트 기능을 제외하고) 한 줄이 내려오도록 작업했다.</li>
</ul>
<h3 id="플레이-리스트-1">플레이 리스트 1</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/42080351-0c00-4ff3-906e-61d2b22734e8/image.png" alt=""></p>
<ul>
<li>강의 내용에는 없었지만, 채널 페이지의 플레이리스트와 동일한 형식이어서 코드를 재활용 했다. 하지만 채널 페이지의 플레이리스트는<code>border-top</code>을 이용해 위쪽에 구분선을 넣어주었기 때문에, 변수명의 일부를 바꿔 css를 완전히 동일하게는 작성할 수 없었다.   </li>
</ul>
<h3 id="플레이-리스트-2">플레이 리스트 2</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/defcacd2-3aa4-4325-add9-53e06a34598e/image.png" alt=""></p>
<h1 id="📌-학습내용-중-어려웠던-점">📌 학습내용 중 어려웠던 점</h1>
<hr>
<h1 id="📌-해결방법">📌 해결방법</h1>
<hr>
<h1 id="📌-학습소감">📌 학습소감</h1>
<hr>
<p>Youtube 카피캣이 오늘로 끝이 났다. 자주 사용하지 않았던 <code>transition</code> 속성을 넣어주는 것 이외에는 특별히 어려웠던 점은 없었다. 또한 강의에 없는 내용도 스스로 만들어, 보람있는 작업기간이었다. 이제는 오류가 나더라도 당황하지 않고 즐기며 찾을 수 있는 단계까지 온 것 같다. (물론 JS는 아직이지만!) 완성도 높은 페이지를 작업할 수 있어서 레벨업한 기분이다. 😝 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[210819 개발일지]]></title>
            <link>https://velog.io/@jiyoon_jeong2005/210819-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@jiyoon_jeong2005/210819-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Thu, 19 Aug 2021 13:43:50 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-학습한-내용">📌 학습한 내용</h1>
<hr>
<h2 id="유튜브-실습">유튜브 실습</h2>
<h3 id="전체-코드--💾">전체 코드 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/youtube_copycat(0819-)">💾</a></h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/4a83abff-8017-45e8-bffc-b4ea1c02accb/youtube%20complete.gif" alt=""></p>
<h3 id="상단-영역">상단 영역</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/10cdb95f-739a-4fe6-9e9b-0d4403a6ea6d/youtube%20top.gif" alt=""></p>
<ul>
<li><p>상세 작업 전 큰 틀 작업을 우선적으로 함</p>
</li>
<li><p>브라우저 확대시, 레이아웃이 틀어지는 것을 방지하기 위해 <code>min-width: 1380px;</code> 적용</p>
<pre><code class="language-css">#youtube-top-nav {
  position: fixed;

  width: 100%;
  min-width: 1380px;
  height: 56px;
  background-color: #212121;

  padding: 0 16px;

  z-index: 999999;
</code></pre>
</li>
</ul>
<p>}</p>
<p>#youtube-left-nav {
    overflow-y: scroll;
    overflow-x: hidden;
    position: fixed;</p>
<pre><code>width: 240px;
background-color: #212121;

top: 56px;
bottom: 0;
left: 0;</code></pre><p>}</p>
<p>#youtube-left-content {
    position: absolute;
    width: 225px;
    height: 100%;
}</p>
<p>#youtube-main {
    position: absolute;</p>
<pre><code>left: 240px;
top: 56px;
right: 0;
bottom: 0;</code></pre><p>}</p>
<pre><code>
### 왼쪽 영역
![](https://images.velog.io/images/jiyoon_jeong2005/post/bb61663e-516e-4860-aaa4-3aabdafdc820/youtube%20left.gif)

* 왼쪽 스크롤을 생성할 것을 전제로 작업. `#youtube-left-nav`를 스크롤을 포함한 넓이로 잡고, 그 안쪽으로 `#youtube-left-content` 영역을 잡아주어  스크롤의 영향을 받지 않게 한다.
```css
#youtube-left-nav {
    position: fixed;

    width: 240px;
    background-color: #212121;

    top: 56px;
    bottom: 0;
    left: 0;
}

#youtube-left-content {
    position: absolute;
    width: 225px;
    height: 100%;
}</code></pre><ul>
<li><p><code>overflow-y: scroll;</code> : 항상 스크롤을 보이게 함
<code>overflow-y: auto;</code> : 컨텐츠가 영역을 넘어 갔을 때, 스크롤을 생성 </p>
</li>
<li><p><code>&lt;footer&gt;</code> 영역을 제외하고는 전부 <code>&lt;nav-section&gt;</code>으로 묶어 작업</p>
<pre><code class="language-css">/* 디폴트 값 */
#youtube-left-content .nav-section {
  padding: 8px 0;
  border-bottom: solid 1px rgba(255, 255, 255, .1);
}
</code></pre>
</li>
</ul>
<p>#youtube-left-content .nav-section .nav-title-wrap {
    padding: 8px 24px;
}</p>
<p>#youtube-left-content .nav-section .nav-title-wrap h2 {
    color: #aaaaaa;
    font-size: 15px;
    font-weight: bold;
}</p>
<pre><code>* 아이콘 영역도 삽입되는 이미지를 제외한 부분은 모두 디폴트 값으로 맞춰 작업
```css
/* 큰 아이콘 */
#youtube-left-content .nav-section .nav-body li a .icon {
    display: inline-block;
    width: 24px;
    height: 24px;

    margin-right: 24px;

    background-position: center;
    background-repeat: no-repeat;
    background-size: 24px;
}

/* 감싸진 아이콘 */
#youtube-left-content .nav-section .nav-body li a .circle-icon {
    display: inline-block;
    width: 24px;
    height: 24px;

    margin-right: 24px;

    background-color: rgb(64, 64, 64);
    border-radius: 50%;
    background-size: 16px;
    background-position: center;
    background-repeat: no-repeat;
}</code></pre><ul>
<li><code>word-break: keep-all;</code> : 단어를 기준으로 줄바꿈을 함 (단어가 잘리지 않도록)</li>
</ul>
<h3 id="컨텐츠-영역">컨텐츠 영역</h3>
<h4 id="태그-영역">태그 영역</h4>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/64928cc4-5d7e-4fac-9f29-8b890ebbca36/tag-wrap.gif" alt=""></p>
<ul>
<li><p><code>tag-wrap</code> 영역도 상단 영역과 동일하게 <code>min-width</code>값을 주고, 브라우저 확대시 레이아웃 틀어짐을 방지</p>
<pre><code class="language-css">#youtube-main .tag-wrap {
  height: 56px;
  width: 100%;
  min-width: 1165px;
  background-color: #212121;

  border-top: solid 1px rgba(255, 255, 255, .1);
  border-bottom: solid 1px rgba(255, 255, 255, .1);

  z-index: 2000;
}</code></pre>
<p>👉 <strong><code>width: 100%;</code> 속성값을 지정할 때는 <code>min-width</code> 속성이 필요한지 확인 필요</strong></p>
</li>
</ul>
<h4 id="배너-영역">배너 영역</h4>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/9f495554-5468-474f-8b90-dd45a552f0da/image.png" alt=""></p>
<ul>
<li><p>메인 영역 안에서 배너 영역을 잡아주고, 안쪽으로 <code>banner-container</code>를 잡아 각 요소의 배치작업을 해준 뒤, <code>margin: 0 auto;</code>로 중앙정렬 해주었다.</p>
<pre><code class="language-css">#youtube-main .youtube-banner {
  position: relative;
  width: 100%;
  height: 260px;
  background-color: #000000;

  margin-bottom: 32px;
}
</code></pre>
</li>
</ul>
<p>#youtube-main .youtube-banner .banner-container {
    position: relative;
    max-width: 2256px;
    height: 100%;
    margin: 0 auto;
}</p>
<pre><code>* 닫기 버튼은 `banner-container` 바깥쪽으로 빼, 브라우저 비율 축소 시, 컨테이너 영역과는 다르게 전체 배너를 기준으로 오른쪽에 위치시켰다. 

#### 영상 영역

* `&lt;a&gt;` 안에 `&lt;a&gt;` 사용할 수 없음

* 일정 부분부터 배경 컬러가 비는 원인
![](https://images.velog.io/images/jiyoon_jeong2005/post/2b48f2d7-99fa-481d-8e7c-651f2f8c1d8e/content%20error.gif)
-&gt; `background-color: #000000;`이 적용된 부분은 `#youtube-main` 영역이다. 반면 스크롤은 브라우저 기준으로 생성되었기 때문에 아래 빈 부분은 `&lt;body&gt;` 영역이 보이게 된 것이다. 따라서 `&lt;body&gt;` 영역에도 `background-color: #000000;`을 적용해주어야 한다.

# 📌 학습내용 중 어려웠던 점
---

1. 컨텐츠 부분 위쪽에 `.tag-wrap`을 추가해 줬는데, `flex-align-between`을 적용했더니 태그들 간의 간격이 원본 페이지 보다 더 컸다. 
![](https://images.velog.io/images/jiyoon_jeong2005/post/79b1e27f-a023-4276-bfee-2d7add754300/image.png)

2. `.tag-wrap`의 `&lt;li&gt;`에 `:hover`가상 선택자를 넣어 색상 변화를 자연스럽게 하려 했다.

    2-2. 첫 번째 `&lt;li&gt;`인 &#39;All&#39;에는 마우스 오버시 아무 변화가 일어나지 않도록 하려 했다.

# 📌 해결방법
---
1. `.tag-wrap`의 `&lt;ul&gt;`에 `justify-content: center;` 속성값을 적용했다.
![](https://images.velog.io/images/jiyoon_jeong2005/post/30050753-96e9-4991-9b7e-c334e693cac6/image.png)

2. 원래 존재하는 `&lt;li&gt;` 요소에 `transition`을 추가, `easy-out` 속성값 사용 (참고 사이트: https://skydoor2019.tistory.com/6)
```css
#youtube-main .tag-wrap li {
    height: 32px;
    min-width: 12px;
    padding: 4px 12px;
    margin: 12px;
    margin-left: 0;

    background-color: rgba(255, 255, 255, .1);
    border: solid 1px rgba(255, 255, 255, .1);
    border-radius: 16px;

    transition: background-color 0.3s ease-out;
}

#youtube-main .tag-wrap li:hover {
    background-color: rgba(136, 136, 136, .6);
}</code></pre><p>2-2. 방법은 두 가지로 hover 시키고 싶지 않은 영역을 따로 빼 다른 영역으로 작업, 또는 해당 영역에 hover시 본래의 속성들을 그대로 적용하는 방법이 이다. 첫 번째 방법은 코드 수정이 조금 복잡해질 것 같고, 시간이 더 소요될 것 같아 두 번째 방법으로 적용했다.</p>
<h1 id="📌-학습소감">📌 학습소감</h1>
<hr>
<p>강의에서는 왼쪽 영역의 아이콘들을 모두 흰색으로 넣어주는 것으로 대체했지만, 좀 더 실제와 비슷하게 작업하고 싶어 아이콘 이미지를 하나씩 찾았다. 비슷한 이미지를 찾지 못해 고생한게 더 힘들었던 것 같다. (무료 아이콘 : <a href="https://icons8.com/">https://icons8.com/</a>) 또한 강의 내용에는 다루지 않았던 위쪽의 태그와 배너 영역도 만들어 주었다. 태그 영역이 상단, 왼쪽 영역과 같이 고정되어 있다는 것을 작업이 모두 끝난 후 알아서 <code>position: fixed;</code>로 수정해보려 했지만 자바스크립트 기능과 연동된 부분이 있어 가운데 정렬작업이 제대로 되지 않았다. 이번에는 레이아웃을 중점적으로 하자는 마음으로 아쉽지만 접어 두었다. 🤔</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[210818 개발일지]]></title>
            <link>https://velog.io/@jiyoon_jeong2005/210818-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@jiyoon_jeong2005/210818-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Wed, 18 Aug 2021 14:13:46 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-학습한-내용">📌 학습한 내용</h1>
<hr>
<h2 id="트위치-실습-2">트위치 실습 2</h2>
<h3 id="전체-코드--💾">전체 코드 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/twitch_copycat(0817-0818)">💾</a></h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/23aeb56d-b69d-4f2b-800c-25e3035fa4b6/twitch%20complete.gif" alt=""></p>
<h3 id="컨텐츠-영역">컨텐츠 영역</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/5d728ad1-3ec2-481d-9102-9cb49a5ac96d/twitch%20contents.gif" alt=""></p>
<ul>
<li><p><code>.content-container</code>로 컨텐츠 영역을 중앙 정렬 </p>
</li>
<li><p>상단 영역과 왼쪽 영역이 3차원 속성을 가지고 있으면서 고정되어 있는 상태
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/a156e528-4a4d-4e45-bdf6-7d19852e2723/image.png" alt=""></p>
</li>
<li><blockquote>
<p><code>position: absolute;</code> 속성을 줘서 공간을 늘려준다.</p>
</blockquote>
<pre><code class="language-css">.content {
   position: absolute;
   top: 50px;
   left: 240px;

   bottom: 0;
   right: 0;
}</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/c8331472-4b3c-4b2e-b8b5-9336bcaf9eab/image.png" alt=""></p>
</li>
<li><blockquote>
<p>여전히 새로 스크롤이 상단영역까지 걸쳐있음.</p>
</blockquote>
</li>
<li><blockquote>
<p><code>overflow-y: auto</code> 적용 : y축 기준으로만 필요한 상황에 스크롤 발생</p>
</blockquote>
</li>
</ul>
<h3 id="👉-background-속성">👉 <code>background 속성</code></h3>
<ul>
<li><p><code>background</code> : 관련 속성을 한 줄로 작성 가능 (속성값의 순서는 관계 x)</p>
<pre><code class="language-css">background: url(../img/game.jpg) no-repeat center; </code></pre>
</li>
<li><p><code>background-size: cover;</code> : 만들어 둔 영역 안에 이미지를 다 채울 수 있도록, 자동으로 이미지를 확대/축소 (단, 이미지의 가로, 세로 비율은 유지된다), 일반적으로 이미지의 센터에 컨텐츠가 몰리게 제작, </p>
</li>
<li><p><code>background-position: center</code></p>
</li>
<li><p><code>min-width: 1340px;</code>을 적용했는데도, 내부 컨텐츠가 줄어듦
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/da03b420-4b1d-4e17-b719-34ab11e785f0/background-size.gif" alt=""></p>
</li>
<li><blockquote>
<p>왼쪽 영역과 컨텐츠 영역이 각각 3차원적 특징을 갖고 있기 때문에 자식들의 width를 부모가 제대로 인식하지 못함
=&gt; <code>.main-container</code>에 <code>position: relative;</code>와 <code>height: 100%</code> 적용</p>
</blockquote>
</li>
</ul>
<h3 id="하단-영역">하단 영역</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/b146a233-329f-4b3f-b6ab-6ed8deaa8025/twitch%20footer.gif" alt=""></p>
<ul>
<li><code>.footer-bottom</code>은 영역 내의 요소들을 가운데로 정렬하기 위한 박스</li>
</ul>
<h2 id="css-추가-설명">CSS 추가 설명</h2>
<h3 id="resetcss">reset.css</h3>
<p>: <strong>기존의 (html 태그가 갖고 있는) 모든 css 속성들을 초기화 시켜주는 코드</strong>, 모든 태그들이 갖고 있는 속성값들은 브라우저 마다 조금씩 차이가 있음 -&gt; &#39;reset.css&#39;는 이러한 차이나는 속성값들을 모두 초기화 시켜줌 (캐스케이딩의 원리가 html에서 css파일을 불러 올 때도 동일하게 적용됨)
(참고 사이트 : <a href="https://meyerweb.com/eric/tools/css/reset/">https://meyerweb.com/eric/tools/css/reset/</a>)
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/2ddbb82c-033a-46a1-996f-4ac6e930d2c9/%EC%A0%9C%EB%AA%A9%20%EC%97%86%EC%9D%8C.png" alt=""></p>
<h3 id="normalizecss">normalize.css</h3>
<p>: 기존의 디자인을 조금씩 가공한 코드 (reset.css와 다르게 완전 초기화는 아님), 브라우저 마다 기본적으로 들어가는 css 디자인에 차이가 나는데, <strong>normalize.css는 그 오차를 줄이고, 버그를 줄이는 방향으로 스타일을 재정의</strong>
(참고 사이트 : <a href="https://necolas.github.io/normalize.css/8.0.1/normalize.css">https://necolas.github.io/normalize.css/8.0.1/normalize.css</a>)
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/c5cd2727-5606-4a90-b614-2d24427a6278/image.png" alt=""></p>
<p>=&gt; 개발자의 취향에 따라 사용함</p>
<h3 id="css-변수">css 변수</h3>
<p>: <strong>일괄적인 코드 수정작업에 편리, 직관적인 코드 작업 가능</strong> 단, 익스플로러에서는 제약이 크다. (지원x),
(Twitch에서는 css변수 사용이 빈번)
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/ab4e25c2-6b81-4ee4-93f0-ff8cbc15c9f0/image.png" alt="">
(⬆ Twitch 예시)</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot;&gt;
    &lt;title&gt;CSS 추가 설명&lt;/title&gt;

    &lt;!-- &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;css/reset.css&quot;&gt; --&gt;
    &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;css/normalize.css&quot;&gt;
    &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;css/style.css&quot;&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;Hellow World&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<pre><code class="language-css">/* 변수 설정 
:root -&gt; 모든 가져다 쓸 수 있는 변수 */
:root {
    --black: #18181a;
    --purple:  #9147ff;
    --font-size-40: 40px;
}

h1 {
    background-color: var(--black);
    font-size: var(--font-size-40);
    color: var(--purple);
}</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/cd292c95-0b3e-403e-bed7-7959a36c271e/image.png" alt=""></p>
<pre><code class="language-css">/* 특정 영역 내에서만 사용 가능한 변수
-&gt; css의 선택자를 활용해, 변수의 영향력이 발휘될 수 있는 범위를 지정 가능*/
#intro {
    --font-color: blue;
    --font-size: 50px;
}

#intro p {
    font-size: var(--font-size);
    color: var(--font-color);
}

#footer p {
    font-size: var(--font-size);
    color: var(--font-color);
}</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/67e0f660-2461-4cd7-9bb2-86d5fec5136d/image.png" alt=""></p>
<h1 id="📌-학습내용-중-어려웠던-점">📌 학습내용 중 어려웠던 점</h1>
<hr>
<ol>
<li><p>컨텐츠 영역의 <code>img</code>에 <code>:hover</code> 선택자를 지정해 이미지를 움직이는 작업에서, <code>image-wrap</code>으로 감싸준 영역이 함께 움직이지 않고 <code>img</code>만 움직이는 현상 발생</p>
</li>
<li><p>컨텐츠 영역 각 섹션에 <code>border-bottom</code>으로 만들어준 구분선에 겹치게 &#39;더보기&#39; 버튼을 만들어 주었다. 해당 버튼의 배경색은 컨텐츠 영역의 배경색과 동일하게 해 마치 구분선이 반으로 나눠진 듯한 효과를 주었다. 하지만 추가적으로 <code>:hover</code> 선택자를 이용해 배경색을 rgba를 이용해 적용했더니, 마우스 오버시에는 배경 선이 그대로 비춰져 나타났다.</p>
</li>
</ol>
<h1 id="📌-해결방법">📌 해결방법</h1>
<hr>
<ol>
<li><p>기존의 html 태그들만으로 설정해주고 싶었지만, 잘 작동되지 않아서 <code>image-wrap</code>을 <code>image-wrap-sub</code>으로 한 번 더 감싸주었다. 생각보다 간단하게 해결되었다.</p>
</li>
<li><p>실제 Twitch 사이트에서는 &#39;show more&#39; 버튼을 기준으로 좌우에 각각 구분선이 배치되어 있었다. 마우스 오버시에 색상을 투명하지 않게 다른 색으로 설정하는 방법도 있었지만 여전히 부자연스러웠다.</p>
</li>
</ol>
<h1 id="📌-학습소감">📌 학습소감</h1>
<hr>
<p>python과 R 을 공부할 때만 사용했던 &#39;변수명&#39;을 css에서도 사용할 수 있다는 것은 처음 알아서 감회가 새로웠다. 특히 Twitch 를 카피캣 하면서 &#39;이런식으로 속성값을 숨기는 건 어떻게 하는건가?&#39;하는 의문을 계속해서 가졌는데, 페이지를 완성하면서 알게 되어 속이 후련하다. 😊  </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[210817 개발일지]]></title>
            <link>https://velog.io/@jiyoon_jeong2005/210817-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@jiyoon_jeong2005/210817-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Tue, 17 Aug 2021 06:20:16 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-학습한-내용">📌 학습한 내용</h1>
<hr>
<h2 id="트위치-실습">트위치 실습</h2>
<h3 id="전체-코드--💾">전체 코드 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/twitch_copycat(0817-)">💾</a></h3>
<h3 id="상단-영역">상단 영역</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/44b20b51-ee4b-4270-a1c4-6ed403dfd3f8/twitch%20top.gif" alt=""></p>
<ul>
<li><p><code>--color-text-base</code> : 최신 브라우저에 등장하는 코드</p>
</li>
<li><p><code>nav .nav-wrap .nav-left ul li:first-child a:after</code>에 <code>margin-top</code>속성을 주면 <code>&lt;a&gt;</code>도 함께 내려온다.
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/34ce45f4-13d1-4e6f-86c2-ac938e9f45e3/image.png" alt=""></p>
</li>
<li><blockquote>
<p><code>position: relative;</code> 적용해서 <code>top</code> 사용
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/7bd8d18c-ab46-40b6-91c2-53f1034c2204/image.png" alt=""></p>
</blockquote>
</li>
<li><p>px &lt;-&gt; em 변환 사이트 : <a href="http://pxtoem.com/">http://pxtoem.com/</a></p>
</li>
<li><p>사이에 동일한 공백을 주는 <code>flex-between</code>을 이용해 배치해준 <code>nav-center</code> 영역이 각기다른 nav요소의 width 값으로 인해 정중앙에 배치되지 않는 현상 발생 
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/fad790f2-53d2-477e-b04e-ee2b8a692165/image.png" alt=""></p>
</li>
<li><blockquote>
<p><code>nav-center</code> 부분을 flex의 영향에서 벗어나게 한 후, <code>position: absolute;</code>로 3차원으로 만들어 x축 중앙정렬 공식을 사용</p>
</blockquote>
<pre><code class="language-css">nav .nav-wrap .nav-center {
   position: absolute;
   left: 50%;
   transform: translateX(-50%);
}</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/626ff806-5536-4118-8bcd-d2e78fe62f13/image.png" alt=""></p>
</li>
<li><p><code>postion; fixed;</code>(3차원적인 특징을 가진 position) 적용시 적절한 <code>width</code> 값을 지정해주지 않으면 아래와 같이 레이아웃이 모두 틀어지게 된다.
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/ad9a37f6-13f4-4216-b2a7-45b31d02527f/image.png" alt=""></p>
</li>
</ul>
<h3 id="왼쪽-영역">왼쪽 영역</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/adfa3782-3ac5-4ca2-97f2-769167865558/1.gif" alt=""></p>
<h4 id="👉-실무-tip-1-항상-해당-영역을-브라우저-크기에-관계-없이-full-height로-유지하는-법">👉 실무 tip 1) 항상 해당 영역을 브라우저 크기에 관계 없이 full height로 유지하는 법</h4>
<p><code>position: fixed;</code>상태에서 <code>top, right, bottom, left</code>를 사용하게 되면 항상 브라우저를 기준으로 좌표 기준점 생성</p>
<p>-&gt; 여기서 <code>bottom: 0;</code>을 적용하면 짧았던 영역의 길이가 브라우저의 세로 끝까지 채워지게 된다. (<strong>순수 3차원적인 특징을 가진 position에서만 발생</strong>) </p>
<p>=&gt; <code>height</code>를 사용하지 않고 <code>top, bottom</code>을 이용해 전체 full size를 만들 수 있다. 해당 박스의 높이값은 브라우저의 높이에 따라 가변적으로 변화한다.</p>
<h4 id="👉-실무-tip-2-해당-영역에서만-스크롤을-생성하는-법">👉 실무 tip 2) 해당 영역에서만 스크롤을 생성하는 법</h4>
<p><code>overflow-y: auto;</code> 적용</p>
<h1 id="📌-학습내용-중-어려웠던-점">📌 학습내용 중 어려웠던 점</h1>
<hr>
<h1 id="📌-해결방법">📌 해결방법</h1>
<hr>
<h1 id="📌-학습소감">📌 학습소감</h1>
<hr>
<p>꽤 긴 시간 동안 네이버 카피캣 작업을 했는데, 이제는 트위치라는 해외 사이트를 카피캣하니까 생각보다 더 새로웠다. 네이버 페이지 작업시에는 대부분 <code>&lt;header&gt;</code>, <code>&lt;main&gt;</code>, <code>&lt;footer&gt;</code>로 큰 구역을 나눠 주었는데, 트위치 카피캣에서는 <code>&lt;nav&gt;</code>와 <code>&lt;div&gt;</code>를 이용해 작업중이다. 또한 개발자 도구를 이용해 간단히 레이아웃의 형태나 속성값 등을 알아냈던 국내 사이트와 달리 해외 사이트는 카피캣 자체가 어렵도록 이루어져있어서 조금 고생을 했다. 하지만 그만큼 육안으로 체크해야할 부분이 많아 좀 더 수치같은 것을 눈에 익힐 수 있었다. 😗</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[210813 개발일지]]></title>
            <link>https://velog.io/@jiyoon_jeong2005/210813-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@jiyoon_jeong2005/210813-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Fri, 13 Aug 2021 08:26:22 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-학습한-내용">📌 학습한 내용</h1>
<hr>
<h2 id="네이버-오디오-실습-2">네이버 오디오 실습 2</h2>
<h3 id="전체-실습--💾">전체 실습 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/naver_copycat%20(0719-0813)">💾</a></h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/b8693597-1e6f-4c51-870f-e858189d3140/audio%20done.gif" alt=""></p>
<h3 id="메인-오른쪽">메인 오른쪽</h3>
<h4 id="1-인기-채널을-소개합니다">1) &#39;인기 채널을 소개합니다.&#39;</h4>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/93d97525-6c77-4222-a95f-a4b01a7415ff/image.png" alt=""></p>
<h4 id="2-오늘의-발견-요즘-많이-듣는-채널👍">2) &#39;오늘의 발견 요즘 많이 듣는 채널👍&#39;</h4>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/3d486eeb-2382-450c-9dc2-3a954495d206/image.png" alt=""></p>
<ul>
<li><code>&lt;button&gt;</code> : inline-block 요소</li>
</ul>
<h4 id="3-banner">3) banner</h4>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/745ab659-7909-4aa4-a60f-3886962a54c6/image.png" alt=""></p>
<ul>
<li><code>!important</code> : 나중에 설정한 값이 적용되지 않게 하려면 속성값 뒤에 !important를 붙임. (속성 강제 적용)
(참고 사이트 : <a href="https://www.w3schools.com/css/css_important.asp">https://www.w3schools.com/css/css_important.asp</a> )</li>
</ul>
<h3 id="하단-영역">하단 영역</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/3c14cd79-f6aa-46a9-b017-9bd9946f9f71/image.png" alt=""></p>
<h3 id="👉-html-특수문자">👉 html 특수문자</h3>
<p>(참고 사이트 : <a href="http://kor.pe.kr/util/4/charmap2.htm">http://kor.pe.kr/util/4/charmap2.htm</a> )</p>
<h2 id="네이버-오디오-카테고리-실습">네이버 오디오-카테고리 실습</h2>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/f02d2bda-8ed2-4a2b-b229-b1315dd68ad7/audio-category%20done.gif" alt=""></p>
<h3 id="👉-flex-between-의-단점">👉 <code>flex-between</code> 의 단점</h3>
<p>: 사전에 정해 놓은 요소의 갯수가 라인마다 맞지 않으면 아래와 같이 공백이 나타나게 된다.
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/27720938-dce6-4185-bc1f-8661fb19806f/image.png" alt=""></p>
<pre><code class="language-css">.audio-category .audio-category-lists {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    align-items: flex-start;
    align-content: stretch;
    margin-top: 22px;
}</code></pre>
<p>-&gt; 해결방법) <code>justify-content: flex-start</code> 를 적용 후, 각각의 <code>&lt;li&gt;</code>에 <code>margin-right</code>와 <code>margin-bottom</code>을 적용 후, 6번째 자리에 해당하는 <code>margin</code> 값을 없애주기 위해 아래 코드를 적용한다.</p>
<pre><code class="language-css">.audio-category .audio-category-lists .category-list:nth-child(6n) {
    margin-right: 0;
}</code></pre>
<ul>
<li><p><code>:nth-child(6n)</code> : 6의 배수마다
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/e4686f63-fcde-40a1-86ca-058d7d15e96f/%EC%A0%9C%EB%AA%A9%20%EC%97%86%EC%9D%8C.png" alt=""></p>
</li>
<li><p><code>:nth-child(odd)</code> : 홀수 번째에 있는 요소
<code>:nth-child(even)</code> : 짝수 번째에 있는 요소
(참고 사이트 : <a href="https://lalacode.tistory.com/6">https://lalacode.tistory.com/6</a> )</p>
</li>
</ul>
<h1 id="📌-학습내용-중-어려웠던-점">📌 학습내용 중 어려웠던 점</h1>
<hr>
<ol>
<li><code>&lt;button&gt;</code>은 inline-blcok 요소이기 때문에 <code>margin</code>과 <code>padding</code> 속성의 상하 간격 지정이 가능해지는데, 왜 굳이 <code>display: blcok;</code> 속성을 넣어주어야 하는가?</li>
</ol>
<h1 id="📌-해결방법">📌 해결방법</h1>
<hr>
<ol>
<li></li>
</ol>
<p><strong>실험1)</strong> <code>display: block;</code> 속성을 주지 않고 (inline-block 요소인 채로) <code>margin</code> 속성값 적용
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/c113db2e-aea6-4993-8588-6a77c8cd6a70/image.png" alt="">
-&gt; 상하/좌우 배치가 가능</p>
<p><strong>실험2)</strong> <code>display: block;</code> 속성을 주지 않고 (inline-block 요소인 채로) <code>margin: auto</code> 속성값 적용
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/b9a39736-95b2-4df2-a637-5f2b1c72944a/image.png" alt="">
-&gt; <code>margin</code> 속성이 적용되지 x</p>
<p><strong>실험3)</strong> <code>display: block;</code> 속성을 주고, <code>margin: auto</code> 속성값 적용
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/db48a42d-a4d1-4553-8183-dedabb89a9b7/image.png" alt="">
-&gt; 정상적으로 적용됨
👉 <strong>결론)</strong> <code>margin: auto</code> 속성값 (중앙정렬 공식)을 사용하기 위해서는 block 요소로 바꾸어 주어야 함 </p>
<h1 id="📌-학습소감">📌 학습소감</h1>
<hr>
<p>길고 길었던 네이버 카피캣이 오늘로 끝이 났다. 같은 사이트에서도 여러 레이아웃, 디자인을 사용한다는 것과 생각보다 실제 사용되는 코드는 더 복잡하다는 것을 새삼 깨달았다. 제작 과정에서 항상 자바스크립트 부분은 스킵했기 때문에 그부분이 항상 궁금하고 찝찝했는데, 조금만 더 하면 배울 수 있다는 사실이 너무 기대된다. 😆</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[210812 개발일지]]></title>
            <link>https://velog.io/@jiyoon_jeong2005/210812-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@jiyoon_jeong2005/210812-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Fri, 13 Aug 2021 03:45:07 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-학습한-내용">📌 학습한 내용</h1>
<hr>
<h2 id="네이버-오디오-실습">네이버 오디오 실습</h2>
<h3 id="전체-코드--💾">전체 코드 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/naver_copycat%20(0719-0813)">💾</a></h3>
<h3 id="상단-영역">상단 영역</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/60750428-af7b-4d71-b482-e2661cb7e4b2/Animation.gif" alt=""></p>
<h4 id="👉-3차원-position-속성을-이용해-공간을-만드는-방법">👉 3차원 position 속성을 이용해 공간을 만드는 방법</h4>
<pre><code class="language-html">&lt;div&gt;&lt;/div&gt;</code></pre>
<pre><code class="language-css">div {
    position: absolute
    background-color: yellow

    left: 0;
    right: 0;
    bottom: 0;
    top; 0;
}</code></pre>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/b0a0925d-bf52-4990-b289-8005d4f4b97a/image.png" alt="">
-&gt; 공간을 늘린다고 생각</p>
<h3 id="메인-왼쪽">메인 왼쪽</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/12a8cbd4-7310-4983-a4ce-d28756d4ab78/audio-main-left.gif" alt=""></p>
<h4 id="1-오늘의-오디오클립">1) &#39;오늘의 오디오클립&#39;</h4>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/0232cbab-50e4-4a93-98e5-0d4ed07daeff/image.png" alt=""></p>
<ul>
<li><p><code>letter-spacing</code> : 텍스트 좌우 간격</p>
</li>
<li><p><code>#audio-main-left</code>, <code>#audio-main-right</code> (자식들)의 <code>float: left/right;</code>가 부모의 높이값에 영향을 주게하기 위해, <code>#audio-main .audio-container { overflow: hidden; }</code>을 적용</p>
<pre><code class="language-css">#audio-main {
  width: 100%;
  height: 2000px;
  background-color: #f6f8fa;

  padding-top: 61px;
}
</code></pre>
</li>
</ul>
<p>#audio-main .audio-container {
    overflow: hidden;
}</p>
<p>.audio-main-left {
    float: left;
    width: 660px;
}</p>
<p>.audio-main-right {
    float: right;
    width: 330px;
}</p>
<pre><code>-&gt; 후에 `btn-left`에 영향을 미쳐 `oveflow: hidden;` 속성을 삭제, 아래와 같이 `align-items: flex-start`를 넣어줌
```css
#audio-main .audio-container {
    /*overflow: hidden;*/
    align-items: flex-start;
}</code></pre><ul>
<li><code>#audio-today .audio-silde .btn</code>의 좌표값을 <code>#audio-today .audio-slide-wrap</code>에 기준점을 두기 위해 각각 <code>position: absolute;</code>,<code>position: relative;</code> 적용</li>
</ul>
<h4 id="2-오디오클립-추천-오리지널">2) &#39;오디오클립 추천 오리지널&#39;</h4>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/446885cc-5e92-4290-9a50-7466779ff14f/image.png" alt=""></p>
<h4 id="3-나를-위한-플레이리스트">3) &#39;나를 위한 플레이리스트&#39;</h4>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/10017cfb-ddef-4139-8b3e-8fb5d89abc43/image.png" alt=""></p>
<ul>
<li><code>image.wrap</code>을 기준으로 <code>img</code>,<code>icon-like</code>와 <code>icon-play</code>버튼의 좌표값을 잡기 위해 각각 <code>position: relative;</code>와 <code>position: absolute</code>를 적용<pre><code class="language-css">#audio-playlist .audio-body li .image-wrap {
  position: relative;
}
</code></pre>
</li>
</ul>
<p>#audio-playlist .audio-body .image-wrap img {
    position: absolute
}
#audio-playlist .audio-body .image-wrap .icon-like {
    position: absolute;<br>}
#audio-playlist .audio-body .image-wrap .icon-play {
    position: absolute;<br>}</p>
<pre><code>
#### 4) &#39;라이브 ON&#39;
![](https://images.velog.io/images/jiyoon_jeong2005/post/b996fe7f-537a-4faa-85b7-c72d3ca7e047/image.png)
* x축 중앙정렬 효과
```css
left: 50%;
transform: translateX(-50%);</code></pre><h4 id="5-셀럽들의-목소리로-듣는-베스트셀러">5) &#39;셀럽들의 목소리로 듣는 베스트셀러&#39;</h4>
<ul>
<li><code>time</code> 클래스에 <code>bottom</code> 속성값이 제대로 적용되지 않은 이유
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/1f55b078-5d05-44dc-90e9-c8d4e3ae5b81/image.png" alt=""></li>
<li><blockquote>
<p><code>time</code>의 좌표 기준점이 되는 <code>image-wrap</code>의 높이가 잡혀있기 않기 때문</p>
</blockquote>
</li>
<li><blockquote>
<p><code>img</code>의 높이를 기준으로 <code>image-wrap</code>에 높이를 만들어 주려 함(<strong>부모가 높이값을 가지고 있지 않을 때, 자식의 높이값이 부모에게 영향을 준다는 원리 이용</strong>) </p>
</blockquote>
</li>
<li><blockquote>
<p>그러나 현재 자식은 3차원적특성(<code>position: absolute;</code>)을 가지고 있고, 부모는 2차원적 특성(<code>position: relative;</code>)을 가지고 있기 때문에 높이를 만들 수가 없음</p>
</blockquote>
</li>
<li><blockquote>
<p>해결방법) <code>img</code>의 <code>position: absolute;</code>를 제거하면 2차원이 됨
   =&gt; <strong>2차원은 부모의 높이값에 영향을 준다.</strong>
   <img src="https://images.velog.io/images/jiyoon_jeong2005/post/a66ba79f-3dcd-4cb2-a6d9-76e724d2e26e/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<h4 id="6-새로-나온-채널">6) &#39;새로 나온 채널&#39;</h4>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/ef61acfe-54d2-47d0-b1b2-abc7dbae8123/image.png" alt=""></p>
<ul>
<li>&#39;오디오클립 추천 오리지널&#39; 영역 코드 재활용</li>
</ul>
<h1 id="📌-학습내용-중-어려웠던-점">📌 학습내용 중 어려웠던 점</h1>
<hr>
<ol>
<li>네이버 오디오의 <code>&lt;main&gt;</code> 영역이 오른쪽으로 밀리는 현상
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/7b4a8e99-b0d6-4805-a82e-7af67f9f128d/image.png" alt=""></li>
</ol>
<h1 id="📌-해결방법">📌 해결방법</h1>
<hr>
<ol>
<li>이전 &#39;네이버 게임&#39; 페이지를 만들며 적용한 전체 <code>&lt;body&gt;</code>의 <code>min-width: 1300px</code>로 인해, (브라우저 크기 100% 기준으로) <code>width: 1080px;</code>을 가진 &#39;네이버 오디오&#39;의 <code>&lt;body&gt;</code> 영역의 레이아웃이 틀어지는 현상이 발생한 것이다. &#39;네이버 게임&#39;의 <code>&lt;main&gt;</code>의 클래스를 이용해, 해당 페이지에만 따로 <code>min-width: 1300px</code>값을 적용하고, &#39;네이버 오디오&#39;의 <code>min-width</code>값은 해제시켜 주었다.  <h1 id="📌-학습소감">📌 학습소감</h1>
</li>
</ol>
<hr>
<p>앞으로는 페이지 전체를 우선적으로 살피고 카피캣을 해야겠다. 페이지에 생각보다 유사한 레이아웃이 많이 쓰이는데, 나중에서야 깨닫고 코드를 수정하니 코드의 가독성이 많이 떨어지는것 같다. 버튼 부분에 <code>hover</code> 가상 선택자를 이용해 버튼이 없었다 나타나는 효과를 주려 했는데, 그리 어려운 작업은 아니었지만 다시 해당 코드를 찾아 효과를 나눠서 넣어주느라 조금 복잡했다. 해당 페이지의 레이아웃이 간단한 것도 한 몫 했지만, 꽤 완성도가 높게 만들어 진 것 같아 뿌듯하다. 😊</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[210811 개발일지]]></title>
            <link>https://velog.io/@jiyoon_jeong2005/210811-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@jiyoon_jeong2005/210811-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Wed, 11 Aug 2021 10:03:16 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-학습한-내용">📌 학습한 내용</h1>
<hr>
<h2 id="네이버-e스포츠-실습-2">네이버 e스포츠 실습 2</h2>
<h3 id="전체-코드--💾">전체 코드 : <a href="https://github.com/janeJeong/daegu_ai_school/blob/main/Web%20Programming/naver_copycat%20(0719-)/e-sport.html">💾</a></h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/c7212ae7-59dc-4023-87e4-18bc12b336db/Animation3.gif" alt=""></p>
<h3 id="메인-왼쪽">메인 왼쪽</h3>
<h4 id="1-article-영역">1) article 영역</h4>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/774ae87a-be78-4193-b1dd-9716330ba6e7/image.png" alt=""></p>
<ul>
<li><p><code>float</code>을 이용해 영역 배치 작업
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/926d44ab-3e67-461b-b418-15d8c6de95f8/image.png" alt=""></p>
<pre><code class="language-html">&lt;div id=&quot;esport-main-article&quot;&gt;                
  &lt;div class=&quot;article one full&quot;&gt;
  &lt;/div&gt;

  &lt;div class=&quot;article two half&quot;&gt;
  &lt;/div&gt;

  &lt;div class=&quot;article three half&quot;&gt;
  &lt;/div&gt;                            
&lt;/div&gt;</code></pre>
<pre><code class="language-css">#esport-main-article .article {
  float: left;
  width: 50%;
  height: 50%;    
}
</code></pre>
</li>
</ul>
<p>#esport-main-article .article.full {
    height: 100%;
    background-color: green;
}</p>
<p>#esport-main-article .article.two {
    background-color: blue;
}</p>
<p>#esport-main-article .article.three {
    background-color: pink;
}</p>
<p>```</p>
<h3 id="👉-여러-줄-말줄임-표시-넣기">👉 <strong>여러 줄 말줄임 표시 넣기</strong></h3>
<p>(참고 사이트 1 : <a href="https://nalrarydesigner.tistory.com/entry/CSS3-displaybox-%EC%97%90-%EB%8C%80%ED%95%B4-%EA%B3%B5%EB%B6%80%ED%95%B4-%EB%B3%B4%EC%9E%90">https://nalrarydesigner.tistory.com/entry/CSS3-displaybox-%EC%97%90-%EB%8C%80%ED%95%B4-%EA%B3%B5%EB%B6%80%ED%95%B4-%EB%B3%B4%EC%9E%90</a> 
참고 사이트 2 : <a href="https://developer.mozilla.org/ko/docs/Web/CSS/-webkit-line-clamp">https://developer.mozilla.org/ko/docs/Web/CSS/-webkit-line-clamp</a>)</p>
<ul>
<li><p><code>box-orient : vertical;</code> : 박스를 수직방향으로 배치
<code>box-orient : horizontal;</code> : 박스를 수평방향으로 배치 (기본값)
<code>box-orient : inherit;</code> : body가 갖는 기본 속성을 상속받음</p>
</li>
<li><p><code>-webkit-line-clamp</code> : 블록 컨테이너의 콘텐츠를 지정한 줄 수만큼으로 제한 (단, display 속성을 <code>-webkit-box</code> 또는 <code>-webkit-inline-box</code>로, 그리고 <code>-webkit-box-orient : vertical;</code>로 설정한 경우에만 동작)</p>
</li>
<li><p><code>max-height</code> : 속성의 최대 높이</p>
</li>
</ul>
<h4 id="2-경기-다시보기">2) &#39;경기 다시보기&#39;</h4>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/3f1a7331-8f9e-402b-9eb3-fb73db51a7f6/Animation2.gif" alt=""></p>
<h4 id="3-추천-뉴스">3) &#39;추천 뉴스&#39;</h4>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/0dc2d5f4-f8bb-4bac-b81b-d0d76c6abc4f/image.png" alt=""></p>
<ul>
<li><code>:before</code> 가상 선택자 적용시 레이아웃이 뒤틀리는 현상 발생
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/64105527-d282-4fb8-a27e-fceca98dc40d/image.png" alt=""></li>
<li><blockquote>
<p>solution_step 1.
가상 선택자 부분에 <code>position: absolute;</code>를 적용해 레이어를 겹치게 만든다.
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/4bf3eabd-56ce-455b-82ff-b370e2a64acf/image.png" alt=""></p>
</blockquote>
</li>
<li><blockquote>
<p><code>#esport-news .article-wrap .right-lists li</code> 에는 <code>position: relative;</code> 적용</p>
</blockquote>
</li>
<li><blockquote>
<p>solution_step 2.
<code>#esport-news .article-wrap .right-lists a</code>에 <code>pdding-right</code> 속성 적용
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/4ae429a2-8adc-4366-974b-b4e6e28cc0a2/image.png" alt=""></p>
</blockquote>
</li>
<li><blockquote>
<p>가상 선택자에 <code>top</code> 속성으로 적당한 위치 찾아주기
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/a9a1a78f-5416-4dd5-9c8a-fe7e52c49928/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<h4 id="4-많이-본-영상">4) &#39;많이 본 영상&#39;</h4>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/c6fbd717-8735-4453-8da3-3d34dc04fa50/image.png" alt=""></p>
<ul>
<li>&#39;경기 다시보기&#39; 영역 재활용</li>
</ul>
<h4 id="5-전문가-칼럼">5) &#39;전문가 칼럼&#39;</h4>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/bbf7a00e-0f15-4a02-a99f-eb6e3e40efe6/image.png" alt=""></p>
<h4 id="6-한국e스포츠협회">6) &#39;한국e스포츠협회&#39;</h4>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/071b2f60-3846-41b7-a10e-269d35a3cc20/image.png" alt=""></p>
<h3 id="메인-오른쪽">메인 오른쪽</h3>
<h4 id="1-많이-본-뉴스">1) &#39;많이 본 뉴스&#39;</h4>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/6644c7cf-19ca-4b00-8413-14b3ce98da60/image.png" alt=""></p>
<ul>
<li><code>&lt;a&gt;</code>에 <code>display: block</code>을 적용하면 flex가 깨질 수 있음</li>
</ul>
<h4 id="1-e스포츠-경기-일정결과">1) &#39;e스포츠 경기 일정/결과&#39;</h4>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/a5a8494a-0a8a-4e1a-9367-b67eb4a0cad9/Animation.gif" alt=""></p>
<h3 id="하단-영역">하단 영역</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/adb93436-a68f-4e0e-9056-5eb047863798/image.png" alt=""></p>
<h3 id="👉-웹-폰트-적용하는-방법">👉 웹 폰트 적용하는 방법</h3>
<ul>
<li><p>사이트 전체 디자인에 사용되는 폰트가 동일한 경우 <code>font-family</code> 속성을 사용해 폰트 명시
<code>font-family</code> : 사용할 폰트를 나열, 입력한 순서대로 우선순위가 적용됨</p>
</li>
<li><p>구글 웹 폰트 적용
(참고 사이트 : <a href="https://fonts.google.com/">https://fonts.google.com/</a>)
위의 사이트를 통해, 사용할 폰트에 대한 정보를 <code>&lt;link&gt;</code>를 이용해 가져올 수 있음
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/8d831c9d-3b55-433c-b36d-9ba0a9dc535a/image.png" alt="">
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/6ad6b72c-0be9-47a6-a498-7f9ed61c5818/image.png" alt="">
💥 단, 적용시 폰트를 먼저 불러온 다음에, css파일을 연동시켜야 함 (위의 사진과 같은 순서) </p>
</li>
<li><blockquote>
<p>가져온 파일이 없는데, 폰트를 먼저 적용한다는 것은 말이 되지 x</p>
</blockquote>
</li>
</ul>
<h1 id="📌-학습내용-중-어려웠던-점">📌 학습내용 중 어려웠던 점</h1>
<hr>
<ol>
<li>&#39;경기 다시보기&#39;의 코드를 재활용해 &#39;많이 본 영상&#39; 영역에 재활용</li>
</ol>
<h1 id="📌-해결방법">📌 해결방법</h1>
<hr>
<ol>
<li>앞서 작성한 &#39;경기 다시보기&#39;의 코드를 재활용하기 위해 class 명을 추가해 css에 class 명만 바꾸어 사용하려 했지만, 생각한 대로 되지 않았다. 아마 id가 class보다 우선한다는 캐스케이딩에 의해 오류가 생긴듯 하다. 캐스케이딩에 대해 재복습하고 코드 재활용을 다시 시도해 봐야겠다.</li>
</ol>
<h1 id="📌-학습소감">📌 학습소감</h1>
<hr>
<p>강의에는 실제 페이지와는 다르게 스킵한 부분이 많았다. 하지만 복습을 위해서, 그리고 실제 페이지와 최대한 비슷하게 작업하기 위해 현 시점의 네이버 e스포츠 페이지를 참고해 강의에서 넘어간 부분을 전부 작업해 주었다. 때문에 시간은 평소보다 많이 걸렸지만 조금 지난 기억들을 되살릴 수 있었다. id는 하나의 파일에 중복되지 않아야 한다는 규칙을 어겼다는 것이 오늘 가장 마음에 걸리는 오류이지만, 혼자만의 힘으로 작성할 수 있게 된 영역이 늘어난 것에 대해 성장을 느낄 수 있는 하루였다. 🙂</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[210810 개발일지]]></title>
            <link>https://velog.io/@jiyoon_jeong2005/210810-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@jiyoon_jeong2005/210810-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Tue, 10 Aug 2021 06:42:05 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-학습한-내용">📌 학습한 내용</h1>
<hr>
<h2 id="네이버-e스포츠-실습">네이버 e스포츠 실습</h2>
<h3 id="전체-코드--💾">전체 코드 : <a href="https://github.com/janeJeong/daegu_ai_school/tree/main/Web%20Programming/naver_copycat%20(0719-)">💾</a></h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/3cd3f1e7-ee8f-4b61-9a11-a4d63601a0e9/image.png" alt=""></p>
<h3 id="상단-영역">상단 영역</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/017b4eff-56ab-476f-b55c-878d14947f64/esport%20header.gif" alt=""></p>
<ul>
<li>최상단에 고정되어 있는 <code>&lt;nav&gt;</code>는 좌우로 100%를 차지하고 있으므로 &#39;game-container&#39;를 감싸는 형태로 작성</li>
</ul>
<h3 id="메인-영역">메인 영역</h3>
<h4 id="1-메인-상단">1) 메인 상단</h4>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/09ed985e-b8c6-475f-b1c3-bcef23ca2cfb/main-top%201.gif" alt=""></p>
<ul>
<li><code>position: fixed</code>를 적용함으로써 3차원 적인 특징을 가진 <code>&lt;header&gt;</code> 영역 -&gt; 먼저 나오는 형제가 3차원이라면, 그 다음에 나온 형제가 2차원인지, 3차원인지에 관계 없이 레이어가 겹치게 된다.
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/8d0cc45e-ffb1-44d8-9c56-25b304aa5b77/image.png" alt=""></li>
<li><blockquote>
<p><code>&lt;main&gt;</code> 영역에 <code>padding-top</code> 속성을 이용해, <code>&lt;header&gt;</code>의 높이값(+border) 만큼 아래로 내려준다.
<img src="https://images.velog.io/images/jiyoon_jeong2005/post/06c5e64d-2c78-4474-ae07-f58b8b4f7205/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<h3 id="👉-브라우저-내부-영역의-컬러를-뽑아내고-싶을-때">👉 브라우저 내부 영역의 컬러를 뽑아내고 싶을 때</h3>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/e9b8856d-cd1f-4a5d-9fa6-365ecfc11577/image.png" alt=""></p>
<h4 id="2-banner">2) banner</h4>
<p><img src="https://images.velog.io/images/jiyoon_jeong2005/post/fb4f6525-7e10-4450-af74-876095bab5e8/image.png" alt=""></p>
<h1 id="📌-학습내용-중-어려웠던-점">📌 학습내용 중 어려웠던 점</h1>
<hr>
<ol>
<li>가상 선택자는 가장 안쪽에 지정되어 있는 태그에서만 작동을 하는 건가?
<code>#esport-header #esport-nav .center li a:hover { color: darkgray; }</code> 과 같이 a태그에 :hover을 걸어줬을 때는 아래와 같이 적용이 잘 되었으나,
<code>#esport-header #esport-nav .center li:hover { color: darkgray; }</code> 처럼 li 태그에 :hover을 걸어줬을 때는 작동하지 않다.</li>
</ol>
<h1 id="📌-해결방법">📌 해결방법</h1>
<hr>
<ol>
<li>강사님께 질문했을 때, hover가 작동되는 범위와 관련 있을 것 같다고 하셨다. hover시에 해당 이벤트가 <code>&lt;a&gt;</code>에 걸리는지 <code>&lt;li&gt;</code>에 걸리는지 여부에 따라 작동이 되는 것이다.</li>
</ol>
<h1 id="📌-학습소감">📌 학습소감</h1>
<hr>
<p>메인 상단영역의 코드를 작성할 때, 가상선택자 hover에 <code>transition</code> 속성과 <code>transform</code> 속성을 사용해 이미지에 애니메이션을 지정할 때 우왕좌왕했다. 인터넷 서칭과 이전에 애니메이션을 중심으로 작업한 파일을 찾아보며 해당 코드를 작성했다. 최근 강의에서 애니메이션 효과를 거의 제외하는 편이라 개인적으로 넣어주고 있다. 대부분이 단순히 hover시에 <code>text-decoration</code>을 넣어주는 것이었는데, 이래서 개발에는 꾸준한 공부가 필요하구나 생각했다. 고려해야할 것도, 알아야 할 것도 너무 많지만 그만큼 배우는 것도 많고 꽤 흥미로워서 즐겁다. 😁 </p>
]]></description>
        </item>
    </channel>
</rss>