<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>inhwa.log</title>
        <link>https://velog.io/</link>
        <description>🐢 💨 💨</description>
        <lastBuildDate>Tue, 21 Mar 2023 08:37:49 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>inhwa.log</title>
            <url>https://velog.velcdn.com/images/inhwa-jang/profile/14daadba-713b-4eeb-85e1-24e46e9e8e3b/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. inhwa.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/inhwa-jang" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[CSS] transform]]></title>
            <link>https://velog.io/@inhwa-jang/CSS-transform</link>
            <guid>https://velog.io/@inhwa-jang/CSS-transform</guid>
            <pubDate>Tue, 21 Mar 2023 08:37:49 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/inhwa-jang/post/55c36ef3-aa01-4ef4-b81c-2ebc0562e4b7/image.png" alt=""></p>
<h1 id="transform">transform</h1>
<ul>
<li>transform은 요소에 이동(translate), 회전(rotate), 확대축소(scale), 비틀기(skew) 효과를 부여하기 위한 함수를 제공한다.</li>
<li>transform은 애니메이션 효과를 위해 사용하여야 하는 것은 아니지만 애니메이션 효과를 부여할 필요가 있다면 <code>transition</code>이나 <code>animation</code>과 함께 사용한다.</li>
</ul>
<h2 id="2d-transform">2D Transform</h2>
<table>
<thead>
<tr>
<th align="left">transform function</th>
<th align="left">설명</th>
<th align="center">단위</th>
</tr>
</thead>
<tbody><tr>
<td align="left">translate(x,y)</td>
<td align="left">요소의 위치를 X축으로 x만큼, Y축으로 y만큼 이동시킨다</td>
<td align="center">px, %, em 등</td>
</tr>
<tr>
<td align="left">translateX(n)</td>
<td align="left">요소의 위치를 X축으로 x만큼 이동시킨다</td>
<td align="center">px, %, em 등</td>
</tr>
<tr>
<td align="left">translateY(n)</td>
<td align="left">요소의 위치를 Y축으로 y만큼 이동시킨다</td>
<td align="center">px, %, em 등</td>
</tr>
<tr>
<td align="left">scale(x,y)</td>
<td align="left">요소의 크기를 X축으로 x배, Y축으로 y배 확대 또는 축소시킨다</td>
<td align="center">0과 양수</td>
</tr>
<tr>
<td align="left">scaleX(n)</td>
<td align="left">요소의 크기를 X축으로 x배 확대 또는 축소 시킨다</td>
<td align="center">0과 양수</td>
</tr>
<tr>
<td align="left">scaleY(n)</td>
<td align="left">요소의 크기를 Y축으로 y배 확대 또는 축소 시킨다</td>
<td align="center">0과 양수</td>
</tr>
<tr>
<td align="left">skew(x-angle, y-angle)</td>
<td align="left">요소를 X축으로 x 각도만큼, Y축으로 y 각도만큼 기울인다</td>
<td align="center">+/- 각도(deg)</td>
</tr>
<tr>
<td align="left">skewX(x-angle)</td>
<td align="left">요소를 X축으로 x 각도만큼 기울인다</td>
<td align="center">+/- 각도(deg)</td>
</tr>
<tr>
<td align="left">skewY(y-angle)</td>
<td align="left">요소를 Y축으로 y 각도만큼 기울인다</td>
<td align="center">+/- 각도(deg)</td>
</tr>
<tr>
<td align="left">rotate(angle)</td>
<td align="left">요소를 angle만큼 회전시킨다</td>
<td align="center">+/- 각도(deg)</td>
</tr>
</tbody></table>
<h2 id="3d-transform">3D Transform</h2>
<table>
<thead>
<tr>
<th align="left">transform function</th>
<th align="left">설명</th>
<th align="center">단위</th>
</tr>
</thead>
<tbody><tr>
<td align="left">translate(x,y,z)</td>
<td align="left">요소의 위치를 X축으로 x만큼, Y축으로 y만큼, Z축으로 z만큼 이동시킨다</td>
<td align="center">px, %, em 등</td>
</tr>
<tr>
<td align="left">translateX(n)</td>
<td align="left">요소의 위치를 X축으로 x만큼 이동시킨다</td>
<td align="center">px, %, em 등</td>
</tr>
<tr>
<td align="left">translateY(n)</td>
<td align="left">요소의 위치를 Y축으로 y만큼 이동시킨다</td>
<td align="center">px, %, em 등</td>
</tr>
<tr>
<td align="left">translateZ(n)</td>
<td align="left">요소의 위치를 Z축으로 z만큼 이동시킨다</td>
<td align="center">px, %, em 등</td>
</tr>
<tr>
<td align="left">scale3d(x,y)</td>
<td align="left">요소의 크기를 X축으로 x배, Y축으로 y배, Z축으로 z배 확대 또는 축소 시킨다</td>
<td align="center">0과 양수</td>
</tr>
<tr>
<td align="left">scaleX(n)</td>
<td align="left">요소의 크기를 X축으로 x배 확대 또는 축소 시킨다</td>
<td align="center">0과 양수</td>
</tr>
<tr>
<td align="left">scaleY(n)</td>
<td align="left">요소의 크기를 Y축으로 y배 확대 또는 축소 시킨다</td>
<td align="center">0과 양수</td>
</tr>
<tr>
<td align="left">scaleZ(n)</td>
<td align="left">요소의 크기를 Z축으로 z배 확대 또는 축소 시킨다</td>
<td align="center">0과 양수</td>
</tr>
<tr>
<td align="left">rotate3d(x,y,z)</td>
<td align="left">요소를 X축으로 x각도, Y축으로 y각도, Z축으로 z각도 회전시킨다</td>
<td align="center">+/- 각도(deg)</td>
</tr>
<tr>
<td align="left">rotateX(n)</td>
<td align="left">요소를 X축으로 x각도 회전시킨다</td>
<td align="center">+/- 각도(deg)</td>
</tr>
<tr>
<td align="left">rotateY(n)</td>
<td align="left">요소를 Y축으로 y각도 회전시킨다</td>
<td align="center">+/- 각도(deg)</td>
</tr>
<tr>
<td align="left">rotateZ(n)</td>
<td align="left">요소를 Z축으로 z각도 회전시킨다</td>
<td align="center">+/- 각도(deg)</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CSS] animation]]></title>
            <link>https://velog.io/@inhwa-jang/CSS-animation</link>
            <guid>https://velog.io/@inhwa-jang/CSS-animation</guid>
            <pubDate>Tue, 21 Mar 2023 07:23:26 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/inhwa-jang/post/0294c573-1a81-4234-9b07-89b0405496ea/image.png" alt=""></p>
<h1 id="animation">animation</h1>
<ul>
<li><code>animation: name duration timing-function delay iteration-count direction fill-mode play-state ;</code></li>
<li>transition이 <span style="color: gray;">자동발동(self-invoking transition)</span> 하도록 하고 싶다면 CSS <strong>animation</strong>을 사용한다.</li>
<li>animation효과는 HTML 요소에 적용되는 스타일을 다른 스타일로 부드럽게 변화시킨다.</li>
<li><span style="color: salmon;">애니메이션을 나타내는 스타일</span>과 <span style="color: skyblue;">애니메이션의 sequance를 나타내는 복수의 ( <code>@keyframes</code> )들</span>로 이루어진다.</li>
<li>비교적 작은 효과나 CSS만으로도 충분한 효과를 볼 수 있는 것은 CSS를 사용한다.</li>
<li>세밀한 제어를 위해서는 Javascript 사용이 바람직하다. <span style="color: gray;">예를 들어 바운스, 중지, 일시 중지, 되감기 또는 감속과 같은 고급 효과는 Javascript가 훨씬 유용하다.</span></li>
<li>여러 사항들을 고려하여 Javacript를 사용할지 CSS를 사용할지 결정하여야 한다.</li>
</ul>
<table>
<thead>
<tr>
<th>프로퍼티</th>
<th>설명</th>
<th>기본값</th>
</tr>
</thead>
<tbody><tr>
<td>animation-name</td>
<td>@keyframes 애니메이션 이름을 지정한다</td>
<td></td>
</tr>
<tr>
<td>animation-duration</td>
<td>한 싸이클의 애니메이션에 소요되는 시간을 초 단위(s) 또는 밀리 초 단위(ms)로 지정한다</td>
<td>0s</td>
</tr>
<tr>
<td>animation-timing-function</td>
<td>애니메이션 효과를 위한 타이밍 함수를 지정한다</td>
<td>ease</td>
</tr>
<tr>
<td>animation-delay</td>
<td>요소가 로드된 시점과 애니메이션이 실제로 시작하는 사이에 대기하는 시간을<br>초 단위(s) 또는 밀리 초 단위(ms)로 지정한다</td>
<td>0s</td>
</tr>
<tr>
<td>animation-iteration-count</td>
<td>애니메이션 재생 횟수를 지정한다</td>
<td>1</td>
</tr>
<tr>
<td>animation-direction</td>
<td>애니메이션이 종료된 이후 반복될 때 진행하는 방향을 지정한다</td>
<td>normal</td>
</tr>
<tr>
<td>animation-fill-mode</td>
<td>애니메이션 미실행 시( 종료 또는 대기 )요소의 스타일을 지정한다</td>
<td></td>
</tr>
<tr>
<td>animation-play-state</td>
<td>애니메이션 재생 상태( 재생 또는 중지 )를 지정한다</td>
<td>running</td>
</tr>
<tr>
<td>animation</td>
<td>모든 애니메이션 프로퍼티를 한번에 지정한다 ( shorthand syntax )</td>
<td></td>
</tr>
</tbody></table>
<h2 id="keyframes">@keyframes</h2>
<ul>
<li>애니메이션의 흐름 중의 여러 시점에서 CSS 프로퍼티값을 지정할 수 있다.</li>
</ul>
<pre><code class="language-css">div {
      position: absolute;
      width: 100px;
      height: 100px;
      background-color: red;
      animation-name: move;
      animation-duration: 5s;
      animation-iteration-count: infinite;
    }
    /* @keyframes rule */
    @keyframes move {
      /* keyframe */
      from {
        left: 0;
      }
      /* keyframe */
      to {
        left: 300px;
      }
    }</code></pre>
