<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>youngee_316.log</title>
        <link>https://velog.io/</link>
        <description>光而不耀 :) 퍼블리싱-ing</description>
        <lastBuildDate>Mon, 21 Nov 2022 07:26:20 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. youngee_316.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/youngee_316" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[JavaScript] - 객체/배열]]></title>
            <link>https://velog.io/@youngee_316/JavaScript-%EA%B0%9D%EC%B2%B4%EB%B0%B0%EC%97%B4</link>
            <guid>https://velog.io/@youngee_316/JavaScript-%EA%B0%9D%EC%B2%B4%EB%B0%B0%EC%97%B4</guid>
            <pubDate>Mon, 21 Nov 2022 07:26:20 GMT</pubDate>
            <description><![CDATA[<p>🎈 객체 지향 언어인 javascript에서의 &#39;객체&#39;인 object
property는 그런 object의 속성을 뜻하며, 이름(name/key)과 값(value)의 연결로 이루어진다. 둘의 관계는 object는 property의 모음이라고 생각하면 쉽다.</p>
<p><img src="https://velog.velcdn.com/images/youngee_316/post/7bc58ade-490d-4221-a29a-0c2b966bff07/image.png" alt=""></p>
<pre><code>const superman{
    name : &#39;clark&#39;,
    age : 33,
}</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/b56f12c2-82d8-449e-adc7-4a6a95dc6335/image.png" alt="">
✔ 각 property는 쉼표로 구분해주며, 마지막 쉼표는 생략가능하나 있는게 수정,삭제시 용이함</p>
<h3 id="object---접근추가삭제">Object - 접근,추가,삭제</h3>
<p><img src="https://velog.velcdn.com/images/youngee_316/post/7fb63b60-b707-4bbf-89c2-442b7e0d2f8a/image.png" alt=""></p>
<p>🎈접근</p>
<pre><code>const superman = {
  name : &#39;clark&#39;,
  age : 33,
}

console.log(superman.name); 👈🏻 점
console.log(superman.[&#39;age&#39;]); 👈🏻 대괄호</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/77119e7b-7474-4a46-8b45-b0311357d419/image.png" alt=""></p>
<p>🎈추가</p>
<pre><code>const superman = {
  name : &#39;clark&#39;,
  age : 33,
}

superman.hairColor = &#39;black&#39;;
superman[&#39;hobby&#39;] = &#39;football&#39;;
console.log(superman);</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/be307454-1e63-43a2-89af-056fb5fc72d7/image.png" alt=""></p>
<p>🎈삭제</p>
<pre><code>const superman = {
  name : &#39;clark&#39;,
  age : 33,
}

delete superman.age;
console.log(superman);</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/e71a50c7-9b82-4b76-9f85-10ab6d493f95/image.png" alt=""></p>
<h3 id="object---단축-property">Object - 단축 property</h3>
<p>ex)이름과 나이를 받아서 객체를 반환하기</p>
<pre><code>function makeObject(name, age){
  return {
     name, //name : name,
     age, //age : age,
    hoby : &#39;football&#39;,
  }
}

const Mike = makeObject(&quot;Mike&quot;, 30);
console.log(Mike);</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/02932009-efff-44ee-8429-0064c785ecb8/image.png" alt=""></p>
<h3 id="object---property-존재여부확인">Object - property 존재여부확인</h3>
<pre><code>function makeObject(name, age){
  return {
    name,
    age,
    hoby : &#39;football&#39;,
  }
}

const Mike = makeObject(&quot;Mike&quot;, 30);
console.log(Mike);

console.log(&#39;age&#39; in Mike);
console.log(&#39;birthdat&#39; in Mike);</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/5074c523-6c40-414f-b818-9cf9f9f98d09/image.png" alt=""></p>
<p>✔ in연산자를 사용해 property가 있는지 확인
: 어떤값이 넘어올지 확신할수없을때 사용</p>
<ol>
<li>함수인자로 받거나</li>
<li>API통신을 통해 데이터를 받을때</li>
</ol>
<p>ex)나이를 확인해서 성인인지 아닌지 구분하기</p>
<pre><code>function isAdult(user){
  if(user.age &lt; 20){
    return false;
  }
  return true;
};

const Mike = {
  name : &quot;Mike&quot;,
  age : 30,
};

const Jane = {
  name : &quot;Jane&quot;,
};

console.log(isAdult(Mike));</code></pre><p>👇🏻 결과값
<img src="https://velog.velcdn.com/images/youngee_316/post/4845ef06-a6fc-448b-baee-f9726070c573/image.png" alt=""></p>
<pre><code>function isAdult(user){
  if(!(&#39;age&#39; in user ) || //user에 age가 없거나

  ✨&#39;age&#39; in user 있으면 true인데 !(NOT)을 이용해 반대로 뒤집어주어 
   &gt; user에 age가 없거나로 인식 👉🏻 false

    user.age &lt; 20){ // 20살 미만이거나
    return false;
  }
  return true;
};

const Mike = {
  name : &quot;Mike&quot;,
  age : 30,
};

const Jane = {
  name : &quot;Jane&quot;,
};

console.log(isAdult(Jane));</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/f9398b09-400c-4a13-8a54-94ee75c280d5/image.png" alt=""></p>
<h3 id="forin반복문">for...in반복문</h3>
<pre><code>const Mike = {
  name : &quot;Mike&quot;,
  age : 30,
};

for(key in Mike){
  console.log(key);
  =console.log(Mike[key]); // 결과값 동일
}</code></pre><p>👇🏻 결과값
<img src="https://velog.velcdn.com/images/youngee_316/post/719f926d-a8db-40f4-80fb-8f444c49073f/image.png" alt=""></p>
<hr>
<p>🎈method: 객체 property로 할당된 함수
<img src="https://velog.velcdn.com/images/youngee_316/post/30819ef5-f263-450d-a5f6-7d65696c50f4/image.png" alt=""></p>
<pre><code>let boy = {
  name : &quot;Mike&quot;,
  showName : function () {
    console.log(boy.name)
  }
};

let man = boy;
man.showName();</code></pre><p>👇🏻결과값
<img src="https://velog.velcdn.com/images/youngee_316/post/85e2c7fc-15b1-4855-961a-93a7c43323d5/image.png" alt=""></p>
<p>🎈this</p>
<p>✔ 화살표 함수는 일반 함수와는 달리 자신만의 this를 가지지 않음
✔ 화살표 함수 내부에서 this를 사용하면, 그 this는 외부에서 값을 가져 옴
: 객체의 method를 작성할때, 왠만하면 화살표함수 사용안하는게 좋음(오류발생)</p>
<pre><code>let boy = {
  name : &quot;Mike&quot;,
  showName : function () {
    console.log(boy.name)
  }
};

let man = boy;
boy = null; 👈🏻 man으로만 접근가능

man.showName();</code></pre><p>👇🏻결과값
<img src="https://velog.velcdn.com/images/youngee_316/post/78a6f27e-7ab9-4989-a293-829451e12fc7/image.png" alt=""></p>
<p>🎈해결방안</p>
<pre><code>let boy = {
  name : &quot;Mike&quot;,
  showName : function () {
    console.log(this.name) 👈🏻 method의 this는 해당객체를 가르킴
  }
};

let man = boy;
boy = null; 

man.showName();</code></pre><p>👇🏻결과값
<img src="https://velog.velcdn.com/images/youngee_316/post/fda4911b-0e85-4cfc-b9bf-c410d1a7944a/image.png" alt=""></p>
<p>🎈Array(배열) 
: 순서가 있는 리스트이며, 문자 뿐만 아니라 숫자,객체,함수 등도 포함가능</p>
<ul>
<li>length : 배열의 길이</li>
<li>push : 배열 뒤에 요소를 추가</li>
<li>pop : 배열 끝에 요소를 제거</li>
<li>shift / unshift : 배열 제일 앞에 제거/추가</li>
</ul>
<pre><code>let days = [&#39;mon&#39;,&#39;thu&#39;,&#39;wed&#39;];
console.log(days);</code></pre><p>👇🏻결과값
<img src="https://velog.velcdn.com/images/youngee_316/post/9dd7ce52-0bdd-4513-a9e9-3f7a615135f6/image.png" alt="">
ex)2번째 요소를 찍었을때</p>
<pre><code>let days = [&#39;mon&#39;,&#39;thu&#39;,&#39;wed&#39;];
console.log(days[1]);</code></pre><p>👇🏻결과값
<img src="https://velog.velcdn.com/images/youngee_316/post/f5c94529-f29c-4b19-afa4-3fd644f7e780/image.png" alt="">
ex)2번째 요소를 바꿨을때</p>
<pre><code>let days = [&#39;mon&#39;,&#39;thu&#39;,&#39;wed&#39;];
days[1] = &#39;화요일&#39;
console.log(days);</code></pre><p>👇🏻결과값
<img src="https://velog.velcdn.com/images/youngee_316/post/f0fc24a9-75b7-4c53-a882-0309d5825026/image.png" alt="">
ex)4번째에 목요일을 추가했을때</p>
<pre><code>let days = [&#39;mon&#39;,&#39;thu&#39;,&#39;wed&#39;];
days.push(&#39;thu&#39;);
console.log(days);</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/9b4b9578-2575-4aff-9960-b1a3fc8b4a35/image.png" alt=""></p>
<p>✨ 반복문(for)</p>
<pre><code>let days = [&#39;mon&#39;,&#39;thu&#39;,&#39;wed&#39;];
days.push(&#39;thu&#39;);
days.unshift(&#39;sun&#39;);

console.log(days);

for(let index = 0; index &lt; days.length; index++){
  console.log(days[index]);
}</code></pre><p>👇🏻결과값
<img src="https://velog.velcdn.com/images/youngee_316/post/a5ea6749-06c4-4995-bb4f-967cec777f17/image.png" alt=""></p>
<p>✨ for.. of 사용(결과동일)</p>
<pre><code>let days = [&#39;mon&#39;,&#39;thu&#39;,&#39;wed&#39;];

days.push(&#39;thu&#39;);
days.unshift(&#39;sun&#39;);

for(let day of days){
  console.log(day);
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] - 화살표함수]]></title>
            <link>https://velog.io/@youngee_316/JavaScript-%ED%99%94%EC%82%B4%ED%91%9C%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@youngee_316/JavaScript-%ED%99%94%EC%82%B4%ED%91%9C%ED%95%A8%EC%88%98</guid>
            <pubDate>Mon, 21 Nov 2022 05:48:20 GMT</pubDate>
            <description><![CDATA[<p>🎈함수선언문 : 어디서든 호출가능</p>
<pre><code>function sayHello(){
  console.log(&#39;Hello&#39;);
}
sayHello();</code></pre><p>🎈함수표현식 : 코드에 도달하면 생성</p>
<pre><code>let sayHello = function(){
  console.log(&#39;Hello&#39;);
}
sayHello();</code></pre><p>🎈화살표 함수(arrow function)</p>
<pre><code>let add = (num1, num2) =&gt;{
return num1 + num2; 
}

👇🏻 동일
let add = function(num1, num2){
    ㅇreturn num1 + num2; 
}</code></pre><p>ex)함수표현식</p>
<pre><code>showError();

let showError = function(){
  console.log(&#39;error&#39;);
}</code></pre><p>👇🏻 결과값
<img src="https://velog.velcdn.com/images/youngee_316/post/e2639d91-80a3-413a-a1bd-f5a7605359e9/image.png" alt=""></p>
<p>ex)함수선언문1
showError();</p>
<p>function showError(){
  console.log(&#39;error&#39;);
}
👇🏻 결과값
<img src="https://velog.velcdn.com/images/youngee_316/post/01579f0e-734a-45be-a294-32715016c69a/image.png" alt=""></p>
<hr>
<p>✍🏻 화살표함수로 바꾸면</p>
<pre><code>let showError = () =&gt; {
  console.log(&#39;error&#39;);
}</code></pre><hr>
<p>ex)함수선언문2</p>
<pre><code>const sayHello = function(name){
  const msg = `Hello, ${name}`;
  console.log(msg);
}</code></pre><p>✍🏻 화살표함수로 바꾸면</p>
<pre><code>const sayHello = (name) =&gt; {
  const msg = `Hello, ${name}`;
  console.log(msg);
}</code></pre><hr>
<p>ex)함수선언문3(인수가 2개이고, return문이 있을때)</p>
<pre><code>const add = function (num1, num2){
  const result = num1 + num2;
  return result;
};</code></pre><p>✍🏻 화살표함수로 바꾸면</p>
<pre><code>const add = (num1, num2) =&gt; {
  return = num1 + num2;
};
👇🏻
const add = (num1, num2) =&gt; (
  num1 + num2;
); 중괄호 &gt; 괄호
👇🏻
const add = (num1, num2) =&gt; num1 + num2;
return문이 한줄이기 때문에 더 간결하게 줄일 수 있음</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] - 함수]]></title>
            <link>https://velog.io/@youngee_316/JavaScript-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@youngee_316/JavaScript-%ED%95%A8%EC%88%98</guid>
            <pubDate>Mon, 21 Nov 2022 04:56:13 GMT</pubDate>
            <description><![CDATA[<p>✍🏻 기본문법
: 함수명 뒤에 괄호를 넣어 호출</p>
<pre><code>function sayHello(name){
  console.log(`Hello, ${name}`);
 }</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/73dc1192-2792-42bf-829d-0f0673c9a5c8/image.png" alt=""></p>
<p>🎈함수작성</p>
<pre><code>function showError(){
  alert(&#39;에러가 발생했습니다. 다시 시도해주세요.&#39;);
}
showError();</code></pre><p>결과값👇🏻
<img src="https://velog.velcdn.com/images/youngee_316/post/03814dd4-1ffd-45ae-8e8b-ca72de3d5eeb/image.png" alt="">
🎈매개변수가 있는 함수작성</p>
<pre><code>function sayHello(name){
  const msg = `Hello, ${name}`;
  console.log(msg);
}
sayHello(&#39;Mike&#39;);</code></pre><p>결과값👇🏻
<img src="https://velog.velcdn.com/images/youngee_316/post/00339969-f716-4848-8c40-660b7e5ab0e2/image.png" alt=""></p>
<p>✔ 만약 로그인하지않아서, 사용자의 이름을 모를때</p>
<pre><code>function sayHello(name){
  const msg = `Hello, ${name}`; 👈🏻조건문으로 처리
  console.log(msg);
}
sayHello();</code></pre><hr>
<p>🙆🏻‍♀️ 최종작성</p>
<pre><code>function sayHello(name){
  let msg = &#39;Hello&#39;;
  if(name){
  msg += &#39; ,&#39; + name; 👈🏻 = msg += `,${name}` 
  }
  console.log(msg);
}
sayHello();
sayHello(&#39;Mike&#39;);</code></pre><p>👇🏻 구현화면
<img src="https://velog.velcdn.com/images/youngee_316/post/11bdd93f-c281-4ebe-9f6b-4a1e91255370/image.png" alt=""></p>
<pre><code>let msg = &#39;Hello&#39;; 👈🏻 전역변수
console.log(&#39;함수 호출 전&#39;);
console.log(msg);

function sayHello(name){
  if(name){
  msg += `,${name}` 
  };
  console.log(&#39;함수 내부&#39;);
  console.log(msg);
}
sayHello(&#39;Mike&#39;);
console.log(&#39;함수 호출 후&#39;);
 console.log(msg);</code></pre><p>👇🏻 구현화면
<img src="https://velog.velcdn.com/images/youngee_316/post/b12d310f-9da2-41d0-9e83-6df0be09c3ce/image.png" alt=""></p>
<p>✔ 지역변수 : 함수 내부에서만 사용가능(locla varable)
✔ 전역변수 : 어디서나 접근가능한 함수(global varable)</p>
<p>ex)</p>
<pre><code>let msg = &quot;welcome&quot;; 👈🏻 전역변수
console.log(msg);

function sayHello(name){
  let msg = &quot;Hello&quot;; 👈🏻 지역변수
  console.log(msg + &#39; &#39; + name);
}

sayHello(&#39;Mike&#39;);
console.log(msg);</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/e13fdcd9-95f1-42f4-8529-7c6163b5752a/image.png" alt=""></p>
<p>ex)</p>
<pre><code>let name = &quot;Mike&quot;;

function sayHello(name){
  console.log(name);
}

sayHello(); 👈🏻 매개변수로 받은값은 복사된 후, 함수의 지역변수가 됨
sayHello(&#39;Jane&#39;);</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/6c1ce961-3d90-4d62-8728-acce07012837/image.png" alt=""></p>
<p>ex) OR</p>
<pre><code>function sayHello(name){
  let newName = name || &#39;friend&#39;;
  let msg = `Hello, ${newName}`;
  console.log(msg);
}

sayHello();
sayHello(&#39;Jane&#39;);</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/884f7af9-db3d-48fc-9c6d-feb2152e1707/image.png" alt=""></p>
<p>default값 설정 = 결과동일</p>
<pre><code>function sayHello(name = &#39;friend&#39; ){ 👈🏻기본값설정
  let msg = `Hello, ${name}`;
  console.log(msg);
}

sayHello();
sayHello(&#39;Jane&#39;);</code></pre><p>ex) return으로 값 반환</p>
<pre><code>function add(num1, num2){
  return num1 + num2;
}

const result = add(2,3);
console.log(result);</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/0f4c51f1-f96b-46e1-a117-71f7ad09e855/image.png" alt=""></p>
<p>✔ 한번에 한 작업에 집중
✔ 읽기 쉽고 어떤 동작인지 알 수 있게 쉽게 네이밍
<img src="https://velog.velcdn.com/images/youngee_316/post/1f84ef8e-44d3-4a13-84c6-6ee33394b1ed/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] - switch]]></title>
            <link>https://velog.io/@youngee_316/JavaScript-switch</link>
            <guid>https://velog.io/@youngee_316/JavaScript-switch</guid>
            <pubDate>Mon, 21 Nov 2022 03:58:38 GMT</pubDate>
            <description><![CDATA[<h3 id="switch">switch</h3>
<p>✔ 모든 switch문은 if&amp;else문으로 바꿀수있음
✔ case가 다양할 경우 보다 간결하게 작성가능</p>
<p>✍🏻 기본코드</p>
<pre><code>switch(평가){
case A:
//A일때 코드
case B:
//B일때 코드
...
}</code></pre><p>👇🏻if&amp;else문으로 바꿔보면</p>
<pre><code>if(평가 == A){
 // A일때 코드
}else if(평가 == B){
 // B일때 코드
}</code></pre><p>ex) 사고싶은 과일 물어보고, 가격알려주기</p>
<pre><code>let fruit = prompt(&#39;무슨 과일을 사고 싶나요?&#39;);

switch(fruit){
  case &#39;사과&#39; :
    console.log(&#39;100원 입니다.&#39;);
  case &#39;키위&#39;:
    console.log(&#39;200원 입니다.&#39;);
  case &#39;바나나&#39;:
    console.log(&#39;300원 입니다.&#39;);
  case &#39;포도&#39; : 
    console.log(&#39;400원 입니다.&#39;);
  case &#39;오렌지&#39; :
    console.log(&#39;500원 입니다.&#39;);
}</code></pre><p>✔ 이렇게만 작성하면, 선택한 과일 아래의값이 다 나오기때문에,
break를 넣어줘야함</p>
<p>🙆🏻‍♀️올바른예시</p>
<pre><code>let fruit = prompt(&#39;무슨 과일을 사고 싶나요?&#39;);

switch(fruit){
  case &#39;사과&#39; :
    console.log(&#39;100원 입니다.&#39;);
    break;
  case &#39;키위&#39;:
    console.log(&#39;200원 입니다.&#39;);
    break;
  case &#39;바나나&#39;:
    console.log(&#39;300원 입니다.&#39;);
    break;
  case &#39;포도&#39; : 
    console.log(&#39;400원 입니다.&#39;);
    break;
  case &#39;오렌지&#39; :
    console.log(&#39;500원 입니다.&#39;);
    break;
  default : 👈🏻else와 동일(case에 없는 과일을 입력했을때)
    console.log(&#39;그런 과일은 없습니다&#39;);
}</code></pre><p>📝 만약 같은 가격이 여러개있다면
case &#39;메론&#39;:
case &#39;키위&#39;:
    console.log(&#39;200원 입니다.&#39;);
    break;
👉🏻 break가 없다면, 그 이후 줄을 실행하기 때문에 둘 다 실행가능</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] - loop/for/while]]></title>
            <link>https://velog.io/@youngee_316/JavaScript-3</link>
            <guid>https://velog.io/@youngee_316/JavaScript-3</guid>
            <pubDate>Mon, 21 Nov 2022 03:35:58 GMT</pubDate>
            <description><![CDATA[<p>🎈 반복문 loop
ex) 1부터 10까지 로그를 찍어주세요
<img src="https://velog.velcdn.com/images/youngee_316/post/989bf781-a222-4d1a-8082-a35ec047b819/image.png" alt=""></p>
<p>✔ 그런데, 만약 1부터 100까지 혹은 10000까지 로그를 찍어달라고한다면?
: 이럴때 반복문 loop사용(동일한 작업을 여러번 반복)</p>
<h3 id="for">for</h3>
<pre><code>for(let 1 = 0; i &lt; 2.; i++){
//반복할코드
}</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/95ea0990-d4f5-4d7f-9212-ee68ec6ec090/image.png" alt=""></p>
<p>i = 0
i가 10보다 작으므로
👉🏻코드실행
i값 1증가</p>
<p>i = 1
i가 10보다 작으므로
👉🏻코드실행
i값 1증가</p>
<p>(반복...)</p>
<p>즉, 초기값 지정 &gt; 조건이 true이면 &gt; 코드를 실행 &gt; 괄호 3번째 부분 작업을 진행 &gt; 다시 조건을 확인 &gt; 코드를 실행 &gt; 괄호 3번째 부분 작업을 진행(1-7번)
<img src="https://velog.velcdn.com/images/youngee_316/post/df9277c1-6449-4aa3-977a-55897c39b2b6/image.png" alt=""></p>
<p>조건을 확인해서 false이면 &gt; 반복문을 빠져나옴(8,9번)
<img src="https://velog.velcdn.com/images/youngee_316/post/bea8960b-1b3e-47f8-bc19-2e8616f3b607/image.png" alt=""></p>
<p>✍🏻코드작성
: 1부터 10까지 로그</p>
<pre><code>for(let i = 0; i &lt; 10; i++){
  console.log(i); 👈🏻1-9까지나옴
  console.log(i+1); 👈🏻1-10까지 나옴
}</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/2f24e90f-b250-421e-b092-d623f334fadf/image.png" alt=""></p>
<h3 id="while">while</h3>
<pre><code>let i = 0;

while ( i &lt; 10) {
//코드
👉🏻i값이 0이기때문에 무한반복후, 브라우저 꺼짐
}</code></pre><hr>
<pre><code>while ( i &lt; 10) {
//코드
i++; 👈🏻 해결방법
}</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/c476b18a-1fbe-42e0-b6b4-bb115ef4ddd2/image.png" alt=""></p>
<h3 id="do-while">do.. while</h3>
<pre><code>let i = 0;

do{
i++;
}while(i &lt; 10)</code></pre><p>✔ while과 비슷한데, 조건문을 아래로 옮길 수 있음
✔ 코드를 실행하고, 조건을 체크(while과 가장 큰 차이: 적어도 코드실행을 한번함)
<img src="https://velog.velcdn.com/images/youngee_316/post/fe32525c-c775-4649-8ad0-2ad22cd4a064/image.png" alt=""></p>
<p>🎈반복문을 빠져나오는 기능</p>
<h3 id="break">break</h3>
<p>: 멈추고 빠져나옴</p>
<pre><code>while(true){ 👈🏻참고로 무한반복 조심해서 사용할것
   let answer = confirm(&#39;계속 할까요?&#39;);
   if(!answer){
     break;
   }
}

확인누르면 무한반복 &gt; 취소누르면 반복문을 빠져나옴</code></pre><h3 id="continue">continue</h3>
<p>: 멈추고 다음 반복으로 진행</p>
<pre><code>for(let i = 0; i &lt; 10; i++){
  if(i%2){
    continue;
  }
  console.log(i)
}</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/79d3e74b-cf59-4c10-8a8a-b268e76ae457/image.png" alt=""></p>
<p>📝Tip : 명확한 횟수가 있다면 for문 / 그게아니라면 while문 사용</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] - 논리연산자]]></title>
            <link>https://velog.io/@youngee_316/JavaScript-2</link>
            <guid>https://velog.io/@youngee_316/JavaScript-2</guid>
            <pubDate>Mon, 21 Nov 2022 03:03:54 GMT</pubDate>
            <description><![CDATA[<p>🎈 논리연산자</p>
<h3 id="-or">|| OR</h3>
<p>:여러개 중 하나라도 true면 true
즉, 모든값이 false일때만 false를 반환
<img src="https://velog.velcdn.com/images/youngee_316/post/f9fd89d1-26c2-459c-9d98-ec0919a20580/image.png" alt=""></p>
<h3 id="and">&amp;&amp; AND</h3>
<p>:모든값이 true면 true
즉, 하나라도 false면 false를 반환
<img src="https://velog.velcdn.com/images/youngee_316/post/c7cde0b7-643f-4353-8a68-68ec2793ac29/image.png" alt="">
(단, age가 10이거나 이름이 &#39;Mike&#39;가 아니라면)👇🏻
<img src="https://velog.velcdn.com/images/youngee_316/post/81675563-efc2-4611-9318-2ee5c800cce8/image.png" alt=""></p>
<h3 id="-not">! NOT</h3>
<p>true면 false
false면 true 
즉, true와 false를 반대값으로 바꿔줌
<img src="https://velog.velcdn.com/images/youngee_316/post/12c1d8d7-3008-455f-9ec9-7f768ce0295d/image.png" alt=""></p>
<p>ex)스티븐 잡스는 한국인 이거나(OR),남자이다.
👉🏻 true(둘중하나라도 true이기때문)
ex)스티븐 잡스는 한국인 이고(AND),남자이다.
👉🏻 false(한국인이 아니기때문에 false)</p>
<p>✔ OR 와 AND의 차이
OR는 첫번째 true를 발견하는 즉시 평가를 멈춤
ex)스티븐 잡스는 남자이거나(OR),한국인 이거나(OR),군인이거나(OR)...
👉🏻 true(첫번째:남자라는 정보가 true)
AND는 첫번째 false를 발견하는 즉시 평가를 멈춤
ex) 스티븐 잡스는 남자이고(AND),한국인 이며(AND),군인인 동시에(AND)...
👉🏻 false(한국인이라는 정보가 false)</p>
<p>📝Tip
ex) 운전면허가 있고 시력이 좋은 여군인 사람을 작성할때
운전면허:80 시력좋은60 여군7 👈🏻 전체비율
작성: 여군인데 시력이 좋고 운전면허가 있는 사람 👉🏻 성능에 최적화</p>
<p>✔ 비교연산자에도 우선순위가 있다
ex)성별이 남자이고, 이름이 Mike이거나 성인이면 &#39;통과&#39;, 아니면 &#39;돌아가&#39;
<img src="https://velog.velcdn.com/images/youngee_316/post/113f3b44-575e-4153-b41e-3387a4043f5e/image.png" alt="">
이유 : AND가 OR보다 우선순위가 높기때문에 먼저 평가됨(원하는 의도X)</p>
<pre><code>if(gender === &#39;M&#39; &amp;&amp; name === &#39;Mike&#39; || isAdult)
👉🏻((gender === &#39;M&#39; &amp;&amp; name === &#39;Mike&#39;) || isAdult){
console.log(&#39;통과&#39;)
} else{
console.log(&#39;돌아가&#39;)
} </code></pre><p>✍🏻의도대로 작성한다면
: 남자이고, 동시에 이름이 &#39;Mike&#39;이거나 성인</p>
<pre><code>if(gender === &#39;M&#39; &amp;&amp; (name === &#39;Mike&#39; || isAdult)){
console.log(&#39;통과&#39;)
} else{
console.log(&#39;돌아가&#39;)
} </code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/5acf3f37-9e6f-4cfd-ae20-1db97faa9694/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] - 변수]]></title>
            <link>https://velog.io/@youngee_316/JavaScript-1</link>
            <guid>https://velog.io/@youngee_316/JavaScript-1</guid>
            <pubDate>Mon, 21 Nov 2022 02:16:04 GMT</pubDate>
            <description><![CDATA[<p>🎈 JavaScript</p>
<ul>
<li>자바스크립트(JavaScript)는 객체(object) 기반의 스크립트 언어</li>
<li>HTML로는 웹의 내용을 작성하고, CSS로는 웹을 디자인하며, 자바스크립트로는 웹의 동작을 구현</li>
<li>주로 웹 브라우저에서 사용되나, Node.js와 같은 프레임워크를 사용하면 서버 측 프로그래밍에서도 사용가능</li>
<li>현재 컴퓨터나 스마트폰 등에 포함된 대부분의 웹 브라우저에는 자바스크립트 인터프리터가 내장되어 있음</li>
</ul>
<p>[참고사이트]
<a href="https://youtu.be/KF6t61yuPCY">https://youtu.be/KF6t61yuPCY</a></p>
<p>🎈변수</p>
<ol>
<li>변수는 문자와 숫자, $와 _만 사용</li>
<li>첫 글자는 숫자가 될수없음</li>
<li>예약어는 사용할수없음</li>
<li>가급성 상수는 대문자로 알려주기</li>
<li>변수명은 읽기 쉽고 이해할수있게 선언</li>
</ol>
<p>✔ 문자는 항상 따옴표로 감싸주어야함
✔ 예약어 사용X(자바스크립트에서 이미 사용하는언어 ex)class)</p>
<hr>
<p>alert 👉🏻 경고창
console.log 👉🏻 로그를찍는창</p>
<p>let 👉🏻 한번선언후에 다른값으로 바꿀수있음
ex) let grade = &quot;F&quot;;
        grade = &quot;A+&quot;; (let생략가능)
const : 절대로 바뀌는 않는 상수 수정X
파이,최댓값,생일 👉🏻 대문자로 선언하는게좋다(다른개발자에게 상수라고 알려줌)
ex) const PI = 3.14;
    const SPEED_LIMIT = 50;
    const BIRTH DAY = &#39;2020-01-01&#39;;
📝Tip : 모든변수 const &gt; 변할수있는것만 let    </p>
<p>🎈자료형</p>
<ul>
<li>Boolean : 논리적인 요소, true와 false값이 있다.</li>
<li>null : 빈 값</li>
<li>undefined : 값을 할당하지 않은 변수가 가지는 값</li>
<li>Number : 숫자형으로 정수와 부동 소수점, 무한대 및 NaN(숫자가 아님)값을 포함한다.</li>
<li>String : 문자열</li>
</ul>
<p>백틱 : 문자열 내부에 변수를 표현해줄때 사용하면 편리
ex) const message = <code>My name is ${name}</code>;
    console.log(message); 
결과값 : &quot;My name is Mike&quot;</p>
<p>🎈typeof 연산자</p>
<ul>
<li>다른 개발자가 작성한 변수의 타입을 알아야하거나</li>
<li>API통신을 통해 받아온 데이터를 타입에 따라 다른방식으로 사용해야할때
typeof null; // &quot;object&quot; 객체형</li>
<li>문자형 + 숫자형 &gt; 문자형으로 변경됨</li>
</ul>
<p>🎈대화상자
alert =알려줌 / 메세지를 보여줌
prompt = 입력받음 / 디폴트값도 입력가능 / 사용자에게 메세지를 보여주고
어떤값을 입력받을수있음 필드를 제공함
confirm = 확인받음 / 사용자에게 확인을 받기위한 용도</p>
<p>📝단점:</p>
<ol>
<li>스크립트 일시 정지(창을 닫기전에는 이후동작에 제한을받음)</li>
<li>스타일링X(위치와 모양을 정할수없음 &gt; 디자이너들이 안좋아함)</li>
</ol>
<h3 id="prompt">prompt</h3>
<p>ex) 디폴트 / 2개의 인수를 받을수있음
함수를 실행하는 괄호안의값 = 인수<br>const name = prompt(&quot;예약일을 입력해주세요.&quot;,&quot;2020-10-18&quot;);
alert(&quot;환영합니다.&quot; + name + &quot;님&quot;);
&quot;2020-10-18&quot; &gt; 입력받을 디폴트값(미리들어가있으면 안내or힌트를 줄수있음)</p>
<p>ex)
const name = prompt(&quot;이름을 입력하세요.&quot;);
alert(<code>안녕하세요. ${name}님. 환영합니다.</code>);</p>
<h3 id="confirm">confirm</h3>
<p>alert과 다른점 &gt; alert는 확인버튼만있지만
confirm은 취소/확인버튼이 같이있음
확인 👉🏻 true / 취소 👉🏻 false</p>
<h3 id="그-외">그 외</h3>
<p>String() 문자형으로 변환
Number() 숫자형으로 변환
ex) Number(&quot;문자&quot;) // NaN
Number(null) // 0
prompt에서 취소버튼을 누르면 null할당 &gt; 숫자0
Number(undefined) // NaN(잘기억해두기)</p>
<p>📝차이점 및 기억해둘것
Number(0) // false
Number(&#39;0&#39;) // true 문자형0
Number(&quot;) // false 비문자열
Number(&#39; &#39;) // true 공백이 들어가있으면
Boolean() 불린형으로 변환
👉🏻false
숫자 0, 빈 문자열 &quot;, null, undefined, NaN &lt;&lt; 제외하고는 true</p>
<hr>
<p>ex)수학과 영어의 점수를 입력받아 평균을 구하는것(수학90/영어80)
const mathScore = prompt(&quot;수학 몇점?&quot;);
const engScore = prompt(&quot;영어 몇점?&quot;);
const result = (mathScore + engScore) / 2;
결과값 : 4540
숫자형이 아니더라도 / 나누기의 값이 들어가면 숫자형으로 변환되어 사용
👉🏻 자동 형변환</p>
<p>✍🏻평균값:85
!codepen[youngee/embed/qBKVNwO?default-tab=html%2Cresult]</p>
<p>✔ 참고로 알아둘것</p>
<pre><code>console.log(
   Number(true); 1
   Number(false); 0
)</code></pre><p>🎈연산자</p>
<p>나머지(%)를 어디에 쓸까?
ex) 홀짝
홀수 : X % 2 = 1
짝수 : Y % 2 = 0
ex) 어떤 값이 들어와도 5를 넘기면 안됌
X % 5 = 0 ~ 4 사이의 값만 반환</p>
<p>✔ 거듭제곱
const num = 2**3;
console.log(num); // 8</p>
<p>✔ 연산자 줄여서 쓰기
ex)
let num = 10;
num = num+5;
console.log(num); // 15
👇🏻
let num = 10;
num += 5; 변수에 5를 넣어서 다시 위의식에 넣어주는것
console.log(num); // 15</p>
<p>✔ 증가 연산자, 감소 연산자 (값을 1만큼 증가 혹은 감소)
let num = 10;
num++; num--;
console.log(num);  11 / 9</p>
<p>✔ 비교연산자</p>
<p>a == 3 &gt; a가 3이랑 같은가
a != 3 &gt; a가 3이랑 다른가
반환값은 // true or flase</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Mercedes-benz]]]></title>
            <link>https://velog.io/@youngee_316/Mercedes-benz-6mjvk0ws</link>
            <guid>https://velog.io/@youngee_316/Mercedes-benz-6mjvk0ws</guid>
            <pubDate>Tue, 15 Nov 2022 09:10:01 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/youngee_316/post/3b1b5dc4-5be8-4228-9126-2e165aa51f1d/image.jpg" alt="">
💻 Mercedes-benz coding</p>
<p>사이트명 : Mercedes-benz
사용언어 : html / css / js 
분류 : 적응형 PC </p>
<p>🎈 Mercedes-benz HOMEPAGE
<a href="https://www.mbusa.com/en/home">https://www.mbusa.com/en/home</a></p>
<h1 id="check-point">Check Point</h1>
<ul>
<li>data-속성 태그컨트롤</li>
<li>gsap 콜백함수</li>
</ul>
<h3 id="1-data-속성-태그컨트롤">1. data-속성 태그컨트롤</h3>
<p>🎈 기본원리
div 또는 요소에 여러 데이터 속성을 포함하여 원하는 작업을 수행
: 아래동영상 참고(js적용)
<a href="https://youtu.be/XtEs0SZ_4Y0">https://youtu.be/XtEs0SZ_4Y0</a></p>
<p>👇🏻 구현해야되는 모습
해당영역에 스크롤이 감지될때, 텍스트가 아래에서 위로 올라오는 효과적용
✍🏻 코드작성</p>
<pre><code>&lt;div class=&quot;left-title pd-side&quot; data-slideUp=&quot;true&quot;&gt; 👈🏻date속성 적용
  &lt;h2 class=&quot;title&quot;&gt;
    &lt;span class=&quot;wrap&quot;&gt;
      &lt;span class=&quot;line&quot;&gt;The new 2024&lt;/span&gt;
    &lt;/span&gt;    
    &lt;span class=&quot;wrap&quot;&gt;
      &lt;span class=&quot;line&quot;&gt;Mercedes C63 S E&lt;/span&gt;
    &lt;/span&gt;
  &lt;/h2&gt;
 &lt;div class=&quot;left-txt&quot;&gt;
   &lt;p class=&quot;wrap&quot;&gt;
     &lt;span class=&quot;line&quot;&gt;ingenuity to pave the&lt;/span&gt;
   &lt;/p&gt;
   &lt;p class=&quot;wrap&quot;&gt;
     &lt;span class=&quot;line&quot;&gt;way for unrelenting hybrid power.          &lt;/span&gt;
   &lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;</code></pre><ol>
<li><p>line-effect를 적용 -&gt; data-slideUp=&quot;true&quot;
전체를 wrap으로 감싸주고, 적용할 text에 line이라는 클래스명을 주었다
<img src="https://velog.velcdn.com/images/youngee_316/post/0f35dccc-12a2-44ea-95d6-fe3b56ac05d4/image.png" alt=""></p>
</li>
<li><p>js로 컨트롤</p>
<pre><code>function lineEffect(){

  $(&#39;[data-slideUp=true]&#39;).each(function(i,el){ 👈🏻모든요소에서
      child = $(this).find(&#39;.line&#39;); 👈🏻적용대상찾기1
      line = $(this).find(&#39;.border-line&#39;); 👈🏻적용대상찾기2
      gsap.to(line,{ 👈🏻width:0 &gt; width:100%
          scrollTrigger:{
              trigger:el,
              start:&quot;top 50%&quot;,
              end:&quot;bottom top&quot;,
              // markers:true,
              toggleActions: &quot;restart none reverse none&quot;,
          },
          width:&quot;100%&quot;,
          stagger:0.1,

      })
      gsap.to(child,{ 👈🏻translateY:100% &gt; translateY(0%)
          scrollTrigger:{
              trigger:el,
              start:&quot;top 50%&quot;,
              end:&quot;bottom top&quot;,
              toggleActions: &quot;restart none reverse none&quot;,
          },
          transform: &#39;translateY(0%)&#39;,
          stagger:0.1,
      })
  })
}</code></pre><p>공용으로 적용되는 애니메이션이기 때문에, common.css에 코드작성</p>
<pre><code>[data-slideUp=true] .wrap{overflow: hidden; display: block;}
[data-slideUp=true] .line{ display: inline-block; transform: translateY(100%);}
[data-slideUp=true] .border-line{position: absolute; top: 0; left: 0; width: 0%; height: 1px; background: #fff}</code></pre><p>이렇게 작성 후, 적용시키고 싶은 부분에 data-속성 추가</p>
</li>
</ol>
<p>✔ each(function(i,el) : object 와 배열 모두에서 사용할 수 있는 일반적인 <span style="background-color:#f5ff00">반복함수</span> 여기에선 $.each() 메서드의 첫번째 매겨변수로 위에서 선언한 객체를 전달.
1.객체를 전달받으면 index는 객체의 key(property)를 가리키고
2.el(해당선택자의 객체)은 키의 값을 가지고옴</p>
<h3 id="2-gsap-콜백함수">2. gsap 콜백함수</h3>
<p>GSAP Callback (트윈 제어 - 콜백 함수)
: callback은 이벤트에 전달해주는 콜백 함수
GSAP는 함수를 호출하고 파라미터를 넘기는 과정을 편하게 제어가능함</p>
<p>🎈 onInit
: 애니메이션(Tween)이 시작되기 바로 전에 함수를 호출
onStart와 별 차이가 없지만, 당연히 onStart 보다 빨리 호출됨</p>
<p>🎈 onStart
: 애니메이션(Tween)이 시작될때 호출</p>
<p>🎈 onComplete
: 애니메이션(Tween)이 종료되었을 때 함수를 호출
GSAP 콜백 함수 중 가장 사용빈도가 높음</p>
<p>🎈 Event(함수) + Params
: 애니메이션(Tween) 중 호출하고자 하는 함수 뒤에 Params 파라미터를 붙여 줄 수 있음</p>
<p>✍🏻 코드문법
✔ 배열의 형태로 값을 넘겨주어야 함
✔ 자기 자신의 값을 넘겨줄 때에는 &quot;{self}&quot;라고 값을 주어야 함</p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot;&gt;
    &lt;title&gt;GSAP - onComplete&lt;/title&gt;
    &lt;script src=&quot;js/jquery.js&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/gsap/3.8.0/gsap.min.js&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        $(function(){
            var outText = document.querySelector(&quot;.motion-message&quot;);
            gsap.to(&#39;.tweenbox&#39;, 3, {
                marginLeft: 300,
                backgroundColor: &#39;#ccc&#39;,
                border: &#39;2px solid #222&#39;,
                borderRadius: 30,
                onStart: motionMessage,
                onStartParams: [&#39;GSAP Tween 콜백함수 시작 메시지&#39;,&#39;START&#39;],
                onComplete: motionMessage,
                onCompleteParams: [&#39;GSAP Tween 콜백함수 종료 메시지&#39;, &#39;END&#39;]
            });

            function motionMessage(message1, message2) {
                outText.innerHTML += message1 + &#39;-&#39; + message2 + &#39;&lt;br&gt;&#39;;
            }
        });
    &lt;/script&gt;
    &lt;style&gt;
        .tweenbox {width:100px;height:100px;border:2px solid crimson;background:lightcoral;box-sizing:border-box}    
        .motion-message{margin:30px 10px}
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div class=&quot;tweenbox&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;motion-message&quot;&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p>!codepen[youngee/embed/WNyOVRe?default-tab=html%2Cresult]</p>
<p>🎈onUpdate
: 애니메이션(Tween)이 계속 진행되는 동안 호출
🎈onRepeat
: 애니메이션(Tween)이 반복될 때마다 호출
🎈onReverseComplete
: 애니메이션(Tween)이 반전(Reverse) 된 후 모션이 완료되었을 때 호출</p>
<p>👇🏻 구현해야되는 모습
: 스크롤감지에 따라, 스크롤이되면서+문단도 동시에 넘어감
<img src="https://velog.velcdn.com/images/youngee_316/post/8d9b7ec3-f008-4400-8352-9a12bf0de85e/image.png" alt="">
✍🏻 코드작성</p>
<pre><code>&lt;div class=&quot;program-scroll&quot;&gt;&lt;/div&gt; 👈🏻스크롤
  &lt;div class=&quot;program-area box01 active&quot;&gt;
    &lt;div class=&quot;left&quot;&gt; 👈🏻왼쪽박스
      &lt;div class=&quot;content&quot;&gt; 👈🏻내용
        &lt;div class=&quot;content-box pd-side&quot;&gt;
        &lt;span class=&quot;number&quot; data-color=&quot;point1&quot;&gt;
          &lt;span&gt;01&lt;/span&gt;
        &lt;/span&gt;
        &lt;h3 data-color=&quot;point1&quot;&gt;1. Multipoint Inspection&lt;/h3&gt;
        &lt;p class=&quot;number-txt&quot; data-color=&quot;point2&quot;&gt;
        A Mercedes-benz Approved (CPO) Vehicle has been
        inspected in compliance with our 111-point checklist
        to ensure they meet the minimum mechanical and
        cosmetic standards and the vehicle meets the
        preparation standards. All work has been performed by
        Mercedes-benz trained technicians and only Genuine
        Mercedes-benz parts have been used.
       &lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt;
      &lt;div class=&quot;title&quot; data-color=&quot;point1&quot;&gt; 👈🏻다음문단
        &lt;div class=&quot;title-inner&quot;&gt;
          &lt;p class=&quot;title-txt&quot;&gt;2. CPO Limited Warranty Coverage&lt;/p&gt;
        &lt;/div&gt;
      &lt;/div&gt;
  &lt;/div&gt;
    &lt;div class=&quot;right&quot;&gt;👈🏻비디오재생
      &lt;video muted autoplay loop playsinline aria-label=&quot;benz-detail-video&quot;&gt;&lt;source src=&quot;./asset/images/benz.mp4&quot; type=&quot;video/mp4&quot;&gt;&lt;/video&gt;
    &lt;/div&gt;
 &lt;/div&gt;</code></pre><hr>
<ol>
<li>gsap.timeline설정<pre><code>gsap.timeline({
     defaults:{
         ease:&#39;none&#39;, 👈🏻motion에 있는 굴곡없어짐
     },
     scrollTrigger:{
         trigger:&#39;.sc-program&#39;,
         start:&quot;top top&quot;, 
         end:&quot;+=300%&quot;, 👈🏻영역을 길게만듬(강제스크롤:영역3배)
         scrub:1, 👈🏻애니메이션을 재사용 할 수 있는 기능
         pin:true, 👈🏻영역이 벗어나는것을 방지   
     },
})        </code></pre><pre><code>.to(&#39;.program-scroll&#39;,{
     height:&#39;100%&#39;
 })</code></pre>☝🏻스크롤<pre><code>.addLabel(&#39;a&#39;)
.to(.box01),{opacity:1,visibility:&#39;visible&#39;},&#39;a&#39;)
.to(.box01),{opacity:0,visibility:&#39;hidden&#39;},&#39;a+=1&#39;)
.to(.box02),{opacity:1,visibility:&#39;visible&#39;},&#39;a+=1&#39;)
.to(.box02),{opacity:0,visibility:&#39;hidden},&#39;a+=2&#39;)
.to(.box03),{opacity:1,visibility:&#39;visible&#39;},&#39;a+=2&#39;)</code></pre>☝🏻영역
<span style="background-color:#f5ff00">문제점:문단영역과 스크롤이벤트가 동시적용이 안됨</span> </li>
</ol>
<ol start="2">
<li>gsap - onUpdate
[참고사이트]
<a href="https://greensock.com/docs/v3/Plugins/ScrollTrigger/progress">https://greensock.com/docs/v3/Plugins/ScrollTrigger/progress</a>
🎈기본원리
onUpdate: self =&gt; console.log(&quot;progress:&quot;, self.progress)
<img src="https://velog.velcdn.com/images/youngee_316/post/9641dfc0-3561-48c9-acb5-9e08b56f2808/image.png" alt="">
☝🏻console로 찍었을때
=&gt; : function과 같음 <pre><code>onUpdate : function(self){
if(self.progress &gt; 0.666)
 $(&#39;.box03&#39;).addClass(&#39;active&#39;).siblings().removeClass(&#39;active&#39;)
}else if(self.progress &gt; 0.333){
 $(&#39;.box02&#39;).addClass(&#39;active&#39;).siblings().removeClass(&#39;active&#39;)
}else {
 $(&#39;.box01&#39;).addClass(&#39;active&#39;).siblings().removeClass(&#39;active&#39;)
}
}</code></pre>✔ 조건문을 줄때, 역순으로 줘야함
: 예를들어, 0.333부터 주게되면 조건이 만족하는순간 조건비교가 안됨</li>
</ol>
<h1 id="issue-point">Issue Point</h1>
<ul>
<li>video-control</li>
<li>grid로 영역잡기</li>
</ul>
<h3 id="1-video-control">1. video-control</h3>
<p>🎈 기본원리
[참고사이트]
<a href="https://blog.edit.kr/entry/video-tag-%EB%A9%88%EC%B6%94%EA%B2%8C-%ED%95%98%EA%B8%B0-vdget0pause-%EC%B2%98%EB%A6%AC">https://blog.edit.kr/entry/video-tag-%EB%A9%88%EC%B6%94%EA%B2%8C-%ED%95%98%EA%B8%B0-vdget0pause-%EC%B2%98%EB%A6%AC</a></p>
<p>👇🏻 구현해야되는 모습
mouseover -&gt; 선택한 비디오만재생
mouseleave -&gt; 재생멈춤</p>
<p>✍🏻 코드작성</p>
<pre><code>function autoVideo(){

    $(&#39;.gallery-item&#39;).mouseover(function(){
        $(this).find(&#39;video&#39;).get(0).play(); 
    })
    $(&#39;.gallery-item&#39;).mouseleave(function(){
        $(this).find(&#39;video&#39;).get(0).pause(); 
    })
}</code></pre><p>✔ 선택자를 정확히 적어줘야 전체적용이 안됨(주의!)</p>
<h3 id="2-grid로-영역잡기">2. grid로 영역잡기</h3>
<p>👇🏻 구현해야되는 모습
<img src="https://velog.velcdn.com/images/youngee_316/post/abd6608a-e240-46a2-b029-bd9db755de23/image.png" alt="">
✍🏻 코드작성
<img src="https://velog.velcdn.com/images/youngee_316/post/db737fe1-77b1-41f6-9e4a-98c73c0f2c66/image.png" alt=""></p>
<pre><code>.sc-order .content .right-inner{display: grid; grid-template-columns: 60px 1fr; gap:30px; padding: 30px; align-items: center; border-radius: 10px; background: #060f10;} 
.sc-order .right-inner .thumb-img{position: relative; grid-row-start: 1; grid-row-end: span 2; overflow: hidden; border-radius: 5px; width: 65px; height: 65px; justify-content: center; }
.sc-order .right-inner .thumb-img img{object-fit: cover; position: absolute; top: 0; left: 0;}
.sc-order .content .right-inner .txt1{font-size: 25px;}
.sc-order .content .right-inner .txt2{margin-top: -25px;}
.sc-order .right-inner .btn-order{grid-column-start: 1; grid-column-end: 3; height: 60px;border-radius: 50px; padding: 40px 0; display: inline-flex; justify-content: center; position: relative; align-items: center; font-weight: bold; text-align: center; background: #fff; color: var(--theme-color2);} </code></pre><p>🤣 flex나 position으로도 구현가능한데, 왜 grid로 잡았을까..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[HYBE]]]></title>
            <link>https://velog.io/@youngee_316/HYBE</link>
            <guid>https://velog.io/@youngee_316/HYBE</guid>
            <pubDate>Wed, 02 Nov 2022 19:16:05 GMT</pubDate>
            <description><![CDATA[<p>💻 HYBE coding</p>
<p>사이트명 : HYBE
사용언어 : html / scss / js 
분류 : 적응형 PC / 반응형</p>
<p>🎈 HYBE HOMEPAGE
<a href="https://hybecorp.com/kor/company/artist">https://hybecorp.com/kor/company/artist</a></p>
<h1 id="check-point">Check Point</h1>
<ul>
<li>loading-page</li>
<li>text-animation</li>
<li>gsap - scrollTrigger</li>
</ul>
<h3 id="1-loading-page">1. loading-page</h3>
<p>🎈 기본원리
: gsap플러그인을 사용하여, 순차적인 애니메이션을 구현함</p>
<pre><code>&lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.2/gsap.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.2/ScrollTrigger.min.js&quot;&gt;&lt;/script&gt;</code></pre><p>✍🏻 코드작성</p>
<pre><code>&lt;div id=&quot;loading&quot;&gt;
  &lt;div class=&quot;loading-txt&quot;&gt;
      &lt;div class=&quot;wrap&quot;&gt;
        &lt;span class=&quot;first&quot;&gt;H&lt;/span&gt;
        &lt;span class=&quot;sec&quot;&gt;Y&lt;/span&gt;
        &lt;span class=&quot;sec&quot;&gt;B&lt;/span&gt;
        &lt;span class=&quot;sec&quot;&gt;E&lt;/span&gt;
      &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/3e611415-fbed-4a3d-b944-4b3fa1233c64/image.jpg" alt=""></p>
<ol>
<li>text가 순차적으로 나와야하기 때문에, wrap으로 전체를 묶어 위치를 잡아주고 class명을 다르게 주었다.<pre><code>.wrap{
     overflow: hidden;
     padding: 0 10px;
     transform: translateX(20%);
 }
 span{
     font-size: 15vw; 
     font-weight: 900;
     color: $color-main;
     display: inline-block;
     transform: translateY(100%);
 }</code></pre></li>
<li>gsap.timeline적용
: 로딩페이지 이벤트 후, 사라지면서 아래의 visual이 나타남</li>
</ol>
<p>✍🏻 코드작성</p>
<pre><code>const intro = gsap.timeline({ 
        defaults:{
        },
        onComplete:function(){ 👈🏻 완료된후에
            scaleIntro.play();
        }
    })
    intro
    .addLabel(&#39;a&#39;)
    .to(&#39;#loading .first&#39;,1,{yPercent: -95},&#39;a&#39;)
    .to(&#39;#loading .sec&#39;,1,{yPercent: -95, stagger:0.1},&#39;a+=0.2&#39;)
    .to(&#39;#loading .wrap&#39;,0.5,{xPercent:-20},&#39;a+=0.5&#39;)
    .to(&#39;#loading&#39;,1,{height:0})

    const scaleIntro = gsap.from(&#39;.sc-visual .visual-bg img&#39;,0.5,{
        scale:1.2,
        paused:true,
    })</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/f2d26654-80cc-4e62-a5ae-28790fae7d9a/image.jpg" alt=""></p>
<p>✔ gsap.timeline : gsap를 한꺼번에 묶어 순차적으로 실행하는 메서드
✔ addLabel : gsap를 그룹으로 묶어, 동시에 애니메이션 적용하는 메서드</p>
<h3 id="2-text-animation">2. text-animation</h3>
<p>🎈 기본원리
: 아래동영상을 참고하여 코드적용
!youtube[gR0-eb5ncEU]</p>
<p>👇🏻 구현해야되는 모습
: text-in과 text-out으로 컨트롤하여 계속 롤링되게 하여야함
<img src="https://velog.velcdn.com/images/youngee_316/post/d5b909fc-ab18-4238-a04e-6a4a6fc12ea9/image.jpg" alt="">
✍🏻 코드작성</p>
<pre><code>&lt;div class=&quot;visual-content&quot;&gt;
   &lt;h2 class=&quot;title&quot;&gt;
       &lt;div class=&quot;title-list&quot;&gt;
          &lt;span class=&quot;title-item&quot;&gt;BTS&lt;/span&gt;
          &lt;span class=&quot;title-item&quot;&gt;LEE HYUN&lt;/span&gt;
          &lt;span class=&quot;title-item&quot;&gt;LE SSERAFIM&lt;/span&gt;
          &lt;span class=&quot;title-item&quot;&gt;NewJeans&lt;/span&gt;
          &lt;span class=&quot;title-item&quot;&gt;SEVENTEEN&lt;/span&gt;
          &lt;span class=&quot;title-item&quot;&gt;ENHYPEN&lt;/span&gt;
          &lt;span class=&quot;title-item&quot;&gt;TXT&lt;/span&gt;
       &lt;/div&gt;
       HYBE ARTIST
   &lt;/h2&gt;                
&lt;/div&gt;</code></pre><ol>
<li>변수선언<pre><code>const txts = document.querySelector(&#39;.title-list&#39;).children;
txtsLen = txts.length;
let index = 0;</code></pre></li>
<li>for반복문(&#39;text-in&#39;, &#39;text-out&#39;)
<img src="https://velog.velcdn.com/images/youngee_316/post/1bd79af5-f7b6-43fb-b1d0-cf3394c183b8/image.png" alt=""></li>
</ol>
<pre><code>function aniMate1() {
    for (let i = 0; i &lt; txtsLen; i++) {
        txts[i].classList.remove(&#39;text-in&#39;, &#39;text-out&#39;);
    }
    txts[index].classList.add(&#39;text-in&#39;);
}
function aniMate2() {
    txts[index-1].classList.add(&#39;text-out&#39;);
}</code></pre><ol start="3">
<li>setInterval() 적용
✍🏻 setTimeout / setInterval 차이점
setTimeout() : 코드를 바로 실행하지 않고 일정 시간 기다린 후 실행해야하는 경우에 사용
setInterval() : 코드를 일정한 시간 간격을 두고 반복해서 실행하고 싶을 때 사용<pre><code>setInterval(function () {
 aniMate2()
}, 3500);
</code></pre></li>
</ol>
<p>setInterval(function () {
    if (index == txtsLen - 1) {
        index = 0;
    }
    else {
        index++;
    }
    aniMate1()
}, 3000);</p>
<pre><code>
### 3. gsap - scrollTrigger

🎈 기본문법
: 어떤 지점에 도달하면 스크롤 하더라도 배경은 유지된 채, 수평 방향에서 요소가 등장하는 효과가 목적</code></pre><p>scrollTrigger:{
    trigger:&quot;기준이될태그&quot;,
    start:&quot;top top&quot;, 👈🏻 기준태그의 시작지점, 윈도우기준 시작지점 
    end:&quot;bottom top&quot; 👈🏻 기준태그의 끝지점, 윈도우기준 끝지점
    markers:true, 👈🏻 인디케이터를 표시
    scrub:1 👈🏻 되감기(스크롤이 요소 이전으로 돌아가면 애니메이션 역시 되돌아가는 기능) 
}</p>
<pre><code>👇🏻 구현해야되는 모습
![](https://velog.velcdn.com/images/youngee_316/post/773e1929-f75e-4628-a17f-ab60f0bb9d01/image.jpg)

1. GSAP ScrollTrigger의 Pin과 timeline을 사용하여 효과를 구현
: 배경을 유지하는 것은 pin, 요소가 등장하는 것은 timeline으로 구현</code></pre><p>const viewSlide = gsap.timeline({
                defaults:{
                    ease:&#39;none&#39;,
                },
                scrollTrigger:{
                    trigger:&#39;.sc-view&#39;,
                    start:&#39;top top&#39;,
                    end:&#39;+=800%&#39;, 👈🏻 값이 클수록 스크롤이 천천히됌
                    scrub:1,
                    markers:true, 👈🏻 시작과 끝위치 확인
                    pin:true, 👈🏻 고정
                },
            })</p>
<pre><code>2. gsap.set({})기초셋팅</code></pre><p>gsap.set(&#39;.sc-view .img-item .item01&#39;,{ scale:1.3 })
            gsap.set(&#39;.sc-view .img-item .item02&#39;,{ rotate:30, })
            gsap.set(&#39;.sc-view .img-item .item03&#39;,{ rotate:-10,scale:0.8 })
            gsap.set(&#39;.sc-view .img-item .item05&#39;,{ rotate:-50,scale:1.5 })
            gsap.set(&#39;.sc-view .img-item .item05&#39;,{ scale:1.1 })
            gsap.set(&#39;.sc-view .img-item .item07&#39;,{ rotate:-120})
            gsap.set(&#39;.sc-view .img-item .item08&#39;,{ rotate:20,scale:1.2 })
            gsap.set(&#39;.sc-view .img-item .item09&#39;,{ rotate:45})
            gsap.set(&#39;.sc-view .img-item .img&#39;,{ yPercent:-50})</p>
<pre><code>3. .addLabel(&#39;a&#39;)로 그룹으로 효과적용</code></pre><p>.addLabel(&#39;a&#39;)
            .to(&#39;.sc-view .title&#39;,{ xPercent:-20 },&#39;a&#39;)
            .to(&#39;.sc-view .img-item&#39;,{ xPercent:-110 },&#39;a&#39;)
            .to(&#39;.sc-view .img-item .img&#39;,{ yPercent:100, stagger:0.02 },&#39;a&#39;)
            .to(&#39;.sc-view .img-item .item01&#39;,{ rotate:-90 },&#39;a&#39;)
            .to(&#39;.sc-view .img-item .item02&#39;,{ rotate:0 },&#39;a&#39;)
            .to(&#39;.sc-view .img-item .item03&#39;,{ rotate:0 },&#39;a&#39;)
            .to(&#39;.sc-view .img-item .item04&#39;,{ rotate:60 },&#39;a&#39;)
            .to(&#39;.sc-view .img-item .item05&#39;,{ rotate:0 },&#39;a&#39;)
            .to(&#39;.sc-view .img-item .item06&#39;,{ rotate:30 },&#39;a&#39;)
            .to(&#39;.sc-view .img-item .item07&#39;,{ rotate:0 },&#39;a&#39;)
            .to(&#39;.sc-view .img-item .item08&#39;,{ rotate:0 },&#39;a&#39;)
            .to(&#39;.sc-view .img-item .item09&#39;,{ rotate:0, left:&#39;100px&#39;, bottom:&#39;-150px&#39; },&#39;a+=.1&#39;)</p>
<pre><code>&lt;span style=&quot;background-color:#f5ff00&quot;&gt;객체의 위치를 잡는게 point였다. &lt;/span&gt;

# Issue Point
- 영역안에서 mousemove/mouseout
- GSAP ScrollTrigger - 3D Transforms
### 1. 영역안에서 mousemove/mouseout

🎈 기본원리

[참고사이트]
https://zzzmh.tistory.com/13
!codepen[youngee/embed/PoaNQxP?default-tab=html%2Cresult]

👇🏻 구현해야되는 모습
![](https://velog.velcdn.com/images/youngee_316/post/dad30a00-3b48-4985-acdc-048a8b18371a/image.jpg)

✍🏻 코드작성</code></pre><p>function menuOpen() {
    var target = document.querySelector(&#39;.menu&#39;);
    var motion = document.querySelector(&#39;.open-btn&#39;);
    target.addEventListener(&#39;mousemove&#39;, (event) =&gt; {
        let x = (event.layerX * 0.1);
        let y = (event.layerY * 0.1);</p>
<pre><code>    motion.style.transform = `translate(${x}px,${y}px)`
})
target.addEventListener(&#39;mouseout&#39;, (event) =&gt; {
    motion.style.transform = &#39;&#39;;
})</code></pre><p>}</p>
<pre><code>
✔ MouseEvent.layerX읽기 전용 속성:  현재 레이어를 기준으로 이벤트의 수평 좌표를 반환
✔ MouseEvent.layerY읽기 전용 속성:  현재 레이어를 기준으로 이벤트의 수직 좌표를 반환

👉🏻 마우스 이벤트가 발생할 때 마우스 포인터의 x 좌표에 대한 정수 값이 나옴

### 2. GSAP ScrollTrigger - 3D Transforms
🎈 기본원리
[참고사이트]
https://codepen.io/jonathan/pen/XXdNjR
👇🏻 구현된 모습
![](https://velog.velcdn.com/images/youngee_316/post/3b7f0317-adae-4e49-92f8-c82e3ef269ce/image.png)
![](https://velog.velcdn.com/images/youngee_316/post/d7bc2a90-5f06-451d-9fb9-26d5098a1006/image.png)
1. transform-origin속성적용
</code></pre><h2 class="title">
  <span class="effect"><span class="em-txt">HYBE</span> is committed to satisfying</span>
  <span class="effect">customers  with the 'content' leading the</span>
  <span class="effect"><span class="em-txt">global trend and our 'fans'</span></span>
</h2>
.title{
    transform-origin: top left;
}

<p><span class="effect"> 👈🏻 효과를 주기위해 class명을 넣어줌</p>
<pre><code>[참고사이트]
https://developer.mozilla.org/en-US/docs/Web/CSS/transform-origin
![](https://velog.velcdn.com/images/youngee_316/post/f56d3a9e-ff34-43ce-89d8-db93582b6cf1/image.png)

2. 스크립트 작성</code></pre><p>gsap.set(&quot;.sc-intro .effect&quot;, { 👈🏻 기초셋팅
        rotationX: -45,
        transformStyle: &quot;preserve-3d&quot;,
        transformOrigin: &quot;0% 50% -100%&quot;,
        opacity: 0,
        yPercent: 110,
    });</p>
<pre><code>const introEffect = gsap.to(&#39;.sc-intro .effect&#39;, {
    scrollTrigger:{
        trigger:&#39;.sc-intro&#39;,
        start:&#39;top 50%&#39;,
        end:&#39;bottom top&#39;,
    },

    transformStyle: &quot;preserve-3d&quot;,
    rotationX: 0,
    duration:1,
    opacity: 1,
    yPercent: 0,
    transformOrigin: &quot;50% 50%&quot;,
    stagger:0.1,
});</code></pre><pre><code>
3. css에 perspective(원근감)추가</code></pre><p>perspective: 400px;</p>
<pre><code>✔ 부모에게 perspective 속성을 주고, 이벤트 대상에는 transform을 시킨 모습
✔ 여기에서의 400px은 &#39;내가 얼마나 떨어져서 보고 있는가&#39;를 나타낸다고 할 수 있음
✔ 값이 작으면 작을 수록 더 가까이에서 보는 것으로 처리
[참고사이트]
https://nykim.work/26

























</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[대광건영]]]></title>
            <link>https://velog.io/@youngee_316/%EB%8C%80%EA%B4%91%EA%B1%B4%EC%98%81</link>
            <guid>https://velog.io/@youngee_316/%EB%8C%80%EA%B4%91%EA%B1%B4%EC%98%81</guid>
            <pubDate>Wed, 02 Nov 2022 19:06:00 GMT</pubDate>
            <description><![CDATA[<p>💻 대광건영 clone coding</p>
<ul>
<li>사이트명 : 대광건영</li>
<li>사용언어 : html / scss / js</li>
<li>분류 : 적응형 PC</li>
</ul>
<h1 id="check-point">Check Point</h1>
<ul>
<li>swiper-pagination - fraction</li>
<li>swiper-navigation - gauge</li>
<li>slide영역 width값 잡기</li>
</ul>
<h3 id="1-swiper-pagination---fraction">1. swiper-pagination - fraction</h3>
<p>🎈 기본원리</p>
<ol>
<li>control해줄대상을 하나로묶음</li>
</ol>
<pre><code>&lt;div class=&quot;fraction&quot;&gt;
 &lt;em class=&quot;count num&quot;&gt;1&lt;/em&gt;
 &lt;span class=&quot;slash num&quot;&gt;/&lt;/span&gt;
 &lt;em class=&quot;total num&quot;&gt;1&lt;/em&gt;
&lt;/div&gt; </code></pre><ol start="2">
<li>스크립트작성
<img src="https://velog.velcdn.com/images/youngee_316/post/e6547b5f-0f39-4cac-8de8-52d5cd600557/image.png" alt=""></li>
</ol>
<p><img src="https://velog.velcdn.com/images/youngee_316/post/e7244efb-531e-4c8c-8ce5-965757a06f86/image.png" alt=""></p>
<p>✔ swiper에도 custom은 있지만 소스가 정해져있기때문에 스타일적용이 힘듬 ex)slash  </p>
<pre><code>pagination: {
   el: &quot;.fraction&quot;,
   type: &quot;custom&quot;, 👈🏻 만들어서 사용
   renderCustom:function(swiper, current, total){
         return `
         &lt;em class=&quot;count num&quot;&gt;1&lt;/em&gt; 👉🏻 current
         &lt;span class=&quot;slash num&quot;&gt;/&lt;/span&gt;
         &lt;em class=&quot;total num&quot;&gt;1&lt;/em&gt;`; 👉🏻 total
   },
}</code></pre><p>✍🏻 코드작성</p>
<pre><code>pagination: {
   el: &quot;.fraction&quot;,
   type: &quot;custom&quot;, 👈🏻 만들어서 사용
   renderCustom:function(swiper, current, total){
         return `
         &lt;em class=&quot;count num&quot;&gt;${current}&lt;/em&gt; 
         &lt;span class=&quot;slash num&quot;&gt;/&lt;/span&gt;
         &lt;em class=&quot;total num&quot;&gt;${total}&lt;/em&gt;`; 
   },
}</code></pre><pre><code>.fraction{width: auto;} 👈🏻 width값이빠짐</code></pre><p>🎈 구현화면</p>
<p><img src="https://velog.velcdn.com/images/youngee_316/post/e65b3c39-c854-40b6-a678-71836b7b375c/image.png" alt="">
<img src="https://velog.velcdn.com/images/youngee_316/post/2d5a5727-d1e0-4e52-bf11-8ee47daa34c5/image.png" alt=""></p>
<h3 id="2-swiper-navigation">2. swiper-navigation</h3>
<ol>
<li>gauge만들기</li>
</ol>
<p>🎈 기본원리
!codepen[youngee/embed/XWYdMdm?default-tab=html%2Cresult]
✍🏻 코드작성</p>
<pre><code>function auto(){
   $(&#39;.gauge span&#39;).css(&#39;width&#39;,0).animate({width:&#39;100%&#39;},2000,function(){
     swiper1.slideNext(); ☝🏻 width값 초기화 후, 다음 슬라이드로 넘어감
   })
}</code></pre><ol start="2">
<li>slide-Change후 호출<pre><code>swiper1.on(&#39;slideChange&#39;,function(){
auto(); // 슬라이드가 바뀌었을때 다시실행
})
</code></pre></li>
</ol>
<p>function auto(){
   $(&#39;.gauge span&#39;).css(&#39;width&#39;,0).animate({width:&#39;100%&#39;},2000,function(){
       swiper1.slideNext();
   })
}
auto();</p>
<pre><code>&lt;span style=&quot;background-color:#f5ff00&quot;&gt;문제점: 일시정지를 눌렀을때 gauge도 중간에 멈춰야하는데 구현하기어려움&lt;/span&gt;

🎈 gsap로 하는방법</code></pre><p> const auto = gsap.to(&#39;.gauge span&#39;,3,{
        ease:&#39;none&#39;,
        width:&#39;100%&#39;,
        onComplete:function(){👈🏻 완료되었을때
          gsap.set(&#39;.gauge span&#39;,{width:0}) 👈🏻 기초값셋팅
          swiper1.slideNext();
        },
        paused:true,
})</p>
<p>auto.play();</p>
<p>swiper1.on(&#39;slideChange&#39;,function(){
    auto.restart(); 👈🏻 슬라이드 넘어가고 재실행 
})</p>
<pre><code>---
3. 재생/멈춤</code></pre><p>$(&#39;.autoplay&#39;).click(function(){
      if($(this).hasClass(&#39;active&#39;)){
        $(this).removeClass(&#39;active&#39;)
        auto.resume(); 👈🏻 진행
      }else{
        auto.pause();
        $(this).addClass(&#39;active&#39;)
      })</p>
<pre><code>active는 가상으로 만든 클래스 &gt; 스크립트 컨트롤용도로 만듬
(위 사이트에서는 클릭이벤트시 재생/멈춤으로 &#39;active&#39;사용) 
![](https://velog.velcdn.com/images/youngee_316/post/27c3bfe4-f2fc-4228-acee-8e3cef69db1c/image.png)

### 3. slide영역 width값 잡기

🎈 기본원리

1. .project-content와 .project-img의 width:50%와 float를 이용해 영역을 잡는다.
</code></pre><p>.project-content{
        width: 50%;
        float: left;
        display: flex;
        justify-content: flex-end;
}
 .project-img{
        width: 50%;
        float: right;<br> } </p>
<pre><code>![](https://velog.velcdn.com/images/youngee_316/post/080fafc9-4fb5-4e3e-8c94-4a27f26272e0/image.jpg)

2. content의 영역만큼 양쪽을 밀어준다.
</code></pre><p>.project-content{
        width: calc(50% - 340px);
        float: left;
        display: flex;
        justify-content: flex-end;
}
 .project-img{
        width: calc(50% + 340px);
        float: right;<br> } </p>
<pre><code>![](https://velog.velcdn.com/images/youngee_316/post/5866b2c5-ce85-4cc4-b4e0-495ba444cb01/image.jpg)

3. 각각의 여백값을 계산해서 레이아웃을 완성시켜준다.
(box-sizing이 들어가있기때문에 margin으로 여백주면됨)

![](https://velog.velcdn.com/images/youngee_316/post/498092a2-1f17-485d-83f1-ff788bebe692/image.jpg)

✍🏻 마우스 호버시 영역이 잘리는경우 
-&gt; swiper에는 overflow:hidden수치가있기때문에 여백을 만들어주면됨</code></pre><p> .swiper{
        padding-bottom: 60px;
    }  </p>
<pre><code>![](https://velog.velcdn.com/images/youngee_316/post/6d84bc5c-4d9f-43d7-8573-391c119e7467/image.jpg)

# Issue Point
- serch-box
- menu-list 
- scss 미디어쿼리 적용방법

### 1. serch-box

🎈 기본원리
:호버나 클릭했을때 나오는 대상의 좌표값만 잘잡아주고 이벤트를 걸어주면됨
![](https://velog.velcdn.com/images/youngee_316/post/d3782155-c78a-410c-a816-be9a97388433/image.jpg)
</code></pre><div class="util-area">
  <a href="" aria-label="검색" class="btn-search icon"></a>      
    <div class="search-box1">
       <button type="submit" aria-label="검색" class="serch-icon"></button>
       <input class="search-bar" type="text" placeholder="SEARCH">
    </div>
  <a href="" aria-label="마이페이지" class="btn-mypage icon"></a>
  <a href="" aria-label="메뉴" class="btn-menu"></a>
  <a href="" class="btn-login sub">LOGIN</a>
</div>
```

<p>✔ html코드는 동일
<span style="background-color:#f5ff00">문제점: z-index값이 낮아선택이되지않아 이벤트자체가 적용이 안되었음</span>
-&gt; 이벤트 대상자인 .btn-search의 z-index값을 조절해 해결함 </p>
<pre><code>function menuSearch(){

  $(&#39;.menu-area .btn-search&#39;).click(function(e){
      e.preventDefault();
        $(&#39;.search-box2&#39;).css({&#39;display&#39;:&#39;block&#39;})
    });
}</code></pre><h3 id="2-menu-list">2. menu-list</h3>
<p>🎈 기본원리
: click -&gt; side-menu가 나올수있도록
!codepen[youngee/embed/jOKWgpE?default-tab=html%2Cresult]
✍🏻 코드작성
<img src="https://velog.velcdn.com/images/youngee_316/post/36f1595f-2cf6-4a13-9120-726e17af36ac/image.png" alt=""></p>
<pre><code>  $(&#39;.depth&#39;).click(function(e){
    e.preventDefault();

    if ($(this).siblings(&#39;.sub-menu-list&#39;).css(&#39;display&#39;)==&#39;none&#39;) { 
      $(&#39;.depth&#39;).removeClass(&#39;active&#39;);
      $(this).addClass(&#39;active&#39;);
      $(&#39;.sub-menu-list&#39;).removeClass(&#39;show&#39;);
      $(this).siblings(&#39;.sub-menu-list&#39;).addClass(&#39;show&#39;);
     } else { 
      $(&#39;.sub-menu-list&#39;).removeClass(&#39;show&#39;);
      $(&#39;.depth&#39;).removeClass(&#39;active&#39;);
    }
})
</code></pre><p><span style="background-color:#f5ff00">문제점: 대메뉴를 클릭했을때, 소메뉴가 계속 겹쳐서나옴</span>
-&gt; .depth가 &#39;active&#39;될때, 전체에 .removeClass를 주고 클릭한메뉴의 소메뉴만 나오게함</p>
<p>🎈 최종화면
<img src="https://velog.velcdn.com/images/youngee_316/post/43e5ddeb-2400-46d8-8ced-185eb1acdfea/image.png" alt=""></p>
<h3 id="3-scss-미디어쿼리-적용방법">3. scss 미디어쿼리 적용방법</h3>
<ul>
<li>mixins.scss폴더에 mediapoint를 변수로 할당하고, 미디어쿼리 기본 문법을 작성해준 뒤, 다른 scss폴더에서 적은 스타일이 적용되도록 @content를 같이 적어준다.</li>
</ul>
<p>🎈 예시
<img src="https://velog.velcdn.com/images/youngee_316/post/fccdfeb4-869a-4325-9049-3ae2b7b57ed1/image.png" alt="">
🎈 미디어쿼리 적용예시
<img src="https://velog.velcdn.com/images/youngee_316/post/a3e50ceb-ba38-4428-8728-2ae1b1e931d2/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JSON]]]></title>
            <link>https://velog.io/@youngee_316/JSON</link>
            <guid>https://velog.io/@youngee_316/JSON</guid>
            <pubDate>Wed, 02 Nov 2022 08:15:47 GMT</pubDate>
            <description><![CDATA[<p>🎈 JSON</p>
<ul>
<li>JavaScript Object Notation라는 의미의 축약어로 데이터를 저장하거나 전송할 때 많이 사용되는 경량의 DATA 교환 형식(단순히 데이터를 표시하는 표현 방법)이다.</li>
<li>태그로 표현하기 보다는 중괄호({}) 같은 형식으로 하고, 값을 &#39;,&#39;로 나열하기에 그 표현이 간단하다.</li>
<li>JSON으로 가져올 수 있는 데이터는 해당 자바스크립트가 로드된 서버의 데이터에 한정된다.</li>
</ul>
<p>🎈 API</p>
<ul>
<li>응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다.</li>
<li>Application Programing Interface라는 용어로써, 어떠한 응용프로그램에서 데이터를 주고 받기 위한 방법을 의미함. 예를들어 어떤 특정 사이트에서 특정 데이터를 공유할 경우 어떠한 방식으로 정보를 요청해야 하는지, 그리고 어떠한 데이터를 제공 받을 수 있을지에 대한 규격들을 API라고 하는것이다.</li>
</ul>
<p>ex)youtube에 &#39;먹방&#39;을 검색했을때의 API
<a href="https://www.googleapis.com/youtube/v3/search?part=snippet&amp;q=%EB%A8%B9%EB%B0%A9&amp;maxResults=20&amp;key=AIzaSyCvA0JdmROOxx3C60fBqO6geUp8B7xFAMs">https://www.googleapis.com/youtube/v3/search?part=snippet&amp;q=%EB%A8%B9%EB%B0%A9&amp;maxResults=20&amp;key=AIzaSyCvA0JdmROOxx3C60fBqO6geUp8B7xFAMs</a></p>
<p>✍🏻 data만들기(배열)</p>
<pre><code> {
   &quot;items&quot;:[
     {
      &quot;name&quot;:&quot;철수&quot;,
      &quot;age&quot;:&quot;30&quot;,
      &quot;문신&quot;:true
     },
     {
     &quot;name&quot;:&quot;영희&quot;,
     &quot;age&quot;:&quot;20&quot;,
     &quot;문신&quot;:false
     },
     {
     &quot;name&quot;:&quot;민수&quot;,
     &quot;age&quot;:&quot;15&quot;,
     &quot;문신&quot;:true
     }
   ]

}</code></pre><hr>
<p>✍🏻 fecth(비동기통신:페이지 전환없이 데이터를 통신)</p>
<pre><code>fetch(&#39;./data.json&#39;)
.then((response) =&gt; response.json())
.then((json) =&gt; {
    x = json.items
})</code></pre><hr>
<p>✍🏻 가져오고싶은 data</p>
<pre><code> &lt;ul class=&quot;list1&quot;&gt;
   &lt;li&gt;
   이름:ㅇㅇㅇ
   나이:ㅇㅇㅇ
   &lt;/li&gt;     
 &lt;/ul&gt;</code></pre><p>console.log(json);
<img src="https://velog.velcdn.com/images/youngee_316/post/df59a9aa-3702-42d8-91ec-8bb56d082e8c/image.png" alt=""></p>
<pre><code> data = json.items

 data.forEach(element =&gt; { 👈🏻 반복문
     console.log(element); 
 });</code></pre><p>console.log(element);
<img src="https://velog.velcdn.com/images/youngee_316/post/ac866f2c-f111-444b-ab6b-11d38793eea7/image.png" alt=""></p>
<p>✍🏻 +=
: 내가 가지고있는 변수+1 + 변수 + 변수 : 즉, 배열의 갯수만큼 담을 수 있음</p>
<p>console.log(html);</p>
<p>✔ 결과1(json)</p>
<pre><code>data = json.items

    let html =&#39;&#39;;
    data.forEach(element =&gt; {
        html += `&lt;li&gt;${element.name}&lt;/li&gt;`;
        console.log(html);
    });

    $(&#39;.list1&#39;).html(html);</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/0f5ac30c-e71e-4c2f-9e79-3f03485c9277/image.png" alt="">
✔ 결과2(javascript)</p>
<pre><code>data = json.items

    let html =&#39;&#39;;
    data.forEach(element =&gt; {
        html += `&lt;li&gt;${element.name}&lt;/li&gt;`;
        console.log(html);
    });

    document.querySelector(&#39;.list1&#39;).innerHTML = html;</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/a0c9f09c-838f-40c8-9085-ef9c3a811cf1/image.png" alt=""></p>
<p>ex)age추가</p>
<pre><code>data = json.items

    let html =&#39;&#39;;
    data.forEach(element =&gt; {
        html += `&lt;li&gt;${element.name},나이는 = ${element.age}&lt;/li&gt;`;
        console.log(html);
    });

    // document.querySelector(&#39;.list1&#39;).innerHTML = html;
    $(&#39;.list1&#39;).html(html);</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/0201b1f0-1810-4762-9efe-87cd7228c282/image.png" alt=""></p>
<p>ex)age가 20살이상이면 &#39;성인&#39;이하면 &#39;미성년자&#39;</p>
<pre><code>data = json.items

    let html =&#39;&#39;;
    data.forEach(element =&gt; {

        if(element.age &gt;= 20){
            isAdult = &#39;성인&#39;;
            ☝🏻isAdult(변수생성)
        }else{
            isAdult = &#39;미성년자&#39;;
        }
        html += `&lt;li&gt;
                ${element.name}
                ${isAdult} 
                &lt;/li&gt;`;
    });

    // document.querySelector(&#39;.list1&#39;).innerHTML = html;
    $(&#39;.list1&#39;).html(html);</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/c52c80e0-9223-4129-a32b-e5b377863957/image.png" alt=""></p>
<p>🎈 if문 짧은조건일때 한줄로 쓰는방법(위의 결과와같음)</p>
<pre><code> isAdult = (element.age &gt;= 20) ? &#39;성인&#39; : &#39;미성년자&#39;;</code></pre><p>(element.age &gt;= 20) : if
? &#39;성인&#39; : 맞다면 &#39;성인&#39;
: &#39;미성년자&#39;; : 그렇지않다면 &#39;미성년자&#39;</p>
<p>ex)문신이있다면 ${element.name}(나쁜친구) 넣어주기</p>
<pre><code>isBad = (element.문신) ? &#39;나쁜친구&#39; : &#39;착한친구&#39;;
                                    ☝🏻&#39;&#39;(빈칸가능)
        html += `&lt;li&gt;
                ${element.name}${isBad}
                ${isAdult} 
                &lt;/li&gt;`;</code></pre><p><img src="https://velog.velcdn.com/images/youngee_316/post/b79b2842-33b6-44d4-bfdb-7da3afa5e693/image.png" alt=""></p>
<p>🎈 Youtube_example</p>
<p>✍🏻 가져오고싶은 data</p>
<pre><code> &lt;ul class=&quot;list1&quot;&gt;
        &lt;li&gt;
            &lt;img src=&quot;&quot; alt=&quot;&quot;&gt;
            &lt;p&gt;&lt;/p&gt;
        &lt;/li&gt;
    &lt;/ul&gt;</code></pre><hr>
<pre><code>fetch(&#39;https://www.googleapis.com/youtube/v3/search?part=snippet&amp;q=%EB%A8%B9%EB%B0%A9&amp;maxResults=20&amp;key=AIzaSyCvA0JdmROOxx3C60fBqO6geUp8B7xFAMs&#39;)
.then((response) =&gt; response.json())
.then((json) =&gt; {
    data = json.items;
    // console.log(json.items);

    html = &#39;&#39;;

    data.forEach(el =&gt; {
        html +=`&lt;li&gt;
                &lt;img src=&quot;${el.snippet.thumbnails.default.url}&quot; alt=&quot;&quot;&gt;
                &lt;p&gt;${el.snippet.title}&lt;/p&gt;
                &lt;/li&gt;`;               
    });
    $(&#39;.list1&#39;).html(html);
})</code></pre><p>👇🏻 결과
<img src="blob:https://velog.io/7746cc05-7d4b-403f-b7c1-50f581da8654" alt="업로드중.."></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[오늘의집]]]></title>
            <link>https://velog.io/@youngee_316/%EC%98%A4%EB%8A%98%EC%9D%98%EC%A7%91</link>
            <guid>https://velog.io/@youngee_316/%EC%98%A4%EB%8A%98%EC%9D%98%EC%A7%91</guid>
            <pubDate>Tue, 01 Nov 2022 15:47:49 GMT</pubDate>
            <description><![CDATA[<p>💻 오늘의집 clone coding</p>
<p>사이트명 : 오늘의집(mobile)
사용언어 : html / css / js 
분류 : mobile</p>
<h1 id="check-point">Check Point</h1>
<ul>
<li>header scroll</li>
<li>tab-menu</li>
<li>menu-click-event</li>
<li>반응형 슬라이더 Swiper</li>
<li>JSON</li>
</ul>
<h3 id="1-header-scroll">1. header scroll</h3>
<p>스크롤에 반응하는 sticky header
: 스크롤을 내릴 때는 header를 숨기고, 스크롤을 올릴 때는 다시 header를 보여줌</p>
<p>🎈 기본원리
!codepen[youngee/embed/qBKbeOr?default-tab=html%2Cresult]</p>
<p>✍🏻 코드작성</p>
<pre><code>.header{width: 100%; position: fixed; top: 0; left: 0; z-index: 10; background: #fff; transition: all .3s;}
.header.hide{transform: translateY(-100%);}
.header.active{background: #fff;}</code></pre><hr>
<pre><code>function headerScroll(){

    let lastScroll = 0;

    $(window).on(&#39;scroll&#39;,onScroll);

    function onScroll(){

        var headerTop = $(window).scrollTop(); 
        👉🏻 스크롤 세로좌표(맨 위 -&gt; 0으로 시작)

        if(headerTop &gt; lastScroll){
            $(&#39;.header&#39;).addClass(&#39;hide&#39;);
        }else{
            $(&#39;.header&#39;).removeClass(&#39;hide&#39;);
        }
        👉🏻 스크롤 내렸을때, .header에 .hide라는 클래스를 추가해서
        {transform: translateY(-100%);}으로 숨김



        if(headerTop &gt;= $(window).height()){
            $(&#39;.header&#39;).addClass(&#39;active&#39;);
        }else{
            $(&#39;.header&#39;).removeClass(&#39;active&#39;);
        }
        👉🏻 스크롤을 다시 올렸을때(background나 color를 변경할수있음)
        lastScroll = headerTop;
    }
}</code></pre><h3 id="2-tab-menu">2. tab-menu</h3>
<p>🎈 기본원리
!codepen[youngee/embed/OJEMzgd?default-tab=html%2Cresult]
✍🏻 코드작성</p>
<pre><code>.header .header-bottom .gnb-item a.active{color: #35c5f0;}</code></pre><hr>
<pre><code>$(&#39;.header-bottom .gnb-item a&#39;).click(function(e){
   e.preventDefault();
        target = $(this).data(&#39;target&#39;);
        👉🏻 data-class 가상의 클래스로 데이터를 넣어사용
        $(this).addClass(&#39;active&#39;).parent().siblings().find(&#39;a&#39;).removeClass(&#39;active&#39;);
        $(target).addClass(&#39;active&#39;).siblings().removeClass(&#39;active&#39;);
})
</code></pre><p>✔ a태그의 기능 -&gt; #을 사용하여 각각의 위치로 이동시켜줌
✔ e.preventDefault() -&gt; a태그는 새로고침 및 이동속성이있기때문에
클릭이벤트 사용시 넣어줘야 a 태그의 href 속성이 중단된다.</p>
<pre><code>click(function(e){
    e.preventDefault();</code></pre><p>🎈 다른방법</p>
<pre><code> &lt;div class=&quot;tab-nav&quot;&gt;
   &lt;a href=&quot;#tab1&quot; class=&quot;active&quot;&gt;탭1&lt;/a&gt;
   &lt;a href=&quot;#tab2&quot;&gt;탭2&lt;/a&gt;
   &lt;a href=&quot;#tab3&quot;&gt;탭3&lt;/a&gt;
 &lt;/div&gt;
 &lt;div class=&quot;tab-con&quot;&gt;
   &lt;div id=&quot;tab1&quot; class=&quot;active&quot;&gt;내용1&lt;/div&gt;
   &lt;div id=&quot;tab2&quot;&gt;내용2&lt;/div&gt;
   &lt;div id=&quot;tab3&quot;&gt;내용3&lt;/div&gt;
 &lt;/div&gt;</code></pre><p>✔ tab이라는 name을 공통으로 넣어줌 -&gt; 동시 컨트롤이 가능해짐</p>
<pre><code>$(function(){

 $(&#39;.tab-nav a&#39;).click(function(e){
    e.preventDefault(); //새로고침X 이동을막아줌

    target = $(this).attr(&#39;href&#39;)👈🏻속성값을 가지고올수있음
    $(this).addClass(&#39;active&#39;).siblings().removeClass(&#39;active&#39;);
    $(target).addClass(&#39;active&#39;).siblings().removeClass(&#39;active&#39;);
    👉🏻$(바뀌어야되는값).addClass(&#39;active&#39;).siblings().removeClass(&#39;active&#39;);
 })

})</code></pre><h3 id="3-menu-click-event">3. menu-click-event</h3>
<p>🎈 기본원리
!codepen[youngee/embed/jOKWgpE?default-tab=html%2Cresult]
✍🏻 코드작성</p>
<pre><code>.menu-inner .menu-area .depth{width: 100%; height: 40px; padding: 0 40px 0 14px; display: block; position: relative; font-weight: 700;}
.menu-inner .menu-area .depth.active{background: rgba(255,255,255);} 
☝🏻 menu-slide
.menu-area .depth .close-arrow::before{content: &quot;\e96c&quot;;}
.menu-area .depth .close-arrow.open::before{content: &quot;\e978&quot;;}
☝🏻 arrow-updown</code></pre><hr>
<pre><code>if($(this).siblings(&#39;.sub&#39;).css(&#39;display&#39;) === &#39;none&#39;){ 👈🏻처음클릭
    $(&#39;.depth1&#39;).removeClass(&#39;active&#39;);
    $(this).addClass(&#39;active&#39;);
}else{ 👈🏻두번째클릭(열고닫힘 or 다른 depth클릭)
    $(&#39;.depth1&#39;).removeClass(&#39;active&#39;);
}

   $(&#39;.sub&#39;).stop().slideUp(); 
   $(this).siblings(&#39;.sub&#39;).stop().slideToggle();</code></pre><p>✔ Toggle -&gt; 열고닫고 
<span style="background-color:#f5ff00">문제점: active가 안빠짐</span></p>
<pre><code>$(this).siblings(&#39;.sub&#39;).stop().slideToggle();</code></pre><p>✔ Toggle+slideUp -&gt; 열고닫고 + 다른메뉴클릭시 닫히고열리고
<span style="background-color:#f5ff00">문제점: 열린지닫힌지 모르기때문에, 내가 원하는 특정모션(조건)을 주지못함 ex)화살표,alert</span></p>
<pre><code>$(&#39;.sub&#39;).stop().slideUp();
$(this).siblings(&#39;.sub&#39;).stop().slideToggle();</code></pre><p>✔ Toggle+slideUp+if -&gt; 열고닫고 + 닫히고열리고 + 조건문가능</p>
<pre><code>if($(this).siblings(&#39;.sub&#39;).css(&#39;display&#39;) === &#39;none&#39;){ 
   $(&#39;.depth1&#39;).removeClass(&#39;active&#39;);
   $(this).addClass(&#39;active&#39;);
}else{ //재클릭
 $(&#39;.depth1&#39;).removeClass(&#39;active&#39;);
}</code></pre><h3 id="5-반응형-슬라이더-swiper">5. 반응형 슬라이더 Swiper</h3>
<p>🎈 기본원리</p>
<p>1.link , script 주소 가져오기(1번만)
2.마크업 구조짜기
3.스크립트 실행문 가져오기
4.옵션수정</p>
<p>🎈 주의사항</p>
<ul>
<li>클래스명 swiepr,swiper-wrapper,swiper-slide 절대로 건드리지말것
(단, 코드 가져왔을때 mySwiper &lt;- 클래스명 그대로 쓰지말것)</li>
<li>스크립트 실행문의 타켓과 스와이퍼의 타겟이 일치한가</li>
<li>.swiper는 높이가없음 -&gt; 자식들은 높이를 상속받음 </li>
</ul>
<p><a href="https://swiperjs.com/">https://swiperjs.com/</a>
Demos -&gt; 원하는구현 &gt; core &gt; 스크립트 실행문 가져오기</p>
<p>✍🏻 navigation / pagination -&gt; custom가능</p>
<pre><code>navigation: {
  nextEl: &quot;.next&quot;,
  prevEl: &quot;.prev&quot;,
pagination: {
  el: &quot;.swiper-pagination&quot;,
  clickable: true,
},  </code></pre><p>✔ swiper안에있을때, 위치 컨트롤하기쉽다.
✔ custom했다면, 스크립트에서 반드시 클래스명을 바꿔줘야 적용된다.</p>
<h3 id="6-json">6. JSON</h3>
<p>🎈 구현화면
<img src="https://velog.velcdn.com/images/youngee_316/post/f9112e1c-1a8e-4927-88ad-facdadf470c8/image.png" alt=""></p>
<pre><code>&lt;section class=&quot;sc-photo&quot;&gt;
  &lt;h2 class=&quot;title&quot;&gt;오늘의 인기사진&lt;/h2&gt;
    &lt;ul class=&quot;photo-list&quot;&gt;
      &lt;!-- todayphoto.json --&gt;
    &lt;/ul&gt;
&lt;/section&gt;&lt;!-- photo --&gt;</code></pre><hr>
<p>✍🏻 data만들기(배열)</p>
<pre><code>{
    &quot;items&quot;:[
        {
            &quot;link&quot;:&quot;경로&quot;,
            &quot;thumbnail&quot;:&quot;https://image.ohou.se/i/bucketplace-v2-development/uploads/cards/snapshots/166547727078651432.jpeg?gif=1&amp;w=512&amp;h=512&amp;c=c&amp;webp=1&quot;
        },
        {
            &quot;link&quot;:&quot;경로&quot;,
            &quot;thumbnail&quot;:&quot;https://image.ohou.se/i/bucketplace-v2-development/uploads/cards/snapshots/166548234298947120.jpeg?gif=1&amp;w=512&amp;h=512&amp;c=c&amp;webp=1&quot;
        },
        {
            &quot;link&quot;:&quot;경로&quot;,
            &quot;thumbnail&quot;:&quot;https://image.ohou.se/i/bucketplace-v2-development/uploads/cards/snapshots/166545882450511476.jpeg?gif=1&amp;w=512&amp;h=512&amp;c=c&amp;webp=1&quot;
        },
        {
            &quot;link&quot;:&quot;경로&quot;,
            &quot;thumbnail&quot;:&quot;https://image.ohou.se/i/bucketplace-v2-development/uploads/cards/snapshots/166547509725909118.jpeg?gif=1&amp;w=512&amp;h=512&amp;c=c&amp;webp=1&quot;
        },
        {
            &quot;link&quot;:&quot;경로&quot;,
            &quot;thumbnail&quot;:&quot;https://image.ohou.se/i/bucketplace-v2-development/uploads/cards/snapshots/166547819058852579.jpeg?gif=1&amp;w=512&amp;h=512&amp;c=c&amp;webp=1&quot;
        },
        {
            &quot;link&quot;:&quot;경로&quot;,
            &quot;thumbnail&quot;:&quot;https://image.ohou.se/i/bucketplace-v2-development/uploads/cards/snapshots/166546278300246529.jpeg?gif=1&amp;w=512&amp;h=512&amp;c=c&amp;webp=1&quot;
        }
    ]
}</code></pre><p>✍🏻 fecth</p>
<pre><code>fetch(&#39;./asset/data/todayphoto.json&#39;)
    .then((response) =&gt; response.json())
    .then((json) =&gt; {
            data = json.items;
            let html = &#39;&#39;;
            isNumber = &#39;&lt;span class=&quot;num&quot;&gt;${index++}&lt;/span&gt;&#39;;
            index = 1;

            data.forEach(el =&gt; {

                if(index &lt; 4){
                    isNumber = `&lt;span class=&quot;num&quot;&gt;${index++}&lt;/span&gt;`;
                }else{
                    isNumber = &#39;&#39;;
                }

                html+= `&lt;li class=&quot;photo-item&quot;&gt;
                         &lt;a href=&quot;&quot; class=&quot;link-photo&quot;&gt;
                          &lt;img src=&quot;${el.thumbnail}&quot; alt=&quot;인기사진이미지&quot;&gt;
                         &lt;/a&gt;${isNumber}
                        &lt;/li&gt;`;
            });
            $(&#39;.photo-list&#39;).html(html)
    })</code></pre><h1 id="issue-point">Issue Point</h1>
<ul>
<li>menu</li>
<li>transiton 효과적용되는 대상에맞게적용</li>
<li>flex로 영역쉽게잡기</li>
<li>가로/세로 스크롤컨트롤</li>
<li>OhouseIcon</li>
</ul>
<h3 id="1-menu-dimmed-순차적으로-click-event주기">1. menu-dimmed 순차적으로 click-event주기</h3>
<p><img src="https://velog.velcdn.com/images/youngee_316/post/9075353c-ac65-4322-8a79-89f3e191825b/image.png" alt="">
dimmed -&gt; menu</p>
<pre><code>.menu.active{left: 0; transition: all .3s;}
.dimmed.show{display: block;} </code></pre><pre><code>$(&#39;.header .btn-menu&#39;).click(function(e){
    e.preventDefault()
    $(&#39;.menu&#39;).addClass(&#39;active&#39;);
    $(&#39;.dimmed&#39;).addClass(&#39;show&#39;);
})

$(&#39;.dimmed&#39;).click(function(e){
    e.preventDefault()
    $(&#39;.menu&#39;).removeClass(&#39;active&#39;);
    $(&#39;.dimmed&#39;).removeClass(&#39;show&#39;);
})</code></pre><h3 id="2-transiton-효과적용되는-대상에맞게적용">2. transiton 효과적용되는 대상에맞게적용</h3>
<p>:animation이 부드럽게 작용하려면 hover가되는 대상에 transition을 정확히 적용해주어야 한다.</p>
<p>🙅🏻‍♀️ 틀린예시 - 뚝뚝끊김
!codepen[youngee/embed/JjZXbKZ?default-tab=html%2Cresult]</p>
<p>🙆🏻‍♀️ 올바른예시 - 부드러움
!codepen[youngee/embed/ExRKNXL?default-tab=html%2Cresult]</p>
<h3 id="3-flex로-영역쉽게잡기">3. flex로 영역쉽게잡기</h3>
<p>🎈 구현화면
<img src="https://velog.velcdn.com/images/youngee_316/post/ec754401-61d4-4b6b-96cf-1f2ab8df5fe1/image.png" alt="">
✍🏻 코드작성
<img src="https://velog.velcdn.com/images/youngee_316/post/c87b70b1-9254-4f2b-975a-8882d598ad06/image.png" alt=""></p>
<pre><code>.sc-story .story-inner{display: flex; justify-content: space-between; flex-wrap: wrap;} 👈🏻 container
.sc-story .story-item{width: calc(50% - 5px); 👈🏻 container-item
.sc-story .story-item.home-tip{display: flex; flex-direction: column;} 👈🏻 container</code></pre><p>!codepen[youngee/embed/JjZXbKZ?default-tab=html%2Cresult]</p>
<p>-&gt; 사이여백값만 알수있다면 flex로 영역을잡는게 편함(반응형)</p>
<h3 id="4-가로세로-스크롤컨트롤">4. 가로/세로 스크롤컨트롤</h3>
<p>🎈 가로/세로 스크롤표시O
<img src="https://velog.velcdn.com/images/youngee_316/post/ce5d886d-bac3-4b63-afaf-10070a3a12c4/image.png" alt="">
✍🏻 코드작성</p>
<pre><code>overflow: hidden; overflow-x: auto; (가로)
overflow: hidden; overflow-y: auto; (세로)</code></pre><p>단, 모바일화면에서는 스크롤표시가 없어져야함(touch)
🎈 가로/세로 스크롤표시X
<img src="https://velog.velcdn.com/images/youngee_316/post/19241315-038e-43e5-97b9-9e7e00af1b3f/image.png" alt="">
✍🏻 코드작성</p>
<pre><code>-ms-overflow-style: none; /* IE and Edge */ scrollbar-width: none; /* Firefox */ 👈🏻 해당영역에 추가 
해당영역::-webkit-scrollbar { display: none; /* Chrome, Safari, Opera*/ }</code></pre><h3 id="5-ohouseicon">5. OhouseIcon</h3>
<p><img src="https://velog.velcdn.com/images/youngee_316/post/fb726b5e-98a4-406f-83f4-dfbf752bca56/image.png" alt=""></p>
<p>&#39;오늘의집&#39;은 CSS 기법 중에 하나인 Image Sprite 방식을 사용하여 여러 이미지를 하나의 큰 이미지에 포함시킨 배경 이미지로 제작하여 단 한번의 HTTP 요청을 통해 문서에 삽입하는 방법을 사용하였다(아이콘폰트)</p>
<p>🎈장점
하나의 글꼴에 다양한 문자(아이콘)을 넣어 두고 이를 호출해 사용할수있음</p>
<pre><code>font-family: OhouseIcon;
    vertical-align: top;</code></pre><p>실제로 사용할때는 가상요소에 폰트번호만 적어주면됨</p>
<pre><code>클래스명::before{content: &quot;\ea05&quot;;}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[NAVER]]]></title>
            <link>https://velog.io/@youngee_316/NAVER</link>
            <guid>https://velog.io/@youngee_316/NAVER</guid>
            <pubDate>Tue, 01 Nov 2022 14:16:11 GMT</pubDate>
            <description><![CDATA[<p>💻 Naver clone coding</p>
<ul>
<li>사이트명 : 네이버</li>
<li>사용언어 : html / css</li>
<li>분류 : 적응형 PC</li>
</ul>
<h1 id="check-point">Check Point</h1>
<ul>
<li>시맨틱 마크업</li>
<li>의미있는 클래스명 짓기</li>
<li>웹 접근성을 고려한 blind 기법</li>
<li>float 해제 방법</li>
<li>IR, IS 기법</li>
</ul>
<h3 id="1-시맨틱-마크업">1. 시맨틱 마크업</h3>
<p>: 태그 자체에 의미를 부여하여 마크업을 구성하는 것.</p>
<p>✍🏻 <strong>시맨틱태그 장점</strong></p>
<ol>
<li>SEO(search engine optimization) 최적화에 유리함
: 검색 엔진이 태그의 목적에 부합하게 설계되어있는 구조의 사이트에서 더욱 빨리 효율적으로 정보를 파악할 수 있어 검색 결과의 노출에 유리할 수 있게 함</li>
<li>웹 접근성에 효율적
: 스크린리더 환경에서는 시각장애가 있는 사용자로 하여금 그 의미를 훨씬 잘 파악할 수 있음</li>
<li>유지보수의 용이성
: 태그의 이름만 보고도 어떤 영역인지 바로 확인이 가능한 정리된 마크업은 코드 식별이 용이</li>
</ol>
<p>✍🏻 <strong>시맨틱태그의 구성 및 사용용도</strong></p>
<p>: header / main / footer </p>
<ul>
<li>header : h1(logo),nav(menu)  </li>
<li>main : section(메인컨텐츠),article(독립적인컨텐츠) </li>
<li>footer : address -&gt; 사이트의 연락처나 정보를 기입</li>
</ul>
<p>strong : 문장강조 게시글에서 제목급
em: 단어강조 게시글에서 카테고리,분류급
p : 문장,단락,내용 유의미한 텍스트
span : 의미없거나 단순 텍스트
i : 디자인</p>
<h3 id="2-의미있는-클래스명-짓기">2. 의미있는 클래스명 짓기</h3>
<ul>
<li><p><strong>의미없이 영역을 구성할 때</strong>
group-flex
column-left,column-right
col-left,col-right
row-top,row-bottom</p>
</li>
<li><p><strong>의미있게 영역을 구성할 때</strong>
섹션: sc-class 
영역: class-area
리스트: ul -&gt; class-list , li -&gt; class-item
a태그 : 링크이동 -&gt; link-목적, 특정한 액션 btn-더보기(스크립트작용)</p>
</li>
<li><p><strong>class작성이 4단계 이상은 지속X</strong></p>
<p>🙅🏻‍♀️[틀린예시 - 작성하기 힘들고 자식이 겹칠 수 있음]
.section-visual ul{}
.section-visual ul li{}
.section-visual ul li a{}
.section-visual ul li a img{}</p>
<p>🙆🏻‍♀️[올바른예시 - 간결하고 정확함]
.sc-visual .txt-list{}
.sc-visual .txt-item{}
.sc-visual .link-item{}
.sc-visual .link-item img{}</p>
</li>
</ul>
<h3 id="3-웹-접근성을-고려한-blind-기법">3. 웹 접근성을 고려한 blind 기법</h3>
<ul>
<li>웹 접근성을 고려한 콘텐츠 숨기기를 위한 기법</li>
<li>display:none, visibility:hidden 등 여러 기법을 사용하여 콘텐츠를 숨길 수 있지만 스크린 리더로도 읽을 수 없기 때문에 접근성에 문제가 발생함 -&gt; 즉, 화면에는 보이지 않지만 스크린 리더에는 읽히는 기법을 사용해야한다.</li>
</ul>
<p>🎈 example</p>
<pre><code>.blind {
    /* 레이아웃에 영향을 끼치지 않도록 */
  position: absolute;

    /* 스크린 리더가 읽을 수 있도록 */
  width: 1px;
  height: 1px;

    /* 눈에 보이는 부분을 제거 */
  clip: rect(0 0 0 0);
  margin: -1px;
  overflow: hidden;
}</code></pre><h3 id="4-float-해제-방법">4. float 해제 방법</h3>
<p>: 자식요소에 float를 적용 시 태그가 붕- 뜨게되면서, 부모는 자식이 없다고 판단하고 height값을 잃기때문에, 해제를 해주어야 한다.</p>
<ol>
<li>부모요소에 overflow:hidden; 주기
영역 밖으로 넘치는 디자인이 있다면 사용X(단순 디자인일때만 사용)</li>
<li>가상요소 ::after에 clear처리</li>
</ol>
<p>🎈 example</p>
<pre><code>  float된 요소의 부모태그::after {
   content:&#39;&#39;;
   display:block;
   clear:both;
 }</code></pre><h3 id="5-ir-is-기법">5. IR, IS 기법</h3>
<ul>
<li>IR(Image Replacement)
의미가 포함되어 있는 이미지를 배경으로 처리하고 대신 전경에 상응하는 텍스트를 넣는 방법으로써 화면 낭독기를 사용하는 시각 장애인이 텍스트 데이터에 접근 할 수 있도록 함</li>
<li>IS(Image Sprite)
조각난 이미지 파일들을 하나의 파일로 병합 후 배경처리해서 웹 문서 전송 속도를 높이는 기법. 이 때 의미가 있는 이미지는 전경에 상응하는 텍스트를 포함시켜서 접근성을 확보해야 하기 때문에 IR(Image Replacement) 기법이 함께 사용됨</li>
</ul>
<p>🎈 example</p>
<p>  <img src="https://velog.velcdn.com/images/youngee_316/post/d151d00c-06a3-4860-a4f5-b959e62cdb6d/image.png" alt="">
<img src="https://velog.velcdn.com/images/youngee_316/post/123ec0f8-ed36-457c-9a00-9f7cb0609003/image.png" alt=""></p>
<p>-&gt; 공통으로 쓰이는 영역 코드작성후, 해당 클래스와 좌표만 추가해주면됨</p>
<pre><code>  .class명:after{
  background-image: url(../images/sp-bg.png);
  background-size: 457px;
  background-repeat: no-repeat;
}</code></pre><p><a href="https://spritegen.website-performance.org/">https://spritegen.website-performance.org/</a>
<a href="https://www.toptal.com/developers/css/sprite-generator">https://www.toptal.com/developers/css/sprite-generator</a></p>
<h1 id="issue-point">Issue Point</h1>
<ul>
<li>flex사용하여 gnb영역잡기</li>
<li>뉴스영역 border 디자인</li>
<li>Text 말줄임표시</li>
</ul>
<h3 id="1-flex사용하여-gnb영역잡기">1. flex사용하여 gnb영역잡기</h3>
<p><img src="https://velog.velcdn.com/images/youngee_316/post/b4af1552-afba-42ac-b8c6-efdf7eded0cd/image.png" alt=""></p>
<pre><code>   &lt;nav class=&quot;gnb-area&quot;&gt;
     &lt;ul class=&quot;gnb-list&quot;&gt;
       &lt;li class=&quot;gnb-item&quot;&gt;&lt;a href=&quot;&quot;&gt;메일&lt;/a&gt;&lt;/li&gt;
       &lt;li class=&quot;gnb-item&quot;&gt;&lt;a href=&quot;&quot;&gt;카페&lt;/a&gt;&lt;/li&gt;
       &lt;li class=&quot;gnb-item&quot;&gt;&lt;a href=&quot;&quot;&gt;블로그&lt;/a&gt;&lt;/li&gt;
       &lt;li class=&quot;gnb-item&quot;&gt;&lt;a href=&quot;&quot;&gt;지식iN&lt;/a&gt;&lt;/li&gt;
       &lt;li class=&quot;gnb-item&quot;&gt;&lt;a href=&quot;&quot;&gt;쇼핑&lt;/a&gt;&lt;/li&gt;
     &lt;/ul&gt;
   &lt;/nav&gt;</code></pre><pre><code>.header .gnb-area .gnb-list {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.header .gnb-area .gnb-item {
  font-size: 15px;
  font-weight: bold;
  line-height: 52px;
  color: #19ce60;
}</code></pre><p>🎈 flex 참고사이트</p>
<p><a href="https://studiomeal.com/archives/197">https://studiomeal.com/archives/197</a></p>
<h3 id="2-뉴스영역-border-디자인">2. 뉴스영역 border 디자인</h3>
<p><img src="https://velog.velcdn.com/images/youngee_316/post/8867c85b-bbe1-45ab-b006-57df84a2b09d/image.png" alt=""></p>
<pre><code>  &lt;ul class=&quot;media-list&quot;&gt;
    &lt;li class=&quot;media-item&quot;&gt;
      &lt;a href=&quot;&quot; class=&quot;link-media&quot;&gt;
        &lt;img src=&quot;https://s.pstatic.net/static/newsstand/2020/logo/light/0604/327.png&quot; alt=&quot;뉴데일리&quot;&gt;
      &lt;/a&gt;
    &lt;/li&gt;
    &lt;li class=&quot;media-item&quot;&gt;
      &lt;a href=&quot;&quot; class=&quot;link-media&quot;&gt;
        &lt;img src=&quot;https://s.pstatic.net/static/newsstand/2020/logo/light/0604/014.png&quot; alt=&quot;파이낸셜&quot;&gt;
      &lt;/a&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
   &lt;!-- i태그는 단순디자인--&gt;
   &lt;!-- 수직선--&gt;
   &lt;i class=&quot;vt-line vt1&quot;&gt;&lt;/i&gt;
   &lt;i class=&quot;vt-line vt2&quot;&gt;&lt;/i&gt;
   &lt;i class=&quot;vt-line vt3&quot;&gt;&lt;/i&gt;
   &lt;i class=&quot;vt-line vt4&quot;&gt;&lt;/i&gt;
   &lt;i class=&quot;vt-line vt5&quot;&gt;&lt;/i&gt; 
   &lt;!-- 수평선 --&gt;
   &lt;i class=&quot;hr-line hr1&quot;&gt;&lt;/i&gt;
   &lt;i class=&quot;hr-line hr2&quot;&gt;&lt;/i&gt;
   &lt;i class=&quot;hr-line hr3&quot;&gt;&lt;/i&gt;</code></pre><h2 id="전체-content박스만-border-1px-solid-처리---그외-나머지-수직선과-수평선은-i태그를-활용하여-positionabsolute로-위치-고정-시킴">전체 content박스만 border 1px solid 처리 -&gt; 그외 나머지 수직선과 수평선은 i태그를 활용하여 position:absolute;로 위치 고정 시킴</h2>
<p>수직선과 수평선을 각각 코딩하여 위치 고정을 시킨 이유
: 각 li에 border처리를 했다고 가정했을 때, 만약 미디어의 리스트가 부족한 경우 디자인 레이아웃이 망가지기 때문에</p>
<pre><code>👉🏻 수직선은 left값으로 조절 
.sc-news .vt-line {
  position: absolute;
  width: 1px;
  height: 100%;
  background: #dae1e6;
  top: 0;
}

.sc-news .vt-line.vt1 {
  left: 124px;
}

👉🏻 수평선은 top값으로 조절 
.sc-news .hr-line {
  position: absolute;
  width: 100%;
  height: 1px;
  background: #dae1e6;
  left: 0;
}

.sc-news .hr-line.hr1 {
  top: 65px;
}</code></pre><h3 id="3-text-말줄임표시">3. Text 말줄임표시</h3>
<ol>
<li>한 줄 단위로 텍스트 말줄임 표시법<pre><code>.box{
display:block; -&gt; 말줄임 처리를 위해 글자 출력할 공간이 필요함
white-space:nowrap; -&gt; 텍스트가 부모너비보다 넓어지면 자동으로 줄바꿈
overflow:hidden; -&gt; 넘치는 텍스트 숨김처리
text-overflow:ellipsis; -&gt; 말줄임 ... 표시
}</code></pre></li>
<li>2줄이상 텍스트 말줄임 표시법<pre><code>.box{
width:200px;
/*특정 단위로 텍스트를 자르기 위한 구문*/
white-space: normal; -&gt; nowrap 해제
display:-webkit-box; -&gt; 블록을 수직,수평으로 배치 혹은 역순배열 임의 배치 순서 바꿀 수 있는 특성
-webkit-line-clamp:3; -&gt; 블록 컨테이너의 컨텐츠를 지정한 줄 수 만큼 제한하는 속성 
-webkit-box-orient:vertical; -&gt; 콘텐츠를 가로 또는 세로로 배치할지 여부를 결정하는 속성
overflow:hidden; -&gt; 넘치는 텍스트 숨김처리
}  </code></pre></li>
<li>IE에서 말줄임 표시법
: -webkit-box-와 text-overflow 지원X<pre><code>.box{
width:200px;
white-space: normal; 
display:-webkit-box;
-webkit-line-clamp:2; 
-webkit-box-orient:vertical; 
overflow:hidden;
/*추가*/
line-height:1.2;
max-height:2.4; -&gt; line-height값 2배
}</code></pre></li>
</ol>
]]></description>
        </item>
    </channel>
</rss>