<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>lucy.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 10 May 2023 09:02:30 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>lucy.log</title>
            <url>https://velog.velcdn.com/images/lucy_leee/profile/0224280a-b728-4d81-8bd3-7b89859b3216/image.JPG</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. lucy.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/lucy_leee" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[제곱 미터는 어케 설정함?]]></title>
            <link>https://velog.io/@lucy_leee/%EC%A0%9C%EA%B3%B1-%EB%AF%B8%ED%84%B0%EB%8A%94-%EC%96%B4%EC%BC%80-%EC%84%A4%EC%A0%95%ED%95%A8</link>
            <guid>https://velog.io/@lucy_leee/%EC%A0%9C%EA%B3%B1-%EB%AF%B8%ED%84%B0%EB%8A%94-%EC%96%B4%EC%BC%80-%EC%84%A4%EC%A0%95%ED%95%A8</guid>
            <pubDate>Wed, 10 May 2023 09:02:30 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-html">&lt;td&gt;20m&lt;sup&gt;2&lt;/sup&gt;&lt;/td&gt;</code></pre>
<p>그럼 텍스트 높이가 달라지잖아..?</p>
<p>그럼.. 우짜뇽...</p>
<pre><code class="language-html">&lt;td&gt;20&lt;span class=&quot;exponent&quot;&gt;2&lt;/span&gt;&lt;/td&gt;</code></pre>
<pre><code class="language-css">.exponent {
  font-size: 0.7em;
  vertical-align: super;
  line-height: 1;
}</code></pre>
<p>캬캬캬캬 성공 했구만  : )</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[slack reminder 사용해보기]]></title>
            <link>https://velog.io/@lucy_leee/slack-reminder-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@lucy_leee/slack-reminder-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Mon, 06 Feb 2023 01:50:43 GMT</pubDate>
            <description><![CDATA[<p>Slack은 효율적인 팀 커뮤니케이션을 지원하는 메신저 어플리케이션입니다. Slack에서 &quot;/remind&quot; 명령어를 사용하여 미래의 중요한 일정을 쉽게 기억할 수 있습니다. 이 블로그에서는 Slack에서 &quot;/remind&quot; 명령어를 사용하는 방법에 대해 자세히 설명하겠습니다.</p>
<ol>
<li>Slack 채널 또는 대화창에서 &quot;/remind&quot; 명령어를 입력합니다.</li>
<li>알림이 필요한 날짜와 시간, 알림 내용을 입력합니다.</li>
<li>알림이 설정되어, 지정한 날짜와 시간에 Slack에서 알림이 표시됩니다.</li>
</ol>
<pre><code class="language-text">/remind @who to “what” at time 반복일정</code></pre>
<p>[누구에게] : me, @맨션, #채널명 설정 가능</p>
<p>[무엇을] : 리마인드할 내용을 자유롭게 서술</p>
<p>[언제] : 언제 메시지를 통지할 것인지 설정.</p>
<p>(시간을 설정하지  않으면 기본으로 오전 9시로 설정)</p>
<table>
<thead>
<tr>
<th>10초 후</th>
<th>45분 뒤</th>
</tr>
</thead>
<tbody><tr>
<td>3분 뒤</td>
<td>in 3 minitus</td>
</tr>
<tr>
<td>16시 20분</td>
<td>at 16:20</td>
</tr>
<tr>
<td>1월 1일 6시 30분</td>
<td>on January 1 at 06:30</td>
</tr>
<tr>
<td>평일</td>
<td>weekday</td>
</tr>
<tr>
<td>내일</td>
<td>tomorrow</td>
</tr>
<tr>
<td>매주 월요일</td>
<td>every Monday</td>
</tr>
<tr>
<td>격주 월요일</td>
<td>every other Monday</td>
</tr>
<tr>
<td>매주 월요일 11시 0분</td>
<td>at 11:00 every Monday</td>
</tr>
</tbody></table>
<p>/remind list </p>
<p>remind 설정된 리스트를 한눈에 확인해볼수 있으며, 삭제가 가능합니다</p>
<p>이와 같이 &quot;/remind&quot; 명령어를 사용하여 Slack에서 미래의 알림을 설정할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[WELCOME 2023]]></title>
            <link>https://velog.io/@lucy_leee/WELCOME-2023</link>
            <guid>https://velog.io/@lucy_leee/WELCOME-2023</guid>
            <pubDate>Mon, 16 Jan 2023 04:57:29 GMT</pubDate>
            <description><![CDATA[<h4 id="2022를-돌아보며">2022를 돌아보며...</h4>
<pre><code class="language-text">2022년 회고를 하면서 느낀 점은
생각보다 많은 일을 했지만 남긴 건 많이 없어 보인다.

2022년은 진로를 정하며 그 분야에서 많이 성장하고,
인간관계와 사회생활을 넓혀보는 시간을 가졌다고 생각한다.</code></pre>
<h4 id="2023을-시작하면서">2023을 시작하면서...</h4>
<pre><code>이번 2023년도는 그것들을 활용하여 나를 발전시키고,
나 자신을 돌아보며 인생을 성장시키고 싶다는 생각도 가지게 되었다.</code></pre><h2 id="목표">목표</h2>
<h3 id="첫번째-블로그-꾸준히-작성하기">첫번째. 블로그 꾸준히 작성하기</h3>
<ul>
<li>지금까지 노션, 벨로그, 티스토리, 네이버 블로그 등등 여기저기 많이 뿌려져 있는 글들을 모아 한곳에 정리해 보려고 한다.</li>
<li>나는 뭘 해도 성장하는 주니어 개발자 배운것들을 예쁘게 정리해서 두고두고 보려고 한다.</li>
<li>내가 가진 정보나 지식이 많이 부족하다는것을 깨닳았다. 앞으로는 더 성장하기 위해 글을 쓰고 피드백을 받을까 한다.</li>
</ul>
<h3 id="두번째-성장하기">두번째. 성장하기</h3>
<ul>
<li>2022년도는 정말 많이 놀았다. 2023년도는 보다 적게 놀고 더 많이 성장하고 싶은 욕심이 있기에 계획을 세우고 실천하며 나 자신을 발전시키고 싶다.</li>
<li>내가 뭘 좋아하는지, 나는 무엇을 하면서 스트레스를 풀고 싶은지, 앞으로 어떤 방향을 살고 싶은지 알아보는 시간을 가지려고 한다. 나는 소듕하니깐 ⭐️</li>
</ul>
<h3 id="세번째-건강지키기">세번째. 건강지키기</h3>
<ul>
<li>생각해 보니 나는 생각보다 생활습관이 좋지 못한 거 같다. 잠을 많이 자긴 하지만 너무 많이 자고, 식습관도 좋지 못한 거 같다. 회사에서 지원해 주는 건강검진을 받고 부족한 부분을 채워 더 건강해지려고 노력해야겠다.</li>
<li>자세. 진짜 중요한데 잘 못 지키고 있어서 항상 허리와 손목이 아작나는 경험을 하고 있다. 앉는 습관부터 일하는 중간에 스트레칭도 꾸준히 해보려고 한다 ㅎㅎ</li>
</ul>
<h3 id="네번째-충분한-휴식과-여행">네번째. 충분한 휴식과 여행</h3>
<ul>
<li>2022년도에는 많은 여행을 다녔고 그에 따라 많은 경험을 토대로 발전하는 경험을 했던 것 같다. 2023년에도 꾸준히 많은 경험을 통해 성장하는 내가 되고 싶다</li>
<li>12월에 2주 정도 쉬면서 느꼈지만 인간은 충분한 휴식이 필요하다고 생각한다. 가만히 쉬면서 내 인생도 돌아보고 멘탈케어를 하는 시간을 종종 가져보려고 한다.</li>
</ul>
<pre><code class="language-text">2023년은 보다 행복한 내가 되기를 바라며 글을 마친다.</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] useEffect 에서 2번씩 호출될때]]></title>
            <link>https://velog.io/@lucy_leee/TIL-useEffect-%EC%97%90%EC%84%9C-2%EB%B2%88%EC%94%A9-%ED%98%B8%EC%B6%9C%EB%90%A0%EB%95%8C</link>
            <guid>https://velog.io/@lucy_leee/TIL-useEffect-%EC%97%90%EC%84%9C-2%EB%B2%88%EC%94%A9-%ED%98%B8%EC%B6%9C%EB%90%A0%EB%95%8C</guid>
            <pubDate>Wed, 11 Jan 2023 10:54:02 GMT</pubDate>
            <description><![CDATA[<p>next.js 를 사용하고 있는데 useEffect가 두번씩 호출이 되는 문제가 있었다.</p>
<pre><code class="language-jsx">   useEffect(() =&gt; {
       console.log(&quot;bbbddd&quot;)
   }, [])</code></pre>
<p>React.StrictMode 가 설정되어 있을 경우 그렇다.</p>
<h4 id="react">react</h4>
<pre><code class="language-jsx">  &lt;React.StrictMode&gt;
    &lt;App /&gt;
  &lt;/React.StrictMode&gt;,</code></pre>
<h4 id="next">next</h4>
<pre><code class="language-jsx">/** @type {import(&#39;next&#39;).NextConfig} */
const nextConfig = {
  reactStrictMode: false,  // true -&gt; false 변경
};

module.exports = nextConfig;
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[상속 & 우선순위]]></title>
            <link>https://velog.io/@lucy_leee/%EC%83%81%EC%86%8D-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84</link>
            <guid>https://velog.io/@lucy_leee/%EC%83%81%EC%86%8D-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84</guid>
            <pubDate>Tue, 19 Apr 2022 05:07:02 GMT</pubDate>
            <description><![CDATA[<p>CSS를 상속하는 속성과 상속하지 않는 속성이 있다.</p>
<ul>
<li>상속하는 속성은 자식 요소에 영향을 끼친다.</li>
<li>상속하지 않는 속성은 자식 요소에 영향을 끼지지 않는다.</li>
</ul>
<table>
<thead>
<tr>
<th>property</th>
<th>상속</th>
<th>property</th>
<th>상속</th>
</tr>
</thead>
<tbody><tr>
<td>width/height</td>
<td>no</td>
<td>visibility</td>
<td>yes</td>
</tr>
<tr>
<td>margin</td>
<td>no</td>
<td>opacity</td>
<td>yes</td>
</tr>
<tr>
<td>padding</td>
<td>no</td>
<td>font</td>
<td>yes</td>
</tr>
<tr>
<td>border</td>
<td>no</td>
<td>color</td>
<td>yes</td>
</tr>
<tr>
<td>display</td>
<td>no</td>
<td>line-height</td>
<td>yes</td>
</tr>
<tr>
<td>background</td>
<td>no</td>
<td>text-align</td>
<td>yes</td>
</tr>
<tr>
<td>vertical-align</td>
<td>no</td>
<td>white-space</td>
<td>yes</td>
</tr>
<tr>
<td>text-decoration</td>
<td>no</td>
<td></td>
<td></td>
</tr>
<tr>
<td>position</td>
<td>no</td>
<td></td>
<td></td>
</tr>
</tbody></table>
<h2 id="캐스캐이딩">캐스캐이딩</h2>
<blockquote>
<p>💡 요소는 하나 이상의 CSS 선언에 영향을 받을 수 있다.<br>이것을 피하기 위해 <strong>캐스캐이딩이</strong> 필요! </p>
</blockquote>
<h3 id="중요도">중요도</h3>
<p>CSS가 어디에 선언되었는지에 따라 우선순위가 달라진다.</p>
<ol>
<li>head 요소 내의 style 요소</li>
<li>head 요소 내의 style 요소 내의 @Import </li>
<li><link> 로 연결된 CSS 파일</li>
<li><link> 로 연결된 CSS 파일 내의 @import 문</li>
<li>브라우저 디폴트 스타일시트</li>
</ol>
<h3 id="명시도">명시도</h3>
<p>대상은 명확하게 특정할수록 명시도가 높아지고 우선순위가 높아진다.</p>
<aside>
💡 !import>인라인 스타일>아이디 선택자>클래스/어트리뷰트/가상 선택자 > 태그 선택자 > 전체 선택자 > 상위 요소에 의해 상속된 속성

</aside>

<pre><code class="language-css">p { color: red !important; } // 1
#thing { color: blue; } // 2
div.food { color: chocolate; } // 3
.food { color: green; } // 4
div { color: orange; } // 5</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Table]]></title>
            <link>https://velog.io/@lucy_leee/Table</link>
            <guid>https://velog.io/@lucy_leee/Table</guid>
            <pubDate>Tue, 19 Apr 2022 05:00:12 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-css">table {
    width: 100%;
}</code></pre>
<p><img src="https://velog.velcdn.com/images/lucy_leee/post/5e6eb3dc-9b2b-406a-801d-58b4d101c2bd/image.png" alt=""></p>
<hr>
<pre><code class="language-css">table {
    width: 100%;
    border: 1px solid #555;
}</code></pre>
<p><img src="https://velog.velcdn.com/images/lucy_leee/post/dd7fad99-c8b5-4c2e-ab26-25f8993ca408/image.png" alt=""></p>
<hr>
<pre><code class="language-css">table {
  width: 100%;
  border: 1px solid #555;
  border-collapse: collapse;
}
th, td {
  border: 1px solid #555;
}</code></pre>
<p><img src="https://velog.velcdn.com/images/lucy_leee/post/b6b734e4-cad6-4bef-a0d5-ff024136b329/image.png" alt=""></p>
<hr>
<pre><code class="language-css">table {
  width: 100%;
  border: 1px solid #555;
  border-collapse: collapse;
}
th, td {
  border: 1px solid #555;
  padding: 10px;
}</code></pre>
<p><img src="https://velog.velcdn.com/images/lucy_leee/post/73206b7b-f366-4ac5-8959-94279685e51b/image.png" alt=""></p>
<hr>
<pre><code class="language-css">table {
  width: 100%;
  border-top: 1px solid #555;
  border-collapse: collapse;
}
th, td {
  border-bottom: 1px solid #555;
  padding: 10px;
}</code></pre>
<p><img src="https://velog.velcdn.com/images/lucy_leee/post/fcc65e63-2af9-47f8-b4c8-cea7a62474a4/image.png" alt=""></p>
<hr>
<pre><code class="language-css">table {
  width: 100%;
  border-top: 1px solid #444444;
  border-collapse: collapse;
}
th, td {
  border-bottom: 1px solid #444444;
  border-left: 1px solid #444444;
  padding: 10px;
}
th:first-child, td:first-child {
  border-left: none;
}</code></pre>
<p><img src="https://velog.velcdn.com/images/lucy_leee/post/75918686-b402-48e8-b708-c3af7c45237b/image.png" alt=""></p>
<hr>
<h1 id="html">HTML</h1>
<pre><code class="language-html">&lt;body&gt;
    &lt;table&gt;
      &lt;thead&gt;
        &lt;tr&gt;
          &lt;th&gt;Lorem&lt;/th&gt;&lt;th&gt;Ipsum&lt;/th&gt;
        &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;td&gt;Lorem&lt;/td&gt;&lt;td&gt;Ipsum&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Lorem&lt;/td&gt;&lt;td&gt;Ipsum&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Lorem&lt;/td&gt;&lt;td&gt;Ipsum&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Lorem&lt;/td&gt;&lt;td&gt;Ipsum&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;Lorem&lt;/td&gt;&lt;td&gt;Ipsum&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/body&gt;</code></pre>
<p><strong>| Reference</strong></p>
<p><a href="https://www.codingfactory.net/10510">https://www.codingfactory.net/10510</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[RESET.CSS]]></title>
            <link>https://velog.io/@lucy_leee/RESET.CSS</link>
            <guid>https://velog.io/@lucy_leee/RESET.CSS</guid>
            <pubDate>Tue, 19 Apr 2022 04:48:18 GMT</pubDate>
            <description><![CDATA[<h2 id="스타일-초기화">스타일 초기화</h2>
<aside>
💡 HTML 요소에 내장된 고유 CSS 속성을 초기화 시켜서 크로스브라우징을 구현할때 유용함
</aside>
<span style="color:green">
// 브라우저마다 <strong>기본적으로 제공하는 스타일값</strong> 이 있어 기본값으로 초기화 시켜주기 위해 설정</span>

<blockquote>
<p>Reset CSS란 <strong>브라우저 간의 차이를 최대한 없애는 코드</strong>를 넣어서, <strong>브라우저 요소들의 스타일이 “0”인 상태에서 디자인을 만들기</strong> 위해 사용하는 코드이다.</p>
</blockquote>
<pre><code class="language-css">html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed, 
figure, figcaption, footer, header, hgroup, 
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
    margin: 0;
    padding: 0;
    border: 0;
    font-size: 100%;
    font: inherit;
    vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure, 
footer, header, hgroup, menu, nav, section {
    display: block;
}
body {
    line-height: 1;
}
ol, ul {
    list-style: none;
}
blockquote, q {
    quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
    content: &#39;&#39;;
    content: none;
}
table {
    border-collapse: collapse;
    border-spacing: 0;
}</code></pre>
<h2 id="적용방법">적용방법</h2>
<pre><code class="language-css">@import &quot;reset.css&quot;; // 맨 위에 적어야 한다

.newbox
{
    padding: 5px;
}</code></pre>
<pre><code class="language-html">&lt;head&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;css/reset.css&quot;&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;css/style.css&quot;&gt;
&lt;/head&gt;</code></pre>
<span style="color:green">
// 다른 CSS와 함께 HTML 파일 안에서 불러와서 사용 가능하다.</span>]]></description>
        </item>
        <item>
            <title><![CDATA[기초 문법 정리]]></title>
            <link>https://velog.io/@lucy_leee/%EA%B8%B0%EC%B4%88-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@lucy_leee/%EA%B8%B0%EC%B4%88-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Tue, 19 Apr 2022 04:44:16 GMT</pubDate>
            <description><![CDATA[<h2 id="csscascading-style-sheets">CSS(Cascading style Sheets)</h2>
<aside >
💡 CSS는 HTML의 각 요소의 style을 정의하여 화면에 어떻게 렌더링 할지 브라우저에게 설명하기 위해 작성하는 언어 입니다.
</aside>

<p><img src="https://velog.velcdn.com/images/lucy_leee/post/3583ba62-15d4-41c3-aac8-7ee3a79f203c/image.png" alt="CSS의 문법은 선택자(selector)와 선언부(declaratives)로 구성됩니다."></p>
<p>CSS의 문법은 선택자(selector)와 선언부(declaratives)로 구성됩니다.</p>
<p>선택자 - CSS를 적용하고자 하는 HTML 요소(element)</p>
<p>선언부 - 하나 이상의 선언들을 세미콜론(;)으로 구분하여 포함할 수 있으며, 중괄호({ })를 사용하여 전체를 둘러쌉니다.</p>
<hr>
<h3 id="선언방식">선언방식</h3>
<blockquote>
<p><strong>인라인(in-line) 방식</strong></p>
</blockquote>
<p>HTML 요소(태그)의 style 속성에 직접 작성하는 방식</p>
<pre><code class="language-html">&lt;body&gt;
    &lt;p style=&quot;width:100px; height:100px; margin:5px;&quot;&gt;
&lt;/body&gt;</code></pre>
<blockquote>
<p><strong>내장(embedded) 방식</strong></p>
</blockquote>
<p>HTML <style> </style> 안에 작성하는 방식</p>
<pre><code class="language-html">&lt;head&gt;
    &lt;style type=&quot;text/css&quot;&gt;
        .logo {
                        color: #22a2a2a;
                        width:100px;
                        height:100px; 
                    }
    &lt;/style&gt;
&lt;/head&gt;</code></pre>
<blockquote>
<p><strong>링크(link) 방식</strong></p>
</blockquote>
<p>HTML <link>를 사용하여 외부문서에서 CSS를 불러와 적용하는 방식</p>
<pre><code class="language-html">&lt;head&gt;
    &lt;link href=&quot;./style.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;&gt;
&lt;/head&gt;
</code></pre>
<blockquote>
<p><strong>@import 방식</strong></p>
</blockquote>
<p>CSS @import 방식을 이용하여 외부 문서로 CSS를 불러와 적용하는 방식</p>
<pre><code class="language-html">&lt;head&gt;
    &lt;style type=&quot;text/css&quot;&gt;
        @import url(style.css);
    &lt;/style&gt;
&lt;/head&gt;</code></pre>
<hr>
<h3 id="선택자">선택자</h3>
<blockquote>
<p><strong>HTML 요소 선택자</strong></p>
</blockquote>
<p>CSS를 적용할 대상으로 <strong>HTML요소</strong>의 이름을 직접 사용하여 선택할 수 있습니다.</p>
<pre><code class="language-html">&lt;style&gt;
    h2 { color: teal; text-decoration: underline; }
&lt;/style&gt;
...
&lt;body&gt;
    &lt;h2&gt;이 부분에 스타일을 적용합니다.&lt;/h2&gt;
&lt;/body&gt;
</code></pre>
<blockquote>
<p><strong>아이디(id) 선택자</strong></p>
</blockquote>
<p>아이디 선택자는 <strong>CSS를 적용할 특정 요소</strong>를 선택할 때 사용합니다. [#을 써서 구분함]</p>
<pre><code class="language-html">&lt;style&gt;
    #heading { color: teal; text-decoration: line-through; }
&lt;/style&gt;
...
&lt;body&gt;
    &lt;h2 id=&quot;heading&quot;&gt;이 부분에 스타일을 적용합니다.&lt;/h2&gt;
&lt;/body&gt;</code></pre>
<aside>
💡 HTML과 CSS에서는 하나의 웹 페이지에서 여러 요소에 같은 아이디 이름을 사용해도  문제없이 동작하지만, 중복된 아이디를 가지고 **JS 작업**을 하게 되면 오류가 발생합니다.

</aside>

<blockquote>
<p><strong>클래스(class) 선택자</strong></p>
</blockquote>
<p>클래스 선택자는 특정 집단의 여러 요소를 한번에 선택할때 사용합니다 </p>
<pre><code class="language-html">&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;title&gt;CSS Syntax&lt;/title&gt;
    &lt;style&gt;
        .head{
                color: lime;
                text-decoration: overline;
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;클래스 선택자를 이용한 선택&lt;/h1&gt;
    &lt;h2 class=&quot;head&quot;&gt;이 부분에 스타일을 적용합니다.&lt;/h2&gt;
    &lt;h3 class=&quot;head&quot;&gt;이 부분에도 같은 스타일을 적용합니다.&lt;/h3&gt;
&lt;/body&gt;
</code></pre>
<h2 id="스타일-적용-우선순위">스타일 적용 우선순위</h2>
<ol>
<li>인라인 선언방식</li>
<li>아이디 선택자</li>
<li>클래스 선택자</li>
<li>태그 선택자</li>
<li>전체 선</li>
</ol>
<br>
| Reference

<p><a href="http://tcpschool.com/css/css_intro_syntax">http://tcpschool.com/css/css_intro_syntax</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Slideshow Gallery 3]]></title>
            <link>https://velog.io/@lucy_leee/Slideshow-Gallery-3</link>
            <guid>https://velog.io/@lucy_leee/Slideshow-Gallery-3</guid>
            <pubDate>Tue, 12 Apr 2022 08:19:07 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Slideshow Gallery 2의 내용을 고도화 시켜 컴포넌트화 시키는 작업을 진행했다.</p>
</blockquote>
<h2 id="span-style-colorffcc00javascriptspan"><span style=" color:#ffcc00;">JAVASCRIPT</span></h2>
<pre><code class="language-java">function button1_click() {
    init();

    var strPath  = &quot;https://via.placeholder.com/325x260/0A174E/0A174E,&quot;;
        strPath += &quot;https://via.placeholder.com/325x260/07553B/07553B,&quot;;
        strPath += &quot;https://via.placeholder.com/325x260/50586C/50586C,&quot;;
        strPath += &quot;https://via.placeholder.com/325x260/DCE2F0/DCE2F0,&quot;;
        strPath += &quot;https://via.placeholder.com/325x260/815854/815854,&quot;;
        strPath += &quot;https://via.placeholder.com/325x260/F9EBDE/F9EBDE&quot;;

    setNavImage(strPath); 
    showSlides(slideIndex);
    setBtnoff(strPath);
}</code></pre>
<p><span style="color:darkgreen;">// 이제 strIndex를 직접 입력해줄 필요가 없다. strPath를 사용하여 자동으로 계산해준다.</span></p>
<pre><code class="language-java">function setNavImage(strPath) {
    console.log(&quot;setNavImage 실행: &quot;); 
    var aPath = strPath.split(&#39;,&#39;); 
    arrPath = aPath; 

    var strIndex = &quot;&quot;
    for ( var i = 1 ; i &lt;= aPath.length; i++ ) {
        strIndex += i+&quot;,&quot;;
    }
    strIndex = strIndex.slice(0, -1);
    // 주소 갯수 받아와서 그 앞까지 , 로 숫자 추가해준 뒤 마지막 , 삭제

    var aIndex = strIndex.split(&#39;,&#39;); 
    var tagStr = &quot;&quot;; 

    totalLen = aPath.length;
    for (var i = 0; i &lt; totalLen; i++) {
        tagStr += &#39;&lt;div class=&quot;column&quot;&gt; &lt;img class=&quot;demo &quot; src=&quot;&#39; + aPath[i] + &#39;&quot; onclick=&quot;currentSlide(&#39; + aIndex[i] + &#39;)&quot;&gt; &lt;/div&gt; \n&#39;;
    }

    var navImg = document.getElementById(&quot;NavImg&quot;);
    navImg.innerHTML = tagStr; 
}</code></pre>
<p><span style="color:darkgreen">// 주소가 담긴 데이터의 갯수를 &quot;,&quot; 문자열로 구분해 준 뒤, 마지막 &quot;,&quot;는 삭제 한다.</span></p>
<pre><code class="language-java">function plusSlides(n) {
    console.log(&quot;plusSlides 실행: &quot;);
    if (n &gt; 0) {
        slideIndex += 1;
        if (slideIndex &gt; totalLen) {
            slideIndex = totalLen;
            document.getElementById(&#39;next&#39;).style.color=&quot;#ffff0000&quot;;
        }
    } else {
        slideIndex -= 1;
        if (slideIndex &lt; 1) {
            slideIndex = 1;
            document.getElementById(&#39;prev&#39;).style.color=&quot;#ffff0000&quot;;
        }
    }

    showSlides(slideIndex);

    if (n &gt; 0) {
        var _scrollX = $(&#39;.row&#39;).scrollLeft();
        $(&#39;.row&#39;).scrollLeft(_scrollX + moveDistance);
    } else {
        var _scrollX = $(&#39;.row&#39;).scrollLeft();
        $(&#39;.row&#39;).scrollLeft(_scrollX - moveDistance);
    }
}</code></pre>
<p><span style="color:darkgreen">// 만약 slider 갯수가 없거나, 1개이면 prev, next 버튼을 투명화 시켜준다. </span></p>
<p><code>- 끝 -</code></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Text Tag]]></title>
            <link>https://velog.io/@lucy_leee/Text-Tag</link>
            <guid>https://velog.io/@lucy_leee/Text-Tag</guid>
            <pubDate>Tue, 12 Apr 2022 08:09:47 GMT</pubDate>
            <description><![CDATA[<hr>
<p><code>&lt;h1&gt; ~ &lt;h6&gt;</code> : 제목: <code>&lt;h1&gt;이</code> 글자가 제일 크고, <code>&lt;h6&gt;으로</code> 갈수록 크기가 작아진다.</p>
<h1>이것은 h1 tag 입니다.</h1>
<h2>이것은 h2 tag 입니다.</h2>
<h3>이것은 h3 tag 입니다.</h3>
<h4>이것은 h4 tag 입니다.</h4>
<h5>이것은 h5 tag 입니다.</h5>
<h6>이것은 h6 tag 입니다.</h6>

<hr>
<p><code>&lt;hr&gt;</code> : 긴 가로선 표시</p>
<hr>

<p><code>&lt;br&gt;</code> : 줄 바꿈 
// 닫는 태그는 없다</p>
<p><code>&lt;p&gt;</code>: 단락, paragraph</p>
<p><code>&lt;b&gt;</code> : bold, 진하게
<code>&lt;em&gt;</code> : 내용의 강조를 위해 기울임 꼴로 표시하는 경우 사용
<code>&lt;i&gt;</code> : 의미 없이 기울임 꼴로 표시하는 경우</p>
<p><code>&lt;strong&gt;</code> : 중요한 내용 강조</p>
<p><code>&lt;strike&gt; ,</code> <code>&lt;del&gt;</code> : 취소선 텍스트</p>
<p><code>&lt;u&gt;,</code> <code>&lt;ins&gt;</code> : 밑줄 텍스트</p>
<p><code>&lt;mark&gt;</code>
 : highlighted text를 지정한다.</p>
<p><code>&lt;sup&gt;</code>: sup 태그는 superscripted(위에 쓰인) text를 지정한다.
<code>&lt;sub&gt;</code> : sub 태그는 subscripted(아래에 쓰인) text를 지정한다.</p>
<pre><code class="language-html">&lt;p&gt;This is &lt;sub&gt;subscripted&lt;/sub&gt; text.&lt;/p&gt;
&lt;p&gt;This is &lt;sup&gt;superscripted&lt;/sup&gt; text.&lt;/p&gt;</code></pre>
<p><code>&lt;q&gt;</code> : 짧은 인용문(quotation)을 지정한다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Semantic Tag]]></title>
            <link>https://velog.io/@lucy_leee/Semantic-Tag</link>
            <guid>https://velog.io/@lucy_leee/Semantic-Tag</guid>
            <pubDate>Tue, 12 Apr 2022 08:02:39 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Semantic은 &#39;의미의&#39;, &#39;의미론적인&#39;이라는 뜻을 가진 형용사이다. 따라서 시맨틱 태그란 의미가 있는 태그를 말한다.</p>
</blockquote>
<blockquote>
<p>div나 span과 같이 의미가 없는 태그는 태그 이름만 보고는 어떤 내용인지 전혀 유추할 수가 없는 반면, form, table, article 등 의미가 있는 태그는 내용을 명확하게 정의한다.</p>
</blockquote>
<blockquote>
<p>검색엔진최적화(SEO)  : 검색엔진은 태그를 기반으로 페이지 내 검색 키워드의 우선순위를 판단한다. 따라서 제목은 h1, 중요한 단어는 strong 또는 em을 사용하는 등 의미에 맞는 올바른 태그를 사용하는 것이 중요하다.</p>
</blockquote>
<blockquote>
<p>시맨틱 태그를 사용하면 애플리케이션, 기업, 커뮤니티에서 데이터를 공유하고 재사용할 수 있다.    <br>- W3C - </p>
</blockquote>
<p><code>&lt;header&gt;</code> : 도입부에 해당하는 콘텐츠나 네비게이션 메뉴와 같은 정보를 포함한다</p>
<ul>
<li>하나 이상의 제목 요소(h1~h6)</li>
<li>로고(logo), 아이콘(Icon)</li>
<li>저자(author) 정보</li>
</ul>
<p><code>&lt;nav&gt;</code> : 페이지의 네비게이션 영역이며 보통 메뉴,목차에 사용 (사이트 내부, 외부로 이동)</p>
<p><code>&lt;aside&gt;</code> :  간접 컨텐츠, 보조 콘텐츠 라고 칭하며 문서와 관련된 내용을 나타냄</p>
<ul>
<li>블로그 옆에 광고, 링크등 필수요소가 아닌 보조 콘텐츠 삽입(본문 이외의 내용)</li>
</ul>
<p><code>&lt;section&gt;</code>: 본문의 여러 내용(article)로 구성된 부분을 의미</p>
<p><code>&lt;article&gt;</code>: 본문의  내용이 삽입된 독립적으로 구성된 요소를 의미</p>
<ul>
<li>게시물</li>
<li>잡지</li>
<li>기사</li>
<li>블로그 작성글</li>
<li>제품 카드</li>
</ul>
<p><code>&lt;footer&gt;</code>: 하단 바닥글을 의미함. 섹션에 대한 아래와 같은 정보를 포함한다.</p>
<ul>
<li>저자(author)의 정보</li>
<li>저작권</li>
<li>연관 페이지</li>
<li>사이트맵</li>
<li>연락처</li>
</ul>
<p><code>&lt;article&gt;</code>은 실제 내용이 들어가고 <code>&lt;section&gt;</code>은 각 태그별로 구분하기 위해 사용</p>
<p><strong>ETC</strong>
강조할 땐 em, strong 
<code>&lt;p&gt;</code> 태그는 글의 단락에 사용된다 하지만 막 쓰는건 비추 </p>
<ul>
<li>리스트는 <code>&lt;li&gt;</code></li>
<li>링크라면 <code>&lt;a&gt;</code></li>
<li>제목이면<code>&lt;h1 ~ h6&gt;</code></li>
</ul>
<p><img src="https://velog.velcdn.com/images/lucy_leee/post/60546307-a7ed-4af5-a31d-0ee580279bfc/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Meta Tag]]></title>
            <link>https://velog.io/@lucy_leee/Meta-Tag</link>
            <guid>https://velog.io/@lucy_leee/Meta-Tag</guid>
            <pubDate>Tue, 12 Apr 2022 07:53:58 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>하이퍼텍스트(Hypertext) 생성 언어 HTML 문서 맨 위에 <code>&lt;head&gt;</code>사이에 위치한 브라우저와 검색엔진을 사용할수있도록 웹 문서의 정보를 포함하는 태그이다.</p>
</blockquote>
<p><code>&lt;meta&gt;</code> 요소가 제공하는 속성에는 4가지 유형이 있다.</p>
<ul>
<li><code>&lt;name&gt;</code>을 지정하면 전체 페이지에 적용되는 ‘문서 레벨 메타데이터’를 제공합니다</li>
<li><code>&lt;charset&gt;</code>을 지정하면 문자 인코딩을 나타내는 ‘문자 집합 선언’을 할 수 있다,</li>
<li><code>&lt;itemprop&gt;</code>을 지정하면 ‘사용자 정의 메타데이터’를 제공한다</li>
<li><code>&lt;http-equiv&gt;</code>를 지정하면 유사한 이름의 HTTP 헤더가 제공하는 정보와 동일한 ‘프라그마 지시문’이 된다. </li>
</ul>
<blockquote>
<p><code>프라그마 지시문</code>은 컴파일러의 동작(변수와 함수용 메모리 할당 방법, 확장 키워드의 허가/금지, 경고 메시지의 표시/ 숨김 등)를 제어한다.</p>
</blockquote>
<blockquote>
<p><code>메타데이터</code>란 사용자가 정의, 배포, 패키지 업그레이드를 할 수 있는 데이터이다. 이 데이터는 원하는 정보를 효율적으로 찾아 이용하기 위해 일정한 규칙을 가지고 있다.</p>
</blockquote>
<p><code>&lt;charset&gt;</code></p>
<ul>
<li>페이지의 문자 인코딩을 선언합니다. 이 특성이 존재할 경우, 반드시 문자열 &quot;utf-8&quot;의 ASCII 표현이어야 한다.</li>
</ul>
<p><code>&lt;name&gt;</code>  <code>&lt;content&gt;</code></p>
<ul>
<li><code>name</code>과 <code>content</code>를 함께 사용하면 문서의 메타데이터를 한쌍으로(이름-값) 제공할 수 있다. </li>
</ul>
<p><code>content</code>는 <code>meta</code>정보의 내용을 지정하고, http-equiv 또는 name 특성의 값을 담는다.</p>
<p><code>&lt;http-equiv&gt;</code></p>
<ul>
<li>프라그마 지시문을 정의함.</li>
<li><code>content-security-policy</code> : 페이지의 콘텐츠 정책을 정의할 수 있다.</li>
<li><code>content-type</code> : 지정할경우, content 특성 값은 반드시 &quot;text/html; charset=utf-8&quot;이어야 한다.</li>
<li><code>default-style</code> : 기본 CSS 스타일 시트 세트의 이름을 지정한다.</li>
<li><code>x-ua-compatible</code> : 지정할 경우, content 특성의 값은 반드시 &quot;IE=edge&quot;이다.</li>
<li><code>refresh</code> : content 특성에 양의 정수 값을 설정한 경우, 새로고침시 대기시간 지정, 만약 그 뒤에 URL이 온다면 이동 전까지의 대기시간을 지정할 수 있다.</li>
</ul>
<h3 id="메타태그-종류">메타태그 종류</h3>
<hr>
<p>검색 엔진에 의해 검색되는 단어를 지정</p>
<pre><code class="language-html">&lt;meta name=&quot;keywords&quot; content=&quot;검색단어&quot; /&gt;</code></pre>
<hr>
<p>검색 결과에 표시되는 문자를 지정</p>
<pre><code class="language-html">&lt;meta name=&quot;description&quot; content=&quot;웹에대한 간략한 설명 또는 소개&quot; /&gt;</code></pre>
<hr>
<p>검색 로봇 제어</p>
<pre><code class="language-html">&lt;meta name=&quot;robots&quot; content=&quot;noindex, nofollow&quot; /&gt;</code></pre>
<span style="font-size:16.5px">
1. All(기본값) : 'index, follow' 를 지정한 것과 같다<br>
2. None : 'noindex, nofollow' 를 지정한 것과 같다.<br>
3. Index : 그 페이지를 수집 대상으로 한다.<br>
4. Noindex : 그 페이지를 수집대상에서 제외한다.<br>
5. Nofollow : 그페이지를 포함해 링크가 걸린 곳을 수집 대상으로 하지 않는다.<br>
6. Follow : 그 페이지를 포함해 링크가 걸린 곳을 수집 대상으로 한다.<br> </span>

<hr>
<p>제작일 입력</p>
<pre><code class="language-html">&lt;meta name=&quot;Date&quot; content=&quot;2020-06-05T07:45:37+09:00&quot; /&gt;</code></pre>
<hr>
<p>웹페이지에 쓰인 언어 입력</p>
<pre><code class="language-html">&lt;meta http-equiv=&quot;Content-Script-Type&quot; content=&quot;Text/javascript&quot; /&gt;</code></pre>
<hr>
<p>X-UA-Compatible (브라우저 호환성)</p>
<pre><code class="language-html">&lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE-edge&quot; /&gt;</code></pre>
<hr>
<p>제목</p>
<pre><code class="language-html">&lt;meta http-equiv=&quot;Title&quot; content=&quot;HTML meta 공부&quot; /&gt;</code></pre>
<hr>
<p>subject (홈페이지 주제 지정)</p>
<pre><code class="language-html">&lt;meta http-equiv=&quot;Subject&quot; content=&quot;기술블로그&quot; /&gt;</code></pre>
<hr>
<p>Author (페이지 작성 제작자명)</p>
<pre><code class="language-html">&lt;meta http-equiv=&quot;Author&quot; content=&quot;인파_&quot; /&gt;</code></pre>
<hr>
<p>제작 도구</p>
<pre><code class="language-html">&lt;meta http-equiv=&quot;Generator&quot; content=&quot;Visual Studio Code&quot; /&gt;</code></pre>
<hr>
<p>메일주소</p>
<pre><code class="language-html">&lt;meta http-equiv=&quot;Email&quot; content =&quot;test@gmail.com&quot; /&gt;</code></pre>
<hr>
<p>Distribution(배포자)</p>
<pre><code class="language-html">&lt;meta http-equiv=&quot;Distribution&quot; content=&quot;name&quot; /&gt;</code></pre>
<hr>
<p>Copyright (저작권)</p>
<pre><code class="language-html">&lt;meta http-equiv=&quot;Copyright&quot; content=&quot;LUCY&quot; /&gt;</code></pre>
<hr>
<p>imagetoolbar (그림에 마우스 오버 시 이미지 관련 툴바 생기지 않게 하기)</p>
<pre><code class="language-html">&lt;meta http-equiv=&quot;imagetoolbar&quot; content=&quot;no&quot; /&gt;</code></pre>
<hr>
<p>Cache-Control / Pragma(Cache가 되지 않도록 하기)</p>
<pre><code class="language-html">&lt;meta http-equiv=&quot;Cache-Control&quot; content=&quot;no-cache&quot; /&gt;
&lt;meta http-equiv=&quot;Pragma&quot; content=&quot;no-chche&quot; /&gt;
&lt;!-- 수정사항이 빠르게 반영 되지만, 로딩시간이 오래 걸린다는 단점이 있음 —&gt;</code></pre>
<hr>
<p>Refresh (새로고침)</p>
<pre><code class="language-html">&lt;meta http-equiv=&quot;refresh&quot; content=&quot;60&quot; /&gt;
&lt;!-- 입력한 주소로 5초 후 이동 --&gt;</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[Head Tag]]></title>
            <link>https://velog.io/@lucy_leee/Head-Tag</link>
            <guid>https://velog.io/@lucy_leee/Head-Tag</guid>
            <pubDate>Tue, 12 Apr 2022 07:47:14 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-html">&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt; 
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt; 
    &lt;link rel=&quot;icon&quot; href=&quot;favicon.ico&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt; 
&lt;/head&gt; </code></pre>
<p><code>&lt;meta&gt;</code></p>
<ul>
<li>html 문서에 대한 정보.</li>
<li>문자 인코딩 및 문서 키워드, 요약 등등등</li>
</ul>
<p><code>&lt;title&gt;</code></p>
<ul>
<li>문서 제목</li>
</ul>
<p><code>&lt;link&gt;</code></p>
<ul>
<li>외부 파일을 연결할 때 사용한다.</li>
</ul>
<p><code>&lt;style&gt;</code></p>
<ul>
<li>스타일 정보를 정의할 때 사용하는 태그</li>
</ul>
<pre><code class="language-html">&lt;style&gt;
.mybox {
   border: 5px outset red;
   background-color: black; 
   font-size: #ffcc85;
}
&lt;/style&gt;</code></pre>
<p><code>&lt;script&gt;</code>
html 파일에서 JS는 2가지 방법으로 사용할 수 있습니다, </p>
<ul>
<li>외부에 있는 파일을 불러오는 방법 </li>
<li>html파일 내부에서 사용하는 방법<pre><code class="language-html">&lt;script type=&quot;text/javascript&quot; src=&quot;./js/imjsfile.js&quot;&gt;&lt;/script&gt;</code></pre>
</li>
</ul>
<pre><code class="language-html">&lt;script&gt;
    document.write(&quot;Hello World !&quot;);
&lt;/script&gt;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Cross Origin Resource Sharing]]></title>
            <link>https://velog.io/@lucy_leee/Cross-Origin-Resource-Sharing</link>
            <guid>https://velog.io/@lucy_leee/Cross-Origin-Resource-Sharing</guid>
            <pubDate>Thu, 07 Apr 2022 08:45:00 GMT</pubDate>
            <description><![CDATA[<h2 id="origin-span-stylefont-size30px💬span">Origin <span style="font-size:30px">💬</span></h2>
<ul>
<li><span style="font-size:23px"><code>Origin(출처): &lt;Protocol&gt; &quot;://&quot; &lt;hostname&gt; [ &quot;:&quot; &lt;port&gt; ]</code></span><ul>
<li><strong>Protocol + Host + Port</strong></li>
<li><code>&lt;Protocol&gt;</code> :  <strong>[ HTTP, HTTPS ]</strong> </li>
<li><code>&lt;hostname&gt;</code> : 서버의 고유한 이름 또는 IP</li>
<li><code>&lt;port&gt;</code> : 서버와 연결을 맺기 위한 TCP 포트 번호, <strong>[ Default : 80 ]</strong>
<BR><BR></li>
</ul>
</li>
</ul>
<p>🚨 Access to fetch at <code>https://blah.blah.blah/yadda</code> Visit Website from origin <code>http://localhost:1234</code> has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. If an opaque response serves your needs, set the request’s mode to ‘no-cors’ to fetch the resource with CORS disabled.</p>
<p>🚨 원본<code>http://localhost:1234</code>에서 <code>https://blah.blah.blah/yadda</code> 웹사이트를 가져오는도중 <strong>CORS정책</strong>에 의해 차단되었습니당. 요청한 리소스에 <code>Access-Control-Allow-Origin</code> 헤더가 없습니다. 만약 응답이 필요한 경우 <code>request’s</code> 모드를  <code>no-cors</code>로 변경해서 CORS가 비활성화된 리소스를 가져와주세여!</p>
<p>이런 오류가 생기는 이유는 HTTP요청에서 어떤 요청을 하냐에 따라 다른 정책을 따르기 때문!</p>
<blockquote>
<p><strong><code>&lt;HTML&gt;</code> <span style="font-size:25px">👉🏻</span> Cross-Origin 정책을 따름</strong></p>
</blockquote>
<blockquote>
<p><strong><code>&lt;Script&gt;</code>  <span style="font-size:25px">👉🏻</span> Same-Origin 정책을 따름</strong></p>
</blockquote>
<ul>
<li><p>JS는 서로 다른 도메인에 대한 요청을 보안상 제한한다. </p>
<hr>
<h2 id="cross-origin-resource-sharing-span-stylefont-size30px💬span">Cross-Origin Resource Sharing <span style="font-size:30px">💬</span></h2>
</li>
</ul>
<blockquote>
<p><code>다른 출처 리소스 공유(Cross-Origin Resource Sharing, CORS)</code>는 추가 HTTP 헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제이다. - MDN</p>
</blockquote>
<ul>
<li>웹 애플리케이션이 외부 리소스를 요청할 때는 HTTP 프로토콜을 사용해서 보낸다. 이때 브라우저는 Origin에 <strong>출처</strong>를 함께 담아서 보낸다.
  <BR><BR>  </li>
</ul>
<h2 id="preflight-requestspan-stylefont-size30px💬span">Preflight Request<span style="font-size:30px">💬</span></h2>
<p><img src="https://velog.velcdn.com/cloudflare/lucy_leee/6450aa8b-0d56-4a13-915b-896f1ca4c81b/image.png" alt=""></p>
<ol>
<li>만약 내가 자바스크립트의 <code>Fetch API</code>를 사용하여 브라우저에게 리스소를 받아와! 라고 시킨다면 </li>
</ol>
<p>-<span style="font-size:17px; color:#777"> <code>Fetch API</code>는 네트워크 통신을 포함한 리소스 취득을 위한 인터페이스가 정의되어 있다.</span>
2. 브라우저는 서버에게 <code>예비 요청(Preflight)</code>을 보낸다.<br>3. 서버는 이 예비 요청에 대한 응답으로 정책을 담은 정보를 브라우저로 다시 보내준다.
4. 이후 브라우저는 자신이 보낸 예비요청과 서버가 보내준 정보를 토대로 비교후 <code>본 요청</code>을 보낸다.
5. 이후 서버가 본 요청에 대한 응답을 하면 최종적으로 응답 데이터를 JS로 넘겨준다 .</p>
<h2 id="simple-requestspan-stylefont-size30px💬span">Simple Request<span style="font-size:30px">💬</span></h2>
<p>특정 조건을 만족하면 예비요청을 생략할수 있다. 하지만 이 조건이 까다로워서 일반적인 방법으로 웹 어플리케이션 아키텍처를 설계한다면 거의 충조시키기 어려워 거의 사용되지 않는다.</p>
<p><img src="https://velog.velcdn.com/cloudflare/lucy_leee/2ced9fca-ba13-41fb-a7e8-2558b8816847/image.png" alt="">
요청의 메소드는 <code>GET</code>, <code>HEAD</code>, <code>POST</code> 중 하나여야 한다.
Fetch가 &quot;CORS-safelisted request-header&quot;로 정의한 헤더만 사용할 수 있다.</p>
<ul>
<li><code>Content-Language</code> <code>Content-Type</code> <code>Accept</code> <code>Accept-Language</code></li>
<li><code>Save-Data</code> <code>Viewport-Width</code> <code>DPR</code> <code>Downlink</code> <code>Width</code></li>
</ul>
<p>만약 Content-Type를 사용하는 경우에는 아래 값들만 허용된다.</p>
<ul>
<li><code>application/x-www-form-urlencoded</code> <code>multipart/form-data</code> <code>text/plain</code>
<BR><BR></li>
</ul>
<h2 id="credentialed-requestspan-stylefont-size30px💬span">Credentialed Request<span style="font-size:30px">💬</span></h2>
<p>이 방법은 다른 방법보다 좀 더 보안을 강화하고 싶을 때 사용하는 방법이다.
기본적으로 브라우저가 제공하는 비동기 리소스 요청 API인 <code>XMLHttpRequest</code> 객체나 <code>fetch API</code>는 별도의 옵션 없이 브라우저의 쿠키 정보나 인증과 관련된 헤더를 함부로 요청에 담지 않는다.
만약 요청에 인증과 관련된 정보를 담아야 한다면 <code>credentials 옵션</code>을 사용해야한다. 
<br>
<span style="font-size:25px"> <strong>Credentials 옵션</strong></span></p>
<ul>
<li><code>same-origin(기본값):</code> <strong>같은 출처 간 요청에만</strong> 인증 정보를 담을 수 있다.</li>
<li><code>include:</code>    <strong>모든 요청에</strong> 인증 정보를 담을 수 있다.</li>
<li><code>omit:</code>    모든 요청에 <strong>인증 정보를 담지 않는다.</strong></li>
</ul>
<p>만약 <code>same-origin</code> , <code>include</code> 옵션을 사용해 리소스 요청에 인증 정보가 포함된다면 한다면 브라우저는 빡빡한 조건들을 추가하여 검사해야한다.</p>
<ul>
<li>Access-Control-Allow-Origin: 모든 요청을 허용하는 (*)은 사용불가, 명시적인 URL 요구</li>
<li>응답 헤더에는 반드시 <code>Access-Control-Allow-Credentials: true</code>가 존재해야함 </li>
</ul>
<hr>
<blockquote>
<p>Chrome 확장프로그램은 CORS 문제를 해결하기 위한 확장 프로그램인 <a href="https://chrome.google.com/webstore/detail/allow-cors-access-control/lhobafahddgcelffkeicbaginigeejlf?hl=ko">Allow CORS</a> 을 제공한다.</p>
</blockquote>
<hr>
<blockquote>
<p>Reference: <a href="https://evan-moon.github.io/2020/05/21/about-cors/#cors%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9D%B8-%EB%82%B4%EC%9A%A9">CORS는 왜 이렇게 우리를 힘들게 하는걸까?</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[URL ]]></title>
            <link>https://velog.io/@lucy_leee/URL</link>
            <guid>https://velog.io/@lucy_leee/URL</guid>
            <pubDate>Thu, 07 Apr 2022 06:12:34 GMT</pubDate>
            <description><![CDATA[<h2 id="🤔-origin">🤔 Origin</h2>
<p><span style="font-size:25px"><code>Origin = [프로토콜]://[Host의 IP주소 또는 Domain]:[포트번호]</code></span></p>
<p>만약 <strong><code>Origin</code></strong>이 다르다는 것은, 주소가 다르거나, HTTP, HTTPS 프로토콜 혹은 포트번호가 다른것이다.</p>
<p><br><br></p>
<h2 id="🤔-url">🤔 URL</h2>
<p><img src="https://velog.velcdn.com/cloudflare/lucy_leee/e8b0e2c1-e0b4-43fa-b42d-f294ac90904d/image.png" alt=""> </p>
<blockquote>
<p>URL주소는 네트워크 상에서 자원이 어디 있는지 알려주기 위한 규약이며, 리소스의 위치와 프로트콜을 가리킨다</p>
</blockquote>
<ol>
<li><p><code>프로토콜</code> : 네트워크 상의 서버로 부터 웹 정보와 이미지 등의 리소스를 받아올 통신 방식을 미리 정해 놓은 것으로  <strong>[ HTTP, HTTPS, FTP, FILE, MAILTO ]</strong>가 있다.</p>
</li>
<li><p><code>도메인</code> : 인터넷에서 사용 가능한 모든 웹 서버에 대해 사람이 읽을 수 있는 주소를 제공한다.</p>
</li>
<li><p><code>Port</code> : 네트워크, 인터넷을 사용하여 통신하는 프로그램의 논리주소 <strong>[ 0 ~ 65535 ]</strong></p>
</li>
<li><p><code>path to the file</code> : 웹 자원에 대한 경로. 과거에는 물리적인 파일 위치였지만 현재는 추상화하여 나타낸다.</p>
</li>
<li><p><code>Query String</code> : <code>&amp;</code>기호로 구분된 키/값으로 짝을 이룬 리스트 입니다. 각각의 웹서버는  파라미터들을 언급하는 자신의 규칙을 가지고 잇고, 웹서버 소유자 이외에 파라미터 사용여부는 아무도 알 수 없습니다.</p>
</li>
</ol>
<p><br><br></p>
<h2 id="🤔-same-origin-policysop">🤔 Same Origin Policy(SOP)</h2>
<ul>
<li><p><code>SOP</code>는 프로세스 혹은 작업을 처리하는 데 품질을 보증할 수 있도록 단계별로 할 행동을 규정해 놓은 것이다.</p>
</li>
<li><p><code>SOP</code>는 한 <code>Origin</code>에서 로드된 문서 또는 스크립트가 다른 <code>Origin</code>의 리소스와 상호 작용할 수 있는 방법을 제한하는 중요한 보안 메커니즘이다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[React-SideBar]]></title>
            <link>https://velog.io/@lucy_leee/React-SideBar</link>
            <guid>https://velog.io/@lucy_leee/React-SideBar</guid>
            <pubDate>Tue, 05 Apr 2022 08:45:28 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/cloudflare/lucy_leee/4a0dcf29-391b-4a41-b985-0c67fddb5444/image.png" alt=""></p>
<h3 id="사용한-라이브러리">사용한 라이브러리</h3>
<pre><code>$ npm i styled-components
$ npm install react-icons —save </code></pre><h3 id="styled-components">styled-components?</h3>
<p>styled-components는 JS에서 CSS를 사용할 수 있도록 도와주는 스타일링 프레임워크입니다.
React Component에 특정 스타일링을 할 수 있기 때문에 재사용성을 더 높일 수 있고, javascript에 영향을 받는 스타일링을 간편하게 구현할 수 있습니다.</p>
<blockquote>
<p>기존 React에서 사용하던 CSS 방식</p>
</blockquote>
<pre><code class="language-css">  const divStyle = {
    backgroundColor: &quot;black&quot;,
    width: &quot;100px&quot;,
    height: &quot;100px&quot;
  };</code></pre>
<pre><code>  return &lt;div style={divStyle}&gt;&lt;/div&gt;</code></pre><blockquote>
<p>Styled-Components를 사용한 방식</p>
</blockquote>
<pre><code class="language-css">  const StyledDiv = styled.div`
    background-color: black;
    width: 100px;
    height: 100px;
  `;</code></pre>
<pre><code>return &lt;StyledDiv&gt;&lt;/StyledDiv&gt;</code></pre><p>styled-components는 style이 적용된 Component를 직접 생성하기 때문에, 스타일링을 위한 코드 사용량이 줄어드는 효과가 있습니다. </p>
<h3 id="react-icon"><a href="https://react-icons.github.io/react-icons/">React Icon</a></h3>
<blockquote>
<p>웹페이지를 구현할때 react-icons을 사용하면  빠르게 아이콘을 넣을 수 있습니다.</p>
</blockquote>
<pre><code class="language-java">import { 아이콘 이름 } from &#39;react-icons/아이콘 카테고리&#39;;
class Question extends React.Component {
  render() {
    return &lt;h3&gt; Lets go for a &lt;FaBeer /&gt;? &lt;/h3&gt;
  }
}</code></pre>
<h3 id="react-sidebar-파일구조">React-SideBar 파일구조</h3>
<hr>
<p><span style="font-size:23px">📂 node_modules</span></p>
<ul>
<li>package.json에 있는 모듈이 의존하고 있는 모듈 전부를 포함하고 있습니다</li>
</ul>
<hr>
<p><span style="font-size:23px">📂 public</span></p>
<ul>
<li>index.html (가상 DOM을 위한 html 파일)</li>
<li>data (mock data관리)</li>
</ul>
<hr>
<p><span style="font-size:23px">📂 src</span></p>
<p><span style="font-size:18.5px">📄 index.js </span>
<span style="font-size:18.5px">📄 App.js </span>
<span style="font-size:18.5px">📄 reportWebVitals.js</span>
<span style="font-size:18.5px">📄 App.css </span>
<span style="font-size:18.5px">📁 components </span>
<span style="font-size:15.5px">📄 Sidebar.js</span>
<span style="font-size:15.5px">📄 SidebarData.js</span>
<span style="font-size:15.5px">📄 Overview.js</span>
<span style="font-size:18.5px"> 📁 pages </span>
<span style="font-size:15.5px">📄 Reports.js</span>
<span style="font-size:15.5px">📄 Reports.js</span>
<span style="font-size:15.5px">📄 Team.js</span></p>
<hr>
<h3 id="오류수정">오류수정</h3>
<p>react-router-dom이 버전 6로 업그레이드되면서, Switch를 더이상 지원을 안한다.<br>또한 component도 element로 바꼈다.</p>
<pre><code class="language-jsx">import { BrowserRouter as Router, Routes, Route }from &#39;react-router-dom&#39;;

function App() {  
  return (
    &lt;Router&gt;
      &lt;Sidebar /&gt;
      &lt;Routes&gt; // Switch -&gt; Routes
        &lt;Route path=&#39;/overview&#39; exact element={&lt;Overview /&gt;} /&gt;
        &lt;Route path=&#39;/reports&#39; exact element={&lt;Reports/&gt;} /&gt;
        &lt;Route path=&#39;/reports/reports1&#39; exact element={&lt;ReportsOne/&gt;} /&gt;
        &lt;Route path=&#39;/reports/reports2&#39; exact element={&lt;ReportsTwo/&gt;} /&gt;
        &lt;Route path=&#39;/reports/reports3&#39; exact element={&lt;ReportsThree/&gt;} /&gt;
        &lt;Route path=&#39;/team&#39; exact element={&lt;Team/&gt;} /&gt;
      &lt;/Routes&gt;
    &lt;/Router&gt;
  );
}

export default App; </code></pre>
<p><img src="https://velog.velcdn.com/cloudflare/lucy_leee/40eb9541-1c12-4168-a896-7ef5ee31a541/image.png" alt=""></p>
<pre><code>function App() {
  return (
    &lt;Router&gt;
      &lt;Sidebar /&gt;
      &lt;Routes&gt;
          &lt;!-- React Router Dom v6 - 함수는 React 자식으로 유효하지 않습니다.--&gt;
        &lt;!-- &lt;Route path=&#39;/overview&#39; exact element={Overview} /&gt;        
        &lt;Route path=&#39;/reports&#39; exact element={Reports} /&gt;
        &lt;Route path=&#39;/reports/reports1&#39; exact element={ReportsOne} /&gt;
        &lt;Route path=&#39;/reports/reports2&#39; exact element={ReportsTwo} /&gt;
        &lt;Route path=&#39;/reports/reports3&#39; exact element={ReportsThree} /&gt;
        &lt;Route path=&#39;/team&#39; exact element={Team} /&gt;
      &lt;/Routes&gt;
    &lt;/Router&gt;
  );
}
export default App;</code></pre><p><span style="font-size:16px"><a href="https://stackoverflow.com/questions/70007166/react-router-dom-v6-functions-are-not-valid-as-a-react-child">// element=<code>{Overview}</code> -&gt; element=<code>{&lt;Overview /&gt;}</code></a></span>
<span style="font-size:16px"><a href="https://stackoverflow.com/questions/70007166/react-router-dom-v6-functions-are-not-valid-as-a-react-child">// 참고: React Router Dom v6 - Functions are not valid as a React child</a></span></p>
<p><a href="https://github.com/Garam-Leee/React_Sidebar.git"><img src="https://velog.velcdn.com/cloudflare/lucy_leee/1d2a791e-4d9f-4146-a94d-94a390d36293/free-icon-github-logo-25231%20(1).png" alt="">
</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Mouse Cursor]]></title>
            <link>https://velog.io/@lucy_leee/Mouse-Cursor</link>
            <guid>https://velog.io/@lucy_leee/Mouse-Cursor</guid>
            <pubDate>Thu, 31 Mar 2022 00:40:57 GMT</pubDate>
            <description><![CDATA[<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="ZEvJqjb" data-user="garam-leee" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/garam-leee/pen/ZEvJqjb">
  Mouse Cursor</a> by RAMI (<a href="https://codepen.io/garam-leee">@garam-leee</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>]]></description>
        </item>
        <item>
            <title><![CDATA[object-fit]]></title>
            <link>https://velog.io/@lucy_leee/object-fit</link>
            <guid>https://velog.io/@lucy_leee/object-fit</guid>
            <pubDate>Tue, 29 Mar 2022 03:01:13 GMT</pubDate>
            <description><![CDATA[<p><code>object-fit</code> 속성은 <code>&lt;img&gt;</code>나 <code>&lt;video&gt;</code>같은 콘텐츠 크기를 어떤 방식으로 조절할지 결정할 수 있습니다!</p>
<pre><code class="language-css">img {
  width: 100%;
  height: 100%;
  object-fit: contain;
}</code></pre>
<blockquote>
<p><code>fill</code> :         기본값. 주어진 너비와 높이에 딱 맞도록 사이즈를 조절. 비율 유지 X</p>
</blockquote>
<blockquote>
<p><code>contain</code> : 이미지와 컨테이너 간의 비율이 맞지 않는 경우엔 자리가 남음 비율유지 O</p>
</blockquote>
<blockquote>
<p><code>cover</code> : 비율이 맞지 않더라도 이미지를 확대해 컨테이너를 완전히 채움 비율 유지 X</p>
</blockquote>
<blockquote>
<p><code>none</code> : 아무것도 하지 않지만, 가운데 정렬함</p>
</blockquote>
<blockquote>
<p><code>scale-down</code> : none 또는 contain 중에 더 적절한 방향으로 이미지 사이즈를 조절</p>
</blockquote>
<p><img src="https://images.velog.io/images/lucy_leee/post/6cf4ddfd-f5ba-4961-97e7-3dbde1911da4/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Slideshow Gallery 2]]></title>
            <link>https://velog.io/@lucy_leee/Slideshow-Gallery-2</link>
            <guid>https://velog.io/@lucy_leee/Slideshow-Gallery-2</guid>
            <pubDate>Mon, 28 Mar 2022 05:54:28 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Slideshow Gallery1을 컴포넌트화 시켜서 자바스크립트만 호출해서 사용할 수 있게 제작했다.
<a href="https://codepen.io/garam-leee/pen/popPwyW">https://codepen.io/garam-leee/pen/popPwyW</a></p>
</blockquote>
<h2 id="span-stylecolororangehtmlspan"><span style="color:orange;">HTML</span></h2>
<p><img src="https://images.velog.io/images/lucy_leee/post/beb2eb47-b0e8-47aa-bc30-d3cd63d17af8/image.png" alt="">
<span style="font-size:16px; color:green;">// 이전 게시글인 Slideshow Gallery1 보다 훨씬 간결한 코드를 볼 수 있다.<br>// 메인 이미지는 서브이미지 주소만 받아와서 보여준다</span></p>
<h2 id="span-style-colorffcc00javascriptspan"><span style=" color:#ffcc00;">JAVASCRIPT</span></h2>
<h3 id="init">init()</h3>
<pre><code class="language-javascript">var totalLen = 0;
var slideIndex = 1;
var moveDistance = 80;
var arrPath = [];

window.onload = function () {
    init();
};

function init() {
    console.log(&#39;초기화&#39;);
    slideIndex = 1;
    arrPath = [];
} </code></pre>
<p><span style="font-size:16px; color:green;">// 윈도우를 실행하면 초기화를 한다. </span></p>
<h3 id="button1_click">button1_click()</h3>
<pre><code class="language-javascript">function button1_click() {
    init();

    var strPath  = &quot;https://via.placeholder.com/400x300/a5b9e6/000000/?text=Temporary+Image,&quot;;
        strPath += &quot;https://via.placeholder.com/500x300/a5b9e6/000000/?text=Temporary+Image,&quot;;
        strPath += &quot;https://via.placeholder.com/300x200/a5b9e6/000000/?text=Temporary+Image,&quot;;
        strPath += &quot;https://via.placeholder.com/300x500/a5b9e6/000000/?text=Temporary+Image,&quot;;
        strPath += &quot;https://via.placeholder.com/350x170/a5b9e6/000000/?text=Temporary+Image,&quot;;
        strPath += &quot;https://via.placeholder.com/300x300/a5b9e6/000000/?text=Temporary+Image&quot;;

    var strIndex = &quot;1,2,3,4,5,6&quot;;
    setNavImage(strPath, strIndex); 
    showSlides(slideIndex);
}</code></pre>
<span style="font-size:16px; color:green;">
// strPath : 이미지 주소<br>
// strIndex: 이미지 번호<br>
// 값을 담아서 setNavImage와 showSlides에 전송해준다</span>


<h3 id="setnavimage">setNavImage()</h3>
<pre><code class="language-javascript">
function setNavImage(strPath, strIndex) { 
    var aPath = strPath.split(&#39;,&#39;); 
    arrPath = aPath; 

    var aIndex = strIndex.split(&#39;,&#39;); 

    var tagStr = &quot;&quot;; 

    totalLen = aPath.length;
    for (var i = 0; i &lt; totalLen; i++) {
        tagStr += &#39;&lt;div class=&quot;columnex&quot;&gt; &lt;img class=&quot;demo &quot; src=&quot;&#39; + aPath[i] + &#39;&quot; onclick=&quot;currentSlide(&#39; + aIndex[i] + &#39;)&quot;&gt; &lt;/div&gt;\n&#39;;
    }

    var navImg = document.getElementById(&quot;NavImg&quot;);
    navImg.innerHTML = tagStr; 
}</code></pre>
<span style="font-size:16px; color:green;">
// split을 사용해 strPath, strIndex를 ','을 기준으로 짤라서 배열로 보관한다.<br>
// for문을 사용해서 이미지 주소가 끝날때까지 html을 생성하여 tagStr에 담는다.<br>
// 서브 이미지 HTML을 구현한 뒤 tagStr에 저장하고 .innerHTML을 사용해서 삽입한다.</span>


<h3 id="showslides">showSlides();</h3>
<pre><code class="language-javascript">function showSlides(n) { 
    var dots = document.getElementsByClassName(&quot;demo&quot;);

    for (var i = 0; i &lt; dots.length; i++) {
        dots[i].className = dots[i].className.replace(&quot; active&quot;, &quot;&quot;); 
    }

    dots[slideIndex - 1].className += &quot; active&quot;; 

    x = dots[slideIndex - 1].src    
    document.getElementById(&quot;MainIMG&quot;).src = x;                
}</code></pre>
<span style="font-size:16px; color:green;">
// demo 이미지를 찾아 dots에 보관하고 값에 따라 active 스타일 값을 조정한다.<br>
// 활성화 되어있는 이미지 src를 메인 이미지로 넘겨준다</span> 

<h3 id="plusslides">plusSlides()</h3>
<pre><code class="language-javascript">function plusSlides(n) { 
    if (n &gt; 0) {
        slideIndex += 1;
        if (slideIndex &gt; totalLen) {
            slideIndex = 1;
        }
    } else {
        slideIndex -= 1;
        if (slideIndex &lt; 1) {
            slideIndex = totalLen;
        }
    }

    showSlides(slideIndex);

    if (n &gt; 0) {
        var _scrollX = $(&#39;.row&#39;).scrollLeft();
        $(&#39;.row&#39;).scrollLeft(_scrollX + moveDistance);
    } else {
        var _scrollX = $(&#39;.row&#39;).scrollLeft();
        $(&#39;.row&#39;).scrollLeft(_scrollX - moveDistance);
    }
}</code></pre>
<span style="font-size:16px; color:green;">
// prev, next 버튼을 눌렀을때 slideIndex값을 계산하여 showSlides에게 넘겨준다.<br>
// 버튼에 따라서 스크롤바를 조정해준다</span>


<h3 id="currentslide">currentSlide()</h3>
<pre><code class="language-javascript">function currentSlide(n) { 
    slideIndex = n;
    showSlides(slideIndex); 
}</code></pre>
<span style="font-size:16px; color:green;">
//서브 이미지를 클릭했을때 slideIndex값을 지정해준다.</span>

<h2 id="span-style-colordarkbluecssspan"><span style=" color:darkblue;">CSS</span></h2>
<pre><code class="language-css">
    /* 이미지 컨테이너를 배치합니다(왼쪽 및 오른쪽 화살표를 배치하는 데 필요). */
    .container_img {
        position: relative;
        padding:  20px;
        border: 1px solid #000;
        background-color: #f0f0f0;
        width: 488px; 
        height: 422px;

    }

    /* 기본적으로 이미지 숨기기 */
    .mySlide {
        display: none;
        background-color: rgb(255, 255, 255);
        text-align : center;
        overflow: hidden;
        height: 293px;
        width: 486px;
        margin-bottom: 20px;
    }

    .mainimg{
        width: 100%;
        height: 100%;
        object-fit: contain; 
    }


    /* 다음 및 이전 버튼 */
    .prev,
    .next {
        cursor: pointer;
        position: absolute;
        top: 29%;
        width: 48px; 
        font-weight: bold; 
        font-size: 50px; 
    }

    /* &#39;다음 버튼&#39;을 오른쪽에 배치합니다*/
    .next {
        right: 0;
        border-radius: 3px 0 0 3px;
    }

    /* 호버 위에 검은색 배경색 추가 */
    .prev:hover,
    .next:hover {
        color: rgba(0, 0, 0, 0.8);
    }
    .row{ 
        width: 486px;
        height: 109px;
        object-fit: contain;
        overflow-y: hidden; 
        display: flex; 
        flex-direction: row; 
        flex-wrap: nowrap; 
        background-color: white;
    }

    .row:after {
        content: &quot;&quot;;
        display: table;
        clear: both;
    }

    .column {
        float: left;
        width: 100px; 
    }

    .column img{
        width: 100px;
        height: 100px;
        object-fit: contain;
        background: rgb(255, 255, 255);
    }

    /* Thumnbail 이미지에 투명 효과 추가 */
    .demo {
        width: 100px;
        height: 100px;
        object-fit: contain;
        background: rgb(255, 255, 255);
        opacity: 0.4;
        cursor: pointer;
    }

    .active,
    .demo:hover {
        opacity: 1; 
    }


    ::-webkit-scrollbar {
        height:  8px;
    } 

    ::-webkit-scrollbar-track {
        box-shadow: inset 0 0 2px grey; 
    }  
    ::-webkit-scrollbar-thumb {
        background: #A2CAD8; 
    } 

    .button_b{
        width: 70px;
        height: 30px;
        background-color: aliceblue;
        color: #1a5663;
        position: relative;
        border: none;
        display: inline-block; 
        font-family: &quot;paybooc-Light&quot;, sans-serif; 
        text-decoration: none;
        font-weight: 600; 
        margin: 5px;
        border: 3px solid #ff5f2eaf;

    }</code></pre>
<p><strong>- 끝 -</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Slideshow Gallery 1]]></title>
            <link>https://velog.io/@lucy_leee/Slideshow-Gallery</link>
            <guid>https://velog.io/@lucy_leee/Slideshow-Gallery</guid>
            <pubDate>Mon, 28 Mar 2022 04:30:40 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>기본 소스: <a href="https://www.w3schools.com/howto/howto_js_slideshow_gallery.asp">https://www.w3schools.com/howto/howto_js_slideshow_gallery.asp</a></p>
</blockquote>
<p><code>w3schools</code>에서 지원해주는 Slideshow Gallery를 사용하려고 했지만 코드가 뭔가 맘에 안들기도 하고, 기능적인 부분에서 추가할 사항이 있어서 코드 분석을 시작했다.</p>
<p>예제는 mySlides, column에 각각 이미지를 넣어주고 JS로 순서를 맞춰 띄워주는 방식이었지만 나는 조금 더 효율적인 방법으로 코드를 개선하고 싶었다.</p>
<h2 id="span-stylecolororangehtmlspan"><span style="color:orange;">HTML</span></h2>
<p><img src="https://images.velog.io/images/lucy_leee/post/fa2e0804-15fe-4186-b7d2-27408e9f3214/image.png" alt=""></p>
<p>JS로 처리하면 이미지 경로는 한번만 지정해주고 column에서 결정된 src 주소만 mySlides로 보내주면 끝 아닌감..?</p>
<h2 id="span-style-colorffcc00javascriptspan"><span style=" color:#ffcc00;">JAVASCRIPT</span></h2>
<h3 id="plusslides">plusSlides()</h3>
<pre><code class="language-javascript">var slideIndex = 1;                                                    
showSlides(slideIndex);

function plusSlides(n) {                                   
    showSlides(slideIndex += n); 
    if(n&gt;0){
        var _scrollX = $(&#39;.row&#39;).scrollLeft();
        $(&#39;.row&#39;).scrollLeft(_scrollX + 80);  
    }else{
        var _scrollX = $(&#39;.row&#39;).scrollLeft();
        $(&#39;.row&#39;).scrollLeft(_scrollX - 80);   
    }
}</code></pre>
<p><code>prev</code>, <code>next</code> 버튼을 누르면 <code>plusSlides</code> 함수가 onclick으로 호출된다.
<code>plusSlides()</code>는 버튼을 눌렀을 때 slideIndex에 (+1), (-1) 계산해 주는 함수이다. 
나는 여기에 버튼을 누를 때마다 스크롤을 움직일 수 있게 <code>scrollLeft</code>를 사용하여 코드를 추가해 주었다.</p>
<h3 id="currentslide">currentSlide()</h3>
<pre><code class="language-javascript">function currentSlide(n) {
    showSlides(slideIndex = n);
}</code></pre>
<p>만약 사용자가 버튼이 아닌 하단에 있는 썸네일 이미지를 누른다면 <code>currentSlide</code> 함수가 onclick으로 인하여 호출되고, 그 안에는 이미지 번호가 들어있다. 이미지 번호를 바로 slideIndex로 넣어주어 계산한다.</p>
<h3 id="showslides">showSlides()</h3>
<pre><code class="language-javascript">function showSlides(n) {
    var i;
    var x;
    var slides = document.getElementsByClassName(&quot;mySlides&quot;); 
    var dots = document.getElementsByClassName(&quot;demo&quot;);

    if(n &gt; dots.length){
        slideIndex = 1;
    }else if(n &lt; 1){
        slideIndex = dots.length;
    } 

    for (i = 0; i &lt; dots.length; i++) {
        dots[i].className = dots[i].className.replace(&quot; active&quot;, &quot;&quot;); 
    }  

    dots[slideIndex - 1].className += &quot; active&quot;;                     
    x = dots[slideIndex - 1].src    
    document.getElementById(&quot;myimg&quot;).src = x;                                           
} 
</code></pre>
<p>slides는 mySlides(메인 이미지), dots는 demo(섬네일 이미지), x는 src(mainimg로 보내줄 주소)로 정의를 해준 뒤 만약 slideIndex가 슬라이더 길이보다 길면 처음으로 돌아가고, 슬라이더 길이보다 짧으면 끝으로 돌아갈 수 있게 처리해 주고, for 문을 통해 이전 썸네일 이미지에 있는 active 클래스를 지워준다.</p>
<p>또한 선택된 이미지 경로를 가지고 와서 x에 담아 둔 뒤, 그 경로를 메인 이미지로 전송해 준다.</p>
<p>그럼 HTML로 돌아와서 mySlides src 안에는 x가 들어있고, 만약 경로를 받지 못했을 때 <code>onError</code>를 사용해 임시 이미지를 생성해 준다.</p>
<h2 id="span-style-colordarkbluecssspan"><span style=" color:darkblue;">CSS</span></h2>
<pre><code class="language-css">.container_img {
        position: relative;
        padding:  20px;
        border: 1px solid #000;
        background-color: #f0f0f0;
        width: 488px;
        height: 422px; 
}

.mySlides {
        display: none;
        background-color: rgb(255, 255, 255);
        text-align : center;
        overflow: hidden;
        height: 293px;
        width: 486px;
        margin-bottom: 20px;
}

  .mainimg{
        width: 100%;
        height: 100%;
        object-fit: contain;
  }


.prev,
.next {
        cursor: pointer;
        position: absolute;
        top: 29%;
        width: 48px; 
        font-weight: bold; 
        font-size: 50px; 
}

.next {
        right: 0;
        border-radius: 3px 0 0 3px;
}

.prev:hover,
.next:hover {
        color: rgba(0, 0, 0, 0.8);
}

.row{
        display: flex;
        flex-wrap: wrap;
        height: 109px;
        overflow-y: hidden;
        flex-direction: column;
}

.row:after {
        content: &quot;&quot;;
        display: table;
        clear: both;
}

.column {
        float: left;
        width: 25%; 
}

.column img{
        width: 100%;
}

.demo {
        opacity: 0.5;
        cursor: pointer;
}

.active,
.demo:hover {
        opacity: 1;
        background-color: black;
}</code></pre>
<p><strong>- 끝 -</strong></p>
]]></description>
        </item>
    </channel>
</rss>