<ul>
<li><strong>from</strong>, <strong>to</strong> 키워드를 사용하여 애니메이션의 시작과 끝 시점을 정의하였다.<pre><code class="language-css">@keyframes move {
0%   { left: 0; }
50%  { left: 100px; }
100% { left: 300px; }
}</code></pre>
</li>
<li>from, to 키워드 대신 <strong>%(퍼센트)</strong>를 사용할 수도 있다. 시작과 끝 키프레임 사이에 %단위로 키프레임을 삽입할 수 있다.</li>
</ul>
<h2 id="animation-name">animation-name</h2>
<ul>
<li>애니메이션을 대표하는 임의의 이름을 부여한다.</li>
<li><code>@keyframes move {}</code></li>
</ul>
<h2 id="animation-duration">animation-duration</h2>
<ul>
<li>한 사이클의 애니메이션에 소요되는 시간을 초 단위(s) 또는 밀리 초 단위(ms)로 지정한다.</li>
<li>animation-duration은 반드시 지정해야 한다. 지정하지 않는 경우 기본값 0s로 인해 어떠한 애니메이션도 실행되지 않는다.</li>
<li><code>animation-duration: .5s;</code> 또는 <code>animation-duration: 500ms;</code></li>
</ul>
<h2 id="animation-timing-function">animation-timing-function</h2>
<ul>
<li>애니메이션 효과를 위한 수치 함수를 지정한다. transition-timing-fucntion을 참조한다.</li>
</ul>
<h2 id="animation-delay">animation-delay</h2>
<ul>
<li>요소가 애니메이션이 실제로 시작하는 사이에 대기하는 시간을 초 단위(s) 또는 밀리 초 단위(ms)로 지정한다.</li>
<li><code>animation-delay: 2s;</code></li>
</ul>
<h2 id="animation-iteration-count">animation-iteration-count</h2>
<ul>
<li>애니메이션 주기의 재생 횟수를 지정한다. 기본값은 1이며 infinite로 무한반복 할 수 있다.</li>
<li><code>animation-iteration-count: 3;</code> 또는 <code>animation-iteration-count: infinite;</code></li>
</ul>
<h2 id="animation-direction">animation-direction</h2>
<ul>
<li>애니메이션이 종료된 이후 반복될 때 진행하는 방향을 지정한다.</li>
</ul>
<table>
<thead>
<tr>
<th>프로퍼티값</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>normal</td>
<td>기본값으로 from(0%)에서 to(100%)방향으로 진행한다</td>
</tr>
<tr>
<td>reverse</td>
<td>to에서 from방향으로 역진행한다</td>
</tr>
<tr>
<td>alternate</td>
<td>홀수번째는 normal로, 짝수번째는 reverse로 진행한다</td>
</tr>
<tr>
<td>alternate-reverse</td>
<td>홀수번째는 reverse로, 짝수번째는 normal로 진행한다</td>
</tr>
</tbody></table>
<h2 id="animation-fill-mode">animation-fill-mode</h2>
<ul>
<li>애니메이션 미실행 시(대기 또는 종료)요소의 스타일을 지정한다.</li>
</ul>
<table>
<thead>
<tr>
<th>프로퍼티값</th>
<th>상태</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>none</td>
<td>대기</td>
<td>시작 프레임(from)에 설정한 스타일을 적용하지 않고 대기한다</td>
</tr>
<tr>
<td></td>
<td>종료</td>
<td>애니메이션 실행 전 상태로 애니메이션 요소의 프로퍼티값을 되돌리고 종료한다</td>
</tr>
<tr>
<td>forwards</td>
<td>대기</td>
<td>시작 프레임(from)에 설정한 스타일을 적용하지 않고 대기한다</td>
</tr>
<tr>
<td></td>
<td>종료</td>
<td>종료 프레임(to)에 설정한 스타일을 적용하고 종료한다</td>
</tr>
<tr>
<td>backwards</td>
<td>대기</td>
<td>시작 프레임(from)에 설정한 스타일을 적용하고 대기한다</td>
</tr>
<tr>
<td></td>
<td>종료</td>
<td>애니메이션 실행 전 상태로 애니메이션 요소의 프로퍼티값을 되돌리고 종료한다</td>
</tr>
<tr>
<td>both</td>
<td>대기</td>
<td>시작 프레임(from)에 설정한 스타일을 적용하고 대기한다</td>
</tr>
<tr>
<td></td>
<td>종료</td>
<td>종료 프레임(to)에 설정한 스타일을 적용하고 종료한다</td>
</tr>
</tbody></table>
<h2 id="animation-play-state">animation-play-state</h2>
<ul>
<li><p>애니메이션 재생 상태를 지정한다. 기본값은 <code>running</code>이다</p>
</li>
<li><p><code>running</code> 또는 <code>paused</code></p>
<pre><code class="language-html">&lt;style&gt;
  .box {
    position: relative;
    width: 100px;
    height: 100px;
    background-color: red;
    animation-name: move;
    animation-duration: 5s;
    animation-play-state: paused; /* 초기 애니메이션 재생 상태: 정지 */
    animation-iteration-count: infinite;
  }

  /* @keyframes rule */
  @keyframes move {
    from {
      left: 0;
    }

    to {
      left: 300px;
    }
  }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class=&quot;box&quot;&gt;&lt;/div&gt;
&lt;button class=&quot;start&quot;&gt;start animation&lt;/button&gt;
&lt;button class=&quot;pause&quot;&gt;pause animation&lt;/button&gt;

&lt;script&gt;
  const box = document.querySelector(&#39;.box&#39;);

  document.querySelector(&#39;.start&#39;).addEventListener(&#39;click&#39;, function () {
    // trigger animation
    // prefixes would be needed...
    box.style.animationPlayState = &#39;running&#39;;
  });

  document.querySelector(&#39;.pause&#39;).addEventListener(&#39;click&#39;, function () {
    // pause animation
    // prefixes would be needed...
    box.style.animationPlayState = &#39;paused&#39;;
  });
&lt;/script&gt;
&lt;/body&gt;</code></pre>
</li>
</ul>
<h2 id="예제">예제</h2>
<h3 id="text-animation">Text animation</h3>
<pre><code class="language-html">&lt;section&gt;
      &lt;div class=&quot;text-effect1 effect&quot;&gt;
        &lt;p&gt;
          &lt;span class=&quot;text-wrapper&quot;&gt;
            &lt;span&gt;The&amp;nbsp;1st&lt;/span&gt;
            &lt;span&gt;Text&amp;nbsp;effect&lt;/span&gt;
          &lt;/span&gt;
        &lt;/p&gt;
      &lt;/div&gt;

      &lt;div class=&quot;text-effect2 effect&quot;&gt;
        &lt;div class=&quot;top-bottom-borders&quot;&gt;&lt;/div&gt;
        &lt;div class=&quot;right-left-borders&quot;&gt;&lt;/div&gt;
        &lt;div class=&quot;text-wrapper&quot;&gt;
          &lt;p&gt;
            &lt;span&gt;The&amp;nbsp;2nd&lt;/span&gt;
            &lt;span&gt;Text&amp;nbsp;effect&lt;/span&gt;
          &lt;/p&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/section&gt;</code></pre>
