<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>프론트엔드 지망생</title>
        <link>https://velog.io/</link>
        <description>안녕하세요. 프론트엔드 지망생입니다.</description>
        <lastBuildDate>Sun, 11 May 2025 09:05:12 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>프론트엔드 지망생</title>
            <url>https://velog.velcdn.com/images/pond_98/profile/4908491d-c96d-4c33-a442-06ee8aec1c68/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 프론트엔드 지망생. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/pond_98" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[애플 사이트 만들기 3 - 네비게이션 바]]></title>
            <link>https://velog.io/@pond_98/%EC%95%A0%ED%94%8C-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EB%84%A4%EB%B9%84%EA%B2%8C%EC%9D%B4%EC%85%98-%EB%B0%94</link>
            <guid>https://velog.io/@pond_98/%EC%95%A0%ED%94%8C-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EB%84%A4%EB%B9%84%EA%B2%8C%EC%9D%B4%EC%85%98-%EB%B0%94</guid>
            <pubDate>Sun, 11 May 2025 09:05:12 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/pond_98/post/3f5b73e8-7ed5-485e-bf81-319b11ea7477/image.png" alt=""></p>
<h2 id="네비게이션-바-만들기">네비게이션 바 만들기</h2>
<pre><code class="language-html">   &lt;nav&gt;
    &lt;div class=&quot;inner&quot;&gt;
      &lt;h1&gt;iPad&lt;/h1&gt;
      &lt;ul class=&quot;menu&quot;&gt;
        &lt;li class=&quot;active&quot;&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;개요&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;iPad를 선택하는 이유&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;제품 사양&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
      &lt;button class=&quot;btn&quot;&gt;구입하기&lt;/button&gt;
    &lt;/div&gt;
   &lt;/nav&gt;</code></pre>
<pre><code class="language-css">nav {
  background-color: rgba(255, 255, 255, 0.7);
  backdrop-filter: blur(20px);
  border-bottom: 1px solid #D2D2D2;
  position: sticky;
  top: 0;
  z-index: 8;
}

nav .inner {
  max-width: 1000px;
  height: 52px;
  margin: 0 auto;
  display: flex;
  align-items: center;
}

nav h1 {
  flex-grow: 1;
  font-size: 22px;
  font-weight: 500;
}

nav .menu {
  display: flex;
  gap: 12px;
  margin-right: 18px;
}

nav .menu li a {
  display: block;
  font-size: 11px;
  padding: 6px;
}

nav .menu li:hover a {
  color: #0071E3
}

nav .menu li.active a {
  opacity: 0.5;
  cursor: default;
}

nav .menu li.active:hover a {
  color: #1D1D1D;
}</code></pre>
<p><img src="https://velog.velcdn.com/images/pond_98/post/227c5b0e-cf5b-4aae-ac10-22c5dd54dfdf/image.png" alt="">
마우스 스크롤이 있을 경우 네비게이션 바가 항상 최상단에 위치하고 있어야 한다.
이를 위해서는 <code>position: sticky;</code>를 사용하면 된다. <code>sticky</code>를 사영하기 위해서는 <code>top</code>, <code>bottom</code>, <code>left</code>, <code>right</code> 중 1개를 지정해야하는데 해당 페이지에서는 항상 최상단에 위치해야함으로 <code>top: 0;</code>을 이용하게 된다.</p>
<p>또한 해당 네비게이션에 위치해있는 페이지 정보는 흐릿하게 나타내기 위해 <code>backdrop-filter: blur(20px);</code>를 사용한다. 이때 해당 네비게이션 배경의 투명도를 정해야하는데 이를 위해 <code>background-color: rgba(255, 255, 255, 0.7);</code>를 사용하게 된다.</p>
<p>현재 위치하고 있는 페이지 정보를 나타내기 위해 현재 위치한 페이지의 class를 <code>class=&quot;active&quot;</code>로 지정하였다.</p>
<pre><code class="language-css">nav .menu li.active a {
  opacity: 0.5;
  cursor: default;
}

nav .menu li.active:hover a {
  color: #1D1D1D;
}</code></pre>
<p><code>active</code>를 포함하고 있는 스타일을 지정함으로써 현재 페이지 위치를 알 수 있도록 해준다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[애플 사이트 만들기 2 - 헤더 만들기 2]]></title>
            <link>https://velog.io/@pond_98/%EC%95%A0%ED%94%8C-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0-%ED%97%A4%EB%8D%94-%EB%A7%8C%EB%93%A4%EA%B8%B0-2</link>
            <guid>https://velog.io/@pond_98/%EC%95%A0%ED%94%8C-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0-%ED%97%A4%EB%8D%94-%EB%A7%8C%EB%93%A4%EA%B8%B0-2</guid>
            <pubDate>Sun, 04 May 2025 09:25:12 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/pond_98/post/4681d444-2d35-4401-b201-ee8f8fd0fc42/image.png" alt=""></p>
<h2 id="검색-창-만들기">검색 창 만들기</h2>
<pre><code class="language-html">&lt;div class=&quot;search-wrap&quot;&gt;
        &lt;div class=&quot;search&quot;&gt;
          &lt;div class=&quot;shadow&quot;&gt;&lt;/div&gt;
          &lt;div class=&quot;textfield&quot;&gt;
            &lt;input type=&quot;text&quot; placeholder=&quot;apple.com 검색&quot;&gt;
            &lt;div class=&quot;search-icon&quot;&gt;&lt;/div&gt;
            &lt;div class=&quot;search-closer&quot;&gt;&lt;/div&gt;
          &lt;/div&gt;
          &lt;div class=&quot;autocompletes&quot;&gt;
            &lt;h3&gt;빠른 링크&lt;/h3&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;Apple Store Online에서 쇼핑하기&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;Apple Visoin Pro&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;Airpods&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;Apple Intelligence&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;Apple Trade In&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;</code></pre>
<pre><code class="language-css">header .search-wrap {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  visibility: hidden;
  opacity: 0;
  transition: 0.4s;
}

header .search {
  max-width: 680px;
  margin: 0 auto;
  position: relative;
}

header .search .shadow {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.4);
}

header .search .textfield {
  position: relative;
}

header .search input {
  width: 100%;
  height: 44px;
  padding: 0 40px;
  border: none;
  outline: none;
  box-sizing: border-box;
  background-color: transparent;
  font-size: 17px;
  color: #FFF;
}

header .search .search-icon  {
  width: 40px;
  height: 44px;
  background-image: url(&quot;../images/header_search.svg&quot;);
  background-repeat: no-repeat;
  background-position: center;
  position: absolute;
  top: 0;
  left: 0;
  opacity: 0.4;
}

header .search .search-closer {
  width: 40px;
  height: 44px;
  background-image: url(&quot;../images/header_close.svg&quot;);
  background-repeat: no-repeat;
  background-position: center;
  position: absolute;
  top: 0;
  right: 0;
  opacity: 0.4;
  cursor: pointer;
}

header .search .search-closer:hover {
  opacity: 1;
}

header .search .autocompletes {
  width: 100%;
  padding: 26px 40px 20px;
  border-radius: 0 0 18px 18px;
  box-sizing: border-box;
  background-color: #FFF;
  position: absolute;
  top: 44px;
  left: 0;
}

header .search .autocompletes h3 {
  font-size: 12px;
  color: #6E6E6E;
  margin-bottom: 12px;
}

header .search .autocompletes ul li a {
  display: block;
  margin: 0 -14px;
  padding: 10px 0 10px 30px;
  font-size: 14px;
  cursor: pointer;
}

header .search .autocompletes ul li a:hover {
  background-color: #F5F5F5;
  font-weight: 500;
}

header .search input,
header .search .search-icon,
header .search .autocompletes h3,
header .search .autocompletes li {
  transition: 0.6s;
  transform: translate(100px, 0);
}

header.searching ul.menu &gt; li {
  transform: scale(0.7);
  opacity: 0;
}

header.searching .search-wrap {
  visibility: visible;
  opacity: 1;
  transition-delay: 0.2s;
}

