<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>쭐코딩</title>
    <link>https://duektmf34.tistory.com/</link>
    <description>공부한 것을 기록하는 블로그 입니다!</description>
    <language>ko</language>
    <pubDate>Wed, 8 Apr 2026 17:35:15 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>다쭐◠‿◠</managingEditor>
    <image>
      <title>쭐코딩</title>
      <url>https://tistory1.daumcdn.net/tistory/6086939/attach/a87fb66dbdb441e5a32c39d290007b24</url>
      <link>https://duektmf34.tistory.com</link>
    </image>
    <item>
      <title>자바스크립트 Throttle(스로틀)과 Debounce(디바운스)의 개념과 차이점!</title>
      <link>https://duektmf34.tistory.com/220</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 자바스크립트에서&lt;span&gt; &lt;/span&gt;이벤트&lt;span&gt; &lt;/span&gt;핸들링을&lt;span&gt; &lt;/span&gt;최적화하기&lt;span&gt; &lt;/span&gt;위해&lt;span&gt; &lt;/span&gt;많이&lt;span&gt; &lt;/span&gt;사용하는&lt;span&gt; &lt;/span&gt;개념인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Debounce와 Throttle에 대해 알아볼 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;최적화 필요성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트에서&lt;span&gt; &lt;/span&gt;이벤트&lt;span&gt; &lt;/span&gt;핸들링을&lt;span&gt; &lt;/span&gt;최적화하는&lt;span&gt; &lt;/span&gt;이유는&lt;span&gt; &lt;/span&gt;성능과&lt;span&gt; &lt;/span&gt;사용자&lt;span&gt; &lt;/span&gt;경험을&lt;span&gt; &lt;/span&gt;개선하기 위해 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히&lt;span&gt;, &lt;/span&gt;&lt;b&gt;사용자가&lt;span&gt; &lt;/span&gt;반복해서&lt;span&gt; &lt;/span&gt;발생시키는&lt;span&gt; &lt;/span&gt;이벤트&lt;span&gt;(&lt;/span&gt;예&lt;span&gt;: &lt;/span&gt;스크롤&lt;span&gt;, &lt;/span&gt;리사이즈&lt;span&gt;, &lt;/span&gt;입력&lt;span&gt; &lt;/span&gt;등&lt;span&gt;)&lt;/span&gt;&lt;/b&gt;는&lt;span&gt; &lt;/span&gt;자칫&lt;span&gt; &lt;/span&gt;성능&lt;span&gt; &lt;/span&gt;저하를&lt;span&gt; &lt;/span&gt;유발할&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있기&lt;span&gt; &lt;/span&gt;때문에..&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Throttle&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;목적&lt;/b&gt;: 특정 함수가 호출되는 빈도를 제한하여 자원 소모를 줄이기 위해 사용된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;동작 원리&lt;/b&gt;: 함수를 일정 시간 간격(예: 1000ms, 1초)으로만 실행되도록 제한한다. 이 간격 동안에는 함수를 한 번만 실행하고, 그 후에 다시 호출할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;throttle은 이벤트 핸들링, API 호출 등의 상황에서 쓰일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;throttle을 사용하는 방법은 2가지가 있는데 첫 번째는 직접 함수를 작성하는 방법과 &quot;Lodash&quot;라는 라이브러리를 사용하는 방법이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;codepen으로 확인하고 다른 예제로도 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://codepen.io/YeoDaSeul4355/embed/PoMxqZM?default-tab=result&amp;amp;theme-id=dark&quot; height=&quot;500&quot; frameborder=&quot;no&quot; scrolling=&quot;no&quot; allowfullscreen=&quot;true&quot;&gt;
  See the Pen &lt;a href=&quot;https://codepen.io/YeoDaSeul4355/pen/PoMxqZM&quot;&gt;
  Throttle 예제&lt;/a&gt; by YeoDaSeul4355 (&lt;a href=&quot;https://codepen.io/YeoDaSeul4355&quot;&gt;@YeoDaSeul4355&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.
&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;직접 throttle 함수 작성하는 방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1731048511551&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function throttle(func, delay) {
  let lastTime = 0; // 마지막 함수 호출 시간을 저장

  return function (...args) {
    const now = new Date().getTime(); // 현재 시간

    if (now - lastTime &amp;gt;= delay) { // 설정한 시간 간격이 지난 후에만 함수 실행
      func.apply(this, args); // 주어진 함수 실행
      lastTime = now; // 마지막 호출 시간을 갱신
    }
  };
}

// 사용 예제
const log = () =&amp;gt; console.log(&quot;버튼 클릭!&quot;);

const throttledLog = throttle(log, 1000); // 1초에 한 번만 호출되도록 제한

document.getElementById(&quot;myButton&quot;).addEventListener(&quot;click&quot;, throttledLog);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;&amp;nbsp;Lodash &lt;/b&gt;&lt;b&gt;라이브러리를&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;사용한&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1731048690195&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- Lodash CDN 링크 --&amp;gt;
&amp;lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;script&amp;gt;
  // 사용 예제
  const log = () =&amp;gt; console.log(&quot;버튼 클릭!&quot;);

  const throttledLog = _.throttle(log, 1000); // 1초에 한 번만 호출되도록 제한

  document.getElementById(&quot;myButton&quot;).addEventListener(&quot;click&quot;, throttledLog);
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 가지 각각 장단점이 있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;직접 구현&lt;/span&gt;할 경우 &lt;span style=&quot;color: #8a3db6;&quot;&gt;라이브러리 의존성을 줄이고, 커스터마이징을 원할 때 유용&lt;/span&gt;하고&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;Lodash&lt;/span&gt;는 &lt;span style=&quot;color: #009a87;&quot;&gt;이미 최적화된 throttle 기능을 제공하므로, 시간과 성능, 코드를 절약하고 싶을 때 사용&lt;/span&gt;하기 좋다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Debounce&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;목적&lt;/b&gt;: 빈번하게&lt;span&gt; &lt;/span&gt;발생하는&lt;span&gt; &lt;/span&gt;이벤트에&lt;span&gt; &lt;/span&gt;대해&lt;span&gt; &lt;/span&gt;불필요한&lt;span&gt; &lt;/span&gt;처리를&lt;span&gt; &lt;/span&gt;방지하고&lt;span&gt;, &lt;/span&gt;성능을&lt;span&gt; &lt;/span&gt;최적화하는&lt;span&gt; &lt;/span&gt;것&lt;/li&gt;
&lt;li&gt;&lt;b&gt;동작 원리&lt;/b&gt;: &lt;b&gt;이벤트가&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;발생할&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;때마다&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;타이머를&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;설정하고&lt;/b&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;일정&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;시간이&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;지나기&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;전에&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;또&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;다른&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;이벤트가&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;발생하면&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;기존&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;타이머를&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;취소&lt;/b&gt;하는&lt;span&gt; &lt;/span&gt;방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Debounce는 실시간 검색, 창 크기 조정, 스크롤 이벤트, 입력 유효성 검사, 검색 필터링 등의 상황에서 쓰일 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Debounce을 사용하는 방법은 2가지가 있는데 첫 번째는 직접 함수를 작성하는 방법과 &quot;Lodash&quot;라는 라이브러리를 사용하는 방법이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://codepen.io/YeoDaSeul4355/embed/GRVwJdg?default-tab=result&amp;amp;theme-id=dark&quot; height=&quot;500&quot; frameborder=&quot;no&quot; scrolling=&quot;no&quot; allowfullscreen=&quot;true&quot;&gt;
  See the Pen &lt;a href=&quot;https://codepen.io/YeoDaSeul4355/pen/GRVwJdg&quot;&gt;
  Debounce 예제&lt;/a&gt; by YeoDaSeul4355 (&lt;a href=&quot;https://codepen.io/YeoDaSeul4355&quot;&gt;@YeoDaSeul4355&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.
&lt;/iframe&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;직접 Debounce 함수 작성하는 방법&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1731049725322&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// debounce 함수 직접 구현
function debounce(func, delay) {
  let timer;
  return function (...args) {
    clearTimeout(timer); // 이전 타이머 취소
    timer = setTimeout(() =&amp;gt; func.apply(this, args), delay); // 새로운 타이머 설정
  };
}

// 검색 처리 함수
function search(query) {
  const results = document.getElementById('searchResults');
  results.innerHTML = query ? `&amp;lt;li&amp;gt;검색 결과: ${query}&amp;lt;/li&amp;gt;` : '';
}

// debounce 적용 (1초 지연)
const debouncedSearch = debounce(search, 1000);

// 검색창 이벤트 처리
document.getElementById('searchInput').addEventListener('input', (e) =&amp;gt; {
  debouncedSearch(e.target.value); // 1초 후에만 실행
});&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;직접 Debounce 함수 작성하는 방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1731049748353&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 검색 처리 함수
function search(query) {
  const results = document.getElementById('searchResults');
  results.innerHTML = query ? `&amp;lt;li&amp;gt;검색 결과: ${query}&amp;lt;/li&amp;gt;` : '';
}

// Lodash debounce 적용 (1초 지연)
const debouncedSearch = _.debounce(search, 1000);

// 검색창 이벤트 처리
document.getElementById('searchInput').addEventListener('input', (e) =&amp;gt; {
  debouncedSearch(e.target.value); // 1초 후에만 실행
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Throttle과 Debounce의 차이?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Throttle&lt;/b&gt;: &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;일정 시간 간격&lt;/b&gt;&lt;/span&gt;으로 이벤트를 실행 (주기적).&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Debounce&lt;/b&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;마지막 이벤트가 발생한 후&lt;/span&gt;&lt;/b&gt;&lt;span&gt; &lt;/span&gt;일정&lt;span&gt; &lt;/span&gt;시간&lt;span&gt; &lt;/span&gt;대기&lt;span&gt; &lt;/span&gt;후&lt;span&gt; &lt;/span&gt;실행&lt;span&gt; (&lt;/span&gt;마지막만&lt;span&gt; &lt;/span&gt;실행&lt;span&gt;).&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Throttle과 Debounce 둘 중 상황에 맞게 사용하면 될 것 같다!&lt;/p&gt;</description>
      <category>코딩/JAVASCRIPT</category>
      <category>debounce</category>
      <category>JavaScript</category>
      <category>Throttle</category>
      <category>디바운스</category>
      <category>성능최적화</category>
      <category>스로틀</category>
      <category>오블완</category>
      <category>이벤트핸들링</category>
      <category>자바스크립트</category>
      <category>티스토리챌린지</category>
      <author>다쭐◠‿◠</author>
      <guid isPermaLink="true">https://duektmf34.tistory.com/220</guid>
      <comments>https://duektmf34.tistory.com/220#entry220comment</comments>
      <pubDate>Fri, 8 Nov 2024 16:16:22 +0900</pubDate>
    </item>
    <item>
      <title>split-type, gsap를 활용해 텍스트 효과 구현해보기!</title>
      <link>https://duektmf34.tistory.com/219</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;gsap에서 제공되는 split text라는 기능이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 그건 유료이기 때문에 split-type이라는 무료 플러그인을 사용해서 글자 쪼개기,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gsap를 활용해 애니메이션까지 구현해 볼 예정!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://codepen.io/YeoDaSeul4355/embed/VwoErbj?default-tab=result&amp;amp;theme-id=dark&quot; height=&quot;800&quot; frameborder=&quot;no&quot; scrolling=&quot;no&quot; allowfullscreen=&quot;true&quot;&gt;
  See the Pen &lt;a href=&quot;https://codepen.io/YeoDaSeul4355/pen/VwoErbj&quot;&gt;
  Split-type, GSAP 활용한 텍스트 효과&lt;/a&gt; by YeoDaSeul4355 (&lt;a href=&quot;https://codepen.io/YeoDaSeul4355&quot;&gt;@YeoDaSeul4355&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.
&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;활용한 플러그인&lt;/h4&gt;
&lt;pre id=&quot;code_1730959398866&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script src=&quot;https://unpkg.com/split-type&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;split-type과 gsap 플러그인 연결해주어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 파일로 저장해서 연결해도 ok&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML 구조&lt;/p&gt;
&lt;pre id=&quot;code_1730959447138&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;section&amp;gt;
  &amp;lt;button onclick=&quot;playBtn()&quot;&amp;gt;Play Split Text!&amp;lt;/button&amp;gt;
  &amp;lt;p class=&quot;text&quot;&amp;gt;
    Lorem ipsum dolor sit amet consectetur adipisicing elit. Porro nostrum
    distinctio ad quo natus et animi facere suscipit fuga sed rem aliquam
    exercitationem possimus non, ab enim illo dolore officia molestiae?
    Eligendi doloribus voluptatibus in necessitatibus, porro corrupti fugiat
    recusandae esse, provident ducimus ab iure ratione tenetur eius magni
    accusantium temporibus incidunt magnam nesciunt ipsa molestiae placeat
    facilis excepturi? Beatae reiciendis saepe eligendi quas est fugiat
    repellat. Nisi, earum quod non dignissimos eaque reprehenderit fugiat
    culpa corporis illum ullam error id totam, qui doloribus, quibusdam
    ipsam eum! Odit, incidunt, quos id ipsam inventore qui molestias facere
    pariatur perferendis unde beatae!
  &amp;lt;/p&amp;gt;
&amp;lt;/section&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 section 안에 p태그를 작성해 로렌입숨 작성~&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;text라는 class를 붙여주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 난 버튼을 누르면 애니메이션이 재생되도록 &lt;b&gt;button태그와 onclick속성&lt;/b&gt;을 사용함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;CSS&lt;/h4&gt;
&lt;pre id=&quot;code_1730959790074&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@import url(&quot;https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&amp;amp;display=swap&quot;);
* {
    margin: 0;
    padding: 0;
}
body {
    overflow-x: hidden;
    font-family: &quot;Roboto&quot;;
}
section {
    width: 100vw;
    height: 100vh;
    display: flex;
    flex-direction: column;
    gap: 50px 0;
    align-items: center;
    justify-content: center;
}
section p {
    word-break: keep-all;
    padding: 0 30px;
    line-height: 30px;
    font-size: 22px;
}
button {
    border: 1px solid #000;
    background: #fff;
    padding: 10px;
    border-radius: 20px;
    cursor: pointer;
}

//   overflow: hidden;
.line {
    display: inline-block;
    overflow: hidden;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딱히 css부분은 설명할 부분은 없지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신경써야할 부분이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 .line 부분인데 일단 스크립트 설명이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;스크립트&lt;/h4&gt;
&lt;pre id=&quot;code_1730960217101&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function playBtn() {
  let typeSplit = new SplitType(&quot;.text&quot;, {
    types: &quot;lines, words, chars&quot;,
    tagName: &quot;span&quot;,
  });

  gsap.from(&quot;.text .word&quot;, {
    y: &quot;100%&quot;,
    opacity: 1,
    duration: 0.3,
    ease: &quot;circ.out&quot;,
    stagger: 0.1,
  });
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;  글자 쪼개기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Split-type은 텍스트를 줄(lines), 단어(words), 그리고 글자(chars) 단위로 나누는 라이브러리이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;new SplitType(&quot;.text&quot;, {...})는 .text 클래스를 가진 요소 내의 텍스트를 각 줄, 단어, 글자 단위로 분리한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;tagName: &quot;span&quot;&amp;nbsp;&lt;/span&gt;옵션을&lt;span&gt; &lt;/span&gt;설정하면&lt;span&gt; &lt;/span&gt;각&lt;span&gt; &lt;/span&gt;줄&lt;span&gt;, &lt;/span&gt;단어&lt;span&gt;, &lt;/span&gt;글자가&lt;span&gt;&amp;nbsp;&amp;lt;span&amp;gt;&amp;nbsp;&lt;/span&gt;태그로&lt;span&gt; &lt;/span&gt;감싸진다&lt;span&gt;. &lt;/span&gt;이&lt;span&gt; &lt;/span&gt;태그는&lt;span&gt; &lt;/span&gt;이후&lt;span&gt; &lt;/span&gt;애니메이션에서&lt;span&gt; &lt;/span&gt;각&lt;span&gt; &lt;/span&gt;텍스트&lt;span&gt; &lt;/span&gt;요소를&lt;span&gt; &lt;/span&gt;선택할&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있게&lt;span&gt; &lt;/span&gt;해주는데, span이 아니고 다른 태그로 감싸기 가능(em, p, div 등등등..)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;  GSAP 애니메이션 주기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;gsap.from(...)는 애니메이션이 시작할 때의 상태를 설정하는 메서드. 여기서는 &quot;.text .word&quot; 선택자를 통해 .text 요소 내의 각 단어(.word 클래스로 감싸진 요소들)에 애니메이션을 적용&lt;/li&gt;
&lt;li&gt;y: &quot;100%&quot;는 각 단어가 애니메이션 시작 시 아래쪽으로 100% 위치에서 시작하도록 설정. 즉, 텍스트가 아래에서 위로 올라오는 효과가 나타난다.&lt;/li&gt;
&lt;li&gt;opacity: 1은 각 단어가 애니메이션 시작 시 불투명도가 1로 설정되어 있으며(투명도가 없도록 설정), 이를 통해 부드러운 전환 효과가 난다.&lt;/li&gt;
&lt;li&gt;ease: &quot;circ.out&quot;은 애니메이션의 속도 곡선을 정의하는데, circ.out은 빠르게 시작했다가 천천히 끝나는 원형의 속도 곡선으로, 자연스러운 움직임을 만든다. (다른 ease 효과도 많으니 참고!). &amp;nbsp;&lt;a href=&quot;https://gsap.com/docs/v3/Eases/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://gsap.com/docs/v3/Eases/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;stagger: 0.1&lt;/span&gt;은&lt;span&gt; &lt;/span&gt;각&lt;span&gt; &lt;/span&gt;단어가&lt;span&gt; 0.1&lt;/span&gt;초&lt;span&gt; &lt;/span&gt;간격으로&lt;span&gt; &lt;/span&gt;순차적으로&lt;span&gt; &lt;/span&gt;애니메이션되도록&lt;span&gt; &lt;/span&gt;하여&lt;span&gt; &lt;/span&gt;하나씩&lt;span&gt; &lt;/span&gt;등장하는&lt;span&gt; &lt;/span&gt;효과를 준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-07 오후 3.10.39.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXm1y6/btsKAYP2xqQ/jrQwtKtIPYudP6Ddmjt5Uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXm1y6/btsKAYP2xqQ/jrQwtKtIPYudP6Ddmjt5Uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXm1y6/btsKAYP2xqQ/jrQwtKtIPYudP6Ddmjt5Uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXm1y6%2FbtsKAYP2xqQ%2FjrQwtKtIPYudP6Ddmjt5Uk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;660&quot; height=&quot;180&quot; data-filename=&quot;스크린샷 2024-11-07 오후 3.10.39.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 구조를 살펴보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;text 안에 line,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;line 안에 word,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;word 안에 char가 있는 걸 확인할 수 있다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-07 오후 3.11.00.png&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zgOx8/btsKy1npcvY/bcE0gbtx1Xir3MAOdcbSO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zgOx8/btsKy1npcvY/bcE0gbtx1Xir3MAOdcbSO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zgOx8/btsKy1npcvY/bcE0gbtx1Xir3MAOdcbSO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzgOx8%2FbtsKy1npcvY%2FbcE0gbtx1Xir3MAOdcbSO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;910&quot; height=&quot;392&quot; data-filename=&quot;스크린샷 2024-11-07 오후 3.11.00.png&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;.line에 overflow: hidden을 준 이유?  &lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;.line&amp;nbsp;&lt;/span&gt;요소에&lt;span&gt;&amp;nbsp;overflow: hidden&lt;/span&gt;을&lt;span&gt; &lt;/span&gt;설정한&lt;span&gt; &lt;/span&gt;이유는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;텍스트&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;애니메이션이&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;이동할&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;때&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;불필요하게&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;보이는&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;부분을&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;숨기기&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;위해서이다&lt;/b&gt;&lt;span&gt;. &lt;/span&gt;아래에서&lt;span&gt; &lt;/span&gt;위로&lt;span&gt; &lt;/span&gt;이동하는&lt;span&gt; &lt;/span&gt;애니메이션&lt;span&gt; &lt;/span&gt;중&lt;span&gt; &lt;/span&gt;텍스트가&lt;span&gt; &lt;/span&gt;화면&lt;span&gt; &lt;/span&gt;밖에&lt;span&gt; &lt;/span&gt;있는&lt;span&gt; &lt;/span&gt;동안&lt;span&gt; &lt;/span&gt;보이지&lt;span&gt; &lt;/span&gt;않게&lt;span&gt; &lt;/span&gt;하는&lt;span&gt; &lt;/span&gt;역할을 한다. word를 line이 감싸고 있기 때문에 .line에다 해당 속성을 준 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 span태그는 inline요소기 때문에 inline-block을 적용해 주어야한다. (태그에 따라 다르므로 참고.)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;밑 예제는 overflow: hidden을 적용 시키지 않았을 때의 예제!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://codepen.io/YeoDaSeul4355/embed/ZEgqvNe?default-tab=result&amp;amp;theme-id=dark&quot; height=&quot;800&quot; frameborder=&quot;no&quot; scrolling=&quot;no&quot; allowfullscreen=&quot;true&quot;&gt;
  See the Pen &lt;a href=&quot;https://codepen.io/YeoDaSeul4355/pen/ZEgqvNe&quot;&gt;
  test&lt;/a&gt; by YeoDaSeul4355 (&lt;a href=&quot;https://codepen.io/YeoDaSeul4355&quot;&gt;@YeoDaSeul4355&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.
&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;전체코드&lt;/h4&gt;
&lt;pre id=&quot;code_1730964096084&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;test&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
      @import url(&quot;https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&amp;amp;display=swap&quot;);
      * {
        margin: 0;
        padding: 0;
      }
      body {
        overflow-x: hidden;
        font-family: &quot;Roboto&quot;;
      }
      section {
        width: 100vw;
        height: 100vh;
        display: flex;
        flex-direction: column;
        gap: 50px 0;
        align-items: center;
        justify-content: center;
      }
      section p {
        word-break: keep-all;
        padding: 0 30px;
        line-height: 30px;
        font-size: 22px;
      }
      .line {
        display: inline-block;
        overflow: hidden;
      }
      button {
        border: 1px solid #000;
        background: #fff;
        padding: 10px;
        border-radius: 20px;
        cursor: pointer;
      }
    &amp;lt;/style&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;section&amp;gt;
      &amp;lt;button onclick=&quot;playBtn()&quot;&amp;gt;Play Split Text!&amp;lt;/button&amp;gt;
      &amp;lt;p class=&quot;text&quot;&amp;gt;
        Lorem ipsum dolor sit amet consectetur adipisicing elit. Porro nostrum
        distinctio ad quo natus et animi facere suscipit fuga sed rem aliquam
        exercitationem possimus non, ab enim illo dolore officia molestiae?
        Eligendi doloribus voluptatibus in necessitatibus, porro corrupti fugiat
        recusandae esse, provident ducimus ab iure ratione tenetur eius magni
        accusantium temporibus incidunt magnam nesciunt ipsa molestiae placeat
        facilis excepturi? Beatae reiciendis saepe eligendi quas est fugiat
        repellat. Nisi, earum quod non dignissimos eaque reprehenderit fugiat
        culpa corporis illum ullam error id totam, qui doloribus, quibusdam
        ipsam eum! Odit, incidunt, quos id ipsam inventore qui molestias facere
        pariatur perferendis unde beatae!
      &amp;lt;/p&amp;gt;
    &amp;lt;/section&amp;gt;
  &amp;lt;/body&amp;gt;
  &amp;lt;script src=&quot;https://unpkg.com/split-type&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

  &amp;lt;script&amp;gt;
    function playBtn() {
      let typeSplit = new SplitType(&quot;.text&quot;, {
        types: &quot;lines, words, chars&quot;,
        tagName: &quot;span&quot;,
      });

      gsap.from(&quot;.text .word&quot;, {
        y: &quot;100%&quot;,
        opacity: 1,
        duration: 0.3,
        ease: &quot;circ.out&quot;,
        stagger: 0.1,
      });
    }
  &amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 기능을 통해 스크롤 트리거까지 활용하면 훨씬 더 고급스러운 효과를 표현할 수 있다!&lt;/p&gt;</description>
      <category>코딩</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>다쭐◠‿◠</author>
      <guid isPermaLink="true">https://duektmf34.tistory.com/219</guid>
      <comments>https://duektmf34.tistory.com/219#entry219comment</comments>
      <pubDate>Thu, 7 Nov 2024 16:09:36 +0900</pubDate>
    </item>
    <item>
      <title>[GSAP] 스크롤에 따른 배경 트랜지션 효과 구현해보기</title>
      <link>https://duektmf34.tistory.com/218</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;오늘은 GSAP(ScrollTrigger)와 Lenis 라이브러리를 써서 스크롤에 따라 반응하는 애니메이션을 만들어보았다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;사용 라이브러리 (플러그인)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- GSAP&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- ScrollTrigger(GSAP에서 제공하는 또다른 플러긘)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- Lenis (부드러운 스크롤 제공)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;완성작&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;iframe src=&quot;https://codepen.io/YeoDaSeul4355/embed/vYoWKQx?default-tab=result&amp;amp;theme-id=dark&quot; height=&quot;600&quot; frameborder=&quot;no&quot; scrolling=&quot;no&quot; allowfullscreen=&quot;true&quot;&gt;
  See the Pen &lt;a href=&quot;https://codepen.io/YeoDaSeul4355/pen/vYoWKQx&quot;&gt;
  GSAP image transition&lt;/a&gt; by YeoDaSeul4355 (&lt;a href=&quot;https://codepen.io/YeoDaSeul4355&quot;&gt;@YeoDaSeul4355&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.
&lt;/iframe&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;HTML 구조&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1729844245531&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;section&amp;gt;
  &amp;lt;!-- 이미지 영역 --&amp;gt;
  &amp;lt;div class='img_area'&amp;gt;
    &amp;lt;img src='https://images.unsplash.com/photo-1607798748738-b15c40d33d57?q=80&amp;amp;w=2070&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;ixlib=rb-4.0.3&amp;amp;ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D'&amp;gt;
    &amp;lt;img src='https://images.unsplash.com/photo-1624377632657-3902bfd35958?q=80&amp;amp;w=2070&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;ixlib=rb-4.0.3&amp;amp;ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D'&amp;gt;
    &amp;lt;img src='https://images.unsplash.com/photo-1607706189992-eae578626c86?q=80&amp;amp;w=2070&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;ixlib=rb-4.0.3&amp;amp;ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D'&amp;gt;
  &amp;lt;/div&amp;gt;
  
  &amp;lt;!-- 텍스트 영역 --&amp;gt;
  &amp;lt;div class='txt_area'&amp;gt;
    &amp;lt;ul class='txt_container'&amp;gt;
      &amp;lt;li&amp;gt;GSAP&amp;lt;/li&amp;gt;
      &amp;lt;li&amp;gt; ScrollTrigger&amp;lt;/li&amp;gt;
      &amp;lt;li&amp;gt;SmoothScroll&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이미지 영역과 텍스트 영역을 나눠준다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;CSS&lt;/h4&gt;
&lt;pre id=&quot;code_1729844448644&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;section {width: 100%; overflow-x: hidden;}

.img_area {width: 100%;}
.img_area img {width: 100%; height: 100vh; object-fit: cover; position: absolute; left: 0; top: 0;}

.txt_area {position: relative; }
.txt_area .txt_container {text-align: center; color: #fff; font-size: 3rem;}
.txt_area .txt_container li {height: 100vh; display: flex; align-items: center; justify-content: center;}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 점은 img_area에 있는 이미지들을 absolute로 주어 3장 다 고정시켜주어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;텍스트는 높이를 100vh로 잡아놓은 뒤 화면 가운데에 배치하기 위해 flex,와 content, items요소들을 center로 잡는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;txt_area에 position: relative를 준 이유는 img_area를 고정시켰기 때문.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;스크립트 주소 연동&lt;/h4&gt;
&lt;pre id=&quot;code_1729844835909&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script src='https://unpkg.com/gsap@3/dist/gsap.min.js'&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src='https://unpkg.com/gsap@3/dist/ScrollTrigger.min.js'&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src='https://unpkg.com/lenis@1.1.14/dist/lenis.min.js'&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용할 스크립트 주소를 적어 연동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순서대로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GSAP -&amp;gt; ScrollTrigger -&amp;gt; Lenis&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;스크립트 작성&lt;/h4&gt;
&lt;pre id=&quot;code_1729844999081&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Lenis 초기화
const lenis = new Lenis({
  duration: 1.2,
  easing: (t) =&amp;gt; Math.min(1, 1.001 - Math.pow(2, -10 * t)),
  smooth: true,
});

const raf = (time) =&amp;gt; {
  lenis.raf(time);
  requestAnimationFrame(raf);
};
requestAnimationFrame(raf);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 부드러운 스크롤 먼저 적용 시켜보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Lenis 초기화&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;duration: 스크롤 애니메이션의 지속 시간을 설정. 여기서는 1.2초로 설정&lt;/li&gt;
&lt;li&gt;easing: 스크롤 애니메이션의 속도 곡선을 정의하는 함수. 여기서 사용된 함수는 타임(t) 값을 입력받아 0에서 1까지의 값을 출력하는데, 이 방식은 부드러운 시작과 끝을 만들기 위해 비선형적인 애니메이션 효과를 제공.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;smooth: &lt;/span&gt;이&lt;span&gt; &lt;/span&gt;속성이&lt;span&gt;&amp;nbsp;true&lt;/span&gt;로&lt;span&gt; &lt;/span&gt;설정되면&lt;span&gt; &lt;/span&gt;부드러운&lt;span&gt; &lt;/span&gt;스크롤&lt;span&gt; &lt;/span&gt;효과를&lt;span&gt; &lt;/span&gt;활성화&lt;span&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;애니메이션 프레임 요청&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;raf: 이 함수는 requestAnimationFrame을 사용하여 Lenis의 스크롤 메커니즘을 매 프레임마다 업데이트함. time 매개변수는 현재 시간의 타임스탬프를 나타냄.&lt;/li&gt;
&lt;li&gt;lenis.raf(time): 이 호출은 Lenis의 내부 애니메이션 로직을 업데이트.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;requestAnimationFrame(raf): &lt;/span&gt;이&lt;span&gt; &lt;/span&gt;함수는&lt;span&gt; &lt;/span&gt;다음&lt;span&gt; &lt;/span&gt;프레임에&lt;span&gt;&amp;nbsp;raf&amp;nbsp;&lt;/span&gt;함수를&lt;span&gt; &lt;/span&gt;다시&lt;span&gt; &lt;/span&gt;호출하도록&lt;span&gt; &lt;/span&gt;요청&lt;span&gt;. &lt;/span&gt;이렇게&lt;span&gt; &lt;/span&gt;하여&lt;span&gt; &lt;/span&gt;부드러운&lt;span&gt; &lt;/span&gt;애니메이션&lt;span&gt; &lt;/span&gt;효과를&lt;span&gt; &lt;/span&gt;지속적으로&lt;span&gt; &lt;/span&gt;유지한다&lt;span&gt;.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1729845183693&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 이미지 초기 설정
const images = document.querySelectorAll('.img_area img'); // querySelectorAll로 모든 이미지 가져와서 변수에 저장
gsap.set(images, { zIndex: 0, opacity: 0 }); // 모든 이미지의 z-index값과 opacity를 0으로 설정
gsap.set(images[0], { opacity: 1, zIndex: 1 }); // 첫 번째 이미지만 보이게 설정

// GSAP ScrollTrigger 설정
gsap.registerPlugin(ScrollTrigger);
const timeline = gsap.timeline({
  scrollTrigger: {
    trigger: &quot;.img_area&quot;,
    start: &quot;top top&quot;,
    end: &quot;bottom bottom&quot;,
    endTrigger: '.txt_container',
    scrub: true,
    pin: true,
    pinSpacing: false,
    onEnter: () =&amp;gt; {
      gsap.to(images[0], { opacity: 1, zIndex: 1, duration: 0.7 }); // 페이지 로드 시 첫 번째 이미지 보이기
    }
  },
});

// 각 텍스트 항목에 대한 ScrollTrigger 생성
gsap.utils.toArray('.txt_container li').forEach((li, index) =&amp;gt; {
    ScrollTrigger.create({
        trigger: li,
        start: 'top 80%',
        end: 'bottom top',
        onEnter: () =&amp;gt; {
            gsap.to(images[index], { opacity: 1, zIndex: 1, duration: 0.7 });
        },
        onLeaveBack: () =&amp;gt; {
            gsap.to(images[index], { opacity: 0, zIndex: 0, duration: 0.7 });
        },
        markers: true,
    });
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맨 처음 이미지 초기 설정을 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이미지 초기 설정&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;이미지 선택&lt;/b&gt;: .img_area 클래스 아래의 모든 이미지 요소를 선택하여 images 변수에 저장.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;초기 스타일 설정&lt;/b&gt;: 모든 이미지의&amp;nbsp;zIndex와&amp;nbsp;opacity를 0으로 설정하여 처음에는 보이지 않도록 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;첫&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;번째&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;이미지&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;설정&lt;/b&gt;&lt;span&gt;: &lt;/span&gt;첫&lt;span&gt; &lt;/span&gt;번째&lt;span&gt; &lt;/span&gt;이미지만&lt;span&gt;&amp;nbsp;opacity&lt;/span&gt;를&lt;span&gt; 1&lt;/span&gt;로&lt;span&gt; &lt;/span&gt;설정하여&lt;span&gt; &lt;/span&gt;보이도록&lt;span&gt; &lt;/span&gt;하고&lt;span&gt;,&amp;nbsp;zIndex&lt;/span&gt;를&lt;span&gt; 1&lt;/span&gt;로&lt;span&gt; &lt;/span&gt;설정하여&lt;span&gt; &lt;/span&gt;다른&lt;span&gt; &lt;/span&gt;이미지보다&lt;span&gt; &lt;/span&gt;위에&lt;span&gt; &lt;/span&gt;표시되도록&lt;span&gt;&amp;nbsp;한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;이미지 고정하는 ScrollTrigger Pin 효과 생성&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ScrollTrigger 등록:&amp;nbsp; GSAP의 ScrollTrigger 플러그인을 등록 함.&lt;/li&gt;
&lt;li&gt;타임라인 생성: GSAP의 타임라인을 생성하고, 스크롤과 관련된 애니메이션을 설정함.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;옵션 부가 설명 보기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;trigger: 스크롤을 감지할 요소입니다. 여기서는 .img_area를 지정했습니다.&lt;/li&gt;
&lt;li&gt;start: 스크롤의 시작 위치를 정의합니다. 여기서는 .img_area의 최상단이 뷰포트의 최상단에 도달할 때 시작합니다.&lt;/li&gt;
&lt;li&gt;end: 스크롤의 끝 위치를 정의합니다. 여기서는 .img_area의 하단이 뷰포트의 하단에 도달할 때 종료합니다.&lt;/li&gt;
&lt;li&gt;endTrigger: 끝 위치를 결정하는 다른 요소를 지정합니다. 여기서는 .txt_container를 사용합니다.&lt;/li&gt;
&lt;li&gt;scrub: true로 설정하면 스크롤에 따라 애니메이션의 진행이 동기화됩니다.&lt;/li&gt;
&lt;li&gt;pin: true로 설정하면 해당 요소를 고정(pinning)하여 스크롤 중에도 화면에 고정됩니다.&lt;/li&gt;
&lt;li&gt;pinSpacing: false로 설정하면 핀 고정 시 추가 공간을 차지하지 않게 합니다.&lt;/li&gt;
&lt;li&gt;onEnter:&amp;nbsp;스크롤이&amp;nbsp;시작될&amp;nbsp;때&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;이미지를&amp;nbsp;보이도록&amp;nbsp;애니메이션을&amp;nbsp;설정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;span&gt;&lt;b&gt;각&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;텍스트&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;항목에&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;대한&lt;/b&gt;&lt;/span&gt;&lt;b&gt; ScrollTrigger &lt;/b&gt;&lt;span&gt;&lt;b&gt;생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;텍스트 항목 선택&lt;/b&gt;: .txt_container 내의 모든 &amp;lt;li&amp;gt; 요소를 배열로 변환하여 각각의 텍스트 항목에 대해 반복.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;ScrollTrigger &lt;/b&gt;&lt;/span&gt;&lt;b&gt;생성&lt;/b&gt;&lt;span&gt;: &lt;/span&gt;각&lt;span&gt; &lt;/span&gt;텍스트&lt;span&gt; &lt;/span&gt;항목에&lt;span&gt; &lt;/span&gt;대해&lt;span&gt; ScrollTrigger&lt;/span&gt;를&lt;span&gt; &lt;/span&gt;생성하여&lt;span&gt; &lt;/span&gt;스크롤과&lt;span&gt; &lt;/span&gt;관련된&lt;span&gt; &lt;/span&gt;애니메이션을&lt;span&gt; &lt;/span&gt;설정&lt;span&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;옵션 부가 설명 보기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;trigger: 현재&amp;nbsp;&amp;lt;li&amp;gt;&amp;nbsp;요소를 스크롤 트리거로 설정합니다.&lt;/li&gt;
&lt;li&gt;start: 해당 요소의 최상단이 뷰포트의 80% 지점에 도달할 때 애니메이션이 시작됩니다.&lt;/li&gt;
&lt;li&gt;end: 해당 요소의 하단이 뷰포트의 최상단에 도달할 때 애니메이션이 종료됩니다.&lt;/li&gt;
&lt;li&gt;onEnter: 해당 텍스트 항목이 뷰포트에 들어오면 해당 인덱스의 이미지를 보이도록 애니메이션을 설정합니다.&lt;/li&gt;
&lt;li&gt;onLeaveBack: 해당 텍스트 항목이 뷰포트를 벗어나면 해당 인덱스의 이미지를 숨기도록 애니메이션을 설정합니다.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;markers:&amp;nbsp;true&lt;/span&gt;로&lt;span&gt; &lt;/span&gt;설정하면&lt;span&gt; &lt;/span&gt;디버깅을&lt;span&gt; &lt;/span&gt;위해&lt;span&gt; &lt;/span&gt;스크롤&lt;span&gt; &lt;/span&gt;트리거의&lt;span&gt; &lt;/span&gt;시작과&lt;span&gt; &lt;/span&gt;끝&lt;span&gt; &lt;/span&gt;지점을&lt;span&gt; &lt;/span&gt;화면에&lt;span&gt; &lt;/span&gt;표시합니다&lt;span&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩</category>
      <category>gsap</category>
      <category>lenis</category>
      <category>scrolltrigger</category>
      <category>부드러운스크롤</category>
      <category>스크롤트리거</category>
      <category>애니메이션</category>
      <category>트랜지션</category>
      <category>효과</category>
      <author>다쭐◠‿◠</author>
      <guid isPermaLink="true">https://duektmf34.tistory.com/218</guid>
      <comments>https://duektmf34.tistory.com/218#entry218comment</comments>
      <pubDate>Fri, 25 Oct 2024 17:49:35 +0900</pubDate>
    </item>
    <item>
      <title>알리고 알람톡 보내기</title>
      <link>https://duektmf34.tistory.com/217</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;알리고로 알람톡 보내려면 카카오 채널을 만들어야하고 비즈니스로 등록하려면 사업자 등록증이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;api키 발급받는 것까진 공식 문서 정독을 추천한다(한국어니까)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://smartsms.aligo.in/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://smartsms.aligo.in/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1728881735998&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;알리고&quot; data-og-description=&quot;알리고 - 국내 최저가 문자발송 알리고 문자, 단문8.4원 장문25원 그림60원 알리고 대량문자/단체문자/문자사이트/문자발송&quot; data-og-host=&quot;smartsms.aligo.in:443&quot; data-og-source-url=&quot;https://smartsms.aligo.in/&quot; data-og-url=&quot;http://smartsms.aligo.in/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/GHTeo/hyXhWej848/4kiTKYJkZLb3FnWgNai7pK/img.png?width=237&amp;amp;height=30&amp;amp;face=0_0_237_30&quot;&gt;&lt;a href=&quot;https://smartsms.aligo.in/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://smartsms.aligo.in/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/GHTeo/hyXhWej848/4kiTKYJkZLb3FnWgNai7pK/img.png?width=237&amp;amp;height=30&amp;amp;face=0_0_237_30');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;알리고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;알리고 - 국내 최저가 문자발송 알리고 문자, 단문8.4원 장문25원 그림60원 알리고 대량문자/단체문자/문자사이트/문자발송&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;smartsms.aligo.in:443&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://smartsms.aligo.in/aligoxkakao.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://smartsms.aligo.in/aligoxkakao.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1728881784143&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;알리고&quot; data-og-description=&quot;알리고 - 국내 최저가 문자발송 알리고 문자, 단문8.4원 장문25원 그림60원 알리고 대량문자/단체문자/문자사이트/문자발송&quot; data-og-host=&quot;smartsms.aligo.in:443&quot; data-og-source-url=&quot;https://smartsms.aligo.in/aligoxkakao.html&quot; data-og-url=&quot;http://smartsms.aligo.in/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/s2KGu/hyXhOHmaFm/EcTTiqiM1B2WcbAynebnP0/img.png?width=237&amp;amp;height=30&amp;amp;face=0_0_237_30&quot;&gt;&lt;a href=&quot;https://smartsms.aligo.in/aligoxkakao.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://smartsms.aligo.in/aligoxkakao.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/s2KGu/hyXhOHmaFm/EcTTiqiM1B2WcbAynebnP0/img.png?width=237&amp;amp;height=30&amp;amp;face=0_0_237_30');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;알리고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;알리고 - 국내 최저가 문자발송 알리고 문자, 단문8.4원 장문25원 그림60원 알리고 대량문자/단체문자/문자사이트/문자발송&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;smartsms.aligo.in:443&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://smartsms.aligo.in/alimapi.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://smartsms.aligo.in/alimapi.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1728881793258&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;알리고&quot; data-og-description=&quot;알리고 - 국내 최저가 문자발송 알리고 문자, 단문8.4원 장문25원 그림60원 알리고 대량문자/단체문자/문자사이트/문자발송&quot; data-og-host=&quot;smartsms.aligo.in:443&quot; data-og-source-url=&quot;https://smartsms.aligo.in/alimapi.html&quot; data-og-url=&quot;http://smartsms.aligo.in/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cUh9Rw/hyXhQSHYUY/h09EQKLUlnW9uLVBUBrVV1/img.png?width=237&amp;amp;height=30&amp;amp;face=0_0_237_30&quot;&gt;&lt;a href=&quot;https://smartsms.aligo.in/alimapi.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://smartsms.aligo.in/alimapi.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cUh9Rw/hyXhQSHYUY/h09EQKLUlnW9uLVBUBrVV1/img.png?width=237&amp;amp;height=30&amp;amp;face=0_0_237_30');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;알리고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;알리고 - 국내 최저가 문자발송 알리고 문자, 단문8.4원 장문25원 그림60원 알리고 대량문자/단체문자/문자사이트/문자발송&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;smartsms.aligo.in:443&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알림톡 보내기 전 사용자 인증(토큰 발급)을 해야 알림톡을 보낼 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;코드&lt;/h4&gt;
&lt;pre id=&quot;code_1728882327005&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
  // 토큰 발급 함수
  function getToken() {
    let getTokenData = {
      'apikey' : '알리고 API KEY', 
      'userid' : '알리고 계정 ID'
    }
    
    // ajax로 비동기 통신
    $.ajax({
      // 토큰 발급하는 api url
      url : 'https://kakaoapi.aligo.in/akv10/token/create/30/s',
      data : getTokenData,
      type : 'post',
      success : function(result) {
        // result에서 나온 토큰을 변수 token에 저장
        let token = result.token;
        // sendMassage 함수에 매개변수로 token 전달해줌
        sendMessage(token);
      }
    });
  }
  
  // 알림톡 보내는 함수
  function sendMessage(token) {
    // 객체로 보냄
    let sendAlimTalkData = {
      'apikey' : '알리고 APIKEY',
      'userid' : '알리고 ID',
      'token' : token,// 매개변수로 받은 token
      'senderkey' : '알리고 senderkey(지급해줌)',
      'tpl_code' : '템플릿 코드', // 템플릿 생성하면 코드 알려줌 
      'sender' : '발신자 연락처', //발신자 연락처 따로 설정해야함
      'receiver_1' : '수신자 연락처', //php로 값을 받아와 변수에 지정 후 넣어줌 &amp;lt;?= $reciver ?&amp;gt; 이런식으로
      'subject_1' : '템플릿 제목', // 발송된 템플릿 제목 정확히 기입
      'message_1' : &quot;발송될 템플릿 내용&quot;, // 발송될 템플릿 내용을 정규식으로 적어야함(띄어쓰기, 기호 등등. GPT에 물어보면 정규식까지 작성해줌)
      'message_2' : &quot;발송될 템플릿 내용2&quot;, // 발송될 템플릿 내용2
        
      // 버튼 있을 시(옵션)
      'button_1' : '{&quot;button&quot; : [{&quot;name&quot;:&quot;버튼 이름&quot;, &quot;linkType&quot;:&quot;WL&quot;, &quot;linkP&quot; : &quot;이동할 링크&quot;, &quot;linkM&quot;: &quot;이동할 링크&quot;}]}' //발송될 템플릿 버튼 내용
    };
	  
    // ajax로 비동기 통신
    $.ajax({
      // 알람톡 보내는 api url
      url : 'https://kakaoapi.aligo.in/akv10/alimtalk/send',
      data : sendAlimTalkData, // 알림톡 데이터(객체)
      type : 'post',
      success : function(result) {
        // 성공시 디버깅
        console.log(result.code);
        console.log(result.message);
      }
    });
  }
	
  // 토큰 얻는 함수부터 실행해줌 
  getToken();
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 - &lt;a href=&quot;https://blog.naver.com/jeongkey3317/222942775688&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blog.naver.com/jeongkey3317/222942775688&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.naver.com/dev-blackcat/222262387331&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blog.naver.com/dev-blackcat/222262387331&lt;/a&gt;&lt;/p&gt;</description>
      <category>코딩/JAVASCRIPT</category>
      <author>다쭐◠‿◠</author>
      <guid isPermaLink="true">https://duektmf34.tistory.com/217</guid>
      <comments>https://duektmf34.tistory.com/217#entry217comment</comments>
      <pubDate>Mon, 14 Oct 2024 14:13:03 +0900</pubDate>
    </item>
    <item>
      <title>맥 전용 에디터 Nova로 FTP 연결해보기(노바 에디터, 구 코다)</title>
      <link>https://duektmf34.tistory.com/216</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;맥으로 갈아탄 기념으루 ^.^&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Nova FTP연결하는 방법을 기록해보려한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 Nova 에디터 사용하는 사람이 별로 없어서 그런지.. 구글링해도 잘 안 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2024-08-06 오후 5.50.33.png&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0msP4/btsIWGcK4co/rc5CN1FMHMiGen33s2xV9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0msP4/btsIWGcK4co/rc5CN1FMHMiGen33s2xV9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0msP4/btsIWGcK4co/rc5CN1FMHMiGen33s2xV9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0msP4%2FbtsIWGcK4co%2Frc5CN1FMHMiGen33s2xV9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;938&quot; height=&quot;558&quot; data-filename=&quot;edited_스크린샷 2024-08-06 오후 5.50.33.png&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 한 번 연결해놓으면 편하게 관리할 수 있당.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 프로젝트 추가&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-06 오후 5.54.17.png&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9mKVB/btsIWib6QDH/vIK26tXReA0evPmWseU3Nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9mKVB/btsIWib6QDH/vIK26tXReA0evPmWseU3Nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9mKVB/btsIWib6QDH/vIK26tXReA0evPmWseU3Nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9mKVB%2FbtsIWib6QDH%2FvIK26tXReA0evPmWseU3Nk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;856&quot; height=&quot;510&quot; data-filename=&quot;스크린샷 2024-08-06 오후 5.54.17.png&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[Add Project] 클릭 후 -&amp;gt;&amp;nbsp; [Add Remote Prject]&amp;nbsp; 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2024-08-06 오후 5.55.53.png&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uC7IA/btsIVlN9z5U/82a2KgpAk4hkP1KEd0KiNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uC7IA/btsIVlN9z5U/82a2KgpAk4hkP1KEd0KiNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uC7IA/btsIVlN9z5U/82a2KgpAk4hkP1KEd0KiNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuC7IA%2FbtsIVlN9z5U%2F82a2KgpAk4hkP1KEd0KiNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;743&quot; height=&quot;614&quot; data-filename=&quot;edited_스크린샷 2024-08-06 오후 5.55.53.png&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;614&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[Project Name]에 프로젝트명 쓰고 + 버튼 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;+이제 안 사실인데 굳이 안 적어도 되는듯 ?&amp;nbsp;&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. FTP 정보 기입&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-06 오후 5.59.11.png&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AlbHF/btsIWvPWj6b/o4bJPNTgTnmAGOcHkumKY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AlbHF/btsIWvPWj6b/o4bJPNTgTnmAGOcHkumKY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AlbHF/btsIWvPWj6b/o4bJPNTgTnmAGOcHkumKY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAlbHF%2FbtsIWvPWj6b%2Fo4bJPNTgTnmAGOcHkumKY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;631&quot; height=&quot;644&quot; data-filename=&quot;스크린샷 2024-08-06 오후 5.59.11.png&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 프로젝트 연결&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_스크린샷 2024-08-06 오후 5.55.53.png&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rAB6q/btsJVN96oG4/KfnLG1nOEUcdZbzVyyPCYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rAB6q/btsJVN96oG4/KfnLG1nOEUcdZbzVyyPCYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rAB6q/btsJVN96oG4/KfnLG1nOEUcdZbzVyyPCYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrAB6q%2FbtsJVN96oG4%2FKfnLG1nOEUcdZbzVyyPCYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;743&quot; height=&quot;267&quot; data-filename=&quot;edited_edited_스크린샷 2024-08-06 오후 5.55.53.png&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가하면 다시 이 화면으로 돌아오는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가한 프로젝트가 리스트처럼 뜬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 상태로 해당 항목을 더블 클릭하면 이런식으로 바로 접속할 수 있게끔 뜬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b77YBu/btsJULFsspu/CkqA2c0ltLa8KxuAhdanMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b77YBu/btsJULFsspu/CkqA2c0ltLa8KxuAhdanMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b77YBu/btsJULFsspu/CkqA2c0ltLa8KxuAhdanMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb77YBu%2FbtsJULFsspu%2FCkqA2c0ltLa8KxuAhdanMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;910&quot; height=&quot;499&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1901&quot; data-origin-height=&quot;1249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1HvcH/btsJUWtdYg3/1H6rx6r4DRLVTUKlrOlpAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1HvcH/btsJUWtdYg3/1H6rx6r4DRLVTUKlrOlpAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1HvcH/btsJUWtdYg3/1H6rx6r4DRLVTUKlrOlpAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1HvcH%2FbtsJUWtdYg3%2F1H6rx6r4DRLVTUKlrOlpAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1901&quot; height=&quot;1249&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1901&quot; data-origin-height=&quot;1249&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;노바 에디터 설정&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pjmQF/btsJWfky5It/klkMRtIFOUx67p0kLkKcg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pjmQF/btsJWfky5It/klkMRtIFOUx67p0kLkKcg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pjmQF/btsJWfky5It/klkMRtIFOUx67p0kLkKcg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpjmQF%2FbtsJWfky5It%2FklkMRtIFOUx67p0kLkKcg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;268&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;툴바 상단에 Nova앱 위로 마우스 오버하면 Setting이 뜨는 걸 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단축키는 &lt;b&gt;커맨드 + 쉼표&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r3Plq/btsJUlG1LI3/kYZqTjGhXLHFJWIoH4e7c1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r3Plq/btsJUlG1LI3/kYZqTjGhXLHFJWIoH4e7c1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r3Plq/btsJUlG1LI3/kYZqTjGhXLHFJWIoH4e7c1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr3Plq%2FbtsJUlG1LI3%2FkYZqTjGhXLHFJWIoH4e7c1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;721&quot; height=&quot;451&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;451&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이런식으로 설정창이 나오는데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 뒤로는 다른 에디터들과 비슷하므로 직접 확인하는게 더 빠를 것이다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 vscode처럼 extensions를 설치할 수 있는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 상단 툴바를 확인해보면 Extensions를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단축키는 &lt;b&gt;shift + 커맨드 + 2&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2474&quot; data-origin-height=&quot;1320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zosTB/btsJUUCeiKu/5WBjbDsTgTjSoSPWAkHnAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zosTB/btsJUUCeiKu/5WBjbDsTgTjSoSPWAkHnAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zosTB/btsJUUCeiKu/5WBjbDsTgTjSoSPWAkHnAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzosTB%2FbtsJUUCeiKu%2F5WBjbDsTgTjSoSPWAkHnAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2474&quot; height=&quot;1320&quot; data-origin-width=&quot;2474&quot; data-origin-height=&quot;1320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 확장자들을 다운받고 적용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 머터리얼 테마, 프리티어, 엠밋 정도 쓰고있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 다양한 기능은 쓰면서 차차 알아가봐야할 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩</category>
      <category>Coda</category>
      <category>editor</category>
      <category>ftp</category>
      <category>Mac</category>
      <category>nova</category>
      <category>리모트</category>
      <category>맥</category>
      <category>맥전용편집기</category>
      <category>편집기</category>
      <author>다쭐◠‿◠</author>
      <guid isPermaLink="true">https://duektmf34.tistory.com/216</guid>
      <comments>https://duektmf34.tistory.com/216#entry216comment</comments>
      <pubDate>Fri, 4 Oct 2024 18:20:03 +0900</pubDate>
    </item>
    <item>
      <title>퍼블리싱, 프론트엔드 개발시 유용한 링크모음 </title>
      <link>https://duektmf34.tistory.com/215</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;북마크 좀 정리할 겸..&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기록용으로 적어둡니다~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꾸준히 추가할 예정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다들 줍줍하세요^//^&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;HTML&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지맵(태그) 사이트 : &lt;a href=&quot;https://www.image-map.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.image-map.net/&lt;br /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엠밋(단축어?) 사이트 : &lt;a href=&quot;https://docs.emmet.io/cheat-sheet/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.emmet.io/cheat-sheet/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파비콘 사이트 : &lt;a href=&quot;https://www.favicon-generator.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.favicon-generator.org/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;html 오류 체크 사이트 : &lt;a href=&quot;https://validator.w3.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://validator.w3.org/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;html 태그 정리 사이트 : &lt;a href=&quot;https://www.w3schools.com/html/default.asp&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.w3schools.com/html/default.asp&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폰트 어썸 사이트 : &lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://www.w3schools.com/html/default.asp&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://fontawesome.com/&quot;&gt;https://fontawesome.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무료 svg(아이콘) 사이트 : &lt;a href=&quot;https://heroicons.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://heroicons.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무료 svg(아이콘) 사이트 2 : &lt;a href=&quot;https://ionicframework.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ionicframework.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RemoveLineBreaks(줄바꿈 문자 제거 혹은 변환) 사이트 : &lt;a href=&quot;https://removelinebreaks.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://removelinebreaks.net/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시멘틱 태그/중요한 태그 사이트(드림코딩) : &lt;a href=&quot;https://youtu.be/T7h8O7dpJIg?si=0WYT7QdMZ91UyyGK&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/T7h8O7dpJIg?si=0WYT7QdMZ91UyyGK&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;CSS&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비율 계산기(aspect-ratio 속성 쓸 때 유용) : &lt;a href=&quot;https://homzzang.com/ratio/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://homzzang.com/ratio/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배경 그라디언트(속성) 사이트 : &lt;a href=&quot;https://cssgradient.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cssgradient.io/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;css -&amp;gt; scss 변환 사이트 : &lt;a href=&quot;https://css2sass.herokuapp.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://css2sass.herokuapp.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;눈누(웹폰트) 사이트 : &lt;a href=&quot;https://noonnu.cc/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://noonnu.cc/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글 폰트 사이트 : &lt;a href=&quot;https://fonts.google.com/&quot;&gt;https://fonts.google.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pangrampangram(영문 이쁜 폰트) 사이트 : &lt;a href=&quot;https://pangrampangram.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://pangrampangram.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;css 선택자 연습 사이트 : &lt;a href=&quot;https://flukeout.github.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://flukeout.github.io/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;css 선택자 연습 사이트 2 :&amp;nbsp;&lt;a href=&quot;https://css-speedrun.netlify.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://css-speedrun.netlify.app/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flex 속성 연습 사이트 : &lt;a href=&quot;https://flexboxfroggy.com/#ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://flexboxfroggy.com/#ko&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;css 배경 패턴 사이트 : &lt;a href=&quot;https://bansal.io/pattern-css#grid&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://bansal.io/pattern-css#grid&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;css 애니메이션 사이트 : &lt;a href=&quot;https://animista.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://animista.net/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;css 레퍼런스 : &lt;a href=&quot;https://wsss.tistory.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wsss.tistory.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ui 효과 레퍼런스(버튼, 카드, 메뉴 등등등..) : &lt;a href=&quot;https://stacksorted.com/buttons&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://stacksorted.com/buttons&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ui 효과 레퍼런스 2 : &lt;a href=&quot;https://navnav.co/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://navnav.co/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ui 효과 레퍼런스 3 : &lt;a href=&quot;https://uiverse.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://uiverse.io/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;px -&amp;gt; rem 변환 사이트 : &lt;a href=&quot;https://nekocalc.com/px-to-rem-converter&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://nekocalc.com/px-to-rem-converter&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tailwind 템플릿 사이트 : &lt;a href=&quot;https://www.tailwindawesome.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.tailwindawesome.com/&lt;/a&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;JS&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모던 자바스크립트(이론정리) 사이트 : &lt;a href=&quot;https://ko.javascript.info/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ko.javascript.info/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트 자료구조 레포 : &lt;a href=&quot;https://github.com/trekhleb/javascript-algorithms&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/trekhleb/javascript-algorithms&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;json 검사 사이트 : &lt;a href=&quot;https://kr.piliapp.com/json/validator/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://kr.piliapp.com/json/validator/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초보자를 위한 자바스크립트 프로젝트 40가지 : &lt;a href=&quot;https://www.freecodecamp.org/korean/news/javascript-projects-for-beginners/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.freecodecamp.org/korean/news/javascript-projects-for-beginners/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;webGL 레퍼런스 사이트 : &lt;a href=&quot;https://wiss.tistory.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wiss.tistory.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;라이브러리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cdn 주소 모음 : &lt;a href=&quot;https://cdnjs.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cdnjs.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모바일 이미지맵 라이브러리 : &lt;a href=&quot;https://github.com/stowball/jQuery-rwdImageMaps&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/stowball/jQuery-rwdImageMaps&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라이트위젯(인스타그램 연동 라이브러리) : &lt;a href=&quot;https://lightwidget.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://lightwidget.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부트스트랩 : &lt;a href=&quot;https://getbootstrap.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://getbootstrap.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 하이라이트 바꿔주는 라이브러리 : &lt;a href=&quot;https://highlightjs.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://highlightjs.org/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;swiper(쩰 유명한 슬라이드) : &lt;a href=&quot;https://swiperjs.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://swiperjs.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;slick(슬라이드) : &lt;a href=&quot;https://kenwheeler.github.io/slick/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://kenwheeler.github.io/slick/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bxSlider(jquery 슬라이드) : &lt;a href=&quot;https://bxslider.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://bxslider.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gsap(쩰 유명한 애니메이션) : &lt;a href=&quot;https://gsap.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://gsap.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ScrollReveal (스크롤 리빌효과) : &lt;a href=&quot;https://scrollrevealjs.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://scrollrevealjs.org/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lenis(부드러운 스크롤) : &lt;a href=&quot;https://github.com/darkroomengineering/lenis&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://lenis.darkroom.engineering/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;matter.js (물리엔진) : &lt;a href=&quot;https://brm.io/matter-js/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://brm.io/matter-js/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;디자인(레퍼런스)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gd웹 : &lt;a href=&quot;https://www.gdweb.co.kr/main/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.gdweb.co.kr/main/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어워즈 (awwwards) : &lt;a href=&quot;https://www.awwwards.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.awwwards.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노트폴리오 : &lt;a href=&quot;https://notefolio.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://notefolio.net/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSSDesignAwards : &lt;a href=&quot;https://www.cssdesignawards.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.cssdesignawards.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드롭(효과 위주) : &lt;a href=&quot;https://tympanus.net/codrops/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://tympanus.net/codrops/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드펜(효과 위주) : &lt;a href=&quot;https://codepen.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://codepen.io/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;눈누(웹폰트) 사이트 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://noonnu.cc/&quot;&gt;https://noonnu.cc/&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;구글 폰트 사이트 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://fonts.google.com/&quot;&gt;https://fonts.google.com/&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;pangrampangram(영문 이쁜 폰트) 사이트 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://pangrampangram.com/&quot;&gt;https://pangrampangram.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mymind(색조합) : &lt;a href=&quot;https://access.mymind.com/colors&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://access.mymind.com/colors&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;color hunt (색조합) : &lt;a href=&quot;https://colorhunt.co/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://colorhunt.co/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;coolors (색조합) : &lt;a href=&quot;https://coolors.co/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://coolors.co/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무료 이미지 : &lt;a href=&quot;https://unsplash.com/ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://unsplash.com/ko&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 최적화 사이트(용량 줄여줌) :&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;a href=&quot;https://imagecompressor.com/ko/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://imagecompressor.com/ko/&lt;/a&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;개발 지식 블로그(사이트) or 개발자 커뮤니티&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;블로그 (혹은 사이트)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코딩하는디자이너 : &lt;a href=&quot;https://usingu.co.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://usingu.co.kr/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코딩에브리바디(개념 정리 잘되어있음!) : &lt;a href=&quot;https://codingeverybody.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://codingeverybody.kr/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Inpa Dev(블로그) : &lt;a href=&quot;https://inpa.tistory.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://inpa.tistory.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Light Dev(블로그) : &lt;a href=&quot;https://light9639.tistory.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://light9639.tistory.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생활코딩(짱 유명한 개발자슨생님) : &lt;a href=&quot;https://opentutorials.org/course/1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://opentutorials.org/course/1&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코딩애플(너무 재밌는 개발자슨생님/유튭채널도이씀) : &lt;a href=&quot;https://codingapple.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://codingapple.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디자인 키트 : &lt;a href=&quot;https://www.designkits.co.kr/blog/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.designkits.co.kr/blog/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;개발자 커뮤니티&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커리어리 : &lt;a href=&quot;https://careerly.co.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://careerly.co.kr/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OKKY : &lt;a href=&quot;https://okky.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://okky.kr/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘IT : &lt;a href=&quot;https://yozm.wishket.com/magazine/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://yozm.wishket.com/magazine/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스콰이엇 : &lt;a href=&quot;https://disquiet.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://disquiet.io/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벨로그(기술 블로그 플랫폼) : &lt;a href=&quot;https://velog.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인프런 내 커뮤니티 : &lt;a href=&quot;https://www.inflearn.com/community/questions&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.inflearn.com/community/questions&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택오버플로우 (해외 사이트) : &lt;a href=&quot;https://stackoverflow.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://stackoverflow.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sir 커뮤니티(주로 그누보드) : &lt;a href=&quot;https://sir.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://sir.kr/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그누스터디 커뮤니티 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://gnustudy.com/&quot;&gt;https://gnustudy.com/&lt;/a&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;기타&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃허브 : &lt;a href=&quot;https://github.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃 명령어 연습 사이트 : &lt;a href=&quot;https://learngitbranching.js.org/?locale=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://learngitbranching.js.org/?locale=ko&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인코딩 디코딩 사이트 : &lt;a href=&quot;https://www.base64decode.org/ko/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.base64decode.org/ko/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인 dns 관리 : &lt;a href=&quot;https://dnszi.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dnszi.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인프런(강의 사이트) : &lt;a href=&quot;https://www.inflearn.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.inflearn.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유데미(해외 강의 지분이 많은 사이트) : &lt;a href=&quot;https://www.udemy.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.udemy.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노티콘 (노션에 귀여운 이모티콘 넣을 수 있음) 사이트 : &lt;a href=&quot;https://noticon.tammolo.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://noticon.tammolo.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vscode 추천 extensions(리액트개발자) : &lt;a href=&quot;https://just-coding.tistory.com/1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://just-coding.tistory.com/1&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;netlify(무료로 배포할 수 있음) : &lt;a href=&quot;https://www.netlify.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.netlify.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;snippet generator(스니펫 생성) 사이트 : &lt;a href=&quot;https://snippet-generator.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://snippet-generator.app/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩</category>
      <category>CSS</category>
      <category>HTML</category>
      <category>JavaScript</category>
      <category>개발</category>
      <category>개발자</category>
      <category>꿀팁</category>
      <category>웹개발</category>
      <category>퍼블리셔</category>
      <category>퍼블리싱</category>
      <category>프론트엔드</category>
      <author>다쭐◠‿◠</author>
      <guid isPermaLink="true">https://duektmf34.tistory.com/215</guid>
      <comments>https://duektmf34.tistory.com/215#entry215comment</comments>
      <pubDate>Fri, 6 Sep 2024 16:45:01 +0900</pubDate>
    </item>
    <item>
      <title>사파리 브라우저에서 폰트(글꼴) 적용</title>
      <link>https://duektmf34.tistory.com/214</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;익숙한 크롬 브라우저에선 글꼴 적용이 잘 되는데...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항상 사파리 브라우저가 문제 ㅜㅜ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크로스 브라우징 생활화해야하는데 아직 쉽지 않다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로 사파리 브라우저에서 글꼴 적용하는 방법을 기록해보려한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통은&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1721970392121&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;html, body {font-family: &quot;Pretendard&quot;;}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 많이 적용하는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사파리 브라우저의 경우 적용이 안될 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 항상 지정 폰트 뒤에 sans-serif를 붙여줘야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1721983868998&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;html, body {font-family: &quot;Pretendard&quot;, sans-serif;}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 웹폰트 방식 중 @import 방식을 사용한다면 import링크를 css파일 최상단에 적어야한다.&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩/CSS</category>
      <author>다쭐◠‿◠</author>
      <guid isPermaLink="true">https://duektmf34.tistory.com/214</guid>
      <comments>https://duektmf34.tistory.com/214#entry214comment</comments>
      <pubDate>Fri, 26 Jul 2024 17:52:06 +0900</pubDate>
    </item>
    <item>
      <title>에디트플러스 단축키 모음! 그리고 자동완성,,,</title>
      <link>https://duektmf34.tistory.com/211</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;내가 보려고 정리하는 것이므로,,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자주 쓰일 것같은 단축키만 모아서 표로 정리해보겠슴다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vscode를 쓰면 좋겠지만,,, 기존 작업을 editplus해서 많이 했기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유지보수 하려면 단축키를 어느정도 알아놔야한다  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Edit Plus&amp;nbsp; 단축키&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 211px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;width: 11.938%; height: 35px;&quot;&gt;Ctrl + N&lt;/td&gt;
&lt;td style=&quot;width: 41.4728%; height: 35px;&quot;&gt;새 문서 작성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 11.938%; height: 20px;&quot;&gt;Ctrl + Shift + S&lt;/td&gt;
&lt;td style=&quot;width: 41.4728%; height: 20px;&quot;&gt;FTP 업로드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 11.938%; height: 20px;&quot;&gt;Ctrl + Z&lt;/td&gt;
&lt;td style=&quot;width: 41.4728%; height: 20px;&quot;&gt;실행 취소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 11.938%; height: 17px;&quot;&gt;Ctrl + Y&lt;/td&gt;
&lt;td style=&quot;width: 41.4728%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: center;&quot;&gt;다시 실행&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 11.938%; height: 17px;&quot;&gt;Alt + Shift + Del&lt;/td&gt;
&lt;td style=&quot;width: 41.4728%; height: 17px;&quot;&gt;줄 지우기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 11.938%; height: 17px;&quot;&gt;Ctrl + J&lt;/td&gt;
&lt;td style=&quot;width: 41.4728%; height: 17px;&quot;&gt;줄 복사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 11.938%; height: 17px;&quot;&gt;Ctrl + R&lt;/td&gt;
&lt;td style=&quot;width: 41.4728%; height: 17px;&quot;&gt;줄 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 11.938%; height: 17px;&quot;&gt;Ctrl + I&lt;/td&gt;
&lt;td style=&quot;width: 41.4728%; height: 17px;&quot;&gt;들여쓰기 (vscode의 tab기능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 11.938%; height: 17px;&quot;&gt;Ctrl + Shift + I&lt;/td&gt;
&lt;td style=&quot;width: 41.4728%; height: 17px;&quot;&gt;들여쓰기 줄이기 (vscode의 shift + tab 기능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 11.938%; height: 17px;&quot;&gt;Shift + F3&lt;/td&gt;
&lt;td style=&quot;width: 41.4728%; height: 17px;&quot;&gt;찾기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 11.938%; height: 17px;&quot;&gt;Ctrl + J&lt;/td&gt;
&lt;td style=&quot;width: 41.4728%; height: 17px;&quot;&gt;여러 줄을 한 줄로 만들어줌 (한 줄 코딩으로 변환할 때 개꿀)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 에디트 플러스의 제일 불편한 점은....................&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;태그 자동완성이 안된다는 것 .. ㅜㅜㅜ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vscode에선 div 치고 탭 누르면 바로 &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;이런식으로 자동ㅇ완성됐는데...............................&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;찾아보니까 어떤 분이 감사하게도 템플릿을 올려두셨다!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글 참고해서 따라해보자~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/vibi1201/221322459258&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://m.blog.naver.com/vibi1201/221322459258&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1715309405886&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;에디트플러스 자동완성 파일 (파일첨부포함)&quot; data-og-description=&quot;웹디자이너 및 퍼블리셔라면 에디트플러스로 코딩시 꼭 필요한 자동완성 파일을 공유하려한다. html5 &amp;amp;...&quot; data-og-host=&quot;blog.naver.com&quot; data-og-source-url=&quot;https://m.blog.naver.com/vibi1201/221322459258&quot; data-og-url=&quot;https://blog.naver.com/vibi1201/221322459258&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bG4tge/hyV2CIiZcI/UmRX4muQW4lrLgFPntuF01/img.png?width=718&amp;amp;height=299&amp;amp;face=0_0_718_299&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/vibi1201/221322459258&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://m.blog.naver.com/vibi1201/221322459258&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bG4tge/hyV2CIiZcI/UmRX4muQW4lrLgFPntuF01/img.png?width=718&amp;amp;height=299&amp;amp;face=0_0_718_299');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;에디트플러스 자동완성 파일 (파일첨부포함)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;웹디자이너 및 퍼블리셔라면 에디트플러스로 코딩시 꼭 필요한 자동완성 파일을 공유하려한다. html5 &amp;amp;...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;에디트 플러스 자동완성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 파일 다운&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 내가 위에 걸어놓은 링크 속 파일을 다운 받아야한다!&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xqqxw/btsHlrhgCeg/ZUd39m5ZJnubZfZPiq4yFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xqqxw/btsHlrhgCeg/ZUd39m5ZJnubZfZPiq4yFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xqqxw/btsHlrhgCeg/ZUd39m5ZJnubZfZPiq4yFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxqqxw%2FbtsHlrhgCeg%2FZUd39m5ZJnubZfZPiq4yFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;609&quot; height=&quot;64&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;html5.acp와 css3.acp 다운 ㄱㄱ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUKxUY/btsHkZZsBwc/ehQVCD9xy7X7FkL873Yf61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUKxUY/btsHkZZsBwc/ehQVCD9xy7X7FkL873Yf61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUKxUY/btsHkZZsBwc/ehQVCD9xy7X7FkL873Yf61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUKxUY%2FbtsHkZZsBwc%2FehQVCD9xy7X7FkL873Yf61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;467&quot; height=&quot;370&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도구 -&amp;gt; 기본 설정을 연다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;571&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0XMzJ/btsHkWoAV3v/DwCG4LwSoLvhVLuKPBA2O1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0XMzJ/btsHkWoAV3v/DwCG4LwSoLvhVLuKPBA2O1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0XMzJ/btsHkWoAV3v/DwCG4LwSoLvhVLuKPBA2O1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0XMzJ%2FbtsHkWoAV3v%2FDwCG4LwSoLvhVLuKPBA2O1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;732&quot; height=&quot;571&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;571&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 &amp;amp; 구문 강조에서 해당하는 파일을 선택해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML이면 HTML,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSS면 CSS.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 자동완성 체크를 눌러준 다음 ... 을 클릭해 해당하는 템플릿 파일을 열어준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4vDSo/btsHk1Qvgsh/lvv7Q05tkkEEsXLDRVWCG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4vDSo/btsHk1Qvgsh/lvv7Q05tkkEEsXLDRVWCG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4vDSo/btsHk1Qvgsh/lvv7Q05tkkEEsXLDRVWCG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4vDSo%2FbtsHk1Qvgsh%2Flvv7Q05tkkEEsXLDRVWCG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;331&quot; height=&quot;180&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 html5.acp부터 적용시켜보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;571&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJwcGU/btsHiG1ga8a/hFxPggTPJZVRIAt74pGeTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJwcGU/btsHiG1ga8a/hFxPggTPJZVRIAt74pGeTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJwcGU/btsHiG1ga8a/hFxPggTPJZVRIAt74pGeTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJwcGU%2FbtsHiG1ga8a%2FhFxPggTPJZVRIAt74pGeTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;732&quot; height=&quot;571&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;571&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일을 열었으면 적용 누르고 확인을 눌러준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 사용법&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;631&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I0e9A/btsHl5klrcm/HR9oXh7XOAMlIw41ovrnsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I0e9A/btsHl5klrcm/HR9oXh7XOAMlIw41ovrnsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I0e9A/btsHl5klrcm/HR9oXh7XOAMlIw41ovrnsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI0e9A%2FbtsHl5klrcm%2FHR9oXh7XOAMlIw41ovrnsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1159&quot; height=&quot;631&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;631&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 드가자~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 vscode는 ! 만 눌러도 바로 기본적인 html구조를 그려주는데...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에디트 플러스는 그런게 없으므로 일일히 만들어야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기선 언더바 (_)로 단축키를 통일한 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;_html 라고 쓰고 엔터를 눌러주면..~&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;572&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pt5j9/btsHlEN2HCc/7DICBy9ceLqWEJlOgokNk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pt5j9/btsHlEN2HCc/7DICBy9ceLqWEJlOgokNk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pt5j9/btsHlEN2HCc/7DICBy9ceLqWEJlOgokNk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpt5j9%2FbtsHlEN2HCc%2F7DICBy9ceLqWEJlOgokNk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;622&quot; height=&quot;572&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;572&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이야.. 진.짜. 오지자나?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;497&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFaw04/btsHk0qxi9p/mlpEOUk0kbljANnxNeopoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFaw04/btsHk0qxi9p/mlpEOUk0kbljANnxNeopoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFaw04/btsHk0qxi9p/mlpEOUk0kbljANnxNeopoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFaw04%2FbtsHk0qxi9p%2FmlpEOUk0kbljANnxNeopoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;781&quot; height=&quot;497&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;497&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;태그도 마찬가지다. _div, _p , _a 이런식으로 써주고 엔터를 누르면?&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lHlLS/btsHkKO1nke/kPvxiOdOHs4MKuKZ5iDOe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lHlLS/btsHkKO1nke/kPvxiOdOHs4MKuKZ5iDOe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lHlLS/btsHkKO1nke/kPvxiOdOHs4MKuKZ5iDOe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlHlLS%2FbtsHkKO1nke%2FkPvxiOdOHs4MKuKZ5iDOe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;985&quot; height=&quot;516&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 편한 기능이?!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 이 템플릿 파일은 내 입맛대로 수정 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;막상 파일을 까보면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1774&quot; data-origin-height=&quot;1293&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0puUZ/btsHkjLb7jI/JGsA6JUSG7joFu0RAqlXo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0puUZ/btsHkjLb7jI/JGsA6JUSG7joFu0RAqlXo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0puUZ/btsHkjLb7jI/JGsA6JUSG7joFu0RAqlXo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0puUZ%2FbtsHkjLb7jI%2FJGsA6JUSG7joFu0RAqlXo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1774&quot; height=&quot;1293&quot; data-origin-width=&quot;1774&quot; data-origin-height=&quot;1293&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 되어있으므로 내가 #T=(단축키)를 지정해서 변형해도 된다는 뜻ㅇ다!!!!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개꿀,,,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 vscode 못잃어............................&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩</category>
      <author>다쭐◠‿◠</author>
      <guid isPermaLink="true">https://duektmf34.tistory.com/211</guid>
      <comments>https://duektmf34.tistory.com/211#entry211comment</comments>
      <pubDate>Fri, 10 May 2024 13:26:20 +0900</pubDate>
    </item>
    <item>
      <title>중복 이벤트 방지하기</title>
      <link>https://duektmf34.tistory.com/209</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 반응형에서 발생하는 에러인 중복되는 이벤트를 제거해보겠다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘의 에러는 어쩌다 마주하게됐냐하믄..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;열심히 반응형 작업 중, 퀵 메뉴에 대한 부분이 있었는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모바일과 패드(세로) 기기에선 퀵 메뉴 중 하나를 눌렀을 때 모달창이 띄워지고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PC기준에서는 그냥 다른 링크로 보내버리는 로직을 짰다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713857831297&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; &amp;lt;ul class=&quot;퀵메뉴임&quot;&amp;gt;
  &amp;lt;li class=&quot;메뉴 1임&quot;&amp;gt;
    &amp;lt;a href=&quot;보내버릴 링크임&quot; target=&quot;_blank&quot; id=&quot;modal&quot;&amp;gt;
      &amp;lt;div&amp;gt;메뉴 1인데 모바일에선 모달로 나타날거임&amp;lt;/div&amp;gt;
    &amp;lt;/a&amp;gt;
  &amp;lt;/li&amp;gt;
  &amp;lt;li class=&quot;메뉴 2임&quot;&amp;gt;
    &amp;lt;a href=&quot;메뉴 2 링크임&quot; target=&quot;_blank&quot;&amp;gt;
      &amp;lt;div&amp;gt;메뉴 2임&amp;lt;/div&amp;gt;
    &amp;lt;/a&amp;gt;
  &amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 저 첫 번째 메뉴를 누르면&amp;nbsp; 새 페이지가 열리면서 원하는 링크로 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 modal이라는 아이디를 보면 알 수 있듯이, 사이트 정보 중 모바일 기기로 전환되면 레이아웃 처리가 곤란해지는 경우가 많다. 그렇기 때문에 퀵메뉴로 모달을 열 수 있도록 만드는 것임~~&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 모달창을 열고 닫는 제이쿼리를 추가해줌..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713858902711&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$(&quot;#modal&quot;).on(&quot;click&quot;, function (e) {
  e.preventDefault();
  $(&quot;#overlay&quot;).fadeIn(300);
  $(&quot;.quick_modal&quot;).fadeIn(300);
  lenis.stop();
});

 // 모달 닫기
$(&quot;.close_btn&quot;).on(&quot;click&quot;, function (e) {
  $(&quot;#overlay&quot;).fadeOut(300);
  $(&quot;.quick_modal&quot;).fadeOut(300);
  lenis.start();
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 on클릭 이벤트를 부여해 함수를 실행시켰다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;overlay는 모달 열었을 때 뒷배경 어둡게 해주기 위함이고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lenis.stop()은 내가 모달을 열고있을 때 스크롤을 방지하기 위함이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 lenis 라이브러리를 쓸 때 사용하는 메서드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 했으니 모달이 아주 잘 열리겠지?^^&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;749&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eIDCES/btsGRKBWyOm/vPYSuys08M5y72InNmSEo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eIDCES/btsGRKBWyOm/vPYSuys08M5y72InNmSEo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eIDCES/btsGRKBWyOm/vPYSuys08M5y72InNmSEo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeIDCES%2FbtsGRKBWyOm%2FvPYSuys08M5y72InNmSEo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;754&quot; height=&quot;749&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;749&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주 잘 열린당!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 문제는... 화면을 PC비율로 키웠을 때도 나타난다는 것..ㅋㅋㅋㅋㅋㅋㅋㅋ;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결방법은 window.resize 메서드를 써서 창 크기 변화에 따라 이벤트 핸들러를 다시 시작해주는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1713860175291&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 처음에 작성했던 모달 열고닫는 함수
function modalOpen() {
  $(&quot;#modal&quot;).on(&quot;click&quot;, function (e) {
  e.preventDefault();
  $(&quot;#overlay&quot;).fadeIn(300);
  $(&quot;.quick_modal&quot;).fadeIn(300);
  lenis.stop();
});

 // 모달 닫기
$(&quot;.close_btn&quot;).on(&quot;click&quot;, function (e) {
  $(&quot;#overlay&quot;).fadeOut(300);
  $(&quot;.quick_modal&quot;).fadeOut(300);
  lenis.start();
});
}

// 초기 실행
modalOpen();

// 창 크기 변화에 따라 이벤트 핸들러 다시 확인
$(window).resize(function () {
  // 창 크기에 따라 이벤트를 다시 확인하여 중복 방지
  if ($(window).width() &amp;lt; 992) {
    // 이미 이벤트 핸들러가 바인딩되어 있으면 아무 작업도 하지 않음
    if (!$(&quot;#mapModal&quot;).data(&quot;events&quot;)) {
      modalOpen();
    }
  } else {
    // 창 크기가 992 이상인 경우 이벤트 핸들러 해제
    $(&quot;#mapModal&quot;).off(&quot;click&quot;);
    $(&quot;.close_btn&quot;).off(&quot;click&quot;);
  }
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 하면 창 크기를 변화할 때마다 이벤트를 다시 실행시키므로&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중복 이벤트를 방지할 수 있다!&lt;/p&gt;</description>
      <category>코딩</category>
      <author>다쭐◠‿◠</author>
      <guid isPermaLink="true">https://duektmf34.tistory.com/209</guid>
      <comments>https://duektmf34.tistory.com/209#entry209comment</comments>
      <pubDate>Tue, 23 Apr 2024 17:22:25 +0900</pubDate>
    </item>
    <item>
      <title>간단한 three.js 배경에 적용해보기</title>
      <link>https://duektmf34.tistory.com/208</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 효과를 background에 넣어보려한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점들이 파도처럼 꿀렁이는? 효과이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://codepen.io/deathfang/embed/WxNVoq?default-tab=&quot; height=&quot;600&quot; frameborder=&quot;no&quot; scrolling=&quot;no&quot; allowfullscreen=&quot;true&quot;&gt;
  See the Pen &lt;a href=&quot;https://codepen.io/deathfang/pen/WxNVoq&quot;&gt;
  three.js canvas - particles - waves&lt;/a&gt; by deathfang (&lt;a href=&quot;https://codepen.io/deathfang&quot;&gt;@deathfang&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.
&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Three.js 배경 적용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에 언급한 효과는 스크립트가 굉장해엄청나 복잡하므로 ,,,(용량 장난없음;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 코드펜 예제를 참고하였다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://codepen.io/mweslander/pen/JreNPj&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://codepen.io/mweslander/pen/JreNPj&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1712905910206&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ThreeJS  Canvas Particle Waves&quot; data-og-description=&quot;...&quot; data-og-host=&quot;codepen.io&quot; data-og-source-url=&quot;https://codepen.io/mweslander/pen/JreNPj&quot; data-og-url=&quot;https://codepen.io/mweslander/details/JreNPj&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/isnmc/hyVPYD9CBs/adiPABuG5pvDLafn9iHKDK/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/jVKfc/hyVMLGtng6/onqlUjUposfr6zTEpMYeKK/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450&quot;&gt;&lt;a href=&quot;https://codepen.io/mweslander/pen/JreNPj&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://codepen.io/mweslander/pen/JreNPj&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/isnmc/hyVPYD9CBs/adiPABuG5pvDLafn9iHKDK/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/jVKfc/hyVMLGtng6/onqlUjUposfr6zTEpMYeKK/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ThreeJS Canvas Particle Waves&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;codepen.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;똑같은 효과인데 커스텀에 따라 느낌이 확 달라지므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이쁘게 커스텀해보자~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;HTML 구조&lt;/h4&gt;
&lt;pre id=&quot;code_1713329228648&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Three.js 배경 테스트&amp;lt;/title&amp;gt;
    &amp;lt;link
      rel=&quot;stylesheet&quot;
      href=&quot;https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css&quot;
    /&amp;gt;
    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;./css/style.css&quot; /&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;canvas id=&quot;background&quot;&amp;gt;&amp;lt;/canvas&amp;gt;
    &amp;lt;header id=&quot;header&quot;&amp;gt;
      &amp;lt;div class=&quot;logo_area&quot;&amp;gt;
        &amp;lt;h1&amp;gt;Three.js&amp;lt;/h1&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;github_area&quot;&amp;gt;
        &amp;lt;a href=&quot;https://github.com/YeoDaSeul4355&quot; target=&quot;_blank&quot;
          &amp;gt;&amp;lt;i class=&quot;fa-brands fa-github-alt&quot;&amp;gt;&amp;lt;/i
        &amp;gt;&amp;lt;/a&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/header&amp;gt;
    &amp;lt;main id=&quot;main&quot;&amp;gt;
      &amp;lt;section id=&quot;content01&quot;&amp;gt;
        &amp;lt;h2&amp;gt;section &amp;lt;span&amp;gt;one&amp;lt;/span&amp;gt;&amp;lt;/h2&amp;gt;
      &amp;lt;/section&amp;gt;
      &amp;lt;section id=&quot;content02&quot;&amp;gt;
        &amp;lt;h2&amp;gt;section &amp;lt;span&amp;gt;two&amp;lt;/span&amp;gt;&amp;lt;/h2&amp;gt;
      &amp;lt;/section&amp;gt;
      &amp;lt;section id=&quot;content03&quot;&amp;gt;
        &amp;lt;h2&amp;gt;section &amp;lt;span&amp;gt;three&amp;lt;/span&amp;gt;&amp;lt;/h2&amp;gt;
      &amp;lt;/section&amp;gt;
      &amp;lt;section id=&quot;content04&quot;&amp;gt;
        &amp;lt;h2&amp;gt;section &amp;lt;span&amp;gt;four&amp;lt;/span&amp;gt;&amp;lt;/h2&amp;gt;
      &amp;lt;/section&amp;gt;
      &amp;lt;section id=&quot;content05&quot;&amp;gt;
        &amp;lt;h2&amp;gt;section &amp;lt;span&amp;gt;five&amp;lt;/span&amp;gt;&amp;lt;/h2&amp;gt;
      &amp;lt;/section&amp;gt;
    &amp;lt;/main&amp;gt;
    &amp;lt;!-- fontAwesome --&amp;gt;
    &amp;lt;script
      src=&quot;https://kit.fontawesome.com/f8a51b75db.js&quot;
      crossorigin=&quot;anonymous&quot;
    &amp;gt;&amp;lt;/script&amp;gt;

    &amp;lt;!-- 필요한 cdn --&amp;gt;
    &amp;lt;script src=&quot;https://unpkg.com/@studio-freight/lenis@1.0.42/dist/lenis.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/three.js/86/three.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;https://codepen.io/mweslander/pen/OxamJj.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;https://codepen.io/mweslander/pen/LzXWOo.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;https://codepen.io/mweslander/pen/JreWMV.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

    &amp;lt;!-- 스크립트 --&amp;gt;
    &amp;lt;script src=&quot;./js/script.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조는 간단히 섹션만 나눠서 스크롤 느낌이 나게끔 설정하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;CSS&lt;/h4&gt;
&lt;pre id=&quot;code_1713329332706&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@import url(&quot;https://fonts.googleapis.com/css2?family=Shrikhand&amp;amp;display=swap&quot;);
body {
  margin: 0;
  overflow-x: hidden;
  font-family: &quot;Shrikhand&quot;, serif;
}

canvas {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: -1;
}
section {
  width: 100%;
  height: 100vh;
  z-index: 100;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
}

header {
  width: 90vw;
  margin: 0 auto;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.github_area i {
  font-size: 3rem;
  color: #000;
  transition: all 0.3s ease-in-out;
}
.github_area i:hover {
  color: #ff84a9;
  transition: all 0.3s ease-in-out;
}

section h2 {
  margin-bottom: 10%;
  font-size: 3rem;
  color: #222;
  text-transform: uppercase;
}

section h2 span {
  color: #ccc;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나머지 스타일링은 별 거 없고 canvas태그만 position: fixed를 통해 고정시켜준다. 그리고 배경으로 깔아줄 것이기 때문에 z-index를 -1로 설정해 뒤에 깔리게끔 설정시켜주기!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;스크립트&lt;/h4&gt;
&lt;pre id=&quot;code_1713330089007&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const lenis = new Lenis({
  duration: 2,
  easing: (t) =&amp;gt; Math.min(1, 1.001 - Math.pow(2, -10 * t)),
});

function raf(time) {
  lenis.raf(time);
  requestAnimationFrame(raf);
}
requestAnimationFrame(raf);
// particle 입자와 간격, 수
const SEPARATION = 100,
  AMOUNTX = 70,
  AMOUNTY = 70;

// Three.js의 카메라, 씬, 렌더러
let camera, scene, renderer;

// 입자들을 저장할 배열과 각각의 입자, 애니메이션 카운터
let particles,
  particle,
  count = 0;

// 마우스의 현재 위치
let mouseX = 0,
  mouseY = 0;

// 브라우저 창의 가로와 세로 크기의 / 2
let windowHalfX = window.innerWidth / 2;
let windowHalfY = window.innerHeight / 2;

// 초기화 함수로 카메라, 입자들, 렌더러 등을 생성하고 설정
function init() {
  camera = new THREE.PerspectiveCamera(
    100, // 시야각
    window.innerWidth / window.innerHeight, // 종횡비
    2, // 전방 절단면
    10000 // 후방 절단면
  );
  camera.position.z = 2000; // z축 방향으로 2000의 거리
  scene = new THREE.Scene();
  // 입자들을 저장할 배열
  particles = new Array();
  var PI2 = Math.PI * 2; // 원주율의 두 배를 계산하여 PI2에 저장
  var geometry = new THREE.Geometry(); // Three.js의 Geometry 객체를 생성
  // 입자의 머티리얼을 설정
  var material = new THREE.SpriteCanvasMaterial({
    color: &quot;#FF7384&quot;, // 입자 색상
    program: function (context) {
      context.beginPath();
      context.arc(0, 0, 0.2, 0, PI2, true); // 입자 크기
      context.fill();
    },
  });

  // 반복문
  var i = 0;
  for (var ix = 0; ix &amp;lt; AMOUNTX; ix++) {
    for (var iy = 0; iy &amp;lt; AMOUNTY; iy++) {
      particle = particles[i++] = new THREE.Sprite(material);
      particle.position.x = ix * SEPARATION - (AMOUNTX * SEPARATION) / 2;
      particle.position.z = iy * SEPARATION - (AMOUNTY * SEPARATION) / 2;
      scene.add(particle);

      if (i &amp;gt; 0) {
        geometry.vertices.push(particle.position);
      }
    }
  }

  //  Three.js의 CanvasRenderer를 생성
  renderer = new THREE.CanvasRenderer();
  renderer.setPixelRatio(window.devicePixelRatio);
  renderer.setSize(window.innerWidth, window.innerHeight);
  document.body.appendChild(renderer.domElement);
  document.addEventListener(&quot;mousemove&quot;, onDocumentMouseMove, false);
  document.addEventListener(&quot;touchstart&quot;, onDocumentTouchStart, false);
  document.addEventListener(&quot;touchmove&quot;, onDocumentTouchMove, false);
  window.addEventListener(&quot;resize&quot;, onWindowResize, false);

  // 스크롤 이벤트 리스너 추가
  window.addEventListener(&quot;scroll&quot;, function () {
    // 스크롤 위치 가져오기
    let scrollPosition = window.scrollY || window.pageYOffset;

    let content03 = document.querySelector(&quot;#content03&quot;).offsetTop;
    let content05 = document.querySelector(&quot;#content05&quot;).offsetTop;
    if (scrollPosition &amp;gt; content03 - 700 &amp;amp;&amp;amp; scrollPosition &amp;lt; content05 - 500) {
      material.color.set(&quot;#ffffff&quot;);

      renderer.render(scene, camera);
    } else {
      material.color.set(&quot;#FF7384&quot;);
      renderer.render(scene, camera);
    }
  });
}

function onWindowResize() {
  windowHalfX = window.innerWidth / 2;
  windowHalfY = window.innerHeight / 2;
  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix();
  renderer.setSize(window.innerWidth, window.innerHeight);
}

function onDocumentMouseMove(event) {
  mouseX = event.clientX - windowHalfX;
  mouseY = event.clientY - windowHalfY;
}

function onDocumentTouchStart(event) {
  if (event.touches.length === 1) {
    event.preventDefault();
    mouseX = event.touches[0].pageX - windowHalfX;
    mouseY = event.touches[0].pageY - windowHalfY;
  }
}

function onDocumentTouchMove(event) {
  if (event.touches.length === 1) {
    event.preventDefault();
    mouseX = event.touches[0].pageX - windowHalfX;
    mouseY = event.touches[0].pageY - windowHalfY;
  }
}

function animate() {
  requestAnimationFrame(animate);
  render();
}

function render() {
  // 현재 색상
  let currentColor = new THREE.Color(renderer.getClearColor());

  // 목표 색상
  let targetColor = new THREE.Color();
  let scrollPosition = window.scrollY || window.pageYOffset;
  let content03 = document.querySelector(&quot;#content03&quot;).offsetTop;
  let content05 = document.querySelector(&quot;#content05&quot;).offsetTop;

  // 조건문
  if (scrollPosition &amp;gt; content03 - 700 &amp;amp;&amp;amp; scrollPosition &amp;lt; content05 - 500) {
    targetColor.set(&quot;#000000&quot;);
  } else {
    targetColor.set(&quot;#ffffff&quot;);
  }

  // 색상 보간을 위한 보간 계수
  let interpolationFactor = 0.1;

  // 보간된 색상 계산
  let newColor = new THREE.Color()
    .copy(currentColor)
    .lerp(targetColor, interpolationFactor);

  // 부드럽게 변경된 색상 설정
  renderer.setClearColor(newColor, 1);

  // 나머지 렌더링 코드는 그대로 유지됨
  camera.position.x += (mouseX - camera.position.x) * 0.05;
  camera.position.y += (-mouseY - camera.position.y) * 0.05;
  camera.lookAt(scene.position);

  for (let i = 0; i &amp;lt; particles.length; i++) {
    let ix = i % AMOUNTX;
    let iy = Math.floor(i / AMOUNTX);
    let particle = particles[i];
    particle.position.y =
      Math.sin((ix + count) * 0.2) * 50 + Math.sin((iy + count) * 0.2) * 50;
    particle.scale.x = particle.scale.y =
      (Math.sin((ix + count) * 0.3) + 1) * 4 +
      (Math.sin((iy + count) * 0.5) + 1) * 4;
  }

  renderer.render(scene, camera);
  count += 0.1;
}

init();
animate();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lenis부분은 부드러운 스크롤 효과를 위해 넣은 것이므로 참고!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://duektmf34.tistory.com/207&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://duektmf34.tistory.com/207&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1713332014333&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;lenis 부드러운 스크롤 효과&quot; data-og-description=&quot;패럴랙스 이펙트하면 가장 기본적인 것은 아마 스크롤의 감도? 아닐까 생각이 든다. 스크롤 움직이는 느낌에 따라 사이트의 퀄을 좌우할 수 있달까!? 난 그렇게 생각한다. 아무튼 가장 많이 쓰는&quot; data-og-host=&quot;duektmf34.tistory.com&quot; data-og-source-url=&quot;https://duektmf34.tistory.com/207&quot; data-og-url=&quot;https://duektmf34.tistory.com/207&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bghW3J/hyVS3rJYP6/nvUAeVMw08l0ROJrouaLvK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Ie6rm/hyVPU4h04s/GePvmmZpg2CAtHQH137sAK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://duektmf34.tistory.com/207&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://duektmf34.tistory.com/207&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bghW3J/hyVS3rJYP6/nvUAeVMw08l0ROJrouaLvK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Ie6rm/hyVPU4h04s/GePvmmZpg2CAtHQH137sAK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;lenis 부드러운 스크롤 효과&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;패럴랙스 이펙트하면 가장 기본적인 것은 아마 스크롤의 감도? 아닐까 생각이 든다. 스크롤 움직이는 느낌에 따라 사이트의 퀄을 좌우할 수 있달까!? 난 그렇게 생각한다. 아무튼 가장 많이 쓰는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;duektmf34.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Three.js 객체 및 변수 초기화&lt;/h4&gt;
&lt;pre id=&quot;code_1713332184038&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const SEPARATION = 100,
  AMOUNTX = 70,
  AMOUNTY = 70;

// Three.js의 카메라, 씬, 렌더러
let camera, scene, renderer;

// 입자들을 저장할 배열과 각각의 입자, 애니메이션 카운터
let particles,
  particle,
  count = 0;

// 마우스의 현재 위치
let mouseX = 0,
  mouseY = 0;

// 브라우저 창의 가로와 세로 크기의 / 2
let windowHalfX = window.innerWidth / 2;
let windowHalfY = window.innerHeight / 2;&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;상수 선언&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;const SEPARATION = 100: 입자 사이의 간격을 나타내는 상수입니다. 입자 사이의 간격이 100인 것으로 정의됩니다.&lt;/li&gt;
&lt;li&gt;const AMOUNTX = 70: x축 방향으로 입자의 수를 나타내는 상수입니다. 즉, x축에 70개의 입자가 배치됩니다.&lt;/li&gt;
&lt;li&gt;const AMOUNTY = 70: y축 방향으로 입자의 수를 나타내는 상수입니다. 즉, y축에 70개의 입자가 배치됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Three.js 객체 및 변수 초기화&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;let camera, scene, renderer;: Three.js에서 사용할 카메라, 씬, 렌더러를 선언합니다.&lt;/li&gt;
&lt;li&gt;let particles, particle, count = 0;: 입자들을 저장할 배열과 각각의 입자, 그리고 애니메이션 카운터 변수를 선언합니다.&lt;/li&gt;
&lt;li&gt;let mouseX = 0, mouseY = 0;: 마우스의 현재 위치를 나타내는 변수를 선언합니다.&lt;/li&gt;
&lt;li&gt;let windowHalfX = window.innerWidth / 2;: 브라우저 창의 가로 크기를 절반으로 나눈 값으로, 브라우저 창의 중심점 x좌표를 나타냅니다.&lt;/li&gt;
&lt;li&gt;let windowHalfY = window.innerHeight / 2;: 브라우저 창의 세로 크기를 절반으로 나눈 값으로, 브라우저 창의 중심점 y좌표를 나타냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;변수 초기화 설명&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;camera, scene, renderer는 각각 Three.js의 카메라, 씬, 렌더러를 나타내는 변수입니다.&lt;/li&gt;
&lt;li&gt;particles는 입자들의 정보를 저장하는 배열입니다.&lt;/li&gt;
&lt;li&gt;particle은 현재 처리 중인 입자를 나타내는 변수입니다.&lt;/li&gt;
&lt;li&gt;count는 애니메이션 카운터로, 애니메이션을 제어하는 데 사용됩니다.&lt;/li&gt;
&lt;li&gt;mouseX, mouseY는 마우스의 현재 위치를 저장하는 변수입니다.&lt;/li&gt;
&lt;li&gt;windowHalfX, windowHalfY는 브라우저 창의 중심점을 나타내는 변수입니다. 이 값은 마우스 이벤트에서 사용되어 마우스의 위치를 화면 중심을 기준으로 계산하는 데 활용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. init 함수&lt;/h4&gt;
&lt;pre id=&quot;code_1713332331030&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function init() {
  camera = new THREE.PerspectiveCamera(
    100, // 시야각
    window.innerWidth / window.innerHeight, // 종횡비
    2, // 전방 절단면
    10000 // 후방 절단면
  );
  camera.position.z = 2000; // z축 방향으로 2000의 거리
  scene = new THREE.Scene();
  // 입자들을 저장할 배열
  particles = new Array();
  var PI2 = Math.PI * 2; // 원주율의 두 배를 계산하여 PI2에 저장
  var geometry = new THREE.Geometry(); // Three.js의 Geometry 객체를 생성
  // 입자의 머티리얼을 설정
  var material = new THREE.SpriteCanvasMaterial({
    color: &quot;#FF7384&quot;, // 입자 색상
    program: function (context) {
      context.beginPath();
      context.arc(0, 0, 0.2, 0, PI2, true); // 입자 크기
      context.fill();
    },
  });

  // 반복문
  var i = 0;
  for (var ix = 0; ix &amp;lt; AMOUNTX; ix++) {
    for (var iy = 0; iy &amp;lt; AMOUNTY; iy++) {
      particle = particles[i++] = new THREE.Sprite(material);
      particle.position.x = ix * SEPARATION - (AMOUNTX * SEPARATION) / 2;
      particle.position.z = iy * SEPARATION - (AMOUNTY * SEPARATION) / 2;
      scene.add(particle);

      if (i &amp;gt; 0) {
        geometry.vertices.push(particle.position);
      }
    }
  }

  //  Three.js의 CanvasRenderer를 생성
  renderer = new THREE.CanvasRenderer();
  renderer.setPixelRatio(window.devicePixelRatio);
  renderer.setSize(window.innerWidth, window.innerHeight);
  document.body.appendChild(renderer.domElement);
  document.addEventListener(&quot;mousemove&quot;, onDocumentMouseMove, false);
  document.addEventListener(&quot;touchstart&quot;, onDocumentTouchStart, false);
  document.addEventListener(&quot;touchmove&quot;, onDocumentTouchMove, false);
  window.addEventListener(&quot;resize&quot;, onWindowResize, false);

  // 스크롤 이벤트 리스너 추가
  window.addEventListener(&quot;scroll&quot;, function () {
    // 스크롤 위치 가져오기
    let scrollPosition = window.scrollY || window.pageYOffset;

    let content03 = document.querySelector(&quot;#content03&quot;).offsetTop;
    let content05 = document.querySelector(&quot;#content05&quot;).offsetTop;
    if (scrollPosition &amp;gt; content03 - 700 &amp;amp;&amp;amp; scrollPosition &amp;lt; content05 - 500) {
      material.color.set(&quot;#ffffff&quot;);

      renderer.render(scene, camera);
    } else {
      material.color.set(&quot;#FF7384&quot;);
      renderer.render(scene, camera);
    }
  });
}&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;카메라 설정&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PerspectiveCamera를 생성하여 시야각, 종횡비, 전방 및 후방 절단면을 설정합니다.&lt;/li&gt;
&lt;li&gt;카메라의 위치를 z축 방향으로 2000의 거리에 위치시킵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Three.js의 Scene 객체 생성&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;THREE.Scene()을 호출하여 새로운 Scene 객체를 생성합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;입자들 생성&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입자들을 저장할 빈 배열 particles을 생성합니다.&lt;/li&gt;
&lt;li&gt;PI2 변수에는 원주율의 두 배를 저장합니다.&lt;/li&gt;
&lt;li&gt;입자의 형태와 색상을 결정하는 SpriteCanvasMaterial을 생성합니다. 여기서는 원 모양을 그리고 입자의 색상을 지정합니다.&lt;/li&gt;
&lt;li&gt;이중 반복문을 통해 AMOUNTX 및 AMOUNTY에 따라 입자들을 생성하고 scene에 추가합니다. 입자들은 SEPARATION 값에 따라 간격을 두고 배치됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Three.js의 CanvasRenderer 생성&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;THREE.CanvasRenderer()를 호출하여 새로운 CanvasRenderer 객체를 생성합니다.&lt;/li&gt;
&lt;li&gt;렌더러의 픽셀 비율을 설정하고, 화면 크기를 브라우저 창의 크기로 조정합니다.&lt;/li&gt;
&lt;li&gt;렌더러의 DOM 요소를 document body에 추가합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이벤트 리스너 등록&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마우스 및 터치 이벤트에 대한 이벤트 리스너를 추가합니다. 마우스 이벤트가 발생하면 onDocumentMouseMove 함수가 호출됩니다.&lt;/li&gt;
&lt;li&gt;창 크기 변경 이벤트에 대한 이벤트 리스너를 추가합니다. 창 크기가 변경되면 onWindowResize 함수가 호출됩니다.&lt;/li&gt;
&lt;li&gt;스크롤 이벤트 리스너를 추가하여 페이지 스크롤에 따라 입자 색상을 변경하고, 변경된 내용을 렌더러를 통해 화면에 다시 렌더링합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 scroll을 감지해 특정 섹션에서는 particle의 색상을 바꾸도록 설정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #0d0d0d; text-align: start;&quot;&gt;3. &lt;/span&gt;&lt;span style=&quot;color: #0d0d0d; text-align: start;&quot;&gt;이벤트를 처리하는 함수 (&lt;/span&gt;&lt;span style=&quot;color: #0d0d0d; text-align: start;&quot;&gt;창 크기 변경, 마우스 이동, 터치 시작, 터치 이동&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0d0d0d; text-align: start;&quot;&gt;)&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1713332411957&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function onWindowResize() {
  windowHalfX = window.innerWidth / 2;
  windowHalfY = window.innerHeight / 2;
  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix();
  renderer.setSize(window.innerWidth, window.innerHeight);
}

function onDocumentMouseMove(event) {
  mouseX = event.clientX - windowHalfX;
  mouseY = event.clientY - windowHalfY;
}

function onDocumentTouchStart(event) {
  if (event.touches.length === 1) {
    event.preventDefault();
    mouseX = event.touches[0].pageX - windowHalfX;
    mouseY = event.touches[0].pageY - windowHalfY;
  }
}

function onDocumentTouchMove(event) {
  if (event.touches.length === 1) {
    event.preventDefault();
    mouseX = event.touches[0].pageX - windowHalfX;
    mouseY = event.touches[0].pageY - windowHalfY;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;onWindowResize() 함수&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브라우저 창 크기가 변경될 때 호출되는 함수입니다.&lt;/li&gt;
&lt;li&gt;windowHalfX와 windowHalfY를 현재 브라우저 창의 가로와 세로 크기의 절반으로 업데이트합니다.&lt;/li&gt;
&lt;li&gt;카메라의 종횡비(aspect)를 새로운 창 크기에 맞게 업데이트합니다.&lt;/li&gt;
&lt;li&gt;카메라의 종횡비가 변경되었으므로, 카메라의 투영 행렬을 업데이트합니다.&lt;/li&gt;
&lt;li&gt;렌더러의 크기를 새로운 창 크기에 맞게 조정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;onDocumentMouseMove(event) 함수&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마우스가 움직일 때 호출되는 함수입니다.&lt;/li&gt;
&lt;li&gt;이벤트에서 마우스의 현재 위치를 가져와서 브라우저 창의 중심으로부터의 거리를 계산합니다.&lt;/li&gt;
&lt;li&gt;이 값을 mouseX와 mouseY 변수에 저장하여 입자들의 위치를 조정하는 데 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;onDocumentTouchStart(event) 함수&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;터치가 시작될 때 호출되는 함수입니다.&lt;/li&gt;
&lt;li&gt;터치가 한 개일 경우에만 이벤트를 처리합니다.&lt;/li&gt;
&lt;li&gt;터치 이벤트에서 첫 번째 터치의 위치를 가져와서 마우스 이동과 동일하게 처리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;onDocumentTouchMove(event) 함수&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;터치가 이동할 때 호출되는 함수입니다.&lt;/li&gt;
&lt;li&gt;터치가 한 개일 경우에만 이벤트를 처리합니다.&lt;/li&gt;
&lt;li&gt;터치 이벤트에서 첫 번째 터치의 위치를 가져와서 마우스 이동과 동일하게 처리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. render 함수&lt;/h4&gt;
&lt;pre id=&quot;code_1713332541957&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function render() {
  // 현재 색상
  let currentColor = new THREE.Color(renderer.getClearColor());

  // 목표 색상
  let targetColor = new THREE.Color();
  let scrollPosition = window.scrollY || window.pageYOffset;
  let content03 = document.querySelector(&quot;#content03&quot;).offsetTop;
  let content05 = document.querySelector(&quot;#content05&quot;).offsetTop;

  // 조건문
  if (scrollPosition &amp;gt; content03 - 700 &amp;amp;&amp;amp; scrollPosition &amp;lt; content05 - 500) {
    targetColor.set(&quot;#000000&quot;);
  } else {
    targetColor.set(&quot;#ffffff&quot;);
  }

  // 색상 보간을 위한 보간 계수
  let interpolationFactor = 0.1;

  // 보간된 색상 계산
  let newColor = new THREE.Color()
    .copy(currentColor)
    .lerp(targetColor, interpolationFactor);

  // 부드럽게 변경된 색상 설정
  renderer.setClearColor(newColor, 1);

  // 나머지 렌더링 코드는 그대로 유지됨
  camera.position.x += (mouseX - camera.position.x) * 0.05;
  camera.position.y += (-mouseY - camera.position.y) * 0.05;
  camera.lookAt(scene.position);

  for (let i = 0; i &amp;lt; particles.length; i++) {
    let ix = i % AMOUNTX;
    let iy = Math.floor(i / AMOUNTX);
    let particle = particles[i];
    particle.position.y =
      Math.sin((ix + count) * 0.2) * 50 + Math.sin((iy + count) * 0.2) * 50;
    particle.scale.x = particle.scale.y =
      (Math.sin((ix + count) * 0.3) + 1) * 4 +
      (Math.sin((iy + count) * 0.5) + 1) * 4;
  }

  renderer.render(scene, camera);
  count += 0.1;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 배경 색상을 가져와 currentColor 변수에 저장합니다.&lt;/li&gt;
&lt;li&gt;스크롤 위치를 기반으로 목표 색상을 설정합니다. content03과 content05의 위치에 따라 배경 색상이 변경됩니다.&lt;/li&gt;
&lt;li&gt;보간 계수를 사용하여 현재 색상에서 목표 색상으로 부드럽게 변경될 새로운 색상을 계산합니다.&lt;/li&gt;
&lt;li&gt;변경된 배경 색상을 설정합니다.&lt;/li&gt;
&lt;li&gt;카메라의 위치를 부드럽게 조정하여 마우스의 위치를 따라 이동합니다.&lt;/li&gt;
&lt;li&gt;입자들의 위치와 크기를 부드럽게 변화시켜 애니메이션 효과를 줍니다.&lt;/li&gt;
&lt;li&gt;변경된 내용을 렌더러를 통해 화면에 렌더링합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. animate 함수&amp;nbsp;&lt;/h4&gt;
&lt;pre id=&quot;code_1713332587131&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function animate() {
  requestAnimationFrame(animate);
  render();
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;requestAnimationFrame()을 사용하여 애니메이션을 반복 호출합니다.&lt;/li&gt;
&lt;li&gt;매 프레임마다 render() 함수를 호출하여 화면을 렌더링합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;완성된 페이지&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://jjul-clone-site.netlify.app/threejs-background/index.html&quot; height=&quot;800&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;코드 확인하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/YeoDaSeul4355/clone_publishing/tree/main/threejs-background&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/YeoDaSeul4355/clone_publishing/tree/main/threejs-background&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩/애니메이션</category>
      <author>다쭐◠‿◠</author>
      <guid isPermaLink="true">https://duektmf34.tistory.com/208</guid>
      <comments>https://duektmf34.tistory.com/208#entry208comment</comments>
      <pubDate>Wed, 17 Apr 2024 14:46:24 +0900</pubDate>
    </item>
  </channel>
</rss>