<pre><code class="language-css">    @import url(&#39;https://fonts.googleapis.com/css2?family=Montserrat:wght@300;800&amp;display=swap&#39;);

    * {
      padding: 0;
      margin: 0;
    }

    body {
      display: flex;
      height: 100vh;
      flex-direction: column;
      justify-content: center;
      align-items: center;
    }

    section {
      display: flex;
      align-items: center;
      justify-content: center;
      flex-wrap: wrap;
      max-width: 1800px;
    }

    /* Common */

    .effect {
      margin: 40px;
    }

    span {
      display: block;
      font-size: calc(1.5rem + 0.5vw);
    }

    span:first-child {
      font-family: &#39;Montserrat Light&#39;, sans-serif;
    }

    span:last-child {
      font-family: &#39;Montserrat ExtraBold&#39;, sans-serif;
    }

    /* Text effect1 */
    .text-effect1 p {
      border-left: 4px solid #000;
      padding-left: 20px;
      transform: scaleY(0);
      animation: scaleUpBorder 1s forwards cubic-bezier(0.85, 0, 0.15, 1);
      overflow: hidden;
    }

    @keyframes scaleUpBorder {
      to {
        transform: scaleY(1);
      }
    }

    .text-effect1 .text-wrapper {
      transform: translateX(calc(-100% - 20px));
      animation: slideTextRight 1s 0.5s forwards cubic-bezier(0.85, 0, 0.15, 1);
    }

    @keyframes slideTextRight {
      to {
        transform: translateX(0%);
      }
    }

    /* Text effect2 */
    .text-effect2 {
      position: relative;
    }

    .text-effect2 .top-bottom-borders {
      position: absolute;
      border-top: 2px solid #000;
      border-bottom: 2px solid #000;
      inset: 0;
      transform: scaleX(0);
      animation: scaleUpHorizontally 1s forwards cubic-bezier(0.85, 0, 0.15, 1);
    }

    .text-effect2 .right-left-borders {
      position: absolute;
      border-right: 2px solid #000;
      border-left: 2px solid #000;
      inset: 0;
      transform: scaleY(0);
      animation: scaleUpVertically 1s forwards cubic-bezier(0.85, 0, 0.15, 1);
    }

    .text-effect2 .text-wrapper {
      overflow: hidden;
    }

    .text-effect2 p {
      text-align: center;
      padding: 20px;
      transform: translateY(100%);
      animation: slideTextUp 1s 0.1s forwards cubic-bezier(0.85, 0, 0.15, 1);
    }

    @keyframes slideTextUp {
      to {
        transform: translateY(0%);
      }
    }

    @keyframes scaleUpVertically {
      to {
        transform: scaleY(1);
      }
    }

    @keyframes scaleUpHorizontally {
      to {
        transform: scaleX(1);
      }
    }
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CSS] transition]]></title>
            <link>https://velog.io/@inhwa-jang/CSS-transition</link>
            <guid>https://velog.io/@inhwa-jang/CSS-transition</guid>
            <pubDate>Tue, 21 Mar 2023 06:08:47 GMT</pubDate>
            <description><![CDATA[<h1 id="transition">transition</h1>
<ul>
<li><code>transition : property  duration  timing-function  delay ;</code></li>
<li>CSS 속성값이 변화할때, 속성값의 변화가 일정 시간(duration)에 걸쳐 일어나도록 하는 것이다</li>
<li>transition은 상태 변화에 동반하여 변경되는 <strong>CSS 프로퍼티 값에 의한 변화를 부드럽게 하기 위해</strong> 애니메이션 속도를 조절한다.</li>
<li>transition은 자동으로 발동되지 않는다. <code>:hover</code>와 같은 <span style="color: salmon;">가상 클래스 선택자</span> 또는 Javascript의 부수적인 액션에 의해 발동한다.<h2 id="transition-property">transition property</h2>
</li>
</ul>
<table>
<thead>
<tr>
<th align="left">프로퍼티</th>
<th align="left">설명</th>
<th align="right">기본값</th>
</tr>
</thead>
<tbody><tr>
<td align="left">transition-property</td>
<td align="left">트랜지션의 대상이 되는 CSS 프로퍼티를 지정한다</td>
<td align="right">all</td>
</tr>
<tr>
<td align="left">transition-duration</td>
<td align="left">트랜지션이 일어나는 지속시간(duration)을 초 단위(s) 또는 밀리 초 단위(ms)로 지정한다</td>
<td align="right">0s</td>
</tr>
<tr>
<td align="left">transition-timing-function</td>
<td align="left">트랜지션 효과를 위한 수치 함수를 지정한다</td>
<td align="right">ease</td>
</tr>
<tr>
<td align="left">transition-delay</td>
<td align="left">프로퍼티가 변화한 시점과 트랜지션이 실제로 시작하는 사이에 대기하는 시간을 초 단위(s) <br>또는 밀리 초 단위(ms)로 지정한다</td>
<td align="right">0s</td>
</tr>
<tr>
<td align="left">transition</td>
<td align="left">모든 트랜지션 프로퍼티를 한번에 지정한다 <br><code>transition : ( property , duration , timing-function , delay )</code></td>
<td align="right"></td>
</tr>
<tr>
<td align="left">```css</td>
<td align="left"></td>
<td align="right"></td>
</tr>
<tr>
<td align="left">div {</td>
<td align="left"></td>
<td align="right"></td>
</tr>
<tr>
<td align="left">transition-property: width, opacity;</td>
<td align="left"></td>
<td align="right"></td>
</tr>
<tr>
<td align="left">transition-duration: 2s, 4s;</td>
<td align="left"></td>
<td align="right"></td>
</tr>
<tr>
<td align="left">}</td>
<td align="left"></td>
<td align="right"></td>
</tr>
<tr>
<td align="left">```</td>
<td align="left"></td>
<td align="right"></td>
</tr>
<tr>
<td align="left">```css</td>
<td align="left"></td>
<td align="right"></td>
</tr>
<tr>
<td align="left">div {</td>
<td align="left"></td>
<td align="right"></td>
</tr>
<tr>
<td align="left">/* shorthand syntax */</td>
<td align="left"></td>
<td align="right"></td>
</tr>
<tr>
<td align="left">transition: width 2s, opacity 4s;</td>
<td align="left"></td>
<td align="right"></td>
</tr>
<tr>
<td align="left">}</td>
<td align="left"></td>
<td align="right"></td>
</tr>
<tr>
<td align="left">```</td>
<td align="left"></td>
<td align="right"></td>
</tr>
<tr>
<td align="left">## transition-timing-function</td>
<td align="left"></td>
<td align="right"></td>
</tr>
<tr>
<td align="left">프로퍼티값</td>
<td align="left">효과</td>
<td align="right"></td>
</tr>
<tr>
<td align="left">: -------</td>
<td align="left">:------</td>
<td align="right"></td>
</tr>
<tr>
<td align="left">ease</td>
<td align="left">기본값. 느리게 시작하여 점점 빨라졌다가 느려지면서 종료한다.</td>
<td align="right"></td>
</tr>
<tr>
<td align="left">linear</td>
<td align="left">시작부터 종료까지 등속 운동을 한다.</td>
<td align="right"></td>
</tr>
<tr>
<td align="left">ease-in</td>
<td align="left">느리게 시작한 후 일정한 속도에 다다르면 그 상태로 등속 운동을 한다.</td>
<td align="right"></td>
</tr>
<tr>
<td align="left">ease-out</td>
<td align="left">일정한 속도의 등속으로 시작해서 점점 느려지면서 종료한다.</td>
<td align="right"></td>
</tr>
</tbody></table>
<h2 id="예제">예제</h2>
<h3 id="1-이미지에-hover시-크기가-커지는-효과">1. 이미지에 hover시 크기가 커지는 효과</h3>
<p><img src="https://velog.velcdn.com/images/inhwa-jang/post/8c608ad3-9b58-4295-aed3-dc97102be950/image.png" alt=""></p>
<pre><code class="language-html">&lt;body&gt;
  &lt;div class=&quot;con-wrap&quot;&gt;
    &lt;div class=&quot;img-wrap&quot;&gt;
      &lt;img src=&quot;https://cdn.pixabay.com/photo/2015/12/09/17/12/popcorn-1085072_960_720.jpg&quot; alt=&quot;&quot;&gt;
    &lt;/div&gt;
    &lt;h3&gt;매점 팝콘 무료쿠폰&lt;/h3&gt;
    &lt;p&gt;Lorem ipsum, dolor sit amet consectetur adipisicing elit. Ipsa, amet!&lt;/p&gt;
 &lt;/div&gt;
&lt;/body&gt;</code></pre>
<pre><code class="language-css">* {
  margin: 0;
  padding: 0;
}

.con-wrap {
  width: 500px;
  margin: 100px auto;
}

.con-wrap:hover img {
  transform: scale(1.2);
}

.img-wrap {
  width: 100%;
  height: 350px;
  overflow: hidden;
}

.img-wrap img {
  width: 100%;
  transition: 0.5s;
}

h3 {
  margin-top: 10px;
  font-weight: 700;
  line-height: 1.2;
}

p {
  margin-top: 7px;
  font-size: 0.8em;
  font-weight: 100;
  line-height: 1.2;

}</code></pre>
<h3 id="어떤-요소상황에-transition을-적용시키는가">어떤 요소,상황에 transition을 적용시키는가</h3>
<ol>
<li>자연스럽게 둘다 적용시 직접적인 엘리먼트에 <code>ransition</code>넣기</li>
<li>마우스만 올렸을때 적용시 hover 이벤트에 <code>ransition</code>넣기</li>
</ol>
<ul>
<li><code>overflow</code> : 부모 바깥으로 넘치는 자식을 관리해준다. 속성값 중 <code>hidden</code>은 넘치는 자식을 잘라주는 역할을 한다. <strong>항상 부모에게 넣어주는 속성</strong>이다.</li>
</ul>
<h3 id="2-hover시-색상이-채워지는-더보기-버튼">2. hover시 색상이 채워지는 더보기 버튼</h3>
<p><img src="https://velog.velcdn.com/images/inhwa-jang/post/0e39da5d-e7d9-4b7c-b630-f2b2e34f77db/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/inhwa-jang/post/4e10153d-7c81-4249-bb83-c0354c6d2aa2/image.png" alt=""></p>
<pre><code class="language-html">&lt;body&gt;
  &lt;div class=&quot;btn-wrap&quot;&gt;
    &lt;div class=&quot;gage&quot;&gt;&lt;/div&gt;
    &lt;h3&gt;더 보기 &amp;rarr;&lt;/h3&gt;
  &lt;/div&gt;
&lt;/body&gt;</code></pre>
<pre><code class="language-css">* {
  margin: 0;
  padding: 0;
}

.btn-wrap {
  width: 300px;
  height: 100px;
  border: 3px solid #50D994;
  border-radius: 10px;
  margin: 100px auto;
  box-sizing: border-box;
  position: relative;
  cursor: pointer;
}

.btn-wrap:hover .gage{
  width: 100%;
}

.btn-wrap h3 {
  color: #494949;
  position: relative;
  text-align: center;
  line-height: 100px;
  font-size: 26px;
}

.btn-wrap:hover h3 {
  color: #fff;
}

.gage {
  width: 0%;
  height: 100%;
  background-color: #50D994;
  position: absolute;
  top: 0;
  left: 0;
  transition: all 0.5s;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue] Vue 컴포넌트]]></title>
            <link>https://velog.io/@inhwa-jang/Vue-Vue-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8</link>
            <guid>https://velog.io/@inhwa-jang/Vue-Vue-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8</guid>
            <pubDate>Wed, 15 Mar 2023 08:32:52 GMT</pubDate>
            <description><![CDATA[<h1 id="컴포넌트">컴포넌트</h1>
<ul>
<li><p>기본 HTML 엘리먼트를 확장하여 <code>재사용</code> 가능한 코드를 캡슐화한다</p>
</li>
<li><p>View, Data, Code의 세트 (컴포넌트 안에는 HTML코드, 코드를 실행하기 위한 Javascript코드, 데이터가 존재한다)</p>
</li>
<li><p>경우에 따라 특별한 <code>is</code> 속성으로 확장 </p>
</li>
<li><p>&#39;UI 덩어리&#39;라고 생각하기 (ex_ 헤더영역: 메뉴, 검색 기능들이 각 컴포넌트로 구성)</p>
<h2 id="전역-등록">전역 등록</h2>
</li>
<li><p>전역 컴포넌트를 등록하려면,<code>Vue.component(tagName, options)</code> 를 사용한다</p>
<pre><code class="language-html">&lt;body&gt;
  &lt;div id=&quot;app&quot;&gt;
    &lt;my-component&gt;&lt;/my-component&gt;
  &lt;/div&gt;

  &lt;script&gt;
    Vue.component(&#39;my-component&#39;, {
      template: &#39;&lt;div class=&quot;me&quot;&gt;{{ message }}&lt;/div&gt;&#39;,
      data: function() {
        return {
          message: &#39;Hello Vue!&#39;
        }
      }
    })

    const vm = new Vue({
      el: &#39;#app&#39;
    })
  &lt;/script&gt;
&lt;/body&gt;</code></pre>
<h2 id="지역-등록">지역 등록</h2>
</li>
<li><p>모든 컴포넌트를 전역으로 등록할 필요는 없다</p>
</li>
<li><p>컴포넌트를 <code>components</code> 인스턴스 옵션으로 등록함으로써 다른 인스턴스/ 컴포넌트의 범위에서만 사용할 수 있는 컴포넌트를 만들 수 있다</p>
<pre><code class="language-html">&lt;body&gt;
  &lt;div id=&quot;app1&quot;&gt;
    &lt;my-component /&gt;
  &lt;/div&gt;

  &lt;div id=&quot;app2&quot;&gt;
    &lt;my-comp /&gt;
  &lt;/div&gt;

  &lt;script&gt;
    const myComp = {
        template: &#39;&lt;div class=&quot;me&quot;&gt;{{ message }}&lt;/div&gt;&#39;,
        data: function () {
          return {
            message: &#39;Hello Vue!&#39;
          }
        }
      }

    const vm1 = new Vue({
      el: &#39;#app1&#39;,
      components: {
        &#39;my-component&#39; : myComp
      }
    })
    const vm2 = new Vue ({
      el: &#39;#app2&#39;,
      components: {
        &#39;my-comp&#39; : myComp
      }
    })
  &lt;/script&gt;
&lt;/body&gt;</code></pre>
<h2 id="data는-함수로-작성하기">data는 함수로 작성하기</h2>
<pre><code class="language-javascript">data: function () {
return {
  ...
}
}</code></pre>
</li>
</ul>
<hr>
<h2 id="props">Props</h2>
<ul>
<li>컴포넌트에 전달할 수 있는 데이터를 정의할 수 있다</li>
<li><code>props</code> 프로퍼티는 배열 또는 객체를 값으로 가진다</li>
<li>부모는 props를 통해 자식에게 데이터를 전달한다 <h3 id="camelcase-vs-kebab-case">camelCase vs kebab-case</h3>
</li>
<li>Html 속성은 camelCase</li>
<li>javascript 속성은 kebab-case</li>
</ul>
<pre><code class="language-html"> &lt;body&gt;
    &lt;div id=&quot;app&quot;&gt;
      &lt;my-comp :my-msg=&quot;message&quot;&gt;&lt;/my-comp&gt;
    &lt;/div&gt;

    &lt;script&gt;
      Vue.component(&#39;my-comp&#39;, {
        template: &#39;&lt;div&gt;{{ myMsg }}&lt;/div&gt;&#39;,
        props: {
          myMsg: {
            type: [String, Number],
            default: &#39;Default!&#39;,
            required: true,
            validator: function(value) {
              return value == &#39;Hello&#39;
            }
          }
        }
      })

      const vm = new Vue({
        el: &#39;#app&#39;,
        data() {
          return {
            message: &#39;Hello&#39;
          }
        }
      })
    &lt;/script&gt;
  &lt;/body&gt;</code></pre>