header.searching .search input,
header.searching .search .search-icon,
header.searching .search .autocompletes h3,
header.searching .search .autocompletes li {
  transform: translate(0, 0);
  transition-delay: 0.2s;
}</code></pre>
<pre><code class="language-js">const headerEl = document.querySelector(&#39;header&#39;)
const headerMenuEls = [...headerEl.querySelectorAll(&#39;ul.menu &gt; li&#39;)]
const searchWrapEl = headerEl.querySelector(&#39;.search-wrap&#39;)
const searchStartEl = headerEl.querySelector(&#39;.search-starter&#39;)
const searchCloserEl = searchWrapEl.querySelector(&#39;.search-closer&#39;)
const searchSchadowEl = searchWrapEl.querySelector(&#39;.shadow&#39;)
const searchInputRl = searchWrapEl.querySelector(&#39;input&#39;)
const searchDelayEls = [...searchWrapEl.querySelectorAll(&#39;li&#39;)]

searchStartEl.addEventListener(&#39;click&#39;, showSearch)

searchCloserEl.addEventListener(&#39;click&#39;, hideSearch)

searchSchadowEl.addEventListener(&#39;click&#39;, hideSearch)

function showSearch() {
  headerEl.classList.add(&#39;searching&#39;)
  document.documentElement.classList.add(&#39;fixed&#39;)
}

function hideSearch() {
  headerEl.classList.remove(&#39;searching&#39;)
  document.documentElement.classList.remove(&#39;fixed&#39;)
}
</code></pre>
<h3 id="검색-바-등장-시-스크롤-방지">검색 바 등장 시 스크롤 방지</h3>
<pre><code class="language-css">html.fixed {
  position: fixed;
  overflow-y: scroll;
  width: 100%;
}</code></pre>
<pre><code class="language-js">function showSearch() {
  headerEl.classList.add(&#39;searching&#39;)
  document.documentElement.classList.add(&#39;fixed&#39;)
}

function hideSearch() {
  headerEl.classList.remove(&#39;searching&#39;)
  document.documentElement.classList.remove(&#39;fixed&#39;)
}</code></pre>
<p>위 코드에서는 <code>showSearch()</code> 함수를 통해 검색바가 보이면 html에 <code>fixed</code> 클래스를 추가하고 <code>hideSearch()</code> 함수를 통해 검색바가 없어지면 html에 <code>fixed</code> 클래스를 제거한다.
이때 html에 <code>fixed</code> 클래스가 추가되었다면 <code>css</code>에서 <code>position: fixed;</code> 에 의해 html은 현재 위치에 고정되게 되고 <code>overflow-y: scroll</code>에 의해 y축(높이)에는 스크롤이 등장하게된다. 하지만 html은 현재 위치에 고정되어 있지 때문에 스크롤을 할 수 없는 상태가 된다.</p>
<h3 id="검색-바-애니메이션">검색 바 애니메이션</h3>
<p><img src="https://velog.velcdn.com/images/pond_98/post/befddac6-7747-437a-a540-7003e2d3ec15/image.gif" alt="">
검색 버튼을 터치하였을 경우 메뉴 버튼이 우측에서부터 사라지고 검색 바가 상단에서부터 출력되고 있다.</p>
<pre><code class="language-css">header .search input,
header .search .search-icon,
header .search .autocompletes h3,
header .search .autocompletes li {
  transition: 0.6s;
  transform: translate(100px, 0);
}</code></pre>
<p>위 코드를 통해 검색 바는 기본적으로 x축 기준으로 100px만큼 우측으로 이동해있는 상태이다.</p>
<pre><code class="language-js">function showSearch() {
  headerEl.classList.add(&#39;searching&#39;)
  document.documentElement.classList.add(&#39;fixed&#39;)
  headerMenuEls.reverse().forEach(function(el, index) {
    el.style.transitionDelay = index * 0.4 / headerMenuEls.length + &#39;s&#39;
  })
  searchDelayEls.forEach(function (el, index) {
    el.style.transitionDelay = index * 0.4 / searchDelayEls.length + &#39;s&#39;
  })
  setTimeout(function(){
    searchInputRl.focus()
  },600)
}</code></pre>
<p>만약 검색 버튼을 누르면 <code>showSearch()</code> 함수가 실행되고 css의 <code>header</code>의 클래스에 <code>searching</code>이 추가된다.</p>
<pre><code class="language-css">header.searching ul.menu &gt; li {
  transform: scale(0.7);
  opacity: 0;
}

header.searching .search-wrap {
  visibility: visible;
  opacity: 1;
  transition-delay: 0.2s;
}

header.searching .search input,
header.searching .search .search-icon,
header.searching .search .autocompletes h3,
header.searching .search .autocompletes li {
  transform: translate(0, 0);
  transition-delay: 0.2s;
}</code></pre>
<p>header에 <code>searching</code>이 추가되면서 검색창에 스타일이 변화가 생기게 되는데, <code>opacity: 1;</code> 보이지 않던 검색 바가 보이게 되고 <code>transform: translate(0, 0);</code>를 통해 x축으로 이동해 있던 검색 바가 원위치로 이동하게 된다.</p>
<pre><code class="language-js">function showSearch() {
 headerMenuEls.reverse().forEach(function(el, index) {
    el.style.transitionDelay = index * 0.4 / headerMenuEls.length + &#39;s&#39;
  })
  searchDelayEls.forEach(function (el, index) {
    el.style.transitionDelay = index * 0.4 / searchDelayEls.length + &#39;s&#39;
  })
}

function hideSearch() { 
 headerMenuEls.reverse().forEach(function(el, index) {
    el.style.transitionDelay = index * 0.4 / headerMenuEls.length + &#39;s&#39;
  })
  searchDelayEls.reverse().forEach(function (el, index) {
    el.style.transitionDelay = index * 0.4 / searchDelayEls.length + &#39;s&#39;
  })
  searchDelayEls.reverse()

}</code></pre>
<p><code>transitionDelay</code> 함수는 CSS 전환이 시작되기 전까지의 지연 시간을 나타낸다. 
페이지에서는 검색창 등장 시 기존 메뉴가 한개씩 사라지고 검색바의 검색어가 하나씩 등장하는 효과가 보여지고 있다. 이 경우에는 배열을 이용할 필요가 있다.
<code>const searchDelayEls = [...searchWrapEl.querySelectorAll(&#39;li&#39;)]</code>
<code>searchWrapEl</code> 안의 모든 <code>li</code>요소를 사용하는데 전개 연산자 <code>[...]</code>를 사용하여 해당 요소들을 배열로 사용할 수 있다.</p>
<p><code>searchDelayEls.reverse().forEach</code>를 사용하여 배열의 각 요소에 <code>transitionDelay</code>를 지정할 수 있다.
<code>el.style.transitionDelay = index * 0.4 / searchDelayEls.length + &#39;s&#39;</code> 함수를 통해 각 배열 별로 계산을 하여 검색창이 1개씩 등장하는 느낌을 줄 수 있게된다.
ex) 해당 페이지의 <code>searchDelayEls.length</code> 값은 12이다.
첫번째 배열의 경우 index = 0이다. 그렇기에 첫번째 배열은 0 * 0.4 / 12 +&#39;s&#39; 이기에 0s이다.
두번째 배역의경우 index = 1이다. 그렇기에 첫번째 배열은 1 * 0.4 / 12 +&#39;s&#39; 이기에 0.0333s이다.</p>
<h3 id="searchdelayelsreverseforeach-에서-reverse-사용-이유"><code>searchDelayEls.reverse().forEach</code> 에서 reverse() 사용 이유?</h3>
<p>검색 버튼을 터치하였을 경우 메뉴 버튼이 우측에서부터 사라지고 검색 바가 상단에서부터 출력되고 있다.
만약 <code>reverse()</code> 사용하지 않았다면 검색 버튼 터치 시 메뉴 버튼은 우측부터가 아닌 좌측에서부터 사라지게 될 것이다.
마찬가지로 검색 바가 사라졌을 때 검색 바가 하단에서부터 사라지고 메뉴 버튼은 좌측에서부터 등장하고 있다.
검색 바가 없어졌을 때의 함수에 <code>reverse()</code>를 사용함으로써 검색 바가 사라졌을 경우 상단이 아닌 하단부터 사라지고 메뉴버튼이 좌측에서부터 등장하도록 하고 있다.</p>
<h2 id="검색-바-포커싱">검색 바 포커싱</h2>
<p><img src="https://velog.velcdn.com/images/pond_98/post/4681d444-2d35-4401-b201-ee8f8fd0fc42/image.png" alt="">
검색 버튼을 터치했을 경우 자동으로 검색 바에 포커싱이 되도록 구성할 것이다.</p>
<pre><code class="language-js">const headerEl = document.querySelector(&#39;header&#39;)
const searchWrapEl = headerEl.querySelector(&#39;.search-wrap&#39;)
const searchInputRl = searchWrapEl.querySelector(&#39;input&#39;)


function showSearch() {
  headerEl.classList.add(&#39;searching&#39;)
  document.documentElement.classList.add(&#39;fixed&#39;)
  headerMenuEls.reverse().forEach(function(el, index) {
    el.style.transitionDelay = index * 0.4 / headerMenuEls.length + &#39;s&#39;
  })
  searchDelayEls.forEach(function (el, index) {
    el.style.transitionDelay = index * 0.4 / searchDelayEls.length + &#39;s&#39;
  })
  setTimeout(function(){
    searchInputRl.focus()
  },600)
}

function hideSearch() {
  headerEl.classList.remove(&#39;searching&#39;)
  document.documentElement.classList.remove(&#39;fixed&#39;)
  headerMenuEls.reverse().forEach(function(el, index) {
    el.style.transitionDelay = index * 0.4 / headerMenuEls.length + &#39;s&#39;
  })
  searchDelayEls.reverse().forEach(function (el, index) {
    el.style.transitionDelay = index * 0.4 / searchDelayEls.length + &#39;s&#39;
  })
  searchDelayEls.reverse()
  setTimeout(function(){
    searchInputRl.value = &#39;&#39;
  },600)

}</code></pre>
<p>위 코드에서 <code>searchInputRl.focus()</code>을 통해 해당 창에 포커싱하도록 할 수 있다.
하지만 위 코드에서는 버튼을 터치하였을 경우 0.4s 뒤에 검색창이 출력되기에 포커싱이 되지 않는 오류가 생긴다.
이 경우에는 <code>setTimeoutset</code> 함수를 사용하면된다.</p>
<p><code>setTimeoutset</code> 함수는 <code>setTimeoutset(함수(), 시간(ms))</code> 형식으로 사용하는데 특정 시간 뒤에 <code>함수()</code> 영역이 실행된다고 할 수 있다.</p>
<pre><code class="language-js">setTimeout(function(){
    searchInputRl.focus()
  },600)</code></pre>
<p>위 코드에서는 0.6초 뒤에 <code>searchInputRl.focus()</code> 함수가 실행되어 검색 창에 포커싱이 되도록 할 수 있다.</p>
<p>또한 검색 창을 끄고 닫으면 이전에 검색했던 단어가 남아있는 오류가 생길 수 있다.
이럴경우 검색창을 닫는 함수 뒤에 <code>searchInputRl.value = &#39;&#39;</code>을 추가하여 입력한 값을 초기화 해줄 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[애플 사이트 만들기 1 - 헤더 만들기 1]]></title>
            <link>https://velog.io/@pond_98/%EC%95%84%EC%9D%B4%ED%8C%A8%EB%93%9C-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0-%ED%97%A4%EB%8D%94-%EB%A7%8C%EB%93%A4%EA%B8%B0-1</link>
            <guid>https://velog.io/@pond_98/%EC%95%84%EC%9D%B4%ED%8C%A8%EB%93%9C-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0-%ED%97%A4%EB%8D%94-%EB%A7%8C%EB%93%A4%EA%B8%B0-1</guid>
            <pubDate>Fri, 02 May 2025 08:17:38 GMT</pubDate>
            <description><![CDATA[<h2 id="word-break">word-break</h2>
<pre><code class="language-html">&lt;div class=&quot;container&quot;&gt;
  The brown fox jumps over the lazy dog.
  동해물과 백두산이 마르고 닭도록 하느님이 보우하사 우리나라 만세
&lt;/div&gt;</code></pre>
<pre><code class="language-css">.container {
  width: 300px;
  border: 4px solid;
  font-size: 40px;
}</code></pre>
<p><img src="https://velog.velcdn.com/images/pond_98/post/802116b3-42bb-424d-a983-eeca42380311/image.png" alt="">
HTML에서는 한글을 쓰면 영어와 다르게 줄바꿈이 있을 경우 단어 단위가 아닌 글자 단위로 줄바꿈이 이루어진다.</p>
<pre><code class="language-css">.container {
  width: 300px;
  border: 4px solid;
  font-size: 40px;
  word-break: keep-all;
}</code></pre>
<p><img src="https://velog.velcdn.com/images/pond_98/post/fce740af-fc64-4757-ab6d-7eddc0103bb3/image.png" alt="">
<code>word-break: keep-all;</code>을 사용함으로써 한글에 줄바꿈이 있어도 글자 단위가 아닌 단어 단위로 줄바꿈이 이루어지도록 해준다.</p>
<h1 id="애플-사이트-만들기">애플 사이트 만들기</h1>
<p><img src="https://velog.velcdn.com/images/pond_98/post/cdc0a04d-4680-42ce-ba63-4d7cd9f41a44/image.png" alt=""></p>
<h2 id="메뉴-만들기">메뉴 만들기</h2>
<p><img src="https://velog.velcdn.com/images/pond_98/post/730e82f8-7247-417c-af85-e3a5b9dcdae4/image.png" alt=""></p>
<pre><code class="language-html">&lt;ul class=&quot;menu&quot;&gt;
        &lt;li class=&quot;apple-logo&quot;&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;Apple&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;스토어&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;Mac&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;iPad&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;iPhone&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;Watch&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;Vison&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;AirPdos&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;TV 및 홈&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;엔터테이먼트&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;액세서리&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;고객지원&lt;/a&gt;&lt;/li&gt;
        &lt;li class=&quot;search-starter&quot;&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;검색&lt;/a&gt;&lt;/li&gt;
        &lt;li class=&quot;basket-starter&quot;&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;장바구니&lt;/li&gt;
      &lt;/ul&gt;</code></pre>
<pre><code class="language-css">header ul.menu {
  display: flex;
  height: 44px;
  justify-content: space-between;
}

header ul.menu &gt; li {
  display: flex;
  position: relative;
}

header ul.menu &gt; li &gt; a {
  padding: 0 10px;
  font-size: 11px;
  display: flex;
  align-items: center;
  color: #F5F5F5;
  opacity: 0.8;
  text-decoration: none;
}</code></pre>
<p>각 버튼을 누르면 링크로 이동하기위해 <code>a</code>태그를 사용하였다.
하지만 아직 연결되어 있는 링크는 없기 때문에 <code>href=&quot;javascript:void(0)&quot;</code>를 사용해 실제로는 이동하지 않도록 하였다.
애플, 검색, 장바구니 버튼은 텍스트가 아닌 이미지 버튼이 삽입되어 있다. </p>
<pre><code class="language-css">header ul.menu &gt; li.apple-logo &gt; a {
  background-image: url(&quot;../images/header_apple.svg&quot;);
}

header ul.menu &gt; li.search-starter &gt; a {
  background-image: url(&quot;../images/header_search.svg&quot;);
}

header ul.menu &gt; li.basket-starter &gt; a {
  background-image: url(&quot;../images/header_bag.svg&quot;);
}</code></pre>
<p><code>background-image</code>를 통해 해당 텍스트 위치에 이미지를 삽입시켰다. 하지만 텍스트는 남아있는 문제가 있다. </p>
<pre><code class="language-css">header ul.menu &gt; li.apple-logo &gt; a,
header ul.menu &gt; li.search-starter &gt; a,
header ul.menu &gt; li.basket-starter &gt; a {
  width: 14px;
  text-indent: -9999px;
  background-repeat: no-repeat;
  background-position: center 13px;
}</code></pre>
<p><code>text-indent: -9999px;</code> 를 통해 텍스트를 <code>-9999px</code> 위치로 이동시켰는데 이는 대체 텍스트를 의미한다.</p>
<h2 id="장바구니-버튼">장바구니 버튼</h2>
<p><img src="https://velog.velcdn.com/images/pond_98/post/a04d6163-b7d8-4859-8dcb-3342e5cb8a6c/image.png" alt="">
장바구니 버튼을 누르면 하단에 추가 버튼이 나오도록 구성하였다.</p>
<pre><code class="language-html">&lt;li class=&quot;basket-starter&quot;&gt;
          &lt;a href=&quot;javascript:void(0)&quot;&gt;장바구니&lt;/a&gt;
          &lt;div class=&quot;basket&quot;&gt;
            &lt;div class=&quot;arrow&quot;&gt;&lt;/div&gt;
            &lt;div class=&quot;message&quot;&gt;
              장바구니가 비어 있습니다.
            &lt;/div&gt;
            &lt;ul&gt;
              &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;장바구니&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;관심 목록&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;주문&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;계정&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;&lt;a href=&quot;javascript:void(0)&quot;&gt;로그인&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/div&gt;
        &lt;/li&gt;</code></pre>
<pre><code class="language-css">header .basket {
  visibility: hidden;
  width: 290px;
  padding: 10px 20px;
  border: 1px solid #D2D2D2;
  border-radius: 10px;
  box-sizing: border-box;
  background-color: #FFF;
  position: absolute;
  top: calc(100% + 4px);
  right: -6px;
  transition: 0.5s;
  opacity: 0;
}

header .basket.show {
  visibility: visible;
  opacity: 1;
}

header .basket .arrow {
  width: 20px;
  height: 10px;
  overflow: hidden;
  position: absolute;
  top: -10px;
  right: 12px;
}

header .basket .arrow::before{
  content: &quot;&quot;;
  width: 12px;
  height: 12px;
  border: 1px solid #D2D2D2;
  background-color: #FFF;
  transform: rotate(45deg);
  transform-origin: 0 0;
  position: absolute;
  top: 0;
  left: 50%;
}

header .basket .message {
  padding: 30px 0;
  font-size: 13px;
  color: #6E6E6E;
  text-align: center;
}

header .basket ul {
  margin-top: 10px;
}

header .basket ul li {
  border-top: 1px solid #D2D2D2;
}

header .basket ul li a {
  display: block;
  padding: 14px;
  font-size: 13px;
  color: #0071E3;
}

header .basket ul li a:hover {
  font-weight: 700;
}</code></pre>
<pre><code class="language-js">const basketStaterEl = document.querySelector(&#39;header .basket-starter&#39;)
const basketEl = basketStaterEl.querySelector(&#39;.basket&#39;)

basketStaterEl.addEventListener(&#39;click&#39;, function(event) {
  event.stopPropagation()
  if (basketEl.classList.contains(&#39;show&#39;)) {
    //hide
    hideBasket()
  }else {
    //show
    showBasket()
  }
})

basketEl.addEventListener(&#39;click&#39;, function(event) {
  event.stopPropagation()
})

window.addEventListener(&#39;click&#39;, function() {
  hideBasket()
})

function showBasket() {
  basketEl.classList.add(&#39;show&#39;)
}

function hideBasket() {
  basketEl.classList.remove(&#39;show&#39;)
}</code></pre>
<p>장바구니 버튼을 누를 경우 <code>basketEl.classList.contains(&#39;show&#39;)</code>를 통해 <code>basketEl</code>에 show가 포함되어 있는지 확인하게된다. 만약 포함되어 있다면 <code>basketEl</code>에 show를 없애고 포함되어 있지 않다면 show를 추가시킨다.
<code>window.addEventListener</code>,<code>basketEl.addEventListener</code>를 통해서 장바구니 버튼 뿐만 아니라 전체 영역과 하단 버튼 영역 터치 시의 동작 또한 구현 시킬 수 있다.
하지만 클릭을 통해 이벤트 감지하는 동작에서는 버블링이라고 하는 문제가 생길 수 있다.
(ex 하단 버튼 영역만을 터치하고 싶은데 window 이벤트 감지 이벤트가 동시에 발생하는 문제)
이는 <code>event.stopPropagation()</code>를 통해 상위 요소로 이벤트가 전달되지 않고 자신의 영역에서만 이벤트가  전달되도록 할 수 있다.</p>
<pre><code class="language-css">header .basket {
  visibility: hidden;
  width: 290px;
  padding: 10px 20px;
  border: 1px solid #D2D2D2;
  border-radius: 10px;
  box-sizing: border-box;
  background-color: #FFF;
  position: absolute;
  top: calc(100% + 4px);
  right: -6px;
  transition: 0.5s;
  opacity: 0;
}

header .basket.show {
  visibility: visible;
  opacity: 1;
}</code></pre>
<p>위 코드를 통해 show가 없다면 <code>visibility: hidden;</code>로 인해 하단 메뉴는 보여지지 않고 show가 있다면 <code>visibility: visible;</code>를 통해 하단 메뉴가 보여지게 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[면접 질문 대비 2 - Git]]></title>
            <link>https://velog.io/@pond_98/%EB%A9%B4%EC%A0%91-%EC%A7%88%EB%AC%B8-%EB%8C%80%EB%B9%84-2-Git</link>
            <guid>https://velog.io/@pond_98/%EB%A9%B4%EC%A0%91-%EC%A7%88%EB%AC%B8-%EB%8C%80%EB%B9%84-2-Git</guid>
            <pubDate>Sun, 27 Apr 2025 08:53:18 GMT</pubDate>
            <description><![CDATA[<h3 id="q-git-master와-main-브랜치의-차이점을-설명하세요">Q) Git Master와 Main 브랜치의 차이점을 설명하세요.</h3>
<h4 id="a-대표적은-vcsversion-control-system인-git에서는-주-브랜치로-master-브랜치를-사용했지만-git-228-버전부터-주-브랜치를-main-브랜치로-변경하였다">A) 대표적은 VCS(Version Control System)인 Git에서는 주 브랜치로 &#39;master&#39; 브랜치를 사용했지만, Git 2.28 버전부터 주 브랜치를 &#39;main&#39; 브랜치로 변경하였다.</h4>
<h4 id="maser라는-단어는-주종-관계와-같이-인종-차별적인-것으로-인식될-수-있어-main이라는-단어로-변경되었다-그래서-git-228-미만-버전에서는-git-config---global-initdefaultbranch-main-명령어로-주-브랜치를-구성하거나-프로젝트-단위로는-git-branch--m-master-main-명령어로-주-브랜치를-변경할-수-있다">&#39;Maser&#39;라는 단어는 주종 관계와 같이 인종 차별적인 것으로 인식될 수 있어, &#39;Main&#39;이라는 단어로 변경되었다. 그래서 Git 2.28 미만 버전에서는 &#39;git config --global init.defaultBranch main&#39; 명령어로 주 브랜치를 구성하거나, 프로젝트 단위로는 &#39;git branch -m master main&#39; 명령어로 주 브랜치를 변경할 수 있다.</h4>
<h3 id="q-git-flow-전략을-사용하는-이유와-주-브랜치에-대해-설명해-주세요">Q) Git Flow 전략을 사용하는 이유와 주 브랜치에 대해 설명해 주세요.</h3>
<h4 id="a-git-flow는-복잡한-프로젝트-개발에서-안전성과-효율성을-향상시키며-버전-관리를-하기-위한-브랜치-관리-전략을-말한다">A) Git Flow는 복잡한 프로젝트 개발에서 안전성과 효율성을 향상시키며 버전 관리를 하기 위한 브랜치 관리 전략을 말한다.</h4>
<h4 id="담당자에-따라-이름은-조금씩-다를-수-있지만-주로-main-dev-feature-release-hotfix로-역할에-맞게-브랜치를-구분한다">담당자에 따라 이름은 조금씩 다를 수 있지만, 주로 &#39;main&#39;, &#39;dev&#39;, &#39;feature&#39;, &#39;release&#39;, &#39;hotfix&#39;로 역할에 맞게 브랜치를 구분한다.</h4>
<h4 id="main은-실제-출시-제품의-브랜치이고-dev는-여러-기능을-병합하는-등의-용도로-안전할-개발을-위해-사용하는-브랜치이다">&#39;main&#39;은 실제 출시 제품의 브랜치이고, &#39;dev&#39;는 여러 기능을 병합하는 등의 용도로 안전할 개발을 위해 사용하는 브랜치이다.</h4>
<h4 id="feature는-featurelogin-featureboard와-같이-기능별-이름을-추가해-개발을-진행하는-브랜치이고-release는-출시-버전을-준비해-버저닝하는-브랜치이고-hotfix는-긴급-버그-수정을-위해-사용하는-브랜치이다">&#39;feature&#39;는 &#39;feature/login&#39;, &#39;feature/board&#39;와 같이 기능별 이름을 추가해 개발을 진행하는 브랜치이고 &#39;release&#39;는 출시 버전을 준비해 버저닝하는 브랜치이고, &#39;hotfix&#39;는 긴급 버그 수정을 위해 사용하는 브랜치이다.</h4>
<h4 id="이렇게-각-브랜치를-역할에-맞게-엄격하게-사용해야-브랜치-간의-병합과-충돌을-최소화해서-프로젝트의-안정성과-효율성을-높일-수-있다">이렇게 각 브랜치를 역할에 맞게 엄격하게 사용해야 브랜치 간의 병합과 충돌을 최소화해서 프로젝트의 안정성과 효율성을 높일 수 있다.</h4>
<h3 id="q-git-merge와-github-pull-request의-차이점을-설명하시오">Q) Git Merge와 GitHub Pull Request의 차이점을 설명하시오</h3>
<h4 id="a-git-merge는-단순히-로컬-개발-환경에서-각-브랜치를-병합할-때-사용하는-명령으로-발생하는-충돌을-직접-해결하기-쉽고-별도의-검토나-승인-없이-빠르게-병합할-수-있다">A) Git Merge는 단순히 로컬 개발 환경에서 각 브랜치를 병합할 때 사용하는 명령으로, 발생하는 충돌을 직접 해결하기 쉽고 별도의 검토나 승인 없이 빠르게 병합할 수 있다.</h4>
<h4 id="반면-github-pull-request는-원격-저장소에서-다른-개발자와의-협업을-위해-사용하는-기능으로-병합-전에-코드-리뷰-등의-피드백을-받을-수-있어서-여러-개발자가-변경-사항을-검토하고-토론할-수-있으며-프로젝트에-따라-관리자-승인이-필요할-수-있기-때문에-더-안전하게-코드를-병합하는-좀-더-구조화된-과정이다">반면 GitHub Pull Request는 원격 저장소에서 다른 개발자와의 협업을 위해 사용하는 기능으로, 병합 전에 코드 리뷰 등의 피드백을 받을 수 있어서 여러 개발자가 변경 사항을 검토하고 토론할 수 있으며, 프로젝트에 따라 관리자 승인이 필요할 수 있기 때문에 더 안전하게 코드를 병합하는 좀 더 구조화된 과정이다.</h4>
<h4 id="그래서-간단한-변경-사항의-브랜치-병합은-로컬에서-git-merge-명령을-사용하고-더-복잡한-변경-사항이나-협업을-위한-코드는-되도록-github-pull-request-기능을-사용해서-병합을-하는-것이-좋다">그래서 간단한 변경 사항의 브랜치 병합은 로컬에서 Git Merge 명령을 사용하고, 더 복잡한 변경 사항이나 협업을 위한 코드는 되도록 GitHub Pull Request 기능을 사용해서 병합을 하는 것이 좋다.</h4>
<h3 id="q-markdown-문법-중-코드-블록code-block과-인라인-코드inline-code의-차이점에-대해-설명하시오">Q) Markdown 문법 중 코드 블록(Code Block)과 인라인 코드(Inline Code)의 차이점에 대해 설명하시오</h3>
<h4 id="a-마크다운-문법에서-코드-블록은-주로-여러-줄의-코드-영역을-표시할-때-사용하는-기능으로-백틱codecode기호를-연속으로-3개-사용해-코드의-시작과-끝을-표시한다">A) 마크다운 문법에서 코드 블록은 주로 여러 줄의 코드 영역을 표시할 때 사용하는 기능으로, 백틱(<code>`</code>)기호를 연속으로 3개 사용해 코드의 시작과 끝을 표시한다.</h4>
<h4 id="또한-코드-블록은-codehtmlcode과-같이-작성-코드의-언어를-명시할-수도-있어서-코드의-가독성을-높이고-코드-하이라이팅을-적용할-수-있다">또한 코드 블록은 <code>```html</code>과 같이 작성 코드의 언어를 명시할 수도 있어서 코드의 가독성을 높이고 코드 하이라이팅을 적용할 수 있다.</h4>
<h4 id="인라인-코드는-한-줄의-코드-영역을-표시할-때-사용하는-기능으로-codedivcode-처럼-백틱-기호-1개씩-코드의-시작과-끝에-사용한다">인라인 코드는 한 줄의 코드 영역을 표시할 때 사용하는 기능으로 <code>`div`</code> 처럼 백틱 기호 1개씩 코드의 시작과 끝에 사용한다.</h4>
<h4 id="그래서-문장-안에서-코드-부분을-강조하는-용도로-사용한다">그래서 문장 안에서 코드 부분을 강조하는 용도로 사용한다.</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git 버전관리 - 마크다운]]></title>
            <link>https://velog.io/@pond_98/Git-%EB%B2%84%EC%A0%84%EA%B4%80%EB%A6%AC-%EB%A7%88%ED%81%AC%EB%8B%A4%EC%9A%B4</link>
            <guid>https://velog.io/@pond_98/Git-%EB%B2%84%EC%A0%84%EA%B4%80%EB%A6%AC-%EB%A7%88%ED%81%AC%EB%8B%A4%EC%9A%B4</guid>
            <pubDate>Sun, 27 Apr 2025 08:27:01 GMT</pubDate>
            <description><![CDATA[<h2 id="마크다운-markdown">마크다운 (Markdown)</h2>
<p>웹에서도 보다 빠르게 컨텐츠를 작성하고 보다 직관적으로 인식할 수 있도록 하는 도움을 준다.
Github에서는 <code>README.md</code>를 통해 우선적으로 접하게 된다.</p>
<h4 id="장점">장점</h4>
<p>문법이 쉽고 간결하다.
관리가 쉽다.
지원 가능한 플랫폼과 프로그램이 다양하다.</p>
<h4 id="단점">단점</h4>
<p>표준이 없다.
모든 HTML 마크업을 대신하지 못한다.</p>
<h3 id="제목-header">제목 (Header)</h3>
<pre><code># 제목 1
## 제목 2
### 제목 3
#### 제목 4
##### 제목 5
###### 제목 6</code></pre><p><img src="https://velog.velcdn.com/images/pond_98/post/3bcf3a4b-b11f-4d00-a231-3c65d59342d8/image.png" alt=""></p>
<h3 id="줄바꿈-line-breaks">줄바꿈 (Line Breaks)</h3>
<p>줄바꿈을 하기 위해서는 줄바꿈이 있는 문장에 두 칸 띄어쓰기를 하면 된다.
간혹 띄어쓰기로 줄바꿈이 되지 않는 경우가 있는데 이 경우에는 <code>&lt;/br&gt;</code>을 사용하면 된다.</p>
<pre><code>동해물과 백두산이 마르고 닳도록  
하느님이 보우하사 우리나라 만세  
무궁한 삼천리 화려 강산&lt;br /&gt;
대한 사람 대한으로 길이 보전하세</code></pre><p><img src="https://velog.velcdn.com/images/pond_98/post/828c68f7-735a-4ba9-a7b8-03ea12582d66/image.png" alt=""></p>
<h3 id="강조-emphasis">강조 (Emphasis)</h3>
<pre><code>_이텔릭_  
**두껍게**  
**_이텔릭 + 두껍게_**  
~~취소선~~  
&lt;u&gt;밑줄&lt;/u&gt;  </code></pre><p><img src="https://velog.velcdn.com/images/pond_98/post/04d72606-5958-466b-bc10-703f5dd06548/image.png" alt=""></p>
<h3 id="목록-list">목록 (List)</h3>
<pre><code>1. 순서가 필요한 목록
1. 순서가 필요한 목록
1. 순서가 필요한 목록
    1. 순서가 필요한 목록
    1. 순서가 필요한 목록
1. 순서가 필요한 목록

- 순서가 필요하지 않은 목록
- 순서가 필요하지 않은 목록
- 순서가 필요하지 않은 목록
    - 순서가 필요하지 않은 목록
    - 순서가 필요하지 않은 목록
- 순서가 필요하지 않은 목록</code></pre><p><img src="https://velog.velcdn.com/images/pond_98/post/c0c388bd-33dc-4b8b-8fa7-19223801de11/image.png" alt=""></p>
<p>동일한 숫자를 입력했음에도 자동으로 다음 숫자 목록으로 출력된다.
또한 들여쓰기를 통해 특정 목록의 상세 목록으로 만들 수 있다.</p>
<h3 id="링크-links">링크 (Links)</h3>
<pre><code class="language-html">&lt;a href=&quot;https://www.naver.com&quot;&gt;NAVER&lt;/a&gt;

[NAVER](https://www.naver.com)

&lt;a href=&quot;https://www.naver.com&quot; title=&quot;NAVER로 이동&quot;&gt;NAVER&lt;/a&gt;

[NAVER](https://www.naver.com &quot;NAVER로 이동&quot;)</code></pre>
<p><img src="https://velog.velcdn.com/images/pond_98/post/74e2505f-0bba-4828-8972-275f8567d505/image.png" alt="">
링크를 삽입하기 위해서는 기본적으로 <code>[]()</code> 형태를 사용하면 된다.</p>
<h3 id="이미지-image">이미지 (Image)</h3>
<pre><code>![NSTORE](https://s.pstatic.net/static/www/mobile/edit/20250417_1095/upload_1744877794098d42hA.png)

[![NSTORE](https://s.pstatic.net/static/www/mobile/edit/20250417_1095/upload_1744877794098d42hA.png)](https://shopping.naver.com/ns/home)</code></pre><p><img src="https://velog.velcdn.com/images/pond_98/post/80bd8610-b3d7-4ae4-8d1b-63d011b0749c/image.png" alt="">
마크다운에 이미지를 삽입하기 위해서는 기본적으로 <code>![대체 텍스트](이미지 주소)</code> 형태로 사용하면 된다.
만약 링크 이미지를 사용하고 싶다면 <code>[![대체 텍스트](이미지 주소)](링크)</code> 를 사용하면 된다.</p>
<h3 id="인용문-blockquote">인용문 (BlockQuote)</h3>
<pre><code>&gt; 남의 말이나 글에서 직접 또는 간접으로 따온 문장.  
&gt; (네이버 국어 사전)

&gt; 인용문을 작성하세요.
&gt;&gt; 중첩된 인용문 1
&gt;&gt;&gt; 중첩된 인용문 2
&gt;&gt;&gt;&gt; 중첩된 인용문 3
&gt;&gt;&gt;&gt;&gt; 중첩된 인용문 4</code></pre><p><img src="https://velog.velcdn.com/images/pond_98/post/271185df-dfe4-494d-b301-80f836dc921f/image.png" alt=""></p>
<h3 id="인라인-inline-코드-강조">인라인 (inline) 코드 강조</h3>
<pre><code>CSS에서 `background` 혹은 `background-image` 속성으로 요소에 배경 이미지를 삽입할 수 있다.</code></pre><p><img src="https://velog.velcdn.com/images/pond_98/post/ddbaf781-ca8b-40e4-abdc-adaa3ce54939/image.png" alt=""></p>
<h3 id="블록-block-코드-강조">블록 (block) 코드 강조</h3>
<p><img src="https://velog.velcdn.com/images/pond_98/post/7d29df44-fd30-4ded-932d-068e277bab97/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/pond_98/post/0061a9bd-61bb-4e3b-8b99-9d280c838bd5/image.png" alt=""></p>
<h3 id="표-table">표 (table)</h3>
<pre><code>값 | 의미 | 기본값
:--|:--:|--:
static | 기준 없음 | O
relative | 요소 자신 | X
absolute | 위치 상 부모 요소 | X
fixed | 뷰포트 | X</code></pre><p><img src="https://velog.velcdn.com/images/pond_98/post/3b2be448-1198-4061-a177-dcbb832fd14c/image.png" alt=""></p>
<h3 id="원시-html-raw-html">원시 HTML (Raw HTML)</h3>
<pre><code>동해물과 &lt;u&gt;백두산&lt;/u&gt;이 마르고 닳도록&lt;br/&gt;
하느님이 보우하사 우리나라 만세

&lt;a href=&quot;https://www.naver.com&quot; title=&quot;NAVER로 이동&quot; targer=&quot;_blank&quot;&gt;NAVER&lt;/a&gt;

&lt;img width=&quot;70&quot; src=&quot;https://s.pstatic.net/static/www/mobile/edit/20250417_1095/upload_1744877794098d42hA.png&quot; alt=&quot;NSTORE&quot;&gt;</code></pre><p><img src="https://velog.velcdn.com/images/pond_98/post/076921f2-1fec-4fd3-86bf-ded9e59e7466/image.png" alt=""></p>
<h3 id="수평선-horizontal-rule">수평선 (Horizontal Rule)</h3>
<p><code>---</code>, <code>***</code>, <code>___</code>를 통해 수평선을 만들 수 있다.</p>
<pre><code>---

***

___</code></pre><p><img src="blob:https://velog.io/0a885587-06e6-401f-8d71-185e4b869412" alt="업로드중.."></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git 버전관리 - 예외사항]]></title>
            <link>https://velog.io/@pond_98/Git-%EB%B2%84%EC%A0%84%EA%B4%80%EB%A6%AC</link>
            <guid>https://velog.io/@pond_98/Git-%EB%B2%84%EC%A0%84%EA%B4%80%EB%A6%AC</guid>
            <pubDate>Sun, 20 Apr 2025 07:49:02 GMT</pubDate>
            <description><![CDATA[<h3 id="버전-되돌리기">버전 되돌리기</h3>
<p><code>git reset --hard HEAD~2</code> : 2버전 전으로 버전을 되돌린다.</p>
<p><code>git reset --hard ORIG_HEAD</code> : 되돌리기 명령을 취소한다.</p>
<h3 id="git-복제하기">git 복제하기</h3>
<p><code>git clone &#39;Git주소&#39;</code> : 원하는 저장소에 GitHub 프로젝트 복사한다.</p>
<h3 id="브랜치">브랜치</h3>
<p><code>git branch -r</code> : 복제한 프로젝트의 브랜치의 목록을 확인할 수 있다.</p>
<p><code>git branch checkout -t &#39;브렌치&#39;</code> : 복제한 프로젝트의 브랜치로 전환할 수 있다.</p>
<p><code>git branch -d &#39;브렌치&#39;</code> : 브랜치를 삭제한다.</p>
<p><code>git checkout -b &#39;브렌치&#39;</code> : 브랜치를 생성하는 동시에 전환한다.</p>
<h3 id="충돌-방지">충돌 방지</h3>
<p>다른 환경에서 프로젝트를 하다 보면 버전 생성도중 충돌이 발생할 수 있다.</p>
<p><code>git pull origin master</code> : 원격 저장소(Github)의 데이터를 가져오고 변경 사항을 자동으로 변경한다.</p>
<h3 id="브랜치-변경">브랜치 변경</h3>
<p><code>git branch -m master main</code> : master라는 이름의 브랜치에서 main이라는 이름의 브랜치로 이동한다.</p>
<p><code>git config --global init.defaultBranch main</code> : main 이름의 브랜치가 기본 브랜치로 변환한다.</p>
<h3 id="github에서-브랜치-이름-수정하기">Github에서 브랜치 이름 수정하기</h3>
<p><img src="https://velog.velcdn.com/images/pond_98/post/7e5c0a95-bb3b-454c-af7c-e8d4f4caef72/image.png" alt="">
<img src="https://velog.velcdn.com/images/pond_98/post/b9d8edde-02bc-4d28-92f9-66c3a305e420/image.png" alt="">
<img src="https://velog.velcdn.com/images/pond_98/post/db3a9132-74db-40c2-8583-ece061969ae5/image.png" alt=""></p>
<h3 id="버전관리-예외사항-파일폴더-설정">버전관리 예외사항 파일/폴더 설정</h3>
<p><img src="https://velog.velcdn.com/images/pond_98/post/73e61478-ccef-496f-b539-86665a426280/image.png" alt="">
<code>.gitignore</code> 파일을 생성하여 파일 안에 버전관리를 하지 않을 파일/폴더 명을 작성하면 된다.
ex)</p>
<pre><code>.idea
.vscode
node_modules</code></pre><h4 id="버전-관리-도중-gitignore을-사용할-경우">버전 관리 도중 .gitignore을 사용할 경우</h4>
<p><code>git rm -r --cached .</code> : 원격 저장소의 파일/폴더를 삭제한다.</p>
<h3 id="브랜치-전략">브랜치 전략</h3>
<h4 id="git-flow">Git Flow</h4>
<p>main(master) : 기본 / 메인 / 제품 브랜치
dev(develop) : 다음 제품 출시를 위해 여러 기능을 병합하는 브랜치
feature/* : 각 기능 개발을 위한 브랜치
release : 이번 제품 출시 직전 최종 테스트(QA)를 위한 브랜치
hotfix : 제품에 버그가 확인되었을 때 긴급 수정을 위한 브랜치</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git 버전관리 - 브랜치 병합하기]]></title>
            <link>https://velog.io/@pond_98/Git-%EB%B2%84%EC%A0%84%EA%B4%80%EB%A6%AC-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%B3%91%ED%95%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@pond_98/Git-%EB%B2%84%EC%A0%84%EA%B4%80%EB%A6%AC-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%B3%91%ED%95%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 13 Apr 2025 07:54:09 GMT</pubDate>
            <description><![CDATA[<p>브랜치 
<code>git add .</code>
<code>git commit -m &#39;변경사항&#39;</code>
<code>git push origin signin</code>
이전에 설명했던 위 과정을 통해 새로운 버전을 생성할 수 있다.</p>
<h3 id="브랜치-병합">브랜치 병합</h3>
<p><img src="https://velog.velcdn.com/images/pond_98/post/8492995c-b211-46f1-9f41-6c6f382bedef/image.png" alt="">
Github에서 <code>Pull requests</code>를 통해 브랜치를 확인할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/pond_98/post/443be614-f818-458f-b905-19a2f4aea687/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/pond_98/post/d4e4f80b-959b-4bf4-a615-b8426c266207/image.png" alt="">
compare을 선택하여 내가 수정버전을 커밋한 브랜치를 선택함으로써 base(master)의 브랜치에서의 변경 사항을 확인할 수 있다.
<code>Create pull request</code> 버튼을 통해 브랜치를 병합할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/pond_98/post/de50f85c-8449-4bee-b989-8deb28dbaa57/image.png" alt="">
설명과 함께 병합이 가능하다.</p>
<p><img src="https://velog.velcdn.com/images/pond_98/post/32d60ee0-af6c-4936-a579-5574d985cf96/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/pond_98/post/776403bc-96ad-4086-8bf4-baf980017b16/image.png" alt="">
Github에 변경된 파일이 정상적으로 변경된 것을 확인할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[스타벅스 만들기 7 - 로그인]]></title>
            <link>https://velog.io/@pond_98/%EC%8A%A4%ED%83%80%EB%B2%85%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0-7-%EB%A1%9C%EA%B7%B8%EC%9D%B8</link>
            <guid>https://velog.io/@pond_98/%EC%8A%A4%ED%83%80%EB%B2%85%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0-7-%EB%A1%9C%EA%B7%B8%EC%9D%B8</guid>
            <pubDate>Sun, 13 Apr 2025 07:32:21 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/pond_98/post/26e8a7a4-f41a-43bd-9f67-38820d4f999b/image.png" alt=""></p>
<pre><code>      &lt;form&gt;
        &lt;input type=&quot;text&quot; placeholder=&quot;아이디를 입력해 주세요.&quot; /&gt;
        &lt;input type=&quot;password&quot; placeholder=&quot;비밀번호를 입력해 주세요.&quot; /&gt;
        &lt;input type=&quot;submit&quot; value=&quot;로그인&quot; /&gt;
        &lt;p&gt;
          * 타 사이트와 비밀번호를 동일하게 사용할 경우 도용의 위험이 있으므로, 정기적인 &lt;br /&gt;
          비밀번호 변경을 해주시길 바랍니다.
        &lt;/p&gt;
      &lt;/form&gt;</code></pre><h3 id="form-input">form, input</h3>
<p><code>input</code> : 사용자에게 데이터를 입력받는 역할
<code>type=&quot;text&quot;</code> : 문자 타입을 입력받기 위한 요소
<code>input type=&quot;password&quot;</code> : 비밀보호 타입을 입력받기 위한 요소
<code>input type=&quot;submit&quot;</code> : 타입을 &#39;submit&#39;을 사용하면 해당 버튼이 선택 시 실제로 서버로 form 태그 내의 내용을 전송하게 해준다.</p>
<h3 id="속성-선택자">속성 선택자</h3>
<pre><code class="language-html">.signin__card form [type=&quot;submit&quot;] {
  background-color: #006633;
  border: none;
  color: #fff;
  font-size: 20px;
  cursor: pointer;
}</code></pre>
<p><code>[type=&quot;submit&quot;]</code> : 타입의 속성이 submit인 요소를 선택할 수 있다.</p>
<h3 id="특정-글씨-강조">특정 글씨 강조</h3>
<pre><code class="language-html"> &lt;div class=&quot;signin__card&quot;&gt;
      &lt;h2&gt;
        &lt;strong&gt;Welcome!&lt;/strong&gt; 스타벅스 코리아에 오신 것을 환영합니다.
      &lt;/h2&gt;
 &lt;/div&gt;</code></pre>
<pre><code class="language-html">.signin__card h2 strong {
  font-weight: 700;
  color: #006633
}</code></pre>
<p><code>strong</code> : strong 태그는 주로 특정 글자를 강조할 때 사용한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git을 이용한 버전 관리]]></title>
            <link>https://velog.io/@pond_98/Git%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC</link>
            <guid>https://velog.io/@pond_98/Git%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC</guid>
            <pubDate>Sat, 12 Apr 2025 08:19:52 GMT</pubDate>
            <description><![CDATA[<h2 id="버전관리">버전관리</h2>
<h3 id="git">Git</h3>
<p>Git(깃)은 컴퓨터 파일의 변경사항을 추적하고 여러 사용자들 간에 파일 작업을 조율하기 위한 대표적인 버전 관리 시스템(VCS)이다.</p>
<h2 id="github에-프로젝트-업로드-하기">GITHUB에 프로젝트 업로드 하기</h2>
<p><img src="https://velog.velcdn.com/images/pond_98/post/4cd9b5ee-bf95-4bd8-8029-dae2ba108b65/image.png" alt="">
터미널에 입력</p>
<h3 id="개행-문자newline-설정">개행 문자(Newline) 설정</h3>
<p><code>git config --global core.autocrlf true(win)/auto(mac)</code> : OS간의 줄바꿈 문자열 문제를 해결하기 위한 설정</p>
<h3 id="사용자-정보-설정">사용자 정보 설정</h3>
<h4 id="유저-이름-설정">유저 이름 설정</h4>
<p><code>git config --global user.name &#39;Name&#39;</code> : 커밋을 위한 유저 &#39;Name&#39;을 설정한다.(Github의 이름과 동일하도록 설정하는 것을 추천)</p>
<h4 id="유저-이메일-설정">유저 이메일 설정</h4>
<p><code>git config --global user.email &#39;Email&#39;</code> : 커밋을 위한 유저 &#39;Email&#39;을 설정한다. </p>
<h4 id="사용자-유저-정보-확인">사용자 유저 정보 확인</h4>
<p><code>git config --global --list</code></p>
<h3 id="git-저장소-생성">Git 저장소 생성</h3>
<p><code>git init</code> : 현재 프로젝트에서 변경사항 추적(버전 관리)을 시작</p>
<h3 id="변경사항-지정">변경사항 지정</h3>
<p><code>git add .</code> : 현재 경로의 모든 파일의 변경사항을 추적하도록 지정
<code>git add index.html</code> : 변경사항을 추적할 특정 파일 지정</p>
<h3 id="현재-상태-확인">현재 상태 확인</h3>
<p><code>git status</code> : <code>git add.</code>를 통해 저장된 파일은 녹색, 저장되지 않은 파일은 빨간색으로 노출된다.</p>
<h3 id="버전-생성">버전 생성</h3>
<p><code>git commit -m &#39;message&#39;</code> : 저장된(변경된) 파일을 &#39;message&#39;와 버전을 생성</p>
<h3 id="원격-저장소-연결">원격 저장소 연결</h3>
<p><code>git remote add origin &#39;https://github....&#39;</code> : origin이란 별칭으로 원격 저장소 연결</p>
<h3 id="파일-업로드">파일 업로드</h3>
<p><code>git push origin master</code> : orgin이란 별칭의 원격 저장소(github)에 버전 내역 업로드
<img src="https://velog.velcdn.com/images/pond_98/post/9438d3a4-83b3-4f07-8f79-c6ad2f4e98ac/image.png" alt=""></p>
<h2 id="수정된-버전-생성하기">수정된 버전 생성하기</h2>
<p><img src="https://velog.velcdn.com/images/pond_98/post/f93a2c5f-d9a0-4e3b-8d82-fe40b8aee761/image.png" alt="">
원격 저장소에 업로드되어 있는 파일이 수정될 경우 해당 파일 우측에 M(modify) 약어가 추가된 것을 확인 가능하다.</p>
<h3 id="현재-상태-확인-1">현재 상태 확인</h3>
<p><img src="https://velog.velcdn.com/images/pond_98/post/9aa87461-a79b-4d28-8ecb-3f508d2c65b6/image.png" alt="">
<code>git status</code>를 통해 index.html 파일이 수정된 것을 알 수 있다.</p>
<h3 id="변경사항-지정-1">변경사항 지정</h3>
<p><code>git add .</code></p>
<h3 id="버전-생성-1">버전 생성</h3>
<p><code>git commit -m &#39;뱃지 이미지 수정&#39;</code> : 메시지에 한글도 사용 가능하다</p>
<h3 id="파일-업로드-1">파일 업로드</h3>
<p><code>git push origin master</code> 
<img src="https://velog.velcdn.com/images/pond_98/post/970e978e-0546-4637-90d0-bdea5cb71325/image.png" alt="">
메시지와 함께 Github에 수정된 파일이 업로드된 것을 확인 가능 </p>
<h2 id="브랜치">브랜치</h2>
<p>버전을 관리하기 위한 일종의 복사본이다.</p>
<h3 id="브랜치-조회">브랜치 조회</h3>
<p><code>git branch</code> : 생성된 브랜치를 조회한다.</p>
<h3 id="브랜치-생성">브랜치 생성</h3>
<p><code>git branch sigin</code> : &#39;signin&#39; 이라는 브랜치를 생성한다.</p>
<h3 id="브랜치-이동">브랜치 이동</h3>
<p><code>git checkout signin</code> : &#39;signin&#39;이라는 브랜치로 이동한다.</p>
<p>브랜치를 이동할 경우 수정된 파일을 변경되지 않는다. </p>
<h2 id="netify">Netify</h2>
<p>Github등과 계정 연동 및 빠른 호스팅을 제공해준다.
<a href="https://www.netlify.com/">Netify</a>
<img src="https://velog.velcdn.com/images/pond_98/post/b390931f-392f-4552-ae12-f84ea24ab526/image.png" alt=""></p>
<h4 id="netify에-접속하여-sign-up-버튼을-터치하여-회원가입을-준비한다">Netify에 접속하여 sign up 버튼을 터치하여 회원가입을 준비한다.</h4>
<p><img src="https://velog.velcdn.com/images/pond_98/post/cec06c96-339b-454a-a260-b9c6b0994623/image.png" alt=""></p>
<h4 id="원하는-방법을-통해-회원가입을-진행한다-github-추천">원하는 방법을 통해 회원가입을 진행한다. (Github 추천)</h4>
<p><img src="https://velog.velcdn.com/images/pond_98/post/3d2d056e-517c-4a82-ba35-d2e28cd6c6df/image.png" alt=""></p>
<h4 id="호스팅할-프로젝트가-저장되어-있는-저장소-선택">호스팅할 프로젝트가 저장되어 있는 저장소 선택</h4>
<h4 id="github에-저장되어-있으면-github-선택">Github에 저장되어 있으면 Github 선택</h4>
<p><img src="https://velog.velcdn.com/images/pond_98/post/f23c8926-6f46-4b9a-be11-c01b3f69d039/image.png" alt=""></p>
<h4 id="호스팅할-프로젝트-선택">호스팅할 프로젝트 선택</h4>
<h4 id="github와-연동하면-업로드-되어-있는-프로젝트를-쉽게-선택할-수-있다">Github와 연동하면 업로드 되어 있는 프로젝트를 쉽게 선택할 수 있다.</h4>
<p><img src="https://velog.velcdn.com/images/pond_98/post/1b43d03d-e598-44fb-8e35-4359cde4883e/image.png" alt=""></p>
<h4 id="deploy-를-터치하여-호스팅">deploy 를 터치하여 호스팅</h4>
<p><img src="https://velog.velcdn.com/images/pond_98/post/20b1a07c-58c3-4e67-987b-d4b73a1f9551/image.png" alt="">
호스팅된 프로젝트 및 해당 URL을 확인할 수 있다.</p>
<h4 id="수정사항">수정사항</h4>
<p><img src="https://velog.velcdn.com/images/pond_98/post/d5a792c7-00dd-4289-86dd-108ed77f995a/image.png" alt="">
Github에 수정된 사항이 있어면 Netify에서는 자동으로 수정된 사항을 불러온다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[면접 질문 대비 1]]></title>
            <link>https://velog.io/@pond_98/%EB%A9%B4%EC%A0%91-%EC%A7%88%EB%AC%B8-%EB%8C%80%EB%B9%84-1</link>
            <guid>https://velog.io/@pond_98/%EB%A9%B4%EC%A0%91-%EC%A7%88%EB%AC%B8-%EB%8C%80%EB%B9%84-1</guid>
            <pubDate>Sun, 06 Apr 2025 08:06:41 GMT</pubDate>
            <description><![CDATA[<h3 id="q-html-doctype-선언의-의미와-역할은">Q) HTML Doctype 선언의 의미와 역할은?</h3>
<h4 id="a-html-doctype-선언은-html-문서가-웹-브라우저에-의해-어떤-방식으로-해석되어야-하는지-알려주는-역할을-하기-때문에-doctype-선언은-html-문서의-첫-줄에-위치한다">A) HTML Doctype 선언은 HTML 문서가 웹 브라우저에 의해 어떤 방식으로 해석되어야 하는지 알려주는 역할을 하기 때문에 Doctype 선언은 HTML 문서의 첫 줄에 위치한다.</h4>
<h4 id="doctype-html-태그는-html-문서가-html5-표준으로-작성되어-있고-웹-브라우저가-그에-맞게-해석해야-한다는-것을-명시하는-것이다"><code>&lt;!DOCTYPE html&gt;</code> 태그는 HTML 문서가 HTML5 표준으로 작성되어 있고 웹 브라우저가 그에 맞게 해석해야 한다는 것을 명시하는 것이다.</h4>
<h4 id="대표적인-html5-표준의-특징-중-하나로-빈empty-태그를-닫는--기호-사용이-필수가-아닌-선택-사항이라는-것이-있고-header-footer-nav-같은-새로운-시맨틱의미를-가지고-있는-요소들이-추가되어-사용할-수-있다는-것이-있다">대표적인 HTML5 표준의 특징 중 하나로 빈(Empty) 태그를 닫는 <code>/</code> 기호 사용이 필수가 아닌 선택 사항이라는 것이 있고 <code>&lt;header&gt;</code>, <code>&lt;footer&gt;</code>, <code>&lt;nav&gt;</code> 같은 새로운 시맨틱(의미를 가지고 있는) 요소들이 추가되어 사용할 수 있다는 것이 있다.</h4>
<h3 id="q-css-선택자-우선순위의-개념과-계산-방법을-설명하라">Q) CSS 선택자 우선순위의 개념과 계산 방법을 설명하라</h3>
<h4 id="a-css-선택자-우선순위는-하나의-요소에-여러-스타일이-적용될-때-어떤-스타일이-최종적으로-적용될지-결정하는-개념이다">A) CSS 선택자 우선순위는 하나의 요소에 여러 스타일이 적용될 때, 어떤 스타일이 최종적으로 적용될지 결정하는 개념이다.</h4>
<h4 id="우선순위가-가정-높은-것은-css-속성에서-직접-사용하는-important-키워드이고-다음으로-html-style-속성에서-선언하는-인라인-스타일이-있다">우선순위가 가정 높은 것은 CSS 속성에서 직접 사용하는 <code>!important</code> 키워드이고, 다음으로 HTML <code>style</code> 속성에서 선언하는 인라인 스타일이 있다.</h4>
<h4 id="아이디-선택자id-클래스-선택자class-태그-선택자tag-전체-선택자-스타일-상속-등의-순서대로-점수가-매겨지고-계산되어-순위가-결정된다">아이디 선택자(<code>#id</code>), 클래스 선택자(<code>.class</code>), 태그 선택자(<code>tag</code>), 전체 선택자(<code>*</code>), 스타일 상속 등의 순서대로 점수가 매겨지고 계산되어 순위가 결정된다,</h4>
<h4 id="각-점수는-인라인-스타일이-1000점-아이디-선택자는-0100점-클래스-선택자는-0010점-태그-선택자는-0001점-전체-선택자는-0000점-상속은-점수가-없다">각 점수는 인라인 스타일이 1000점, 아이디 선택자는 0100점, 클래스 선택자는 0010점, 태그 선택자는 0001점, 전체 선택자는 0000점, 상속은 점수가 없다.</h4>
<h4 id="만약-구글-크롬-브라우저-기준-99버전부터-지원하는-layer-규칙을-사용하면-스타일-우선순위를-의도적으로-조정할-수-있다">만약 구글 크롬 브라우저 기준 99버전부터 지원하는 <code>@layer</code> 규칙을 사용하면, 스타일 우선순위를 의도적으로 조정할 수 있다.</h4>
<h3 id="q-브라우저-기본-스타일의-초기화reset와-표준화noramlize의-차이점을-설명하라">Q) 브라우저 기본 스타일의 초기화(Reset)와 표준화(Noramlize)의 차이점을 설명하라</h3>
<h4 id="a-웹-브라우저마다-기본적으로-제공하는-스타일이-조금씩-다르기-때문에-브라우저마다-일관성-있는-화면을-보여주기-위해서-초기화reset-또는-정규화라고도-하는-표준화noramlize-작업이-필요하다">A) 웹 브라우저마다 기본적으로 제공하는 스타일이 조금씩 다르기 때문에, 브라우저마다 일관성 있는 화면을 보여주기 위해서 초기화(Reset) 또는 정규화라고도 하는 표준화(Noramlize) 작업이 필요하다.</h4>
<h4 id="그중에서-초기화reset는-모든-요소의-크기나-여백-기타-모양을-말-그대로-초기화해서-처음부터-스타일을-다시-추가할-수-있게-하는-개념이다">그중에서 초기화(Reset)는 모든 요소의 크기나 여백, 기타 모양을 말 그대로 초기화해서 처음부터 스타일을 다시 추가할 수 있게 하는 개념이다.</h4>
<h4 id="반면-표준화noramlize는-브라우저-간의-스타일-차이를-일관성-있게-적용하기-위해-기본-스타일을-유지하며-일치시키는-개면이다">반면 표준화(Noramlize)는 브라우저 간의 스타일 차이를 일관성 있게 적용하기 위해 기본 스타일을 유지하며 일치시키는 개면이다.</h4>
<h4 id="그래서-페이지-스타일의-많은-부분을-원하는-대로-커스터마이징하려면-초기화reset을-사용하고-브라우저의-기본-스타일을-활용하려면-표준-화noramlize를-사용하는-것이-좋다">그래서 페이지 스타일의 많은 부분을 원하는 대로 커스터마이징하려면 초기화(Reset)을 사용하고, 브라우저의 기본 스타일을 활용하려면 표준 화(Noramlize)를 사용하는 것이 좋다.</h4>
<h3 id="q-마진-병합margin-collapse-현상이란-무엇인지-설명하라">Q) 마진 병합(Margin Collapse) 현상이란 무엇인지 설명하라</h3>
<h4 id="a-마진-병합은-서로-다른-두-요소의-css-margin-속성의-값이-중첩되어-하나의-값으로만-출력되는-현상을-말한다">A) 마진 병합은 서로 다른 두 요소의 CSS <code>margin</code> 속성의 값이 중첩되어 하나의 값으로만 출력되는 현상을 말한다.</h4>
<h4 id="기본적으로-두-형제-요소의-위아래-마진이-만나면-중첩되어-더-큰-값으로-결합되고-또-부모와-자식-요소의-위쪽이나-아래쪽-마진이-서로-만나면-중첩되어-부모-요소의-마진-값으로-결합됩니다">기본적으로 두 형제 요소의 위아래 마진이 만나면 중첩되어 더 큰 값으로 결합되고, 또 부모와 자식 요소의 위쪽이나 아래쪽 마진이 서로 만나면 중첩되어 부모 요소의 마진 값으로 결합됩니다.</h4>
<h4 id="그래서-마진-병합은-블록-요소-간의-수직-정렬-간격을-일정하게-유지하거나-자식-요소를-통한-부모-요소의-여백-설정에서-유용할-수-있지만-레이아웃-코드에-대한-가독성이-떨어지므로-간접적인-여백-생성의-마진-병합을-피하고-최신의-flex나-grid를-사용하는-것이-좋다">그래서 마진 병합은 블록 요소 간의 수직 정렬 간격을 일정하게 유지하거나 자식 요소를 통한 부모 요소의 여백 설정에서 유용할 수 있지만, 레이아웃 코드에 대한 가독성이 떨어지므로 간접적인 여백 생성의 마진 병합을 피하고 최신의 Flex나 Grid를 사용하는 것이 좋다.</h4>
<h3 id="q-오픈-그래프open-graph는-무엇이고-어떤-역할을-하는지-설명하라">Q) 오픈 그래프(Open Graph)는 무엇이고 어떤 역할을 하는지 설명하라</h3>
<h4 id="a-오픈-그래프는-웹-페이지의-제목-설명-이미지-url-등의-메타-정보를-정의하는-규약프로토콜이다">A) 오픈 그래프는 웹 페이지의 제목, 설명, 이미지, URL 등의 메타 정보를 정의하는 규약(프로토콜)이다.</h4>
<h4 id="이-메타-정보를-통해-페이스북이나-카카오톡-등-다양한-플랫폼에서-url을-공유할-때-해달-페이지의-미리보기로-표시될-정보를-제공할-수-있고-사용자는-url로-접속하기-전에-해당-페이지의-기본-정보를-미리-확인할-수-있다">이 메타 정보를 통해 페이스북이나 카카오톡 등 다양한 플랫폼에서 URL을 공유할 때 해달 페이지의 미리보기로 표시될 정보를 제공할 수 있고, 사용자는 URL로 접속하기 전에 해당 페이지의 기본 정보를 미리 확인할 수 있다.</h4>
<h4 id="대부분의-플랫폼-검색-엔진은-공유된-url의-페이지-전체-로딩을-기다리지-않고-빠르게-메타-정보만-읽어서-해당-페이지의-정보를-파악하므로-오픈-그래프나-트위너-카드-같은-메타-정보를-잘-제공해야-검색-엔진-최적와seo에도-도움이-된다">대부분의 플랫폼 검색 엔진은 공유된 URL의 페이지 전체 로딩을 기다리지 않고 빠르게 메타 정보만 읽어서 해당 페이지의 정보를 파악하므로, 오픈 그래프나 트위너 카드 같은 메타 정보를 잘 제공해야 검색 엔진 최적와(SEO)에도 도움이 된다.</h4>
<h4 id="그래서-spasingle-page-application-같은-단일-html-제공-사이트는-페이지-구조에-따라-이러한-메타-정보를-위해-별도의-컴퓨팅-서버가-필요할-수-있다">그래서 SPA(Single Page Application) 같은 단일 HTML 제공 사이트는 페이지 구조에 따라 이러한 메타 정보를 위해 별도의 컴퓨팅 서버가 필요할 수 있다.</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[스타벅스 만들기 6]]></title>
            <link>https://velog.io/@pond_98/%EC%8A%A4%ED%83%80%EB%B2%85%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0-6</link>
            <guid>https://velog.io/@pond_98/%EC%8A%A4%ED%83%80%EB%B2%85%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0-6</guid>
            <pubDate>Sun, 30 Mar 2025 07:07:36 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/pond_98/post/9cb48038-e3f8-48d4-a31b-cff1653d5414/image.png" alt=""></p>
<h2 id="3d-애니메이션">3D 애니메이션</h2>
<p><img src="https://velog.velcdn.com/images/pond_98/post/c44dab14-6262-4fd8-8086-df84c7f5fdba/image.gif" alt=""></p>
<pre><code>.reserve-store {
  background-image: url(&quot;../images/reserve_store_bg.jpg&quot;);
  background-repeat: no-repeat;
  background-position: center;
  background-attachment: fixed;
  background-size: cover;
}

.reserve-store .inner {
  height: 600px;
  display: flex;
  justify-content: center;
  align-items: center;
}

.reserve-store .medal {
  width: 334px;
  height: 334px;
  perspective: 600px;
}

.reserve-store .medal .front,
.reserve-store .medal .back {
  width: 334px;
  height: 334px;
  position: absolute;
  backface-visibility: hidden;
  transition: 1s;
}

.reserve-store .medal .front {
  transform: rotateY(0deg);
}

.reserve-store .medal:hover .front {
  transform: rotateY(180deg);
}

.reserve-store .medal .back {
  transform: rotateY(-180deg);
}

.reserve-store .medal:hover .back {
  transform: rotateY(0deg);
}

.reserve-store .medal .back .btn {
  position: absolute;
  top: 240px;
  left: 0;
  right: 0;
  margin: auto;
}</code></pre><p><code>transform: rotateY(-180deg)</code> 요소를 뒤집는다.(Y축으로 -180도)
<code>backface-visibility : hidden</code> 뒷면을 안보이도록 처리한다.
<code>perspective: 600px;</code> 원근법을 이용해서 600px 거리에서 3차원의 효과를 시각적으로 보여준다.</p>
<pre><code>.reserve-store .medal .front {
  transform: rotateY(0deg);
}</code></pre><p><code>transform: rotateY(0deg);</code>을 적는 이유.
일부 브라우저에서는 지원이 안될 수 있기에 명시적으로 작성하여 적용해준다.</p>
<h2 id="스크롤-위치에-따른-애니메이션">스크롤 위치에 따른 애니메이션</h2>
<p><img src="https://velog.velcdn.com/images/pond_98/post/013107f5-87ee-4f45-999e-6abc99316326/image.gif" alt="">
현재 스크롤 위치에 따라 이미지와 텍스트가 좌/우에서 생성되는 느낌이 들도록 구현하였다.</p>
<pre><code>   &lt;section class=&quot;season-product scroll-spy&quot;&gt;
    &lt;div class=&quot;inner&quot;&gt;
      &lt;img src=&quot;./images/floating3.png&quot; alt=&quot;Icon&quot; class=&quot;floating floating3&quot; /&gt;

      &lt;img src=&quot;./images/season_product_image.png&quot; alt=&quot;&quot; class=&quot;product back-to-position to-right delay-0&quot; /&gt;
      &lt;div class=&quot;text-group&quot;&gt;
        &lt;img src=&quot;./images/season_product_text1.png&quot; alt=&quot;&quot; class=&quot;title back-to-position to-left delay-1&quot; /&gt;
        &lt;img src=&quot;./images/season_product_text2.png&quot; alt=&quot;&quot; class=&quot;description back-to-position to-left delay-2&quot; /&gt;
        &lt;div class=&quot;more back-to-position to-left delay-3&quot;&gt;
          &lt;a href=&quot;javascript:void(0)&quot; class=&quot;btn&quot;&gt;자세히 보기&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
   &lt;/section&gt;</code></pre><pre><code>const spyEls = document.querySelectorAll(&#39;section.scroll-spy&#39;);
spyEls.forEach(function (spyEl) {
  new ScrollMagic
  .Scene({
    triggerElement: spyEl, // 보여짐 여부를 감시할 요소를 지정
    triggerHook: 0.8
  })
  .setClassToggle(spyEl, &#39;show&#39;)
  .addTo(new ScrollMagic.Controller());
});
</code></pre><h3 id="scrollmagic">scrollMagic</h3>
<p>스크롤 요소의 상호작용을 위한 cdn 라이브러리이다.
<code>triggerHook: 0.8</code> 페이지 상단이 0 하단이 1이다. 현재 보고 있는 페이지의 0.8의 영역을 의미한다.
<code>.setClassToggle(spyEl, &#39;show&#39;)</code> 을 이용하여 페이지의 0.8 영역의 class에 <code>show</code>를 추가해준다.</p>
<pre><code>.back-to-position {
  opacity: 0;
  transition: 1s;
}

.back-to-position.to-right {
  transform: translateX(-150px);
}

.back-to-position.to-left {
  transform: translateX(150px);  
}

.show .back-to-position {
  opacity: 1;
  transform: translateX(0);
}

.show .back-to-position.delay-0 {
  transition-delay: 0s;
}

.show .back-to-position.delay-1 {
  transition-delay: 0.3s;

}

.show .back-to-position.delay-2 {
  transition-delay: 0.6s;
}

.show .back-to-position.delay-3 {
  transition-delay: 0.9s;
}</code></pre><p>class에 <code>show</code>가 있는 요소들에 애니메이션을 추가해주는 코드이다.</p>
<h2 id="fotter">Fotter</h2>
<p><img src="https://velog.velcdn.com/images/pond_98/post/62c4752d-e221-45c2-bc12-a2f5a996c3ed/image.png" alt=""></p>
<h3 id="html에서-특수-기호-사용하는-방법">html에서 특수 기호 사용하는 방법</h3>
<p>특수문자를 삽입할 때 &amp;와 ;를 사용하면 특수 문자를 사용 가능하다.
<code>&amp;copy;</code> : ©
<code>&amp;lt;</code> : &lt;
<code>&amp;gt;</code> : &gt;
<a href="https://www.ascii-code.com/">참고</a></p>
<h3 id="현재-연도-구하기">현재 연도 구하기</h3>
<pre><code>const thisYear = document.querySelector(&#39;.this-year&#39;)
thisYear.textContent = new Date().getFullYear();</code></pre><p>Date() 생성자는 날짜와 관련된 생성자이다.
<code>new Date().getFullYear()</code>을 이용하여 현재 연도를 구할 수 있다.</p>
<h2 id="상단-이동-버튼">상단 이동 버튼</h2>
<p><img src="https://velog.velcdn.com/images/pond_98/post/9139b50b-095a-4fa0-9dfc-ce69db306698/image.png" alt="">
ScrollToPlugin은 스크롤 애니메이션을 지원해주는 GSAP 플러그 인이다.</p>
<pre><code>  &lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.7/ScrollToPlugin.min.js&quot; integrity=&quot;sha512-uLq4Xf3PvaO+NTghyBWeh43DxozRnHMM2vcwlxY+KVc7xv2PMLimAerptg7AbrdN2qZjAwExwV/IqGm4YQBPww==&quot; crossorigin=&quot;anonymous&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/script&gt;</code></pre><pre><code>const toTopEl = document.querySelector(&#39;#to-top&#39;);

window.addEventListener(&#39;scroll&#39;, _.throttle(function() {
  console.log(window.scrollY);
  if (window.scrollY &gt; 500) {
    // gsap.to(요소, 지속시간, 옵션 );
    // 버튼 보이기
    gsap.to(toTopEl, 0.2, {
      x: 0
    });
  } else {
    // 버튼 숨기기
    gsap.to(toTopEl, 0.2, {
      x: 100
    });
  }
}, 300))

toTopEl.addEventListener(&#39;click&#39;, function() {
  gsap.to(window, 0.7, {
    scrollTo: 0
  });
});
</code></pre><p>Y축 기준으로 500 초과일 경우 상단 이동 버튼이 보이고 이하일 경우 버튼을 이동시켜 보이지 않도록 한다.
<code>scroolTo</code>를 이용하여 버튼 터치 시 최상단으로 이동할 수 있도록 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[스타벅스 만들기5 - 이미지, Youtube]]></title>
            <link>https://velog.io/@pond_98/%EC%8A%A4%ED%83%80%EB%B2%85%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B05-%EC%9D%B4%EB%AF%B8%EC%A7%80-Youtube</link>
            <guid>https://velog.io/@pond_98/%EC%8A%A4%ED%83%80%EB%B2%85%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B05-%EC%9D%B4%EB%AF%B8%EC%A7%80-Youtube</guid>
            <pubDate>Fri, 28 Mar 2025 10:03:41 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/pond_98/post/9544c073-2050-4823-8ee8-4775a6bc3911/image.png" alt=""></p>
<h2 id="리워드">리워드</h2>
<p><img src="https://velog.velcdn.com/images/pond_98/post/8c87eb79-493f-4861-91ea-2cb031cd1d7c/image.png" alt=""></p>
<pre><code>  &lt;section class=&quot;rewards&quot;&gt;
    &lt;div class=&quot;bg-left&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;bg-right&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;inner&quot;&gt;
      &lt;div class=&quot;btn-group&quot;&gt;
        &lt;div class=&quot;btn btn--reverse sign-up&quot;&gt;회원가입&lt;/div&gt;
        &lt;div class=&quot;btn sign-in&quot;&gt;로그인&lt;/div&gt;
        &lt;div class=&quot;btn gift&quot;&gt;스타벅스 모바일 카드 선물하기&lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;</code></pre><p><img src="https://velog.velcdn.com/images/pond_98/post/fd47a386-fb7d-4d76-9843-d79ad83db1c0/image.png" alt=""></p>
<pre><code>.rewards .btn-group {
  position: absolute;
  bottom: 24px;
  right: 0px;
  width: 250px;
  display: flex;
  flex-wrap: wrap;
}</code></pre><p><code>flex-wrap: wrap;</code>을 이용하여 만약 버튼이 부모 요소의 크기에 넘친다면 다음줄로 줄바꿈을 해준다.</p>
<pre><code>.rewards .btn-group .btn.gift{
  margin-top: 10px;
  flex-grow: 1;
}</code></pre><p><code>flex-grow: 1</code> 속성을 사용하여 너비를 전체 너비로 지정해줄 수 있다.</p>
<h2 id="유튜브-영상-첨부하기">유튜브 영상 첨부하기</h2>
<p><img src="https://velog.velcdn.com/images/pond_98/post/05b5c5af-ac4b-471e-8651-f4fe343e536b/image.gif" alt=""></p>
<h3 id="비율-조정">비율 조정</h3>
<pre><code>.youtube {
  position: relative;
  height: 700px;
  overflow: hidden;
  background-color: #333;
}

.youtube .youtube__area {
  width: 1920px;
  position: absolute;
  left: 50%;
  margin-left: calc(1920px / -2);
  top: 50%;
  margin-top: calc(1920px * 9 / 16 / -2);
}

.youtube .youtube__area::before{
  content: &quot;&quot;;
  display: block;
  width: 100%;
  height: 0;
  padding-top: 56.25%;
}</code></pre><p>일반적으로 유튜브와 같은 영상들은 16:9 비율을 통해 사용한다.
<code>padding-top: 56.25%;</code>를 이용하여 16:9 비율로 동영상 영역의 크기를 지정하였다.</p>
<pre><code>left: 50%;
margin-left: calc(1920px / -2);</code></pre><p>해당 코드를 통해 동영상이 항상 중앙 배치되도록 하였다.</p>
<h3 id="youtube-iframe-api">youtube iframe api</h3>
<p><a href="https://developers.google.com/youtube/iframe_api_reference">iframe player api</a>를 통해서 youtube 영상을 제아할 수 있다.</p>
<pre><code> tag.src = &quot;https://www.youtube.com/iframe_api&quot;;
 var firstScriptTag = document.getElementsByTagName(&#39;script&#39;)[0];
 firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

 function onYouTubeIframeAPIReady() {
   new YT.Player(&#39;player&#39;, {
     videoId: &#39;cyD74DajmH0&#39;, // 최초 재생할 유튜브 영상 ID
     playerVars: {
      autoplay: true, // 자동 재생 유무
      loop: true, // 반복 재생 유무
      playlist: &#39;cyD74DajmH0&#39; // 반복 재생할 유튜브 ID 목록
     },
     events: {
      onReady: function (event) {
        event.target.mute() // 음소거
      }
     }
   });
 }</code></pre><p><img src="https://velog.velcdn.com/images/pond_98/post/50a60088-6794-4424-8aad-e19eadfeddbb/image.png" alt=""></p>
<p>유튜브 영상 ID란 주소창에 &#39;=&#39;이후의 부분을 통해 알 수 있다.
(<code>onYouTubeIframeAPIReady</code>의 함수 이름을 변경하면 해당 함수를 사용할 수 없게된다. 이전에는 함수 이름의 경우 우리가 원하는 이름을 사용 가능하였지만 api를 사용하는 함수들의 경우 정해진 이름의 함수를 사용하는 것을 추천한다.)</p>
<h2 id="고정-이미지-배경">고정 이미지 배경</h2>
<p><img src="https://velog.velcdn.com/images/pond_98/post/58ef73c5-c80b-4fe9-904c-1570459d98d6/image.png" alt=""></p>
<pre><code>.pick-your-favorite {
  background-image: url(&quot;../images/favorite_bg.jpg&quot;);
  background-repeat: no-repeat;
  background-position: center;
  background-attachment: fixed;
  background-size: cover;
}</code></pre><p><code>background-attachment: fixed</code> 해당 이미지가 상하 스크롤 될때 같이 스크롤 되지 않고 뷰포트에 고정시켜 배경 이미지와 같이 고정시켜주다.
<code>background-size: cover</code> 배경의 이미지를 더 넓은 너비에 맞춰서 비율을 조정해준다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[스타벅스 만들기4 - 슬라이드]]></title>
            <link>https://velog.io/@pond_98/%EC%8A%A4%ED%83%80%EB%B2%85%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B04-%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C</link>
            <guid>https://velog.io/@pond_98/%EC%8A%A4%ED%83%80%EB%B2%85%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B04-%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C</guid>
            <pubDate>Sun, 23 Mar 2025 11:50:20 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/pond_98/post/52e1397c-93f4-4c0b-9702-ccec6c4c38bf/image.png" alt=""></p>
<h2 id="swiper를-이용하여-움직이는-공지사항">Swiper를 이용하여 움직이는 공지사항</h2>
<p><img src="https://velog.velcdn.com/images/pond_98/post/66e44757-0f7c-436a-9979-39bf7b475d17/image.gif" alt=""></p>
<p>Swiper을 이용하여 공지사항의 텍스트가 자동으로 움직으도록 구현하였다.</p>
<p><a href="https://velog.io/@pond_98/JS-Swiper">Swiper</a> 에 대한 정보는 링크 참조</p>
<pre><code>&lt;div class=&quot;inner__left&quot;&gt;
          &lt;h2&gt;공지사항&lt;/h2&gt;
          &lt;div class=&quot;swiper&quot;&gt;
            &lt;div class=&quot;swiper-wrapper&quot;&gt;
              &lt;div class=&quot;swiper-slide&quot;&gt;
                &lt;a href=&quot;javascript:void(0)&quot;&gt;[당첨자 발표] 2025 스타벅스 영수증 이벤트&lt;/a&gt;
              &lt;/div&gt;
              &lt;div class=&quot;swiper-slide&quot;&gt;
                &lt;a href=&quot;javascript:void(0)&quot;&gt;스타벅스 카드 온라인 재충전 / 모바일 카드 구매 가능 금액 안내&lt;/a&gt;
              &lt;/div&gt;
              &lt;div class=&quot;swiper-slide&quot;&gt;
                &lt;a href=&quot;javascript:void(0)&quot;&gt;스타벅스 카드 이용약관 개정 안내&lt;/a&gt;
              &lt;/div&gt;
              &lt;div class=&quot;swiper-slide&quot;&gt;
                &lt;a href=&quot;javascript:void(0)&quot;&gt;시스템 개선 및 서비스 점검 안내&lt;/a&gt;
              &lt;/div&gt;
            &lt;/div&gt;
          &lt;/div&gt;
          &lt;a href=&quot;javascript:void(0)&quot; class=&quot;notice-line__more&quot;&gt;
            &lt;div class=&quot;material-icons&quot;&gt;add_circle&lt;/div&gt;
          &lt;/a&gt;
        &lt;/div&gt;</code></pre><pre><code>new Swiper(&#39;.notice-line .swiper&#39;, {
  direction: &#39;vertical&#39;,
  autoplay: true,
  loop: true
});</code></pre><p><code>new Swiper(선택자, 옵션)</code>
direction : 슬라이드 방향 지정
autoplay : 자동 재생과 관련된 설정
loop : 슬라이드 루프(무한 회전)을 활성화, 마지막 슬라이드 다음에 다시 첫 번째 슬라이드가 나타난다.</p>
<h2 id="프로모션-숨기기">프로모션 숨기기</h2>
<p><img src="https://velog.velcdn.com/images/pond_98/post/cab63e9f-6aa3-4e36-92fe-e44ce06a70aa/image.gif" alt=""></p>
<pre><code>&lt;div class=&quot;inner__right&quot;&gt;
  &lt;h2&gt;스타벅스 프로모션&lt;/h2&gt;
  &lt;div class=&quot;toggle-promotion&quot;&gt;
    &lt;div class=&quot;material-icons&quot;&gt;expand_less&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</code></pre><pre><code>.notice .promotion {
  height: 693px;
  background-color: #f6f5ef;
  position: relative;
  transition: height 0.4s;
  overflow: hidden;
}

.notice .promotion.hide {
  height: 0px;
}</code></pre><pre><code>const promotionEl = document.querySelector(&#39;.promotion&#39;);
const promotionToggleBtn = document.querySelector(&#39;.toggle-promotion&#39;);
const promotionToggleBtnImg = document.querySelector(&#39;.toggle-promotion .material-icons&#39;);

let isHidePromotion = false;
promotionToggleBtn.addEventListener(&#39;click&#39;, function () {
  isHidePromotion = !isHidePromotion
  if(isHidePromotion) {
    // 숨김 처리
    promotionEl.classList.add(&#39;hide&#39;);
    promotionToggleBtnImg.textContent = &quot;expand_more&quot;
  }else {
    // 보임 처리
    promotionEl.classList.remove(&#39;hide&#39;);
    promotionToggleBtnImg.textContent = &quot;expand_less&quot;;
  }
});</code></pre><p>이전 장에서 진행한 matarial icons을 이용하여 프로모션 버튼 모양을 구현하였다.
<code>addEventListener</code>을 이용하여 <code>click</code>이 일어날 때마다 함수가 호출되도록 하였다.
<code>isHidePromotion</code>의 기본 값이 <code>false</code>로 지정하여 <code>click</code> 행위가 일어날 때마다 <code>isHidePromotion = !isHidePromotion</code>로 <code>isHidePromotion</code> 값을 반대 (만얄 false면 true로)로 변경시켰다.</p>
<p>만약 <code>isHidePromotion</code> 가 <code>true</code>가 되면</p>
<pre><code>  promotionEl.classList.add(&#39;hide&#39;);
  promotionToggleBtnImg.textContent = &quot;expand_more&quot;</code></pre><p><code>promotionEl</code> class에 hide를 추가함으로 CSS 코드에 hide 부분에 해당하는 스타일을 따르도록 만들고 텍스트를 <code>expand_more</code>로 변경시키면서 아이콘 또한 변경시켰다.</p>
<p>만약 <code>isHidePromotion</code> 가 <code>false</code>가 되면 하단에 해당하는 코드가 호출되도록 하였다.</p>
<h2 id="프로모션-슬라이드">프로모션 슬라이드</h2>
<p><img src="https://velog.velcdn.com/images/pond_98/post/2de0dbb3-caf2-4bd0-84b2-b17225c5dbea/image.gif" alt=""></p>
<pre><code>    &lt;div class=&quot;promotion&quot;&gt;
      &lt;div class=&quot;swiper-pagination&quot;&gt;&lt;/div&gt;
      &lt;div class=&quot;swiper-prev&quot;&gt;
        &lt;div class=&quot;material-icons&quot;&gt;chevron_left&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class=&quot;swiper-next&quot;&gt;
        &lt;div class=&quot;material-icons&quot;&gt;chevron_right&lt;/div&gt;
      &lt;/div&gt; 
    &lt;/div&gt;</code></pre><pre><code>new Swiper(&#39;.promotion .swiper&#39;, {
  direction: &#39;horizontal&#39;,
  slidesPerView: 3, 
  spaceBetween: 10, 
  centeredSlides: true, 
  loop: true,
  autoplay: {
    delay: 300
  },
  pagination: {
    el: &#39;.promotion .swiper-pagination&#39;, // 페이지 번호 요소 선택자
    clickable: true // 사용자 페이지 번호 요소 제어 여부
  },
  navigation: {
    prevEl: &#39;.promotion .swiper-prev&#39;,
    nextEl: &#39;.promotion .swiper-next&#39;
  }
});</code></pre><p>slidesPerView : 한번에 보여줄 슬라이드 개수
spaceBetween : 슬라이드 사이 여백
centeredSlides : 1번 슬라이드가 가운데 보이기</p>
<h4 id="swiper-pagination">swiper-pagination</h4>
<p>슬라이드 페이지 번호 및 이동</p>
<h4 id="swiper-prev-swiper-next">swiper-prev, swiper-next</h4>
<p>슬라이드 이전, 다음 버튼</p>
<h2 id="개발자-도구로-swiper-살펴보기">개발자 도구로 Swiper 살펴보기</h2>
<p><img src="https://velog.velcdn.com/images/pond_98/post/2505f19d-f776-4875-bc9f-f4ac16b12111/image.png" alt="">
Swiper의 경우 자동으로 클래스 명이 변경된다.
현재 슬라이드의 경우 class에 <code>active</code>가 붙어 있고 이전/다음 슬라이드에는 각각 <code>prev</code>,<code>next</code>가 붙었다.
이처럼 Swiper는 특정 클래스 명을 변경할 수 있다.
해당 기능을 이용하여 CSS을 이용하여 스타일을 변경할 수 있다.
하단 그림과 같이 현재 보고 있는 슬라이드는 선명하게 보이지만, 이전/다음 슬라이드의 경우 흐른 이미지로 보인다.
<img src="https://velog.velcdn.com/images/pond_98/post/0a88f985-2449-403b-9748-f74ce4aef361/image.png" alt=""></p>
<pre><code>.notice .promotion .swiper-slide {
  opacity: 0.5;
  transform: opacity 1s;
  position: relative;
}

.notice .promotion .swiper-slide-active {
  opacity: 1;
}</code></pre><p><code>swiper-slide</code>에 스타일에 <code>opacity</code>를 이용하여 선명도를 0.5로 변경하였고, <code>swiper-slide-active</code> 해당하는 <code>swiper-slide</code>에만 선명도를 1로 지정하였다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS-Swiper]]></title>
            <link>https://velog.io/@pond_98/JS-Swiper</link>
            <guid>https://velog.io/@pond_98/JS-Swiper</guid>
            <pubDate>Sun, 23 Mar 2025 11:17:59 GMT</pubDate>
            <description><![CDATA[<h2 id="swiper">Swiper</h2>
<p>HTML, CSS, JS 에서 반응형 슬라이드 및 스와이프 기능을 쉽게 구현할 수 있도록 해주는 라이브러리</p>
<p><a href="https://swiperjs.com/">https://swiperjs.com/</a></p>
<h3 id="사용방법">사용방법</h3>
<h4 id="1-html에-swiper-라이브러리-삽입">1) HTML에 Swiper 라이브러리 삽입</h4>
<pre><code>&lt;link
  rel=&quot;stylesheet&quot;
  href=&quot;https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css&quot;
/&gt;

&lt;script src=&quot;https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js&quot;&gt;&lt;/script&gt;</code></pre><h4 id="2-html에-swiper-컨테이너-생성">2) HTML에 Swiper 컨테이너 생성</h4>
<pre><code>&lt;div class=&quot;swiper&quot;&gt;
  &lt;div class=&quot;swiper-wrapper&quot;&gt;
    &lt;div class=&quot;swiper-slide&quot;&gt;Slide 1&lt;/div&gt;
    &lt;div class=&quot;swiper-slide&quot;&gt;Slide 2&lt;/div&gt;
    &lt;div class=&quot;swiper-slide&quot;&gt;Slide 3&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[스타벅스 만들기 3 - 헤더2 (header)]]></title>
            <link>https://velog.io/@pond_98/%EC%8A%A4%ED%83%80%EB%B2%85%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0-3-%ED%97%A4%EB%8D%942-header</link>
            <guid>https://velog.io/@pond_98/%EC%8A%A4%ED%83%80%EB%B2%85%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0-3-%ED%97%A4%EB%8D%942-header</guid>
            <pubDate>Sat, 22 Mar 2025 03:40:21 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/pond_98/post/418060d5-66f3-4d35-8cae-b0ddb48932fd/image.png" alt=""></p>
<h3 id="gsap-greensock-animation-platform">GSAP (GreenSock Animation Platform)</h3>
<p>JavaScript를 이용하여 웹 애니메이션을 만들때 도움을 주는 라이브러리
<a href="https://cdnjs.com/libraries/gsap">https://cdnjs.com/libraries/gsap</a>
해당 사이트를 통해 gsap 라이브러리를 이용할 수 있다.</p>
<h3 id="뱃지">뱃지</h3>
<pre><code>&lt;div class=&quot;badges&quot;&gt;
  &lt;div class=&quot;badge&quot;&gt;
    &lt;img src=&quot;./images/badge1.jpg&quot; alt=&quot;Badge&quot; /&gt;
  &lt;/div&gt;
  &lt;div class=&quot;badge&quot;&gt;
  &lt;img src=&quot;./images/badge2.jpg&quot; alt=&quot;Badge&quot; /&gt;
&lt;/div&gt;</code></pre><pre><code>const badgeEl = document.querySelector(&#39;header .badges&#39;);

window.addEventListener(&#39;scroll&#39;, _.throttle(function() {
  console.log(window.scrollY);
  if (window.scrollY &gt; 500) {
    // 배지 숨기기
    // gsap.to(요소, 지속시간, 옵션 );
    gsap.to(badgeEl, 0.6, {
      opacity: 0,
      display: &#39;none&#39;
    });
  } else {
    // 배지 보이기
    gsap.to(badgeEl, 0.6, {
      opacity: 1,
      display: &#39;block&#39;
    });
  }
}, 300))</code></pre><p>스크롤을 함으로써 특정 영역 이상 스크롤을 하였을 경우 뱃지를 숨긴다.
<code>gsap.to(요소, 지속시간, 옵션);</code>을 사용함으로써 뱃지가 숨겨지거나 보여질때 지속시간을 두어 갑자기 생기거나 없어지는 등의 어색함을 없앨 수 있다.
뱃지가 숨겨졌을 때 <code>opacity: 0</code>만 사용하고 <code>display: &#39;none&#39;</code>를 사용하지 않았을 경우 뱃지만 숨겨지지만 해당 숨겨진 뱃지가 터치되는 불상사가 생길 수 있다.</p>
<h3 id="이미지">이미지</h3>
<pre><code>.visual .cup1.image {
  position: absolute;
  bottom: 0;
  right: -47px;
}

.visual .cup1.text {
  position: absolute;
  top: 38px;
  right: 171px;
}</code></pre><p>CSS 에서 상품 이미지와 이름을 사용할때 동일한 상품끼리 <code>.visual .cup1</code>를 사용함으로써 <code>image</code>의 위치만 이동시켜도 <code>text</code>의 위치도 자동으로 이동시켜 코드를 추가로 수정할 번거러움을 없앨 수 있다.</p>
<h3 id="순차적-애니메이션">순차적 애니메이션</h3>
<p><img src="https://velog.velcdn.com/images/pond_98/post/9eb96bd5-0cb4-4387-a958-cd970733bc23/image.gif" alt=""></p>
<pre><code>const fadeEls = document.querySelectorAll(&#39;.visual .fade-in&#39;);
fadeEls.forEach(function (fadeEl, index) {
  gsap.to(fadeEl, 1, {
    delay: (index + 1) * 0.7,
    opacity: 1
  });
});</code></pre><p><code>fade-in</code>의 이름의 모든 변수를 <code>fadeEls</code>로 선택하였다.
<code>foreach</code> 반복문을 사용하여 <code>fade-in</code> 이름의 수 만큼 반복 시켰다.
index의 초기 값은 0이므로 첫 번째 이미지가 생기기 위해 딜레이를 0.7초((0+1)*0.7=0.7)를 주었고 차례로 1.4, 2.1, 2.8 초의 딜레이를 적용시켰다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML-BEM]]></title>
            <link>https://velog.io/@pond_98/HTML-BEM</link>
            <guid>https://velog.io/@pond_98/HTML-BEM</guid>
            <pubDate>Sat, 22 Mar 2025 01:58:46 GMT</pubDate>
            <description><![CDATA[<h3 id="bem-block-element-modifier">BEM (Block Element Modifier)</h3>
<p>HTML 클래스 속성의 작명법</p>
<p>요소__일부분 : Underscore(Lodash) 기호로 요소의 일부분을 표시
요소--상태 : Hyphen(Dash) 기호로 요소의 상태를 표시</p>
<p>BEM 미적용 코드</p>
<pre><code>&lt;div class=&quot;container&quot;&gt;
  &lt;div class=&quot;name&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;item&quot;&gt;
    &lt;div class=&quot;name&quot;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;btn primary&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;btn success&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;btn error&quot;&gt;&lt;/div&gt;</code></pre><p>BEM 적용 코드</p>
<pre><code>&lt;div class=&quot;container&quot;&gt;
  &lt;div class=&quot;container__name&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;item&quot;&gt;
    &lt;div class=&quot;item__name&quot;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;btn--primary&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;btn--success&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;btn--error&quot;&gt;&lt;/div&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[스타벅스 만들기 2 - 헤더 (header)]]></title>
            <link>https://velog.io/@pond_98/%EC%8A%A4%ED%83%80%EB%B2%85%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0-2-%ED%97%A4%EB%8D%94-header</link>
            <guid>https://velog.io/@pond_98/%EC%8A%A4%ED%83%80%EB%B2%85%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0-2-%ED%97%A4%EB%8D%94-header</guid>
            <pubDate>Mon, 17 Mar 2025 06:39:09 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/pond_98/post/7066bfb3-1636-41f1-80c5-4b6a8a91c581/image.png" alt=""></p>
<h3 id="로고-logo">로고 (logo)</h3>
<pre><code>&lt;a href=&quot;/&quot; class=&quot;logo&quot;&gt; &lt;/a&gt;</code></pre><p>a 태그를 이용하여 특정 페이지로 이동할 수 있도록 해준다. 이때 <code>href=&quot;/&quot;</code>를 입력함으로써 로고 클릭 시 메인 페이지로 이동한다는 것을 의미한다.</p>
<pre><code>img {
  display: block;
}</code></pre><p>이미지는 inline 요소이기에 하단에 불필요한 백이 생길 수 있다.
이때 이미지를 block 요소로 지정함으로써 불필요한 하단 여백이 생기는 것을 방지할 수 있다.</p>
<h3 id="absolute">absolute</h3>
<pre><code>.inner {
  width: 1100px;
  margin: 0 auto;
  position: relative;
}</code></pre><pre><code>header .logo {
  height: 75px;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  margin: auto;
}</code></pre><p>부모요소에 <code>position: relative;</code> 속성을 추가하고 logo에 <code>position: absolute;</code> 속성과 <code>margin: auto;</code> 속성을 추가함으로써 가운데 정렬하도록 하였다.
<code>top: 0;</code>와 <code>bottom: 0;</code>을 속성을 추가해야지만 수직 중앙 정렬을 할 수 있다.</p>
<h3 id="링크">링크</h3>
<pre><code>&lt;li&gt;
  &lt;a href=&quot;javascript:void(0)&quot;&gt;My Starbucks&lt;/a&gt;
&lt;/li&gt;</code></pre><p><code>javascript:void(0)</code>를 사용함으로써 a 태그에 아무 동작도 하지 않도록 할 수 있다.
(<code>javascript:void(0)</code> 대신 <code>#</code>를 사용가능하나 <code>#</code> 사용 시 실제 #로 이동하기에 <code>javascript:void(0)</code>를 사용하는 것을 추천)</p>
<h3 id="before">before</h3>
<p><img src="https://velog.velcdn.com/images/pond_98/post/8ad2d9a6-2a99-4bf7-bbaa-95a5410eb2fb/image.png" alt=""></p>
<pre><code>header .sub-menu ul.menu li::before {
  content: &quot;&quot;;
  display: block;
  width: 0.7px;
  height: 12px;
  background-color: #d4d4d4;
  position: absolute;
  top: 0;
  bottom: 0;
  margin: auto;
}</code></pre><p>가상요소 <code>::before</code>을 사용함으로써 해당 요소의 앞에 특정 요소를 추가할 수 있다.</p>
<pre><code>header .sub-menu ul.menu li:first-child:before {
  display: none;
}</code></pre><p><code>:first-child</code>을 사용함으로써 첫번째 태그에는 가상요소가 출력되지 않도록 할 수 있다.</p>
<h3 id="focus">focus</h3>
<p><img src="https://velog.velcdn.com/images/pond_98/post/a9b2f9d7-75bc-49fb-950e-de4630b65272/image.png" alt=""></p>
<pre><code>header .sub-menu .search input:focus {
  width: 190px;
  border-color: #669900;
}</code></pre><p>해당 태그를 포커스(클릭 시)하는 동안 해당 속성을 추가해준다.
위 코드에서는 가로 길이와 테두리 색을 바꿔준다.</p>
<h3 id="hover">:hover</h3>
<p><img src="https://velog.velcdn.com/images/pond_98/post/b81728e3-cbb4-450e-9768-074a9a7c1628/image.png" alt=""></p>
<pre><code>header .main-menu .item .item__contents {
  width: 100%;
  position: fixed;
  left: 0;
  display: none;
}</code></pre><pre><code>header .main-menu .item:hover .item__contents {
  display: block;
}</code></pre><p>상단 메뉴를 터치하고 있는 동안 하단 메뉴가 나오도록 해준다.
기본으로 <code>display: none</code> 속성을 통해 해당 메뉴가 출력되지 않도록 한 후 <code>:hover</code> 속성을 통해 해당 메뉴에 마우스가 이동해있을 때 <code>disply: block</code>을 통해 출력되도록 해준다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[스타벅스 만들기 1 - 기본 준비]]></title>
            <link>https://velog.io/@pond_98/%EC%8A%A4%ED%83%80%EB%B2%85%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0-1-%EA%B8%B0%EB%B3%B8-%EC%A4%80%EB%B9%84</link>
            <guid>https://velog.io/@pond_98/%EC%8A%A4%ED%83%80%EB%B2%85%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0-1-%EA%B8%B0%EB%B3%B8-%EC%A4%80%EB%B9%84</guid>
            <pubDate>Sun, 16 Mar 2025 10:01:25 GMT</pubDate>
            <description><![CDATA[<h3 id="오픈그래프">오픈그래프</h3>
<p>웹 사이트가 쇼셜미디어(카카오톡 등)에 공유될때 우선적으로 활용되는 정보 지정</p>
<pre><code>  &lt;meta property=&quot;og:type&quot; content=&quot;website&quot; /&gt;
  &lt;meta property=&quot;og:site_name&quot; content=&quot;Starbucks&quot; /&gt;
  &lt;meta property=&quot;og:title&quot; content=&quot;Starbucks Korea&quot; /&gt;
  &lt;meta property=&quot;og:description&quot; content=&quot;스타벅스에서 매일 새로운 커피 경험을 만나보세요.&quot; /&gt;
  &lt;meta property=&quot;og:image&quot; content=&quot;./images/starbucks_seo.jpg&quot; /&gt;
  &lt;meta property=&quot;og:url&quot; content=&quot;https://starbucks.co.kr&quot; /&gt;
</code></pre><p><code>og:type</code> : 페이지의 유형
<code>og:site_name</code> : 속한 사이트의 이름
<code>og:title</code> : 페이지의 이름(제목)
<code>og:description</code> : 페이지의 간단한 설명
<code>og:image</code> : 페이지의 대표 이미지 주소(URL)
<code>og:url</code> : 페이지 주소(URL)</p>
<p>ex) 카카오톡의 오픈그래프 예시
<img src="https://velog.velcdn.com/images/pond_98/post/29f16254-3757-416e-acd1-b1939f9b3860/image.png" alt=""></p>
<h3 id="트위터-카드">트위터 카드</h3>
<p>웹 사이트가 쇼셜미디어(X(구 트위터))에 공유될때 우선적으로 활용되는 정보 지정</p>
<pre><code>  &lt;meta property=&quot;twitter:card&quot; content=&quot;summary&quot; /&gt;
  &lt;meta property=&quot;twitter:site&quot; content=&quot;Starbucks&quot; /&gt;
  &lt;meta property=&quot;twitter:title&quot; content=&quot;Starbucks Korea&quot; /&gt;
  &lt;meta property=&quot;twitter:description&quot; content=&quot;스타벅스에서 매일 새로운 커피 경험을 만나보세요.&quot; /&gt;
  &lt;meta property=&quot;twitter:image&quot; content=&quot;./images/starbucks_seo.jpg&quot; /&gt;
  &lt;meta property=&quot;twitter:url&quot; content=&quot;https://starbucks.co.kr&quot; /&gt;</code></pre><p><code>twitter:card</code> : 페이지(카드)의 유형
<code>twitter:site</code> : 속한 사이트의 이름
<code>twitter:title</code> : 페이지의 이름(제목)
<code>twitter:description</code> : 페이지의 간단한 설명
<code>twitter:image</code> : 페이지의 대표 이미지 주소(URL)
<code>twitter:url</code> : 페이지 주소(URL)</p>
<p>ex) X(구 트위터)
<img src="https://velog.velcdn.com/images/pond_98/post/db40974c-9f89-44ff-8a08-9c3bc27267c2/image.png" alt=""></p>
<h3 id="파비콘-favicon">파비콘 (Favicon)</h3>
<p>웹페이즈를 나타내는 아이콘
루트 경로에 위치하며 이미지 파일의 이름은 favicon으로 지정하는 것이 원칙
<code>&lt;link rel=&quot;icon&quot; href=&quot;./favicon.ico&quot; &gt;</code></p>
<p><img src="https://velog.velcdn.com/images/pond_98/post/892d930a-0f2b-4ca0-ad63-0a7e9d68817a/image.png" alt=""></p>
<h3 id="google-fonts">Google Fonts</h3>
<p>웹 페이지에서 사용할 폰트 지정</p>
<pre><code>  &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=Nanum+Gothic:wght@400;700&amp;display=swap&quot; rel=&quot;stylesheet&quot;&gt;
</code></pre><p>CSS 파일에서 폰트 적용</p>
<pre><code>  font-family: &quot;Nanum Gothic&quot;, sans-serif;</code></pre><h3 id="google-material-icons">Google Material Icons</h3>
<p>구글에서 제공하는 아이콘을 사용 가능</p>
<pre><code>&lt;link rel=&quot;stylesheet&quot; href=&quot;https://fonts.googleapis.com/icon?family=Material+Icons&quot; /&gt;</code></pre><p><code>&lt;div class=&quot;material-icons&quot;&gt;search&lt;/div&gt;</code>
ex)
<img src="https://velog.velcdn.com/images/pond_98/post/c71799a6-afe1-4221-b758-4fba930a0a73/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS 특징 2]]></title>
            <link>https://velog.io/@pond_98/JS-%ED%8A%B9%EC%A7%95-2</link>
            <guid>https://velog.io/@pond_98/JS-%ED%8A%B9%EC%A7%95-2</guid>
            <pubDate>Sun, 16 Mar 2025 05:35:56 GMT</pubDate>
            <description><![CDATA[<h2 id="dom-api">DOM API</h2>
<p>=Document Object Model, Application Programming Interface
자바스크립트에서 HTML을 제어하는 명령들 (이미 약속되어 있는 명령)</p>
<h4 id="defer">defer</h4>
<p><code>&lt;script defer src=&quot;./main.js&quot;&gt;&lt;/script&gt;</code>
defer : 가져온 JS 파일을 HTML 문서 분석 이후에 실행하도록 지시하는 HTML 속성</p>
<pre><code>// HTML 요소(Element) 1개 검색 / 찾기
let boxEl = document.querySelector(&#39;.box&#39;);

// HTML 요소에 적용할 수 있는 메소드
box.El.addEventListener();

// 인수(Arguments)를 추가 가능
box.El.addEventListener(1, 2);

// 1 - 이벤트(Event, 상황)
box.El.addEventListener(&#39;click&#39;, 2);

// 2 - 핸들러(Handler, 실행할 함수)
box.El.addEventListener(&#39;click&#39;, function () {
  console.log(&#39;Click&#39;);
});
</code></pre><pre><code>// HTML 요소(Element) 검색 / 찾기
const boxEl = document.querySelector(&#39;.box&#39;);

// 요소의 클래스 정보 객체 활용
boxEl.classList.add(&#39;active&#39;);
let isContains = boxEl.classList.contains(&#39;active&#39;);
console.log(isContains); // true

boxEl.classList.remove(&#39;active&#39;);
isContains = boxEl.classList.contains(&#39;active&#39;);
console.log(isContains); // false</code></pre><pre><code>// HTML 요소(Element) 모두 검색 / 찾기
const boxEls = document.querSelectorAll(&#39;.box&#39;)
console.log(boxEls);

// 찾은 요소들 반복해서 함수 실행
// 익명 함수를 인수로 추가
boxEls.forEach(function () {});

// 첫 번째 매개변수(boxEl): 반복 중인 요소
// 두 번째 매개변수(index): 반복 중인 번호
boxEls.forEach(function (boxEl, index) {});

//출력
boxEls.forEach(function (boxEl, index) {
  boxEls.classList.add(`order-${index + 1}`);
  console.log(index, boxEl);
});</code></pre><p><img src="https://velog.velcdn.com/images/pond_98/post/614d1312-7916-4c17-8d9d-8226acb21c7f/image.png" alt=""></p>
<pre><code>const boxEl = document.querSelector(&#39;.box&#39;);

// Getter, 값을 얻는 용도
console.log(boxEl.textContent); // box의 내용 반환

// Setter, 값을 지정하는 용도
boxEl.textContent = &#39;Hello!&#39;;
console.log(boxEl.textContent); // Hello!
</code></pre><h2 id="메소드-체이닝-method-chaining">메소드 체이닝 (Method Chaining)</h2>
<p>메소드를 체인처럼 이어서 만드는 것</p>
<pre><code>const a =&#39;Hello&#39;;
// split : 문자를 인수 기준으로 쪼개서 배열로 전환
// reverse : 배열을 뒤집기
//join : 배열을 인수 기준으로 문자로 변합해 반환
const b = a.split(&#39;&#39;).reverse().join(&#39;&#39;); // 메소드 체이닝

console.log(a); // Hello
console.log(n); // olleH</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[JS 특징 1]]></title>
            <link>https://velog.io/@pond_98/JS-%ED%8A%B9%EC%A7%95-1</link>
            <guid>https://velog.io/@pond_98/JS-%ED%8A%B9%EC%A7%95-1</guid>
            <pubDate>Sat, 15 Mar 2025 06:38:29 GMT</pubDate>
            <description><![CDATA[<h2 id="표기법">표기법</h2>
<h3 id="dash-casekebab-case">dash-case(kebab-case)</h3>
<p><code>hello-yello-green-apple</code>
단어 사이에 &#39;-&#39;를 사용하는 방식
HTTML, CSS에서 주로 사용</p>
<h3 id="snake_case">snake_case</h3>
<p><code>hello_yello_green_apple</code>
단어 사이에 &#39;_&#39;를 사용하는 방식
HTTML, CSS에서 주로 사용</p>
<h3 id="camelcase">camelCase</h3>
<p><code>helloYelloGreenApple</code>
첫 번째 단어를 제외하고 단어 앞 글자에 대문자를 사용하는 방식
JS에서 주로 사용</p>
<h3 id="parcelcase">ParcelCase</h3>
<p><code>HelloYelloGreenApple</code>
단어 앞 글자에 대문자를 사용하는 방식
JS에서 주로 사용</p>
<h3 id="zero-based-numbering">Zero-based Numbering</h3>
<p>0 기반 숫자 매기기
특수한 경우를 제외하고 0부터 숫자를 시작한다.</p>
<h2 id="데이터-종류-자료형">데이터 종류 (자료형)</h2>
<h3 id="string-문자데이터">String (문자데이터)</h3>
<p>따옴표를 사용한다.</p>
<pre><code>let myName = &quot;pond_98&quot;;
let hello = &#39;Hello ${myName}&#39;;

console.log(myName); // pond_98
console.log(hello); // Hello pond_98</code></pre><h3 id="number-숫자-데이터">Number (숫자 데이터)</h3>
<p>정수 및 부동소수점 숫자를 나타낸다.</p>
<pre><code>let number = 123;
let opacity = 1.23;

console.log(number); // 123
console.log(opacity); // 1.23</code></pre><h3 id="boolean-불린-데이터">Boolean (불린 데이터)</h3>
<p>true, flase 두 가지 값밖에 없는 논리 데이터</p>
<pre><code>let checked = true;
let fake = false;

console.log(checked); // true
console.log(fake); // false</code></pre><h3 id="undefined">Undefined</h3>
<p>값이 할당되지 않은 상태를 나타낸다.</p>
<pre><code>let undef;
let obj = { abc: 123 };

console.log(undef); // undefined
console.log(obj.abc); // 123
console.log(obj.def); // undefined</code></pre><h3 id="null">Null</h3>
<p>어떤 값이 의도적으로 비어있음을 의미한다</p>
<pre><code>let empty = null;

console.log(empty); // null</code></pre><h3 id="object-객체-데이터">Object (객체 데이터)</h3>
<p>여러 데이터를 Key:Value 형태로 저장한다.</p>
<pre><code>let user = {
  // Key: Value,
  name: &#39;Pond_98&#39;,
  age: 27,
  isValued: true
};

console.log(user.name); // Pond_98
console.log(user.age); // 27
console.log(user.isValued); // true</code></pre><h3 id="array-배열-데이터">Array (배열 데이터)</h3>
<p>여러 데이터를 순차적으로 저장한다.</p>
<pre><code>let fruits = [&#39;Apple&#39;, &#39;Banna&#39;, &#39;Cherry&#39;];

console.log(fruits[0]); // &#39;Apple&#39;
console.log(fruits[0]); // &#39;Banna&#39;
console.log(fruits[0]); // &#39;Cherry&#39;</code></pre><h2 id="변수">변수</h2>
<p>데이터를 저장하고 참조(사용)하는 데이터의 이름
ex) var, let, const</p>
<pre><code>// 재사용 가능
// 변수 선언
let a = 2;
let b = 5;

console.log(a + b); // 7
console.log(a - b); // -3</code></pre><pre><code>// 값(데이터)의 재할당 가능
let a = 2;
console.log(a); // 2

a = 15;
console.log(a); // 15</code></pre><pre><code>// 값(데이터)의 재할당 불가
const a = 2;
console.log(a); // 2

a = 15;
console.log(a); // 에러 발생</code></pre><h2 id="예약어">예약어</h2>
<p>특별한 의미를 가지고 있어, 변수나 함수 이름 등으로 사용할 수 없는 단어</p>
<pre><code>let this = &#39;Hello&#39;; // SyntaxError
let if = 123; // SyntaxError
let break = true; // SyntaxError</code></pre><h2 id="함수-function">함수 (function)</h2>
<p>특정 동작(기능)을 수행하는 일부 코드의 집합(부분)</p>
<pre><code>// 함수 선언
function helloFunc() {
  // 실행 코드
  console.log(123);
}

// 함수 호출
helloFunc(); // 123</code></pre><pre><code>function returnFunc() {
  return 123;
}

let a = returnFunc();

console.log(a); // 123
</code></pre><pre><code>function sum(a, b) { // a와 b는 매개변수(Parameters)
  return a + b;
}

// 재사용
let a = sum(1, 2); // 1과 2는 인수(Arguments)
let b = sun(5, 7)

console.log(a, b) // 3, 12
</code></pre><pre><code>// 기명(이름이 있는) 함수
// 함수 선언
function hello() {
  console.log(&#39;Hello&#39;)
}

// 익명(이름이 없는) 함수
// 함수 표현
let world = function() {
  console.log(&#39;World&#39;)
}

// 함수 호출
hello() // Hello
world() // World</code></pre><pre><code>// 객체 데이터
const myData = {
  name: &#39;Pond_98&#39;
  age: 27,
  // 메소드(Method)
  getName: function() {
    return this.name
  }
};

const hisName = myData.getName();
console.log(hisName); // Pond_98
console.log(myData.getName()); // Pond_98</code></pre><h2 id="조건문">조건문</h2>
<p>조건의 결과(truthy, falsy)에 따라 다른 코드를 실행하는 구문</p>
<pre><code>let isShow = true;
let checked = false;

if (isShow) { // if문이 참이기에 아래 코드 실행 
  console.log(&#39;Show&#39;); //show
}

if (chekced) { // if문이 거짓이기에 아래 코드 미실행
  console.log(&#39;Chekced&#39;);
}</code></pre><pre><code>let isShow = true;

if (isShow) { 
  console.log(&#39;Show&#39;); //show , isShow가 참이기에 해당 코드 실횅
} else {
  console.log(&#39;Hide&#39;); // 만약 isShow가 거짓이면 해당 코드 실행
}</code></pre>]]></description>
        </item>
    </channel>
</rss>