<h2 id="컴포넌트-작성">컴포넌트 작성</h2>
<ul>
<li><p>Vue.js에서 부모-자식 컴포넌트 관계는 &#39;props는 아래로, events는 위로&#39;라고 요약할 수 있다</p>
</li>
<li><p>부모는 props를 통해 자식에게 데이터를 전달한다</p>
</li>
<li><p>자식은 events를 통해 부모에게 메시지를 보낸다
<img src="https://velog.velcdn.com/images/inhwa-jang/post/00c35210-0600-41fa-bf3d-6f5a5db34187/image.png" alt=""></p>
<pre><code class="language-html">&lt;body&gt;
  &lt;div id=&quot;app&quot;&gt;
    &lt;my-comp :my-msg=&quot;message&quot; @my-event=&quot;updateMessage&quot;&gt;&lt;/my-comp&gt;
  &lt;/div&gt;

  &lt;script&gt;
    Vue.component(&#39;my-comp&#39;, {
      template: &#39;&lt;div @click=&quot;updateMsg&quot;&gt;{{ myMsg }}&lt;/div&gt;&#39;,
      props: {
        myMsg: String
      },
      methods: {
        updateMsg() {
          // this.myMsg = &#39;Good&#39;
          this.$emit(&#39;my-event&#39;, &#39;Good&#39;)
        }
      }
    })

    const vm = new Vue({
      el: &#39;#app&#39;,
      data() {
        return {
          message: &#39;Hello&#39;
        }
      },
      methods: {
        updateMessage(value) {
          this.message = value
        }
      }
    })
  &lt;/script&gt;
&lt;/body&gt;</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue] 폼 입력 바인딩]]></title>
            <link>https://velog.io/@inhwa-jang/Vue-%ED%8F%BC-%EC%9E%85%EB%A0%A5-%EB%B0%94%EC%9D%B8%EB%94%A9</link>
            <guid>https://velog.io/@inhwa-jang/Vue-%ED%8F%BC-%EC%9E%85%EB%A0%A5-%EB%B0%94%EC%9D%B8%EB%94%A9</guid>
            <pubDate>Wed, 15 Mar 2023 05:15:18 GMT</pubDate>
            <description><![CDATA[<h1 id="폼-입력-바인딩">폼 입력 바인딩</h1>
<h2 id="기본-사용법">기본 사용법</h2>
<ul>
<li><p><code>v-model</code> 디렉티브를 사용하여 입력 폼 input과 textarea 엘리먼트를 <code>양방향</code> 데이터로 <code>바인딩</code>할 수 있다.</p>
</li>
<li><p><code>v-model</code>은 내부적으로 서로 다른 속성과 서로 다른 이벤트를 전송한다.     </p>
<ul>
<li>text와 textarea 태그는 <code>value</code> 속성과 <code>input</code> 이벤트를 사용한다</li>
<li>체크박스와 라디오버튼은 <code>checked</code> 속성과 <code>change</code> 이벤트를 사용한다</li>
<li>Select 태그는 <code>value</code>를 prop으로, <code>change</code>를 이벤트로 사용한다</li>
</ul>
<hr>
<pre><code class="language-html">&lt;body&gt;
  &lt;div id=&quot;app&quot;&gt;
    &lt;input type=&quot;text&quot; 
           @input=&quot;bindMessage&quot; 
           :value=&quot;message&quot; /&gt;
    &lt;div&gt;{{ message }}&lt;/div&gt;
  &lt;/div&gt;

  &lt;script&gt;
    const vm = new Vue({
      el: &#39;#app&#39;,
      data: {
        message: &#39;Hello!&#39;
      },
      methods: {
        bindMessage(e) {
          this.message = event.target.value
        }
      }
    })
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
</li>
</ul>
<p>```</p>
<h3 id="주의사항">주의사항</h3>
<ul>
<li><p><code>v-model</code>을 통해서 한글을 입력할 경우 하나의 글자가 완성되지 않으면 한박자 늦게 적용됨</p>
</li>
<li><p>한글을 입력할 경우 <code>@input</code> , <code>:value</code>을 통해 양방향 바인딩을 적용한다</p>
<h2 id="수식어">수식어</h2>
</li>
<li><p><code>.lazy</code> : <code>v-model</code>은 각 input 이벤트 후 입력과 데이터를 동기화한다. <code>.lazy</code> 수식어를 추가하여 change이벤트 이후에 동기화 할 수 있다.</p>
</li>
<li><p><code>.number</code> : 사용자 입력이 자동으로 숫자로 형변환 된다. HTML 입력 요소의 값은 항상 문자열(String)을 반영하기 때문에 종종 유용하다.</p>
</li>
<li><p><code>.trim</code> : 사용자가 입력한 내용에서 자동으로 앞뒤 공백을 제거한다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue] 이벤트 핸들링]]></title>
            <link>https://velog.io/@inhwa-jang/Vue-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%ED%95%B8%EB%93%A4%EB%A7%81</link>
            <guid>https://velog.io/@inhwa-jang/Vue-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%ED%95%B8%EB%93%A4%EB%A7%81</guid>
            <pubDate>Wed, 15 Mar 2023 02:25:07 GMT</pubDate>
            <description><![CDATA[<h2 id="메서드-이벤트-핸들러">메서드 이벤트 핸들러</h2>
<pre><code class="language-html">&lt;body&gt;
    &lt;div id=&quot;app&quot;&gt;
      &lt;ul&gt;
        &lt;li
          :class=&quot;&#39;item - &#39;  + (index + 1)&quot;
          v-for=&quot;(todo,index) in todos&quot;
          :key=&quot;index&quot;
          @click=&quot;clickMethod1(todo.title, $event); clickMethod2()&quot;
        &gt;
          {{ todo.title }}
        &lt;/li&gt;
      &lt;/ul&gt;
    &lt;/div&gt;

    &lt;script&gt;
      const vm = new Vue({
        el: &#39;#app&#39;,
        data: {
          todos: [
            { title: &#39;아침 먹기&#39; },
            { title: &#39;점심 먹기&#39; },
            { title: &#39;저녁 먹기&#39; }
          ]
        },
        methods: {
          clickMethod1(title, event) {
            console.log(&#39;click1&#39;)
            console.log(title)
            console.log(event.currentTarget.className)
          },
          clickMethod2(title, event) {
            console.log(&#39;click2&#39;)
          }
        }
      })
    &lt;/script&gt;
  &lt;/body&gt;</code></pre>
<h2 id="inline-method-handler">inline method handler</h2>
<p>li요소를 클릭하면 console에 요소의 className이 찍히도록 동작 <code>clickMethod1(title, event) { console.log(event.currentTarget.className)}</code> <code>:class=&quot;&#39;item - &#39;  + (index + 1)&quot;</code></p>
<h2 id="인라인--이벤트">인라인 + 이벤트</h2>
<p>인라인 이벤트 핸들러(인수사용)에 이벤트 핸들러를 함께 사용하는 방법</p>
<pre><code class="language-html">&lt;button @click=&quot;clickMethod1(todo.title, $event)&quot;&gt;
  click!
&lt;/button&gt;</code></pre>
<h2 id="multiple-event-handlers">Multiple event handlers</h2>
<p>다중 메서드 핸들러를 사용할때는 인수가 없어도 ()소괄호를 명시해야한다</p>
<pre><code class="language-html">&lt;button @click=&quot;clickMethod1(todo.title, $event); clickMethod2()&quot;&gt;
  click!
&lt;/button&gt;</code></pre>
<hr>
<h2 id="이벤트-수식어event-modifiers">이벤트 수식어(Event Modifiers)</h2>
<pre><code class="language-javascript">handler(e) {
  e.preventDefault()
} 
// HTML의 기본 동작을 방지하고 method만 실행하는 기능</code></pre>
<pre><code class="language-javascript">handlerB(e) {
  e.stopPropagation()
}
// 버블링을 방지하는 기능</code></pre>
<p>이벤트 핸들러 내부에 <code>event.preventDefault()</code> 또는 <code>event.stopPropagation()</code>을 호출하여 DOM 이벤트 세부 사항을 처리하는 대신,
데이터 로직에 대한 메소드만 사용할 수 있도록 Vue는 <code>v-on</code> 이벤트에 이벤트 수식어를 제공한다.
수식어는 점으로 표시된 접미사이다.</p>
<ul>
<li><code>.stop</code></li>
<li><code>.prevent</code></li>
<li><code>.capture</code></li>
<li><code>.self</code></li>
<li><code>.once</code></li>
<li><code>.passive</code><pre><code class="language-html">&lt;!-- 클릭 이벤트 전파가 중단됩니다 --&gt;
&lt;a v-on:click.stop=&quot;doThis&quot;&gt;&lt;/a&gt;
</code></pre>
</li>
</ul>
<!-- 제출 이벤트가 페이지를 다시 로드 하지 않습니다 -->
<form v-on:submit.prevent="onSubmit"></form>

<!-- 수식어는 체이닝 가능합니다 -->
<p><a v-on:click.stop.prevent="doThat"></a></p>
<!-- 단순히 수식어만 사용할 수 있습니다 -->
<form v-on:submit.prevent></form>

<!-- 이벤트 리스너를 추가할 때 캡처모드를 사용합니다 -->
<!-- 즉, 내부 엘리먼트를 대상으로 하는 이벤트가 해당 엘리먼트에서 처리되기 전에 여기서 처리합니다. -->
<div v-on:click.capture="doThis">...</div>


<!-- event.target이 엘리먼트 자체인 경우에만 트리거를 처리합니다(target과 currentTarget이 동일) -->
<!-- 자식 엘리먼트에서는 안됩니다 -->
<div v-on:click.self="doThat">...</div>

<!-- 클릭 이벤트는 최대 한번만 트리거 됩니다. -->
<p><a v-on:click.once="doThis"></a></p>
<!-- 스크롤의 기본 이벤트를 취소할 수 없습니다. -->
<div v-on:scroll.passive="onScroll">...</div>
```

<hr>
<h2 id="키-수식어">키 수식어</h2>
<pre><code class="language-html">&lt;!-- `key`가 `Enter`일 때 vm.submit()을 호출하겠다 --&gt;
&lt;input v-on:keyup.enter=&quot;submit&quot;&gt;</code></pre>
<p>키보드 이벤트를 수신할 때 Vue는 <code>v-on</code>에 대한 키 수식어를 추가할 수 있다</p>
<pre><code class="language-html">&lt;body&gt;
    &lt;div id=&quot;app&quot;&gt;
      &lt;input type=&quot;text&quot; @keydown.ctrl.enter=&quot;keydownHandler&quot; /&gt;
    &lt;/div&gt;

    &lt;script&gt;
      const vm = new Vue({
        el: &#39;#app&#39;,
        data: {},
        methods: {
          keydownHandler(e) {
            console.log(&#39;Done!!&#39;)
          }
        }
      })
    &lt;/script&gt;
  &lt;/body&gt;</code></pre>
<ul>
<li><code>.enter</code></li>
<li><code>.tab</code></li>
<li><code>.delete</code> (“Delete” 와 “Backspace” 키 모두를 캡처합니다)</li>
<li><code>.esc</code></li>
<li><code>.space</code></li>
<li><code>.up</code></li>
<li><code>.down</code></li>
<li><code>.left</code></li>
<li><code>.right</code><h3 id="시스템-키-수식어-목록">시스템 키 수식어 목록</h3>
해당 수식어 키가 눌러진 경우에만 마우스 또는 키보드 이벤트 리스너를 트리거 할 수 있다</li>
<li><code>.ctrl</code></li>
<li><code>.alt</code></li>
<li><code>.shift</code></li>
<li><code>.meta</code></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue] 리스트 렌더링 - 객체]]></title>
            <link>https://velog.io/@inhwa-jang/Vue-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EB%A0%8C%EB%8D%94%EB%A7%81-%EA%B0%9D%EC%B2%B4</link>
            <guid>https://velog.io/@inhwa-jang/Vue-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EB%A0%8C%EB%8D%94%EB%A7%81-%EA%B0%9D%EC%B2%B4</guid>
            <pubDate>Tue, 14 Mar 2023 07:03:18 GMT</pubDate>
            <description><![CDATA[<h1 id="객체-변경">객체 변경</h1>
<p>때로는 <code>Object.assign()</code>이나 <code>_.extend()</code>를 사용해 기존의 객체에 새 속성을 할당할 수 있다. 이 경우 두 객체의 속성을 사용해 새 객체를 만들어야 한다.</p>
<pre><code class="language-javascript">vm.userProfile = Object.assign({}, vm.userProfile, {
  age: 27,
  favoriteColor: &#39;Vue Green&#39;
})</code></pre>
<hr>
<p><code>Vue.set(object, propertyName, value)</code> 메소드를 사용하여 중첩된 객체에 반응형 속성을 추가할 수 있다</p>
<pre><code class="language-html">&lt;script&gt;
      const vm = new Vue({
        el: &#39;#app&#39;,
        data: {
          todos: [
            { title: &#39;아침 먹기&#39; },
            { title: &#39;점심 먹기&#39; },
            { title: &#39;저녁 먹기&#39; }
          ]
        },
        methods: {
          pushTodo() {
            // this.todos[3] = { title: &#39;야식먹기&#39; }
            // this.todos.push({ title: &#39;야식먹기&#39; })
            Vue.set(this.todos, 3, { title: &#39;야식먹기!&#39; })
          }
        }
      })
    &lt;/script&gt;</code></pre>
<p>인스턴스 메소드인 <code>vm.$set</code>를 사용할 수도 있다. 이는 전역 <code>Vue.set</code>의 별칭이다</p>
<pre><code class="language-javascript">methods: {
          pushTodo() {
            // this.todos[3] = { title: &#39;야식먹기&#39; }
            // this.todos.push({ title: &#39;야식먹기&#39; })
            this.$set(this.todos, 3, { title: &#39;야식먹기!&#39; })
          }
        }</code></pre>
<p><code>Vue.set(this.todos, 3, { title: &#39;야식먹기!&#39; })</code>을 이렇게 변경해도 똑같이 작동한다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue] 리스트렌더링 - 배열]]></title>
            <link>https://velog.io/@inhwa-jang/Vue-%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A0%8C%EB%8D%94%EB%A7%81-%EB%B0%B0%EC%97%B4</link>
            <guid>https://velog.io/@inhwa-jang/Vue-%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A0%8C%EB%8D%94%EB%A7%81-%EB%B0%B0%EC%97%B4</guid>
            <pubDate>Tue, 14 Mar 2023 06:21:24 GMT</pubDate>
            <description><![CDATA[<h1 id="v-for">v-for</h1>
<pre><code class="language-html">&lt;body&gt;
&lt;ul class=&quot;todos&quot;&gt;
     &lt;li v-for=&quot;(todo, index) in todos&quot; :key=&quot;index&quot;&gt;{{ todo.title }}&lt;/li&gt;
&lt;/ul&gt;

&lt;script&gt;
      const vm = new Vue({
        el: &#39;#app&#39;,
        data: {
          todos: [
            { title: &#39;아침 먹기&#39; },
            { title: &#39;점심 먹기&#39; },
            { title: &#39;저녁 먹기&#39; }
          ]
        }
&lt;/script&gt;
&lt;/body&gt;</code></pre>
<h1 id="배열-변경-감지">배열 변경 감지</h1>
<p>Vue는 감시중인 배열의 변이 메소드를 래핑하여 뷰 갱신을 트리거한다
버튼을 누르면 4번째 인덱스가 추가되도록 push메서드 생성</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot; /&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;ie=edge&quot; /&gt;
    &lt;title&gt;Document&lt;/title&gt;
    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue/dist/vue.js&quot;&gt;&lt;/script&gt;
  &lt;/head&gt;

  &lt;body&gt;
    &lt;div id=&quot;app&quot;&gt;
      &lt;button @click=&quot;pushTodo&quot;&gt;Push&lt;/button&gt;
      &lt;ul class=&quot;todos&quot;&gt;
        &lt;li v-for=&quot;(todo, index) in todos&quot; :key=&quot;index&quot;&gt;{{ todo.title }}&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/div&gt;

    &lt;script&gt;
      const vm = new Vue({
        el: &#39;#app&#39;,
        data: {
          todos: [
            { title: &#39;아침 먹기&#39; },
            { title: &#39;점심 먹기&#39; },
            { title: &#39;저녁 먹기&#39; }
          ]
        },
        methods: {
          pushTodo() {
            // this.todos[3] = { title: &#39;야식먹기&#39; }
            this.todos.push({ title: &#39;야식먹기&#39; })
          }
        }
      })
    &lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre>
<h2 id="변이-메서드">변이 메서드</h2>
<ul>
<li>배열 데이터를 갱신하거나 삭제할때는 자바스크립트의 변이 메서드를 사용해야 한다
<code>push()</code> 배열의 가장 뒤에 새로운 요소를 추가해주는 메서드
<code>pop()</code> 배열의 가장 뒤의 요소를 반환해주는 메서드
<code>shift()</code> 배열의 가장 앞의 요소를 반환해주는 메서드
<code>unshift()</code> 배열의 가장 앞에 요소를 추가해주는 메서드
<code>splice()</code> 인덱스를 이용해서 요소를 추가하거나 삭제할 때 사용하는 메서드
<code>sort()</code> 배열을 정렬해주는 메서드
<code>reverse()</code> 배열을 뒤집어주는 메서드</li>
</ul>
<h2 id="배열-대체">배열 대체</h2>
<ul>
<li>변이 메소드는 호출된 원본 배열을 변형한다. 이와 비교하여 변형을 하지 않는 방법도 있다
<code>filter()</code>
<code>concat()</code>
<code>slice()</code></li>
<li>원본 배열을 변형하지 않고 항상 새 배열을 반환한다</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue] 조건부 렌더링 ]]></title>
            <link>https://velog.io/@inhwa-jang/Vue-%EC%A1%B0%EA%B1%B4%EB%B6%80-%EB%A0%8C%EB%8D%94%EB%A7%81</link>
            <guid>https://velog.io/@inhwa-jang/Vue-%EC%A1%B0%EA%B1%B4%EB%B6%80-%EB%A0%8C%EB%8D%94%EB%A7%81</guid>
            <pubDate>Fri, 10 Mar 2023 00:34:51 GMT</pubDate>
            <description><![CDATA[<h1 id="v-if">v-if</h1>
<pre><code class="language-html">&lt;body&gt;
  &lt;style&gt;
    .box {
      width: 100px;
      height: 100px;
    }

    .box--red {
      background-color: red;
    }

    .box--blue {
      background-color: blue;
    }

    .box--gray {
      background-color: gray;
    }
  &lt;/style&gt;

  &lt;div id=&quot;app&quot;&gt;
    &lt;div v-if=&quot;colorState === &#39;red&#39;&quot; class=&quot;box box--red&quot;&gt;&lt;/div&gt;
    &lt;div v-if=&quot;colorState === &#39;blue&#39;&quot; class=&quot;box box--blue&quot;&gt;&lt;/div&gt;
    &lt;div v-if=&quot;colorState !== &#39;red&#39; &amp;&amp; colorState != &#39;blue&#39;&quot; class=&quot;box box--gray&quot;&gt;&lt;/div&gt;
  &lt;/div&gt;

  &lt;script&gt;
    const vm = new Vue({
      el: &#39;#app&#39;,
      data: {
        colorState: &#39;grdfday&#39;
      },
    })
  &lt;/script&gt;
&lt;/body&gt;</code></pre>
<ul>
<li><code>v-if</code> , <code>v-else</code> , <code>v-if-else</code></li>
<li><code>v-if</code>는 토글비용이 높다</li>
<li>실질적으로 요소를 없애버린다</li>
</ul>
<h1 id="v-show">v-show</h1>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot; /&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;ie=edge&quot; /&gt;
    &lt;title&gt;Document&lt;/title&gt;
    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue/dist/vue.js&quot;&gt;&lt;/script&gt;
  &lt;/head&gt;

  &lt;body&gt;
    &lt;style&gt;
      .box {
        width: 100px;
        height: 100px;
        background-color: orange;
      }
    &lt;/style&gt;

    &lt;div id=&quot;app&quot;&gt;
      &lt;button @click=&quot;toggle&quot;&gt;Toggle&lt;/button&gt;
      &lt;div v-show=&quot;show&quot; class=&quot;box&quot;&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;script&gt;
      const vm = new Vue({
        el: &#39;#app&#39;,
        data: {
          show: true
        },
        methods: {
          toggle() {
            this.show = !this.show
          }
        }
      })
    &lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre>
<ul>
<li>초기 렌더링 비용이 높다</li>
<li>CSS로 <code>display: none;</code> 을 적용시켜 요소를 없애지 않고 요소가 보이지 않게 한다</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue] computed]]></title>
            <link>https://velog.io/@inhwa-jang/Vue-computed</link>
            <guid>https://velog.io/@inhwa-jang/Vue-computed</guid>
            <pubDate>Thu, 09 Mar 2023 04:48:50 GMT</pubDate>
            <description><![CDATA[<h1 id="computed">computed</h1>
<ul>
<li>참조하고 있는 값이 변경될때마다 정의된 계산식에 따라 값을 출력한다.</li>
<li>정의된 계산식에 따라 결과값을 반환할때 사용한다<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
</code></pre>
</li>
</ul>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
  <div id="app">
    <div class="todos">
      <div v-for="todo in computedTodos" :key="todo.id">
        <input type="checkbox" v-model="todo.done">
        <span>{{ todo.title }}</span>
      </div>
    </div>
  </div>
  <script>
    const vm = new Vue({
      el: '#app',
      data: {
        todos: [

<pre><code>      {
        title: &#39;아침먹기&#39;
      },
      {
        title: &#39;점심먹기&#39;
      },
      {
        title: &#39;저녁먹기&#39;
      }

    ]
  },
  computed: {
    computedTodos() {
      return this.todos.map((todo, index) =&gt; {
        // return Object.assign({}, todo, {
        //   id: index + 1,
        //   done: false
        // })
        return {
          ...todo,
          id: index + 1,
          done: false
        }
      })
    }
  }
})</code></pre><p>  </script></p>
</body>

</html>
```
- console
`vm.todos.push({id: 4, done: false, title:'야식먹기'})`

<p><img src="https://velog.velcdn.com/images/inhwa-jang/post/47451d82-c9ce-4cdc-b49d-1d6a1c28323f/image.png" alt=""></p>
<ul>
<li>야식먹기 추가</li>
</ul>
<hr>
<h1 id="computed-getter-setter-">computed Getter, Setter /</h1>
<hr>
<h1 id="watch">watch</h1>
<ul>
<li><p>지정한 대상의 값이 변경될때마다 정의한 함수가 실행되는 것.</p>
<pre><code class="language-html">&lt;body&gt;
&lt;div id=&quot;app&quot;&gt;
  &lt;div&gt;{{ msg }}&lt;/div&gt;
  &lt;div&gt;{{ reversedMsg }}&lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
  const vm = new Vue({
    el: &#39;#app&#39;,
    data: {
      msg: &#39;Hello Vue!&#39;
    },
    computed: {
      reversedMsg: {
        // Getter
        get() {
          return this.msg.split(&#39;&#39;).reverse().join(&#39;&#39;)
        },
        // Setter
        set(v) {
          this.msg = v
        }
      }
    },
    watch: {
      msg(newMsg) {
        console.log(&#39;New msg : &#39; + newMsg)
      },
      reversedMsg(newMsg) {
        console.log(&#39;New reversedMsg : &#39; + newMsg)
      }
    }
  })
&lt;/script&gt;
&lt;/body&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/inhwa-jang/post/46ffde58-875c-4ac0-9bf7-e8e36c40af60/image.png" alt=""></p>
</li>
<li><p>reversedMsg 변경될때 값 받아오는 get(), set() 작성</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue] 템플릿 문법]]></title>
            <link>https://velog.io/@inhwa-jang/Vue-%ED%85%9C%ED%94%8C%EB%A6%BF-%EB%AC%B8%EB%B2%95</link>
            <guid>https://velog.io/@inhwa-jang/Vue-%ED%85%9C%ED%94%8C%EB%A6%BF-%EB%AC%B8%EB%B2%95</guid>
            <pubDate>Thu, 09 Mar 2023 04:28:47 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;

&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;ie=edge&quot;&gt;
  &lt;title&gt;Document&lt;/title&gt;
  &lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue/dist/vue.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;

&lt;body&gt;
  &lt;style&gt;
    .normal {
      color: blue;
    }

    .active {
      color: red;
    }
  &lt;/style&gt;
  &lt;div id=&quot;app&quot;&gt;
    &lt;div :class=&quot;className&quot; @click=&quot;changeClassName&quot;&gt;
      {{ msg }}
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;script&gt;
    const vm = new Vue({
      el: &#39;#app&#39;,
      data: {
        msg: &#39;Hello Vue!&#39;,
        className: &#39;normal&#39;
      },
      methods: {
        changeClassName() {
          this.className = &#39;active&#39;
        }
      }

    })
  &lt;/script&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre>
<br/>


<h3 id="문자열">문자열</h3>
<p>“Mustache” 구문(이중 중괄호)을 사용</p>
<h3 id="원시-html">원시 HTML</h3>
<p>이중 중괄호는 일반 텍스트로 데이터를 해석한다.
실제 HTML을 출력하려면 <code>v-html</code> 디렉티브를 사용해야한다.</p>
<pre><code class="language-html">&lt;p&gt;Using mustaches: {{ rawHtml }}&lt;/p&gt;
&lt;p&gt;Using v-html directive: &lt;span v-html=&quot;rawHtml&quot;&gt;&lt;/span&gt;&lt;/p&gt;</code></pre>
<h3 id="약어">약어</h3>
<ul>
<li><code>v-bind:</code> 약어 = <code>:</code></li>
<li><code>v-on:</code> 약어 = <code>@</code><pre><code class="language-html">&lt;div :class=&quot;className&quot; @click=&quot;changeClassName&quot;&gt;
  {{ msg }}
&lt;/div&gt;</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue] 라이프 사이클]]></title>
            <link>https://velog.io/@inhwa-jang/Vue-%EB%9D%BC%EC%9D%B4%ED%94%84-%EC%82%AC%EC%9D%B4%ED%81%B4</link>
            <guid>https://velog.io/@inhwa-jang/Vue-%EB%9D%BC%EC%9D%B4%ED%94%84-%EC%82%AC%EC%9D%B4%ED%81%B4</guid>
            <pubDate>Thu, 09 Mar 2023 02:42:28 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/inhwa-jang/post/bf73f27f-d94b-44ce-8c33-063451a4e7de/image.png" alt=""></p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;

&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;ie=edge&quot;&gt;
  &lt;title&gt;Document&lt;/title&gt;
  &lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue/dist/vue.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;

&lt;body&gt;
  &lt;div id=&quot;app&quot;&gt;
    &lt;div ref=&quot;msg&quot;&gt;{{ msg }}&lt;/div&gt;
    &lt;div ref=&quot;div&quot;&gt;&lt;/div&gt;
  &lt;/div&gt;

  &lt;script&gt;
    const vm = new Vue({
      el: &#39;#app&#39;,
      data: {
        msg: &#39;Hello Vue!&#39;
      },
      beforeCreate() {
        console.log(&#39;beforeCreate!&#39;, this.msg)
      },
      created() {
        console.log(&#39;created!&#39;, this.msg)
      },
      beforeMount() {
        console.log(&#39;beforeMount!&#39;, this.$refs.div)
      },
      mounted() {
        console.log(&#39;mounted!&#39;, this.$refs.div)
      },
      beforeUpdate() {
        console.log(&#39;beforeUpdate&#39;, this.$refs.msg.innerText)
      },
      updated() {
        console.log(&#39;updated!&#39;, this.$refs.msg.innerText)
      },
      beforeDestroy() {
        console.log(&#39;beforeDestroy!&#39;)
      },
      destroyed() {
        console.log(&#39;destroyed!&#39;)
      }
    })
  &lt;/script&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre>
<ul>
<li><code>created</code> , <code>mounted</code> 중요</li>
<li>destroy 할때 <code>vm.$destroy()</code> </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CSS] 위아래 분리 네비게이션 호버 이펙트]]></title>
            <link>https://velog.io/@inhwa-jang/CSS-%EC%9C%84%EC%95%84%EB%9E%98-%EB%B6%84%EB%A6%AC-%EB%84%A4%EB%B9%84%EA%B2%8C%EC%9D%B4%EC%85%98-%ED%98%B8%EB%B2%84-%EC%9D%B4%ED%8E%99%ED%8A%B8</link>
            <guid>https://velog.io/@inhwa-jang/CSS-%EC%9C%84%EC%95%84%EB%9E%98-%EB%B6%84%EB%A6%AC-%EB%84%A4%EB%B9%84%EA%B2%8C%EC%9D%B4%EC%85%98-%ED%98%B8%EB%B2%84-%EC%9D%B4%ED%8E%99%ED%8A%B8</guid>
            <pubDate>Thu, 09 Mar 2023 00:13:09 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/inhwa-jang/post/30f8a408-b2b8-43d6-995d-9e108c87c63f/image.png" alt=""></p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot; /&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;ie=edge&quot; /&gt;
    &lt;title&gt;위아래 분리 네비게이션 호버 이펙트&lt;/title&gt;
    &lt;style&gt;
      @import url(&#39;https://fonts.googleapis.com/css2?family=Nanum+Gothic&amp;display=swap&#39;);

      body {
        font-family: &#39;Nanum Gothic&#39;, sans-serif;
        font-size: 15px;
        color: #fff;
        line-height: 1.5em;
        font-weight: 300;
        margin: 0;
        background-color: #222;
      }

      a {
        text-decoration: none;
        color: #222;
      }

      .items {
        text-align: center;
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
      }

      .item {
        width: 300px;
        height: 200px;
        display: inline-block;
        position: relative;
        margin: 10px;
      }

      .front {
        width: 100%;
        height: inherit;
        background-color: #333;
        z-index: 1;
      }

      .front,
      .back {
        position: absolute;
        transition: 0.5s;
        top: 0;
      }

      .front h2 {
        margin-top: 0;
      }

      .back {
        box-sizing: border-box;
        background-color: #fff;
        color: #000;
        height: inherit;
        text-align: center;
        padding: 20px;
        opacity: 0;
      }

      .back a {
        font-size: 13px;
        background-color: yellowgreen;
        padding: 5px 15px;
        color: #fff;
        border-radius: 20px;
      }

      .back a:hover {
        background-color: #000;
      }

      .item:hover .front {
        top: -50%;
      }

      .item:hover .front img {
        animation: ani 1s linear infinite;
      }

      .item:hover .back {
        top: 50%;
        opacity: 1;
      }

      @keyframes ani {
        0% {
          transform: scale(1);
        }
        50% {
          transform: scale(1.1);
        }
      }
    &lt;/style&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div class=&quot;items&quot;&gt;
      &lt;div class=&quot;item&quot;&gt;
        &lt;div class=&quot;front&quot;&gt;
          &lt;img src=&quot;imgs/space-01.png&quot; alt=&quot;&quot; /&gt;
          &lt;h2&gt;Mars&lt;/h2&gt;
        &lt;/div&gt;
        &lt;div class=&quot;back&quot;&gt;
          &lt;p&gt;
            화성은 태양계의 네 번째 행성이다. 4개의 지구형 행성 중 하나다.
            동양권에서는 불을 뜻하는 화(火)를 써서 화성이라 부르고 로마 신화의
            전쟁의 신 마르스의 이름을 따 Mars라 부른다.
          &lt;/p&gt;
          &lt;a href=&quot;#none&quot;&gt;Read More&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class=&quot;item&quot;&gt;
        &lt;div class=&quot;front&quot;&gt;
          &lt;img src=&quot;imgs/space-02.png&quot; alt=&quot;&quot; /&gt;
          &lt;h2&gt;Jupiter&lt;/h2&gt;
        &lt;/div&gt;
        &lt;div class=&quot;back&quot;&gt;
          &lt;p&gt;
            목성은 태양계의 다섯번째 행성이자 가장 큰 행성이다. 태양의 질량의
            천분의 일배에 달하는 거대행성으로, 태양계에 있는 다른 모든 행성들을
            합한 질량의 약 2.5배에 이른다.
          &lt;/p&gt;
          &lt;a href=&quot;#none&quot;&gt;Read More&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class=&quot;item&quot;&gt;
        &lt;div class=&quot;front&quot;&gt;
          &lt;img src=&quot;imgs/space-03.png&quot; alt=&quot;&quot; /&gt;
          &lt;h2&gt;Saturnus&lt;/h2&gt;
        &lt;/div&gt;
        &lt;div class=&quot;back&quot;&gt;
          &lt;p&gt;
            토성은 태양으로부터 여섯 번째에 있는 태양계의 행성으로,
            진성(鎭星)으로도 불렀다. 토성은 태양계 내의 행성 중 목성에 이어 두
            번째로 크며, 지름은 약 12만 킬로미터이다.
          &lt;/p&gt;
          &lt;a href=&quot;#none&quot;&gt;Read More&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre>
<ul>
<li>가로배치할 item들 .item { display: inline-block; }</li>
<li>transition 시작할때 속성 값이 없으면 안먹힘 </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CSS] hover 흐려지는 네비게이션 ]]></title>
            <link>https://velog.io/@inhwa-jang/CSS-hover-%ED%9D%90%EB%A0%A4%EC%A7%80%EB%8A%94-%EB%84%A4%EB%B9%84%EA%B2%8C%EC%9D%B4%EC%85%98</link>
            <guid>https://velog.io/@inhwa-jang/CSS-hover-%ED%9D%90%EB%A0%A4%EC%A7%80%EB%8A%94-%EB%84%A4%EB%B9%84%EA%B2%8C%EC%9D%B4%EC%85%98</guid>
            <pubDate>Tue, 07 Mar 2023 08:39:12 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/inhwa-jang/post/7d00aa30-725c-4acb-9c85-d838ad3d18a3/image.png" alt="">
<img src="https://velog.velcdn.com/images/inhwa-jang/post/0ee0ffa1-6b6f-4ff9-981b-74f501e452c7/image.png" alt=""></p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;eng&quot;&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot; /&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;ie=edge&quot; /&gt;
    &lt;title&gt;네비게이션 만들기&lt;/title&gt;
    &lt;style&gt;
      body {
        font-family: &#39;Climate Crisis&#39;, cursive;
        background-color: #5fb7ff;
        line-height: 1.6em;
      }

      a {
        text-decoration: none;
        color: #fff;
      }

      .gnb {
        position: absolute;
        top: 50%;
        transform: translateY(-50%);
        left: 40px;
      }

      .gnb a {
        display: block;
        font-size: 30px;
        margin: 20px 0;
        transition: 0.5s;
      }

      .gnb:hover a {
        opacity: 0.3;
      }

      .gnb a:hover {
        opacity: 1;
      }

      .gnb a:before {
        content: &#39;\f105&#39;;
        font-family: fontawesome;
        margin-right: 10px;
        opacity: 0;
      }

      .gnb a:hover:before {
        opacity: 1;
      }
    &lt;/style&gt;
    &lt;link
      rel=&quot;stylesheet&quot;
      href=&quot;https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css&quot;
    /&gt;
    &lt;link rel=&quot;preconnect&quot; href=&quot;https://fonts.googleapis.com&quot; /&gt;
    &lt;link rel=&quot;preconnect&quot; href=&quot;https://fonts.gstatic.com&quot; crossorigin /&gt;
    &lt;link
      href=&quot;https://fonts.googleapis.com/css2?family=Climate+Crisis&amp;family=Noto+Sans+KR:wght@500&amp;display=swap&quot;
      rel=&quot;stylesheet&quot;
    /&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div class=&quot;gnb&quot;&gt;
      &lt;a href=&quot;#none&quot;&gt;New Arrivals&lt;/a&gt;
      &lt;a href=&quot;#none&quot;&gt;Summer Collection&lt;/a&gt;
      &lt;a href=&quot;#none&quot;&gt;Winter&lt;/a&gt;
      &lt;a href=&quot;#none&quot;&gt;Special Offers&lt;/a&gt;
      &lt;a href=&quot;#none&quot;&gt;Trends&lt;/a&gt;
    &lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CSS] 마우스 오버 툴팁 만들기]]></title>
            <link>https://velog.io/@inhwa-jang/CSS-%EB%A7%88%EC%9A%B0%EC%8A%A4-%EC%98%A4%EB%B2%84-%ED%88%B4%ED%8C%81-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@inhwa-jang/CSS-%EB%A7%88%EC%9A%B0%EC%8A%A4-%EC%98%A4%EB%B2%84-%ED%88%B4%ED%8C%81-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Tue, 07 Mar 2023 07:37:17 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/inhwa-jang/post/e3b6be0a-7893-49df-906b-81746e36ecea/image.png" alt=""></p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot; /&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;ie=edge&quot; /&gt;
    &lt;title&gt;툴팁만들기&lt;/title&gt;
    &lt;style&gt;
      body {
        font-family: &#39;Noto Sans KR&#39;, sans-serif;
      }
      .material-symbols-outlined {
        font-variation-settings: &#39;FILL&#39; 0, &#39;wght&#39; 400, &#39;GRAD&#39; 0, &#39;opsz&#39; 48;
      }
      .container {
        display: flex;
        justify-content: center;
        align-items: center;
        height: 100vh;
      }

      .icon {
        position: relative;
        display: inline-block;
        margin: 10px;
      }

      .icon span {
        font-size: 80px;
        color: #333;
        cursor: pointer;
      }

      .icon1 span {
        color: #70b9fa;
      }

      .icon2 span {
        color: #50faa6;
      }

      .icon3 span {
        color: #fab74d;
      }

      .icon4 span {
        color: #fa7a69;
      }

      .icon p {
        display: none;
        position: absolute;
        top: -70px;
        left: 50%;
        transform: translateX(-50%);
        background-color: #586c7a;
        color: #fff;
        width: 100px;
        padding: 10px;
        text-align: center;
        border-radius: 7px;
        box-shadow: 0 5px 10px -7px rgba(0, 0, 0, 0.2);
        opacity: 0;
      }

      .icon p:after {
        content: &#39;&#39;;
        position: absolute;
        background-color: #586c7a;
        width: 10px;
        height: 10px;
        transform: rotate(45deg) translateX(-50%);
        bottom: -5px;
        left: 50%;
      }

      .icon:hover p {
        display: inline-block;
        animation: showToolTip 2s forwards;
      }

      @keyframes showToolTip {
        0% {
          opacity: 0;
        }

        100% {
          opacity: 1;
        }
      }
    &lt;/style&gt;
    &lt;link
      rel=&quot;stylesheet&quot;
      href=&quot;https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&quot;
    /&gt;
    &lt;link rel=&quot;preconnect&quot; href=&quot;https://fonts.googleapis.com&quot; /&gt;
    &lt;link rel=&quot;preconnect&quot; href=&quot;https://fonts.gstatic.com&quot; crossorigin /&gt;
    &lt;link
      href=&quot;https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@500&amp;display=swap&quot;
      rel=&quot;stylesheet&quot;
    /&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div class=&quot;container&quot;&gt;
      &lt;div class=&quot;icon icon1&quot;&gt;
        &lt;span class=&quot;material-symbols-outlined&quot;&gt;
          sentiment_very_satisfied
        &lt;/span&gt;
        &lt;p&gt;기분이 좋아요&lt;/p&gt;
      &lt;/div&gt;
      &lt;div class=&quot;icon icon2&quot;&gt;
        &lt;span class=&quot;material-symbols-outlined&quot;&gt;
          sentiment_neutral
        &lt;/span&gt;
        &lt;p&gt;생각이 없어요&lt;/p&gt;
      &lt;/div&gt;
      &lt;div class=&quot;icon icon3&quot;&gt;
        &lt;span class=&quot;material-symbols-outlined&quot;&gt;
          sentiment_very_dissatisfied
        &lt;/span&gt;
        &lt;p&gt;힘들어요&lt;/p&gt;
      &lt;/div&gt;
      &lt;div class=&quot;icon icon4&quot;&gt;
        &lt;span class=&quot;material-symbols-outlined&quot;&gt;
          sentiment_very_satisfied
        &lt;/span&gt;
        &lt;p&gt;행복해요&lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CSS] hover활용 상세설명 상품목록]]></title>
            <link>https://velog.io/@inhwa-jang/CSS-hover%ED%99%9C%EC%9A%A9-%EC%83%81%EC%84%B8%EC%84%A4%EB%AA%85-%EC%83%81%ED%92%88%EB%AA%A9%EB%A1%9D</link>
            <guid>https://velog.io/@inhwa-jang/CSS-hover%ED%99%9C%EC%9A%A9-%EC%83%81%EC%84%B8%EC%84%A4%EB%AA%85-%EC%83%81%ED%92%88%EB%AA%A9%EB%A1%9D</guid>
            <pubDate>Tue, 07 Mar 2023 05:42:03 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/inhwa-jang/post/3b5ba127-b51c-42c8-a7f3-5af7e9efeff7/image.png" alt=""></p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot; /&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;ie=edge&quot; /&gt;
    &lt;title&gt;상세설명상품&lt;/title&gt;
    &lt;style&gt;
      body {
        color: #222;
        line-height: 1.5em;
        font-weight: 300;
        margin: 0;
      }

      a {
        color: #222;
        text-decoration: none;
      }

      .items {
        text-align: center;
      }

      .item {
        cursor: pointer;
        position: relative;
        display: inline-block;
        width: 300px;
        height: 300px;
        margin: 10px;
      }

      .item img {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
      }

      .caption {
        box-sizing: border-box;
        color: #fff;
        padding: 15px;
        padding-top: 5px;
        position: absolute;
        top: 0;
        width: 300px;
        height: 300px;
        background-color: rgba(0, 0, 0, 0.7);
        border-radius: 10px;
        opacity: 0;
        transition: all 1s;
      }

      .caption a {
        color: #fff;
        background-color: teal;
        border-radius: 3px;
        padding: 7px;
      }

      .caption a:hover {
        scale: 1.3;
        background-color: #fff;
        color: #222;
      }

      .item:hover .caption {
        opacity: 1;
      }
    &lt;/style&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div class=&quot;items&quot;&gt;
      &lt;div class=&quot;item&quot;&gt;
        &lt;img src=&quot;imgs/boximage.png&quot; alt=&quot;&quot; /&gt;
        &lt;div class=&quot;caption&quot;&gt;
          &lt;h2&gt;캡슐커피&lt;/h2&gt;
          &lt;p&gt;
            Lorem ipsum dolor sit amet consectetur adipisicing elit. Soluta quod
            unde quidem asperiores modi aut voluptatum, porro fuga minus
            eligendi?
          &lt;/p&gt;
          &lt;p&gt;가격: &lt;s&gt;32000원&lt;/s&gt; -&gt; 28000원&lt;/p&gt;
          &lt;a href=&quot;#&quot;&gt;상세보기&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class=&quot;item&quot;&gt;
        &lt;img src=&quot;imgs/boximage.png&quot; alt=&quot;&quot; /&gt;
        &lt;div class=&quot;caption&quot;&gt;
          &lt;h2&gt;머신 세척 약품&lt;/h2&gt;
          &lt;p&gt;
            Lorem ipsum dolor sit amet consectetur adipisicing elit. Soluta quod
            unde quidem asperiores modi aut voluptatum, porro fuga minus
            eligendi?
          &lt;/p&gt;
          &lt;p&gt;가격: &lt;s&gt;10000원&lt;/s&gt; -&gt; 5000원&lt;/p&gt;
          &lt;a href=&quot;#&quot;&gt;상세보기&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class=&quot;item&quot;&gt;
        &lt;img src=&quot;imgs/boximage.png&quot; alt=&quot;&quot; /&gt;
        &lt;div class=&quot;caption&quot;&gt;
          &lt;h2&gt;원두&lt;/h2&gt;
          &lt;p&gt;
            Lorem ipsum dolor sit amet consectetur adipisicing elit. Soluta quod
            unde quidem asperiores modi aut voluptatum, porro fuga minus
            eligendi?
          &lt;/p&gt;
          &lt;p&gt;가격: &lt;s&gt;29000원&lt;/s&gt; -&gt; 19000원&lt;/p&gt;
          &lt;a href=&quot;#&quot;&gt;상세보기&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre>
<ul>
<li>요소 구현하고 기능넣기</li>
<li>가로정렬 - <code>display: inline-box;</code> , <code>width값 설정</code></li>
<li>이펙트 주는 요소(.caption)에 <code>transition</code></li>
<li>.caption <code>opacity: 0;</code> 에서 <code>opacity: 1;</code></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[HTML]container안에 태그 구분으로 불필요한 class명 줄이기]]></title>
            <link>https://velog.io/@inhwa-jang/HTMLcontainer%EC%95%88%EC%97%90-%ED%83%9C%EA%B7%B8-%EA%B5%AC%EB%B6%84%EC%9C%BC%EB%A1%9C-%EB%B6%88%ED%95%84%EC%9A%94%ED%95%9C-class%EB%AA%85-%EC%A4%84%EC%9D%B4%EA%B8%B0</link>
            <guid>https://velog.io/@inhwa-jang/HTMLcontainer%EC%95%88%EC%97%90-%ED%83%9C%EA%B7%B8-%EA%B5%AC%EB%B6%84%EC%9C%BC%EB%A1%9C-%EB%B6%88%ED%95%84%EC%9A%94%ED%95%9C-class%EB%AA%85-%EC%A4%84%EC%9D%B4%EA%B8%B0</guid>
            <pubDate>Wed, 22 Feb 2023 14:45:51 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/inhwa-jang/post/c2320bab-d9a9-48b3-aafa-937081213ada/image.png" alt=""></p>
<pre><code class="language-html">&lt;div class=&quot;square&quot;&gt;
  &lt;div&gt;&lt;/div&gt;
  &lt;div&gt;&lt;/div&gt;
  &lt;div&gt;&lt;/div&gt;
  &lt;div&gt;
    &lt;h2&gt;Heading Text&lt;/h2&gt;
    &lt;p&gt;
      Lorem ipsum dolor sit amet consectetur adipisicing elit. Voluptates
      molestias quas dolorum! Itaque quae ex recusandae. Nulla nam enim
      dolorem!
    &lt;/p&gt;
    &lt;a href=&quot;#none&quot;&gt; Read More &lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;</code></pre>
<p>위 코드를 이런 식으로 작성할 경우, 
어떤 모양과 역할의 태그인지 의미 파악은 되지만
.square(container) 안에 여러 div 태그가 존재하기 때문에 CSS 작성 시 다소 복잡하고 혼돈을 줄 수 있다.
<br/></p>
<pre><code class="language-html">&lt;div class=&quot;square&quot;&gt;
  &lt;span&gt;&lt;/span&gt;
  &lt;span&gt;&lt;/span&gt;
  &lt;span&gt;&lt;/span&gt;
  &lt;div&gt;
    &lt;h2&gt;Heading Text&lt;/h2&gt;
    &lt;p&gt;
      Lorem ipsum dolor sit amet consectetur adipisicing elit. Voluptates
      molestias quas dolorum! Itaque quae ex recusandae. Nulla nam enim
      dolorem!
    &lt;/p&gt;
    &lt;a href=&quot;#none&quot;&gt; Read More &lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;</code></pre>
<p>선으로 만들어질(border스타일을 적용해줄) 태그들을 span 태그로 변경해주고,</p>
<p>선 안에 내용이 될 컨텐츠는 클래스명없이 div 태그로 정리해주면,</p>
<p>큰 .square 안에 span 태그와 div 태그로 선과 컨텐츠가 구분이 가능하다.</p>
<p>클래스명을 주지 않고 요소들을 div 태그로만 감싸줄 필요도 없게 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CSS] CSS 우선순위]]></title>
            <link>https://velog.io/@inhwa-jang/CSS-CSS-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84</link>
            <guid>https://velog.io/@inhwa-jang/CSS-CSS-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84</guid>
            <pubDate>Wed, 15 Feb 2023 13:27:20 GMT</pubDate>
            <description><![CDATA[<h2 id="css-우선순위">CSS 우선순위</h2>
<ol>
<li>속성 값 뒤에 !import를 붙인 속성 
<code>점수 ♾pt</code></li>
</ol>
<hr>
<ol start="2">
<li>인라인 선언방식 = HTML에서 style을 직접 지정한 속성 
<code>점수 1000pt</code></li>
</ol>
<hr>
<ol start="3">
<li>id 선택자, #id로 지정한 속성 
<code>점수 100pt</code></li>
</ol>
<hr>
<ol start="4">
<li>클래스 선택자, .class, :추상클래스 로 지정한 속성 
<code>점수 10pt</code></li>
</ol>
<hr>
<ol start="5">
<li>태그 이름으로 지정한 속성 
<code>점수 1pt</code></li>
</ol>
<hr>
<ol start="6">
<li>전체 선택자, * 
<code>점수 0pt</code></li>
</ol>
<hr>
<ol start="7">
<li>상속받은 속성
<code>상속 받은 속성은 항상 우선시 하지 않음</code></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CSS] float clear하는 방법]]></title>
            <link>https://velog.io/@inhwa-jang/CSS-float-clear%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@inhwa-jang/CSS-float-clear%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Wed, 15 Feb 2023 05:17:51 GMT</pubDate>
            <description><![CDATA[<h2 id="float">float</h2>
<p>뜨다 라는 의미이며, block요소를 지정한 위치에 떠있도록 배치하는 속성이다</p>
<h2 id="float를-clear한다는-의미는">float를 clear한다는 의미는?</h2>
<p>float으로 컨텐츠를 띄울 시 다음 내용은 빈자리를 채우려 올라오게 된다.
이러한 현상은 브라우저의 오류로 생겨난 것이고,float의 부작용을 해제한다는 의미이다.</p>
<h2 id="float-clear-방법">float clear 방법</h2>
<ol>
<li>부모 요소에 높이값(height) 부여 =&gt; 높이를 고정으로 주는 콘텐츠가 아니라면 높이값으로 float를 해제하는 것은 바람직하지 못하다. 근본적인 해결이 안된다.</li>
<li>부모 요소에 float 적용 =&gt; 부모요소의 레이아웃이 깨지는 현상이 일어난다. 그 부모의 부모에서 또 float를 해제해야하기 때문에 이 방법은 불편하다.</li>
<li>부모 요소에 overflow:hidden 적용 =&gt; 해당 요소 안의 콘텐츠를 박스 외부로 표현할 수 없다. 예를 들어 자식요소에서 부모요소보다 위로 올라가는 이미지 요소를 올리게 되면 잘리게 된다.</li>
<li>부모 요소에 overflow:auto 적용 =&gt; 특정 브라우저에서 스크롤바가 표시된다. 예를 들어 자식 요소가 부모 요소의 가로길이보다 크면 가로 스크롤바가 생기고 세로 스크롤바가 생기는 경우에는 사용할 수 없다.</li>
<li>float된 요소 다음에 나오는 태그에 clear:both 적용 =&gt; clear:both된 요소에 margin-top적용이 불가하다.</li>
<li><strong>부모 요소에 가상요소 선택자 ::after 를 만들고 clear:both 적용</strong> =&gt; 최고의 방법이다!</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JS] 클래스와  생성자 함수 ]]></title>
            <link>https://velog.io/@inhwa-jang/JS-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%99%80-%EC%83%9D%EC%84%B1%EC%9E%90-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@inhwa-jang/JS-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%99%80-%EC%83%9D%EC%84%B1%EC%9E%90-%ED%95%A8%EC%88%98</guid>
            <pubDate>Mon, 06 Feb 2023 09:57:58 GMT</pubDate>
            <description><![CDATA[<h2 id="클래스-정의">클래스 정의</h2>
<ul>
<li><code>class</code>    키워드를 사용하여 정의한다</li>
</ul>
<pre><code class="language-javascript">// 익명 클래스 표현식
const Person = class = {}
// 기명 클래스 표현식
const Person = class MyClass{}</code></pre>
<ul>
<li>클래스를 표현식으로 정의할 수 있다 = 클래스가 값으로 사용할 수 있다 = <code>일급객체</code><ul>
<li>무명의 리터럴로 생성할 수 있다. 즉, 런타임에 생성이 가능하다</li>
<li>변수나 자료구조(객체, 배열 등)에 저장할 수 있다</li>
<li>함수의 매개변수에게 전달할 수 있다</li>
<li>함수의 반환값으로 사용할 수 있다</li>
</ul>
</li>
<li>클래스 몸체에서 정의할 수 있는 메서드는 constructor(생성자), 프로토타입 메서드, 정적메서드 세가지가 있다</li>
</ul>
<h2 id="클래스와-생성자-함수의-정의-방식-비교">클래스와 생성자 함수의 정의 방식 비교</h2>
<h3 id="생성자함수">생성자함수</h3>
<pre><code class="language-javascript">var Person = (function() {
  // 생성자 함수
  function Person(name) {
    this.name = name;
  }

  // 프로토타입 메서드
  Person.prototype.sayHi = function() {
    console.log(&#39;Hi! My name is&#39; + this.name);
  }

  // 정적 메서드
  Person.sayHello = function() {
    console.log(&#39;Hello!&#39;);
  }

  // 생성자 함수 반환
  return Person;
}());</code></pre>
<h3 id="클래스">클래스</h3>
<pre><code class="language-javascript">class Person {
  // 생성자
  constructor(name) {
    this.name = name;
  }

  // 프로토타입 메서드
  sayHi() {
    console.log(&#39;Hi! My name is ${this.name}&#39;);
  }

  // 정적 메서드
  static sayHello() {
    console.log(&#39;Hello!&#39;);
  }
}</code></pre>
]]></description>
        </item>
    </channel>
</rss>