<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>cloud_kim.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Thu, 22 Jun 2023 13:52:04 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>cloud_kim.log</title>
            <url>https://velog.velcdn.com/images/cloud_kim/profile/88b1f6f3-d8b9-4483-a96c-9d7027dfcd67/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. cloud_kim.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/cloud_kim" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Samsung semiconductor]]></title>
            <link>https://velog.io/@cloud_kim/Samsung-semiconductor</link>
            <guid>https://velog.io/@cloud_kim/Samsung-semiconductor</guid>
            <pubDate>Thu, 22 Jun 2023 13:52:04 GMT</pubDate>
            <description><![CDATA[<h4 id="분류">분류</h4>
<ul>
<li>반응형, 클론코딩</li>
<li>사용언어 : html, css</li>
<li>라이브러리 : j-query, swiper</li>
<li>제작기간: 7일</li>
</ul>
<h4 id="point">Point</h4>
<ol>
<li>반응형 이미지 넣기</li>
<li>스크롤 상승 시 보이고 내릴 땐 안 보이는 헤더 
3-1. swiper pagination에 글자 넣기 
3-2. 디바이스 크기별로 swiper 효과 다르게 주고싶을 때</li>
<li>masonry.js</li>
<li>클릭한 value값 input에 넣기</li>
<li>데이터 바인딩 </li>
</ol>
<hr>
<h2 id="1-반응형-이미지-넣기">1. 반응형 이미지 넣기</h2>
<p>처음엔 img srcset으로 해보려 했으나 새로고침 후 디바이스 크기 변동하니 적용이 되지 않는 오류가 있어 현 사이트(삼성반도체) 및 타 사이트 서치 결과,
figure태그 &gt; ficture태그 &gt; source태그를 사용 한다는 것을 알게되었다. 
아래와 같이 넣으면 개발자 모드에서 디바이스 크기를 수시로 변경해도 문제없이 적용되는 모습을 볼 수 있다.</p>
<pre><code class="language-html">&lt;figure&gt;
  &lt;picture&gt;
    &lt;source media=&quot;(min-width:768px)&quot; srcset=&quot;./assets/img/infosilde-01-ta.avif&quot;&gt;
    &lt;source media=&quot;(min-width:0px) and (max-width:767px)&quot; srcset=&quot;./assets/img/infosilde-01-mo.avif&quot;&gt;
    &lt;img src=&quot;./assets/img/infosilde-01.avif&quot; alt&gt; 
  &lt;/picture&gt;
&lt;/figure&gt;</code></pre>
<hr>
<h2 id="2-스크롤-상승-시-보이고-내릴-땐-안-보이는-헤더">2. 스크롤 상승 시 보이고 내릴 땐 안 보이는 헤더</h2>
<pre><code class="language-js">let lastScroll = 0;
$(window).scroll(function () {
  curr = $(this).scrollTop();
  startOffset = $(&#39;.sc-info&#39;).offset().top; //선택자 요소 크기의 top부분

  if (!$(&#39;body&#39;).hasClass(&#39;hidden&#39;)) { //body에 hidden클레스를 가지고있지 않을 때 이면서
    if (curr &gt;= startOffset) { //현재 스크롤 된 양이 startOffset보다 같거나 클 때
      $(&#39;.header&#39;).addClass(&#39;fix&#39;); // 헤더를 fix 해버린다!

      if (curr &gt; lastScroll) {  // 현재 스크롤 된 양이 lastScroll보다 클 때 =&gt; 즉 0이상 일 때
        $(&#39;.header&#39;).addClass(&#39;hide&#39;) //header를 숨겨라
      } else {
        $(&#39;.header&#39;).removeClass(&#39;hide&#39;) //그렇지 않다면 보여라
      }
      lastScroll = curr; //curr값에 lastScroll값을 대입하면 

    } else { //body에 .hidden있으면 .header에 .fix 제거
      $(&#39;.header&#39;).removeClass(&#39;fix&#39;);
    }
  }
})    </code></pre>
<hr>
<h2 id="3-1-swiper-pagination에-글자-넣기">3-1. swiper pagination에 글자 넣기</h2>
<h2 id="3-2-디바이스-크기별로-swiper-효과-다르게-주고싶을-때">3-2. 디바이스 크기별로 swiper 효과 다르게 주고싶을 때</h2>
<p>해당 부분은 breakpoints라는 swiper의 내장 기능을 활용하고자 하였으나 작동하지 않음, 반복 여부나 효과 등 세부 기능은 지원하지 않아(공식문서에 기재되어있음) 아래의 방법을 사용하게 되었다.</p>
<pre><code class="language-js"> var menu = [&#39;SFF &amp; SAFE™ Forum 2023&#39;, &#39;희망별숲&#39;, &#39;아이소셀 포토부스&#39;, &#39;비전&#39;, &#39;PIM&#39;]

let width = window.innerWidth; //내현재 윈도우창위드
let swiper; //재할당가능한변수선언문
let mainswiper; //재할당가능한변수선언문

responsiveSwiper();

function initSwiper(effect, space, view, touch) {
  if (typeof (swiper) == &#39;object&#39;) swiper.destroy(); // window resize시 스와이퍼 새로 만들어야 함(충돌남), 기존 스와이퍼 죽임 후 밑에서 재실행


  return swiper = new Swiper(&quot;.sc-insight .swiper&quot;, {
    effect: effect,
    slidesPerView: view,
    centeredSlides: true,
    spaceBetween: space,
    pagination: {
      el: &quot;.sc-insight .tab-list&quot;,
      clickable: true,
      renderBullet: function (index, className) {
        return &#39;&lt;div class=&quot;&#39; + className + &#39;&quot;&gt;&#39; + (tab[index]) + &#39;&lt;/div&gt;&#39;;
      },
    },
    touchRatio: touch,
  });
}

//반응형 스와이퍼 부분 각각 파라미터 순서대로 넣어주면 된다.
// 순서대로 effect, slidePerview, spaceBetween, tuchRatio의 디바이스별 적용할 효과이다.
function responsiveSwiper() {
  if (width &gt;= 1024) { 
    initSwiper(&#39;fade&#39;, 0, &#39;auto&#39;, 0);
  } else if (width &lt; 768) {
    initSwiper(&#39;slide&#39;, 16, 1.03, 1);
  } else if (width &lt; 1024) {
    initSwiper(&#39;slide&#39;, 16, 1.03, 1);
  }
}

window.addEventListener(&#39;resize&#39;, function () {
  width = window.innerWidth;
  responsiveSwiper();
}); //윈도우 리사이즈 될 때 let width에 실제 윈도우 width 대입하고  실행

window.addEventListener(&quot;orientationchange&quot;, ()=&gt;
    width = window.innerWidth;
    responsiveSwiper();
});// 가로모드도 resize 똑같이 대응, pc는 가로모드 개념이 없어서 동작x, 태블릿 모바일에서만 작동</code></pre>
<hr>
<h2 id="5-masonryjs">5. masonry.js</h2>
<p><img src="https://velog.velcdn.com/images/cloud_kim/post/37e5702f-2fa0-46e9-8431-9201e721dd62/image.png" alt=""></p>
<p>핀터레스트와 같은 레이아웃을 masonry 레이아웃이라고 한다고 한다. 나는 아래의 레이아웃을 구성해보았다.
<img src="https://velog.velcdn.com/images/cloud_kim/post/440267fb-cb39-4864-99de-50ab5995f261/image.gif" alt=""></p>
<pre><code class="language-html">&lt;div class=&quot;news-wrapper&quot;&gt;
    &lt;ul class=&quot;news-list&quot;&gt;
        &lt;li class=&quot;gutter-sizer&quot;&gt;&lt;/li&gt; &lt;!--여백 넣어주기--&gt;
        &lt;li class=&quot;news-item&quot; data-aos=&quot;fade-up&quot;&gt;
            &lt;a href=&quot;&quot;&gt;
                &lt;div class=&quot;img-wrap&quot;&gt;&lt;img src=&quot;./assets/img/news-01.jpeg&quot; alt&gt;&lt;/div&gt;
                &lt;div class=&quot;text-wrap&quot;&gt;
                    &lt;em&gt;뉴스&lt;/em&gt;
                    &lt;strong&gt;삼성전자, 업계 최선단 12나노급 D랩 양산&lt;/strong&gt;
                &lt;/div&gt;
            &lt;/a&gt;
            &lt;div class=&quot;tag-wrap&quot;&gt;
                &lt;a href=&quot;&quot;&gt;&lt;span&gt;DRAM&lt;/span&gt;&lt;/a&gt;
                &lt;a href=&quot;&quot;&gt;&lt;span&gt;DDR5&lt;/span&gt;&lt;/a&gt;
                &lt;a href=&quot;&quot;&gt;&lt;span&gt;12나노 D램&lt;/span&gt;&lt;/a&gt;
            &lt;/div&gt;
        &lt;/li&gt;
      &lt;!--이하 생략--&gt;
    &lt;/ul&gt;
&lt;/div&gt;</code></pre>
<pre><code class="language-css">
.news-list {
  &amp;::after {
      display: block;
      clear: both;
      content: &#39;&#39;;
  } /*부모에게 float 해제*/
 }

  .gutter-sizer {
      width: 20px; /*여백 사이즈*/
  }

  .news-item {
    float: left;
    width: calc((100% - 40px)/3); /*3단 레이아웃 */
    margin-bottom: 64px;
    padding: 0 32px;

    @include tablet{
        width: calc((100% - 20px)/2);/*2단 레이아웃 */
    }
    @include mobile{ /*1단 레이아웃*/
        width: 100%;
        padding: 0 16px;
        margin-bottom: 48px;
    }
}
</code></pre>
<pre><code class="language-js">window.onload = function () { //자바스크립트 문서가 준비된 이후에 실행
    $(&#39;.news-list&#39;).masonry({
        itemSelector: &#39;.news-item&#39;, //적용대상 - 대상은 div로 감싸져있어야 한다.
        gutter: &#39;.gutter-sizer&#39;, //여백값
    });
};
</code></pre>
<hr>
<h2 id="6-클릭한-value값-input에-넣기">6. 클릭한 value값 input에 넣기</h2>
<p><img src="https://velog.velcdn.com/images/cloud_kim/post/7e984e86-1edd-4b54-991a-38d26030f6da/image.gif" alt=""></p>
<pre><code class="language-js">   $(&#39;.sc-search .tag-wrap a&#39;).click(function (e) {
        e.preventDefault(); 
        keyword = $(this).text(); //클릭한 대상의 텍스트를 keyword에 담는다.
        $(&#39;.sc-search input&#39;).val(keyword);  // keyword를 value값으로 input에 넣는다.
    })</code></pre>
<hr>
<h2 id="7-데이터-바인딩">7. 데이터 바인딩</h2>
<pre><code class="language-js">let arr = [{ //array에 값을 담는다.
            name: &#39;제품&#39;, //대제목
            sub: [{ //소제목들
                    name: &quot;DRAM&quot;
                },
                {
                    name: &quot;SSD&quot;
                },
                {
                    name: &quot;eStorage&quot;
                },
                {
                    name: &quot;오토모티브 메모리&quot;
                },
                {
                    name: &quot;Consumer Storage&quot;
                },
                {
                    name: &quot;프로세서&quot;
                },
                {
                    name: &quot;이미지센서&quot;
                },
                {
                    name: &quot;디스플레이 IC&quot;
                },
                {
                    name: &quot;보안 솔루션&quot;
                },
                {
                    name: &quot;전력관리 IC&quot;
                },
                {
                    name: &quot;LED&quot;,
                    arrow: true //바로가기 화살표 아이콘 유무
                }
            ]
        },
        //이하 생략
    ]

    let footerHtml = &#39;&#39; 
    arr.forEach(el =&gt; {
        let innerTemplate = &#39;&#39;;

        el.sub.forEach(e =&gt; {

            isArrow = (e.arrow) ? `&lt;img src=&quot;./assets/img/more-t3.svg&quot; alt=&quot;&quot; class=&quot;arrow-t2&quot;&gt;` : &#39;&#39;; 
          // 바로가기 아이콘이 true이면 해당 태그 넣고 아니면 넣지않기

            innerTemplate += `
                &lt;ul class=&quot;quick-list&quot;&gt;
                    &lt;li class=&quot;quick-item&quot;&gt;
                        &lt;a href=&quot;&quot;&gt;${e.name} ${isArrow}&lt;/a&gt; 
                    &lt;/li&gt;
                &lt;/ul&gt;` //소제목 넣기 부분
        })

        let template = &#39;&#39;;

        template += `
                    &lt;div class=&quot;quick-wrap&quot;&gt;
                      &lt;h3 class=&quot;title-box&quot;&gt;${el.name}&lt;/h3&gt; //대제목 넣기 부분
                      &lt;div class=&quot;quick-inner-wrap&quot;&gt;
                      ${innerTemplate} //소제목들 넣은것
                      &lt;/div&gt;
                     &lt;/div&gt;
                      `;

        footerHtml += template; //template에 footerHtml 넣기

    })
    $(&#39;.grid-inner&#39;).html(footerHtml) // footerHtml 넣기</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[Amondz]]></title>
            <link>https://velog.io/@cloud_kim/Amondz</link>
            <guid>https://velog.io/@cloud_kim/Amondz</guid>
            <pubDate>Thu, 22 Jun 2023 13:43:01 GMT</pubDate>
            <description><![CDATA[<h4 id="분류">분류</h4>
<ul>
<li>적응형 모바일, 클론코딩</li>
<li>사용언어 : html, css</li>
<li>라이브러리 : j-query, swiper</li>
<li>제작기간: 3일</li>
</ul>
<h4 id="point">Point</h4>
<ol>
<li>a태그와 button태그가 같은 영역에 있을 때</li>
<li>탭 클릭시 스크롤 이동</li>
</ol>
<hr>
<h2 id="1-a태그와-button태그가-같은-영역에-있을-때">1. a태그와 button태그가 같은 영역에 있을 때</h2>
<p>아래와 같이 a태그 안에 button이 있을 때는 a태그로 영역만 잡고 버튼을 z-index를 높여 배치할 수 있다.
<img src="https://velog.velcdn.com/images/cloud_kim/post/69b64fee-15b6-493a-a706-dfa02b13d5fe/image.png" alt=""></p>
<pre><code class="language-html">&lt;div class=&quot;prod-area&quot;&gt;
  &lt;a href=&quot;&quot;&gt;&lt;/a&gt; &lt;!--영역만 잡기--&gt;
  &lt;div class=&quot;thumb-box&quot;&gt;&lt;img src=&quot;assets/img/rec-01.jpeg&quot; alt=&quot;&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;prod-wrap&quot;&gt;
    &lt;div class=&quot;title-box&quot;&gt;
      &lt;em&gt;가이거주얼리&lt;/em&gt;
      &lt;p&gt;[아몬즈 단독] 14K 컷팅 하트 목걸이 GIAM14NN003&lt;/p&gt;
    &lt;/div&gt;
    &lt;button class=&quot;btn-like&quot; aria-label=&quot;좋아요 버튼&quot;&gt;
      &lt;svg&gt;&lt;path&gt;&lt;!--svg 소스 생략--&gt;&lt;/path&gt;&lt;/svg&gt;
    &lt;/button&gt;
    &lt;p class=&quot;price-wrap&quot;&gt;
      &lt;em class=&quot;sale&quot;&gt;30%&lt;/em&gt;
      &lt;span class=&quot;curr&quot;&gt;&lt;strong&gt;198,450&lt;/strong&gt;원&lt;/span&gt;
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;</code></pre>
<pre><code class="language-css">.prod-area {
    position: relative;
    width: calc(50% - 7.5px);
}

.prod-area a {
    width: 100%;
    height: 100%;
    display: block;
    position: absolute;
    top: 0;
    left: 0;
    z-index: 1;
}

prod-wrap .btn-like {
    position: absolute;
    right: 0;
    top: 0;
    z-index: 2;
}
</code></pre>
<h2 id="2-탭-클릭시-스크롤-이동">2. 탭 클릭시 스크롤 이동</h2>
<p><img src="https://velog.velcdn.com/images/cloud_kim/post/44e09b78-7e38-4205-b41c-37c2fd44cf73/image.gif" alt=""></p>
<pre><code class="language-js">    $(&#39;.tab-item&#39;).click(function () {
        var offset = $(&quot;.tab-item&quot;).offset(); //해당 요소의 좌표
        $(&quot;html, body&quot;).animate({scrollTop: offset.top},200); //offset의 top으로 부드럽게 이동
    })</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Lotte Eatz]]></title>
            <link>https://velog.io/@cloud_kim/Lotte-Eatz</link>
            <guid>https://velog.io/@cloud_kim/Lotte-Eatz</guid>
            <pubDate>Thu, 22 Jun 2023 11:42:37 GMT</pubDate>
            <description><![CDATA[<h4 id="분류">분류</h4>
<ul>
<li>적응형, 클론코딩</li>
<li>사용언어 : html, css</li>
<li>라이브러리 : j-query, swiper</li>
<li>제작기간: 5일</li>
</ul>
<h4 id="point">Point</h4>
<ol>
<li>swiper</li>
<li>데이터 바인딩</li>
<li>quick top button</li>
</ol>
<hr>
<h2 id="1-swiper">1. swiper</h2>
<p><img src="https://velog.velcdn.com/images/cloud_kim/post/df53595e-15be-453f-be9d-4d2046d3b33a/image.png" alt=""></p>
<p>양 쪽 prev, next 버튼은 보이면서 내부 컨텐츠는 overflow:hidden을 해야한다. 처음에는 이 개념이 참 어려웠다. 어떻게 해도 안되어서 머리가 아팠는데 의외로 간단히 해결이 되었다. 방법은 아래와 같다.</p>
<ul>
<li>swiper에 부모 div를 하나 더 감싸고 position:initial을 준다. </li>
<li>prev, next 버튼은 .swiper-wrapper와 같은 형제 요소로 둔다.</li>
</ul>
<h2 id="2-데이터-바인딩">2. 데이터 바인딩</h2>
<ul>
<li><p>fetch()란?
자바스크립트를 사용하면 필요할 때 서버에 네트워크 요청을 보내고 새로운 정보를 받아오는 일을 할 수 있다.</p>
</li>
<li><p>json란?
일반적으로 서버에서 클라이언트로 데이터를 보낼 때 사용하는 양식. 클라이언트가 사용하는 언어에 관계 없이 통일된 데이터를 주고받을 수 있도록, 일정한 패턴을 지닌 문자열을 생성해 내보내면 클라이언트는 그를 해석해 데이터를 자기만의 방식으로 온전히 저장, 표시할 수 있게 된다.</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/cloud_kim/post/f56ae15f-1b0f-4cf4-8143-7dcddb2cde68/image.gif" alt=""></p>
<p><strong>js</strong></p>
<pre><code class="language-js">// 데이터바인딩 

// 각 리스트명 클릭 시 on class 삽입 
$(&#39;.sc-best .list-item&#39;).click(function(e){
  e.preventDefault();
  $(this).addClass(&#39;on&#39;).siblings().removeClass(&#39;on&#39;);
  company = $(this).find(&#39;a&#39;).data(&#39;company&#39;);

  favList(company); // 데이터 불러오기
})

    function favList(company) {
        fetch(`./assets/data/${company}.json`) //api 주소(json파일 읽어오기)
        .then(res=&gt;res.json()) //읽어온 데이터를 json으로 데이터 타입 변환
        .then(json=&gt;{
              // data를 응답 받은 후의 로직

            allData = json.items;

            let html=``;
            let html2=``;

              allData.forEach(el =&gt; {//forEach배열의 갯수만큼 반복문 돌림

                isBest = (el.best)?`&lt;span&gt;BEST&lt;/span&gt;`:&#39;&#39;; //삼항연산자, el.best가 참일경우 바로 다음에있는 ``실행 거짓이면 :뒤의 ``실행
                isReorder = (el.reorder)?`&lt;span class=&quot;reorder&quot;&gt;재주문 1위&lt;/span&gt;`:&#39;&#39;;
                isPriceFormat = (el.price)? `&lt;div class=&quot;prod-box price&quot;&gt;${priceFormat(el.price)}원&lt;/div&gt;`:&#39;&#39;;
                html+=`&lt;li class=&quot;menu-list&quot;&gt;
                            &lt;a href=&quot;&quot; class=&quot;link-prod&quot;&gt;
                                &lt;div class=&quot;thumb-box&quot;&gt;
                                    &lt;div class=&quot;thumb-img&quot;&gt;
                                        &lt;img src=&quot;${el.thumb}&quot; alt&gt;
                                    &lt;/div&gt;
                                    &lt;div class=&quot;badge-wrap&quot;&gt;
                                       ${isBest}
                                       ${isReorder}
                                    &lt;/div&gt;
                                &lt;/div&gt;
                                &lt;div class=&quot;prod-info&quot;&gt;
                                    &lt;div class=&quot;prod-box&quot;&gt;${el.title}&lt;/div&gt;
                                    ${isPriceFormat}
                                &lt;/div&gt;
                            &lt;/a&gt;
                        &lt;/li&gt;`;
            });

            const colorObj = {
                &#39;lotte&#39;: &#39;#EF3D2E&#39;,
                &#39;krispy&#39;: &#39;#1CAC68&#39;,
                &#39;plating&#39;: &#39;#000&#39;,
                &#39;angelinus&#39;: &#39;#AA9481&#39;,
            } // 브랜드별 폰트 색상  

            html2 += `&lt;a href=&quot;&quot; class=&quot;link-more&quot;&gt;
                          &lt;span&gt;
                            &lt;em style=&quot;color: ${colorObj[company]}&quot;&gt;${json.company}&lt;/em&gt; &amp;nbsp;메뉴 보러가기
                            &lt;i&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;10&quot; height=&quot;10&quot; viewBox=&quot;0 0 10 10&quot;&gt;&lt;g transform=&quot;translate(-54 -4.001)&quot;&gt;&lt;rect width=&quot;10&quot; height=&quot;10&quot; transform=&quot;translate(54 4.001)&quot; fill=&quot;#fff&quot; opacity=&quot;0&quot;/&gt;&lt;path d=&quot;M10232.7-747.317l4,4-4,4&quot; transform=&quot;translate(-10174.203 752.317)&quot; fill=&quot;none&quot; stroke=&quot;#000&quot; stroke-width=&quot;1&quot;/&gt;&lt;/g&gt;&lt;/svg&gt;
                              &lt;/i&gt;
                        &lt;/span&gt;
                      &lt;/a&gt;`;
              //(브랜드명) 바로가기 영역 

            $(&#39;#favList&#39;).html(html); //#favList에 넣기 -&gt; 출력
            $(&#39;.more-wrap&#39;).html(html2); //.more-wrap에 넣기 -&gt; 출력
        })
    }
    favList(&#39;lotte&#39;);

// 상품 가격 원 단위 &#39;,&#39; 넣기
function priceFormat(price){
  return result = price.toLocaleString(&#39;ko-KR&#39;);
}</code></pre>
<p><strong>json</strong>
json에선 주석을 사용할 수 없다. 마지막으로 작성하는 객체는 ,를 작성하지 않으며
숫자, true, false가 아닌 값은 &quot;&quot;안에 작성해주어야 한다.</p>
<pre><code>{ }: 속성명이 있는 객체를 의미
[ ]: 순서가 있는 배열</code></pre><pre><code class="language-js">{
    &quot;company&quot;:&quot;롯데리아&quot;,
    &quot;items&quot;:[
        {
            &quot;thumb&quot;:&quot;./assets/img/best-01.png&quot;,
            &quot;title&quot;:&quot;불고기 버거&quot;,
            &quot;best&quot;:true,
            &quot;reorder&quot;:false,
            &quot;price&quot;:4700
        },
        {
            &quot;thumb&quot;:&quot;./assets/img/best-02.png&quot;,
            &quot;title&quot;:&quot;새우 버거&quot;,
            &quot;best&quot;:true,
            &quot;reorder&quot;:false,
            &quot;price&quot;:4700
        },
        {
            &quot;thumb&quot;:&quot;./assets/img/best-03.png&quot;,
            &quot;title&quot;:&quot;치즈스틱&quot;,
            &quot;best&quot;:false,
            &quot;reorder&quot;:false,
            &quot;price&quot;:2400
        },
        {
            &quot;thumb&quot;:&quot;./assets/img/best-04.png&quot;,
            &quot;title&quot;:&quot;모짜렐라 인 더 버거 베이컨&quot;,
            &quot;best&quot;:false,
            &quot;reorder&quot;:true,
            &quot;price&quot;:7400
        }
    ]
}</code></pre>
<h3 id="유투브-데이터-바인딩">유투브 데이터 바인딩</h3>
<p>.json파일을 불러오는것 이외 fetch()로 실제 주소값을 받아와 출력해주는 화면을 만들어 보았다.</p>
<p><img src="https://velog.velcdn.com/images/cloud_kim/post/e10b8d52-56da-48aa-82f1-111d3719c2d1/image.png" alt=""></p>
<p>[결과화면]</p>
<p><strong>code</strong></p>
<pre><code class="language-html">&lt;input type=&quot;text&quot; class=&quot;text&quot;&gt;
&lt;button class=&quot;submit&quot;&gt;전송&lt;/button&gt;
&lt;ul class=&quot;list1&quot;&gt; 
&lt;/ul&gt;

&lt;script&gt;
  $(&#39;.submit&#39;).click(function(){ 
    keyword=$(&#39;.text&#39;).val();
    list(keyword); //.submit 클릭 시 input에 입력된 value값을 keyword에 담아 list()에 넣어준다.
  })

  function list(a){ //input value 값을 파라미터로 받아온다.
    fetch(`https://www.googleapis.com/youtube/v3/search?part=snippet&amp;q=${a}&amp;maxResults=3&amp;key=AIzaSyCvA0JdmROOxx3C60fBqO6geUp8B7xFAMs`) //.val값은 유투브 키값에 들어간다.
    .then(res=&gt;res.json()) //읽어온 데이터 json으로 데이터 타입 변환
    .then(json=&gt;{
    data = json.items; //json에 있는 items만 받아오기

    let html = ``;

    data.forEach(element =&gt; { //배열의 갯수만큼 forEach를 돌림
    html+=`&lt;li&gt;
              &lt;a href=&quot;https://www.youtube.com/watch?v=${element.id.videoId}&quot;&gt; //params로 넣은 value값에 대한 video 주소값
                &lt;img src=&quot;${element.snippet.thumbnails.medium.url}&quot; alt=&quot;&quot;&gt; //동영상 썸네일
                &lt;p&gt;${element.snippet.title}&lt;/p&gt; // 동영상 제목
              &lt;/a&gt;
           &lt;/li&gt;`
    });

    $(&#39;.list1&#39;).html(html);

    })
  }
&lt;/script&gt;</code></pre>
<h2 id="3-quick-top-button">3. quick top button</h2>
<p>처음엔 보이지 않다가, 스크롤 다운 시 보이고 올라갈 때 또한 ease 효과가 들어간 모습이다.
<img src="https://velog.velcdn.com/images/cloud_kim/post/a34b2953-5ad8-4a28-b2d3-5d68cd9c35cc/image.gif" alt=""></p>
<p><strong>통통튀는 up 화살표 transition</strong></p>
<pre><code class="language-css">.floating-wrap .btn-top i {
    display: block;
    width: 16px;
    height: 16px;
    opacity: 0;
    transform: translateY(10px);
    transition: 0.3s 0.25s cubic-bezier(0.17, 0.67, 0.29, 1.32);
}

.floating-wrap .btn-top.on i {
    transform: translateY(0);
    opacity: 1;
}
</code></pre>
<p><strong>ease scrolltop 효과</strong></p>
<pre><code class="language-js">$(&#39;.btn-top&#39;).click(function (event) {
  event.preventDefault();
  $(&#39;html, body&#39;).animate({ scrollTop: 0 },600, &#39;easeInExpo&#39;);
});</code></pre>
<p>easeInExpo를 사용하려면 별도의 js를 불러와야 한다.</p>
<p><a href="https://gist.github.com/codeink/5471970">&gt; js파일 바로가기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Vikiki]]></title>
            <link>https://velog.io/@cloud_kim/Vikiki</link>
            <guid>https://velog.io/@cloud_kim/Vikiki</guid>
            <pubDate>Wed, 21 Jun 2023 10:15:38 GMT</pubDate>
            <description><![CDATA[<h4 id="분류">분류</h4>
<ul>
<li>반응형, 클론코딩</li>
<li>사용언어 : html, css</li>
<li>라이브러리 : j-query, gsap, slitType</li>
<li>제작기간: 7일</li>
</ul>
<h4 id="point">Point</h4>
<ol>
<li>fixed content</li>
<li>GSAP </li>
<li>반응형 GSAP</li>
</ol>
<hr>
<h2 id="1-fixed-content">1. fixed content</h2>
<p>하단 콘텐츠가 스크롤이 된지 한참 뒤에 올라오는 효과 
<img src="https://velog.velcdn.com/images/cloud_kim/post/cd0b9550-e3c8-42e6-b681-30471ab5dda3/image.gif" alt=""></p>
<pre><code class="language-css">다음으로 올라올 영역에 margin-top:200vh;를 넣어준다</code></pre>
<h2 id="2-gsap">2. GSAP</h2>
<pre><code class="language-js">GSAP중에서도 전체적으로 scrollTrigger를 사용하였다.
코드 작성 하기 앞서 제일 상단에
gsap.registerPlugin(ScrollTrigger);
위의 코드를 적어야 사용할 수 있다.</code></pre>
<h3 id="이미지가-스크롤에-따라-scale이-줄어드는-효과">이미지가 스크롤에 따라 scale이 줄어드는 효과</h3>
<p><img src="https://velog.velcdn.com/images/cloud_kim/post/a738e399-c8d2-49f8-97ca-ef6c8a3fa34c/image.gif" alt=""></p>
<p><strong>html</strong>
여러 이미지를 data-scale에 각각 보여질 크기로 작성한다.</p>
<pre><code class="language-html">&lt;div class=&quot;img-wrap&quot;&gt;
  &lt;div class=&quot;img-item&quot;&gt;&lt;img src=&quot;./assets/img/img-01.jpg&quot; alt class=&quot;img img1&quot; data-scale=&quot;1&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;img-item&quot;&gt;&lt;img src=&quot;./assets/img/img-01.jpg&quot; alt class=&quot;img img1&quot; data-scale=&quot;0.9&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;img-item&quot;&gt;&lt;img src=&quot;./assets/img/img-01.jpg&quot; alt class=&quot;img img2&quot; data-scale=&quot;0.7&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;img-item&quot;&gt;&lt;img src=&quot;./assets/img/img-01.jpg&quot; alt class=&quot;img img3&quot; data-scale=&quot;0.5&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;img-item&quot;&gt;&lt;img src=&quot;./assets/img/img-01.jpg&quot; alt class=&quot;img img4&quot; data-scale=&quot;0.3&quot;&gt;&lt;/div&gt;
&lt;/div&gt;</code></pre>
<p><strong>css</strong>
제일 첫번째 이미지는 고정</p>
<pre><code class="language-css">.sc-intro .img-wrap .img-item:not(:first-child) {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 100%;
    height: 100%;
}</code></pre>
<p><strong>js</strong>
여러개의 이미지 이므로 img에 대해 each문 돌리고 
index가 아닌 element에 대해 trigger 한다.
dataset값을 변수에 담고 scale에 넣어준다.
부드러운 스크롤 효과를 위해 scrub:1을 넣어준다 <del>(부드럽지 않길 원하면 0)</del></p>
<pre><code class="language-js"> $(&#39;.sc-intro .img&#39;).each(function (idx, ele) {
   scaleVal = $(this).data(&#39;scale&#39;)
   gsap.to(ele, {
     scrollTrigger: {
       trigger: &#39;.sc-intro .title-area&#39;,
       start: &#39;0% 100%&#39;,
       end: &#39;100% 0%&#39;,
       scrub: 1
     },
     scale: scaleVal
   })
 })</code></pre>
<h3 id="스크롤-시-고정된-content에서-이미지-scale-및-글자-효과">스크롤 시 고정된 content에서 이미지 scale 및 글자 효과</h3>
<p><img src="https://velog.velcdn.com/images/cloud_kim/post/92c996b6-1c4b-4f49-91bf-75c749c0b8f4/image.gif" alt=""></p>
<p><strong>html</strong></p>
<pre><code class="language-html">&lt;div class=&quot;sticky-wrapper&quot;&gt;
  &lt;div class=&quot;sticky-trigger&quot;&gt;
    &lt;section class=&quot;sc-intro2&quot;&gt;
      &lt;div class=&quot;frame-wrap&quot;&gt;
        &lt;strong class=&quot;headline1 none&quot;&gt;7 years&lt;/strong&gt;
        &lt;strong class=&quot;headline2 none&quot;&gt;experience &lt;br&gt;in digital &lt;br&gt;design&lt;/strong&gt;
        &lt;strong class=&quot;headline3&quot;&gt;observing&lt;br&gt;crafting&lt;br&gt; doing stuff&lt;/strong&gt;
      &lt;/div&gt;
      &lt;div class=&quot;img-area&quot;&gt;
        &lt;div class=&quot;img-wrap&quot;&gt;
          &lt;div class=&quot;img-box&quot;&gt;
            &lt;img src=&quot;./assets/img/interview-01.gif&quot; class=&quot;scroll-img1&quot; alt&gt;
            &lt;img src=&quot;./assets/img/interview-07.png&quot; class=&quot;scroll-img2&quot; alt&gt;
            &lt;img src=&quot;./assets/img/interview-08.jpg&quot; class=&quot;scroll-img3&quot; alt&gt;
          &lt;/div&gt;
          &lt;!--이하생략--&gt;
      &lt;div class=&quot;fixed-wrap&quot;&gt;
        &lt;span&gt;RECENT&lt;/span&gt;
        &lt;span&gt;WORKS&lt;/span&gt;
      &lt;/div&gt;
    &lt;/section&gt;
  &lt;/div&gt;
&lt;/div&gt;</code></pre>
<p>스크롤되면서 바뀔 이미지를 .img-box 안에 한거번에 담는다.</p>
<pre><code class="language-js">
gsap.set(&#39;.sc-intro2 .headline2,.sc-intro2 .headline3&#39;, {
  visibility: &#39;hidden&#39;
})
gsap.set(&#39;.sticky-trigger .scroll-img2, .sticky-trigger .scroll-img3 &#39;, {
  visibility: &#39;hidden&#39;
})

const intro2 = gsap.timeline({
  scrollTrigger: {
    trigger: &#39;.sc-intro .sticky-trigger&#39;,
    start: &#39;20% 100%&#39;,
    end: &#39;100% 100%&#39;,
    scrub: 1
  },
})

intro2
  .to(&#39;.sc-intro2 .headline1&#39;, {
  scale: 1.3
})
  .addLabel(&#39;a&#39;)
  .set(&#39;.sc-intro2 .headline1&#39;, {
  visibility: &#39;hidden&#39;
}, &#39;a&#39;)
  .set(&#39;.sc-intro2 .headline2&#39;, {
  visibility: &#39;visible&#39;
}, &#39;a&#39;)

  .set(&#39;.sticky-trigger .scroll-img1&#39;, {
  visibility: &#39;hidden&#39;
})
  .set(&#39;.sticky-trigger .scroll-img2&#39;, {
  visibility: &#39;visible&#39;
})


  .to(&#39;.sc-intro2 .headline2&#39;, {
  scale: 1.3
})
  .set(&#39;.sc-intro2 .headline2&#39;, {
  visibility: &#39;hidden&#39;
})
  .set(&#39;.sc-intro2 .headline3&#39;, {
  visibility: &#39;visible&#39;
})

  .set(&#39;.sticky-trigger .scroll-img2&#39;, {
  visibility: &#39;hidden&#39;
})
  .set(&#39;.sticky-trigger .scroll-img3&#39;, {
  visibility: &#39;visible&#39;
})


  .to(&#39;.sc-intro2 .headline3&#39;, {
  scale: 1.3
})
  .to(&#39;.sticky-trigger .scroll-img3&#39;, {
  scale: 0
})
</code></pre>
<p>순차대로 일어나야하는 이벤트이므로 gsap.timeline을 사용하였다.
trigger할 부분은 position:sticky 되어있는 .sticky-trigger(길게 스크롤되어야 하므로 height 300vw) 는 에 걸어주고 2,3번째 이미지와 텍스트는 숨겨둔다.
시작지점은 콘텐츠의 20% 지점 뷰포트의 100% 지점이다.<br>종료지점은 콘텐츠의 100% 지점 뷰포트의 100% 지점이다.
첫번째 텍스트의 scale 1.3으로 커지게 하고, 
그에 이어서 다 커진 텍스트는 숨겨진 뒤, 숨겨준 두번째 텍스트를 보이게 한다.
그와 동시에 두번째 이미지가 보이고 세번째도 위와 동일하게 한 다음 
마지막스크롤이 끝날때 마지막 이미지인 3번째 이미지의 scale을 0으로 해준다.</p>
<h3 id="스크롤-시-고정된-content-위로-올라오는-contents">스크롤 시 고정된 content 위로 올라오는 contents</h3>
<p><img src="https://velog.velcdn.com/images/cloud_kim/post/e6c694ab-223c-4387-90c9-589c9c129388/image.gif" alt=""></p>
<pre><code class="language-js">const slidePin = gsap.timeline({
  scrollTrigger: {
    trigger: &#39;.sc-slide&#39;,
    start: &#39;0% -100%&#39;,
    end: &#39;100% 100%&#39;,
    scrub: 1
  },
})

slidePin
  .addLabel(&#39;a&#39;)
  .to(&#39;.sc-slide .slide-01 img&#39;, {
  scale: 1.3
}, &#39;a&#39;)
  .to(&#39;.sc-slide .slide-02&#39;, {
  top: &#39;7vw&#39;
}, &#39;a&#39;)

  .addLabel(&#39;b&#39;)
  .to(&#39;.sc-slide .slide-02 img&#39;, {
  scale: 1.3
}, &#39;b&#39;)
  .to(&#39;.sc-slide .slide-03&#39;, {
  top: &#39;15vw&#39;
}, &#39;b&#39;)

  .addLabel(&#39;c&#39;)
  .to(&#39;.sc-slide .slide-03 img&#39;, {
  scale: 1.3
}, &#39;c&#39;)
  .to(&#39;.sc-slide .slide-04&#39;, {
  top: &#39;22.8vw&#39;
}, &#39;c&#39;)

  .to(&#39;.sc-slide .slide-04 img&#39;, {
  scale: 1.3
})</code></pre>
<p>이 효과도 순차적으로 일어나야 하므로 gsap.timeline을 사용하였다.
시작지점 콘텐츠의 0%, 뷰포트의 -100%인 이유는 이미 이전 콘텐츠가 보여지고 있어야 하므로 -100%이여야 한다.
순차적으로 일어나면서 같이 일어나야 하는것들은 .addlabel로 묶어주었다.
scale이 기존보다 커지면서, 올라와서 고정되는 위치의 top값을 적어주었다.</p>
<h3 id="스크롤-시-글자-가로로-나타나기">스크롤 시 글자 가로로 나타나기</h3>
<p><img src="https://velog.velcdn.com/images/cloud_kim/post/0bfda895-0db9-4676-b8bb-8ef1e1394850/image.gif" alt=""></p>
<pre><code class="language-js">gsap.set(&#39;.sc-awards .em-list .em-box&#39;,{
  opacity:0,
  xPercent:10
})

gsap.to(&#39;.sc-awards .em-list .em-box&#39;, {
  scrollTrigger: {
    trigger: &#39;.sc-awards .em-list&#39;,
    start: &#39;0% 100%&#39;,
    end: &#39;100% +=700px&#39;,
    scrub: 0
  },
  opacity:1,
  xPercent:0,
  stagger:0.2
})</code></pre>
<p>문자들을 .set으로 opaticy와 xPercent를 설정해준다.(각각 0, 10)
이후 문자들을 감싼 .em-list에 trigger를 해준 뒤 
opacity:1, xPercent:0을 해준다. stagger는 각 요소 시작 시간사이에 0.1초가 있게 하는 것이다.</p>
<h3 id="스크롤-시-글자-세로로-슬라이드">스크롤 시 글자 세로로 슬라이드</h3>
<p><img src="https://velog.velcdn.com/images/cloud_kim/post/ceb1cd5e-45d5-4f12-9ef4-8f2aecc5e8af/image.gif" alt=""></p>
<pre><code class="language-js">gsap.to(&#39;.sc-awards .scroll-area .scroll-box .absolute-wrap&#39;,{ 
  scrollTrigger:{
    trigger:&#39;.sc-awards .scroll-area&#39;,
    start:&quot;0% 50%&quot;,
    end:&quot;100% 50%&quot;,
    scrub:0,
  },
  top:&#39;100%&#39;,
  yPercent:-100,
  ease:&#39;none&#39;
})

$(&#39;.sc-awards .scroll-wrap .scroll-list&#39;).each(function (idx,ele){

  fontClass = [&#39;a1&#39;, &#39;a2&#39;, &#39;a3&#39;]
  fontText = [&#39;key&#39;,&#39;special&#39;,&#39;crush&#39;]
  fontText2 = [&#39;skils&#39;,&#39;expertise&#39;,&#39;things&#39;]

  ScrollTrigger.create({
    trigger: ele,
    start: &#39;0% 50%&#39;,
    end: &#39;100% 50%&#39;,
    scrub: 0,
    onEnter:function(){
      $(&#39;.sc-awards .absolute-wrap p&#39;).text(fontText[idx]).removeClass(&#39;a1 a2 a3&#39;).addClass(fontClass[idx]);
      $(&#39;.sc-awards .absolute-wrap.text2 p&#39;).text(fontText2[idx])
    },
    onEnterBack:function(){
      $(&#39;.sc-awards .absolute-wrap p&#39;).text(fontText[idx]).removeClass(&#39;a1 a2 a3&#39;).addClass(fontClass[idx]);
      $(&#39;.sc-awards .absolute-wrap.text2 p&#39;).text(fontText2[idx]);
    },
  })
})</code></pre>
<p>제일 부모를 trigger한다. 스크롤되며 같이 내려갈 문자는 yPercent:-100해준다.
ease를 none 해주어 부드러운 효과를 제거해준다.</p>
<p>각각의 문자들이 담겨있는 리스트의 부모인 .scroll-list를 each문으로 돌린다.
각각 스크롤 시 변경될 text를 array에 담는다.
trigger는 각각의 element이다.
시작 지점은 콘텐츠의 0%, 뷰포트의 50% 종료 지점은 콘텐츠의 100%, 뷰포트의 50%이다.
이벤트 발생 위치에 도달했을 때 텍스트를 array에 들어 있는 text 대로 트리거 된다! fontClass는 font-family에 대한 부분이다.</p>
<p><strong>toggleAction 구성</strong></p>
<pre><code>onEnter : 이벤트 발생 위치에 도달
onLeave : 이벤트 발생 위치를 떠남
onEnterBack: 스크롤을 다시 올려 이벤트 발생 위치에 도달
onLeaveBack: 스크롤을 다시 올려 이벤트 발생 위치를 떠남</code></pre><h3 id="스크롤-시-이미지-나타나기">스크롤 시 이미지 나타나기</h3>
<p><img src="https://velog.velcdn.com/images/cloud_kim/post/b0cb1a43-a2cb-42d6-8a2a-6ac68d78951b/image.gif" alt=""></p>
<pre><code class="language-js">gsap.set(&#39;.sc-awards .awards-item&#39;,{
  scale:0
})

$(&#39;.sc-awards .awards-item&#39;).each(function(idx,ele){
  const playMotion2 = gsap.timeline({
    scrollTrigger: {
      trigger: ele,
      start: &#39;0% 100%&#39;,
      end: &#39;100% 100%&#39;,
      scrub: 1,
    },
  })
  playMotion2
    .to(ele, {
    scale: 1,
  })
})
</code></pre>
<p>기존 이미지들은 scale:0으로 안보이게 한다.
각각의 element에 대해 each문을 돌린다.
trigger는 element에 걸어준 다음 scale을 1로 키운다.</p>
<h3 id="스크롤-시-텍스트-및-이미지-나타나기">스크롤 시 텍스트 및 이미지 나타나기</h3>
<p><img src="https://velog.velcdn.com/images/cloud_kim/post/bcc1f547-5cb9-4c8b-9f94-3193f1534954/image.gif" alt=""></p>
<pre><code class="language-js">const letTxt = new SplitType(&#39;.sc-contact .title-wrap h3&#39;, {type:&#39;words, chars&#39;})
// 글자 쪼개기

gsap.set(letTxt.chars,{
  opacity:0,
  xPercent:100
})
//쪼갠 글자들 오른쪽으로 보내버리고 투명도 0

$(&#39;.sc-contact .title-wrap h3&#39;).each(function(idx,ele){
  gsap.to($(this).find(&#39;.char&#39;),{
    scrollTrigger: {
      trigger: &#39;.sc-contact .title-wrap&#39;,
      start: &#39;20% 50%&#39;,
      end: &#39;100% 100%&#39;,
      scrub:1,
    },
    opacity:1,
    xPercent:0,
    stagger:0.01
  })
})
//쪼갠 글자들을 감싼 부모에게 trigger걸어주고 투명도 1, x축 위치 원상복귀, stagger 주기


gsap.set(&#39;.sc-contact .title-wrap .img-box img&#39;,{
  scale:0,
}) 
//스크롤 트리거 할 이미지 scale 0으로 줄여놓기

gsap.to(&#39;.sc-contact .title-wrap .img-box img&#39;,{
  scrollTrigger: {
    trigger: &#39;.sc-contact&#39;,
    start: &#39;0% 60%&#39;,
    end: &#39;100% 100%&#39;,
    scrub:0,
  },
  scale:1,
})
//scale로 키워주기 -&gt; 이미지가 가운데서부터 커진다면 transform-origin으로 조절해줄 수 있다!
</code></pre>
<h2 id="3-반응형-gsap">3. 반응형 gsap</h2>
<p>내가 원하는 브라우저 크기에서만 스크립트가 실행되기 원한다면 아래와 같이 작성해줄 수 있다.</p>
<pre><code class="language-js">  ScrollTrigger.matchMedia({
    &quot;(min-width: 992px)&quot;: function() {
        //여기에 작성
    })

    &quot;all&quot;: function() {
          //여기에 작성
      })

  })</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[NAVER Career]]></title>
            <link>https://velog.io/@cloud_kim/NAVER-Career</link>
            <guid>https://velog.io/@cloud_kim/NAVER-Career</guid>
            <pubDate>Tue, 20 Jun 2023 15:06:24 GMT</pubDate>
            <description><![CDATA[<h4 id="분류">분류</h4>
<ul>
<li>반응형, 클론코딩</li>
<li>사용언어 : html, css</li>
<li>라이브러리 : j-query, swiper</li>
<li>제작기간: 4일</li>
</ul>
<h4 id="point">Point</h4>
<ol>
<li>swiper</li>
<li>이미지 크기</li>
<li>transition</li>
<li>label select</li>
</ol>
<hr>
<h2 id="1-swiper">1. swiper</h2>
<p>영역을 벗어난 swiper를 보이게 해야한다. 아래의 이미지에서 빨간 상자 영역이 컨텐츠 영역 밖이다.</p>
<p><img src="https://velog.velcdn.com/images/cloud_kim/post/a5554336-7ea5-4b9a-aad8-ebd19da65722/image.png" alt=""></p>
<ul>
<li><p>html</p>
<pre><code class="language-html">&lt;div class=&quot;inner&quot;&gt;
  &lt;div class=&quot;swiper&quot;&gt;
      &lt;div class=&quot;swiper-wrapper&quot;&gt;
        ...
        &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</code></pre>
</li>
<li><p>컨텐츠 안쪽 여백</p>
<pre><code class="language-css">.inner { position: relative; max-width: 1408px; margin: 0 auto; padding: 0 104px; } </code></pre>
</li>
<li><p>swiper</p>
<pre><code class="language-css">.swiper{overflow:initial}
.swiper-wrapper{overflow:hidden}</code></pre>
<h2 id="2-이미지-크기">2. 이미지 크기</h2>
<p>이미지 크기를 px로 해버리면 줄어들지 않는다. 반응형 사이트에서의 이미지를 padding-bottom으로 조절할 수 있다.</p>
</li>
<li><p>html</p>
<pre><code class="language-html">&lt;div class=&quot;img-wrap&quot;&gt;
  &lt;img src=&quot;./assets/img/people-01.jpg&quot; alt&gt;
&lt;/div&gt;</code></pre>
</li>
<li><p>css</p>
<pre><code class="language-css">.swiper-slide .img-wrap {
  position: relative;
  padding-bottom: calc((520/1097)*100%);
} /* 실제 보여질 이미지 사이즈 나눈값을 100%에 곱한다 */
</code></pre>
</li>
</ul>
<p>.swiper-slide .img-wrap img {
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
} /* 내부 이미지는 맞춰서 조절될 수 있게 꽉 채워준다.  */</p>
<pre><code>## 3. transition
기존 사이트는 animation으로 되어있었는데, transition으로 변경하여 코드를 줄이는 방향으로 개선해보았다. 

- 기존 사이트 
```css
.spot [class^=spot_text] {
    animation: fade-out 0.2s linear forwards;
}

.spot .swiper-slide.swiper-slide-active .spot_content .spot_text {
    opacity: 0;
    animation: wave-in 0.3s ease-out forwards, fade 0.8s linear forwards;
    animation-delay: 0.8s;    
}

@keyframes fade-out {
  0% {
    opacity: 1;
  }
  100% {
    opacity: 0;
  }
}

@keyframes wave-in {
  0% {
    width: 0%;
  }
  50% {
    width: 50%;
  }
  100% {
    width: 100%;
  }
}
</code></pre><ul>
<li>변경 후<pre><code class="language-css">.swiper-slide .text-wrap h3 { 
width: 0; 
opacity: 0; 
transition: width 0.3s 0.8s, opacity 0.8s 0.8s; 
} 
</code></pre>
</li>
</ul>
<p>.swiper-slide-active .text-wrap h3 { 
  opacity: 1;
  width: 100%;
} </p>
<pre><code>
## 4. label selection
라벨 선택 시 전체 선택, 해제 시 전체 해제 되어야 하는 부분
![](https://velog.velcdn.com/images/cloud_kim/post/fbb3dbee-227a-4ecf-987d-1cff6679305f/image.gif)
```html
&lt;div class=&quot;job-wrap&quot;&gt;
    &lt;strong class=&quot;title&quot;&gt;직군/직무&lt;/strong&gt;
    &lt;ul class=&quot;job-list&quot;&gt;
        &lt;li class=&quot;job-item&quot;&gt;
            &lt;i class=&quot;list&quot;&gt;&lt;/i&gt;
              &lt;span&gt;Tech&lt;/span&gt;
             &lt;ul class=&quot;sub-list&quot;&gt;
                &lt;li class=&quot;sub-all&quot;&gt;
                    &lt;input type=&quot;checkbox&quot; id=&quot;select-all&quot;&gt;
                    &lt;label for=&quot;select-all&quot; data-box=&quot;.box&quot;&gt;전체&lt;/label&gt;
                 &lt;/li&gt;
                 &lt;li class=&quot;sub-item box&quot;&gt;
                     &lt;i class=&quot;list&quot;&gt;&lt;/i&gt;
                    &lt;span&gt;Software Development&lt;/span&gt;
                    &lt;ul class=&quot;sub-list2&quot;&gt;
                        &lt;li class=&quot;sub-item2&quot;&gt;
                            &lt;input type=&quot;checkbox&quot; id=&quot;select&quot;&gt;
                            &lt;label for=&quot;select&quot;&gt;Frontend&lt;/label&gt;
                        &lt;/li&gt;
                          &lt;!--이하생략--&gt;
                     &lt;/ul&gt;
                 &lt;/li&gt;
             &lt;/ul&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;</code></pre><pre><code>  전체 label을 data-box=&quot;.box&quot;로 지정
하위 label은 class=&quot;box&quot;
전체 label 클릭시 하위 label 선택 되게 한다.</code></pre><pre><code class="language-js">// 전체label  누르면 한번에 선택하기
$(&#39;.sub-all label&#39;).each(function (idx, el) {
  $(el).click(function () {
    box = $(this).data(&#39;box&#39;);
    if ($(this).siblings().prop(&#39;checked&#39;)) {
      $(box).find(&#39;input&#39;).prop(&#39;checked&#39;, false)
    } else {
      $(box).find(&#39;input&#39;).prop(&#39;checked&#39;, true)
    }
  })
})
</code></pre>
<p>전체 label : siblings인 Input이 이미 체크 된 상태이면 전체 label 클릭시 .box 내부의 개별 input 체크 해제</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Andar]]></title>
            <link>https://velog.io/@cloud_kim/Andar</link>
            <guid>https://velog.io/@cloud_kim/Andar</guid>
            <pubDate>Tue, 20 Jun 2023 13:14:57 GMT</pubDate>
            <description><![CDATA[<h4 id="분류">분류</h4>
<ul>
<li>적응형 Mobile, 클론코딩</li>
<li>사용언어 : html, css</li>
<li>라이브러리 : j-query, swiper</li>
<li>제작기간: 3일</li>
</ul>
<h4 id="point">Point</h4>
<ol>
<li>재 사용하면 좋은 것들</li>
<li>스크롤 시 나타나는 header</li>
<li>hamburger menu</li>
<li>quick button</li>
<li>개선방안</li>
</ol>
<hr>
<h2 id="1-재-사용하면-좋은-것들">1. 재 사용하면 좋은 것들</h2>
<ul>
<li>svg
svg를 색상 등 변형하여 재사용 할 경우 <code>&lt;img&gt;</code>태그로 넣지 않고 svg소스로 넣어 사용한다.</li>
</ul>
<p><strong>(예시)</strong></p>
<pre><code class="language-html">&lt;svg width=&#39;20&#39; height=&#39;17&#39; viewBox=&#39;0 0 20 17&#39; fill=&#39;#fff&#39;&gt;
    &lt;path fill-rule=&#39;evenodd&#39; clip-rule=&#39;evenodd&#39; d=&#39;M20 0.5H0V2H20V0.5ZM20 7.75H0V9.25H20V7.75ZM0 15H16V16.5H0V15Z&#39; fill=&#39;#fff&#39;/&gt;
&lt;/svg&gt;</code></pre>
<pre><code class="language-css">svg {fill:#000}</code></pre>
<ul>
<li>화살표 이미지
클릭 시 메뉴가 펼쳐지면서 버튼이 회전이 되거나, 스와이퍼의 다음,이전 버튼은 한 이미지로 회전하여 사용한다. </li>
</ul>
<p><strong>(예시)</strong></p>
<pre><code class="language-css">.nav-item .nav-box.on::after {transform: rotate(-135deg);} </code></pre>
<hr>
<h2 id="2-스크롤-시-나타나는-header">2. 스크롤 시 나타나는 header</h2>
<ul>
<li>스크롤 다운 시 나타나고, 최상단 도달 시 다시 사라지는 header
<img src="https://velog.velcdn.com/images/cloud_kim/post/a3c92b26-4f6e-4376-8aa3-77650d90a4a1/image.gif" alt=""></li>
</ul>
<pre><code class="language-js">$(window).scroll(function () {
    curr = $(this).scrollTop();
        if (curr &gt; 0) {
            $(&#39;.header-inner&#39;).addClass(&#39;fixed&#39;)
        } else {
            $(&#39;.header-inner&#39;).removeClass(&#39;fixed&#39;)
        }
})

$(window).trigger(&#39;scroll&#39;);  // 페이지 스크롤 다운된 상태에서 새로고침 시 헤더 보이지 않는 현상 -&gt; 스크롤 강제 발생시킨다.</code></pre>
<hr>
<h2 id="3-hamburger-menu">3. hamburger menu</h2>
<ul>
<li>아코디언 메뉴
<img src="https://velog.velcdn.com/images/cloud_kim/post/5440a2a9-f24a-4b3a-a146-0b5dddbc1e47/image.gif" alt=""></li>
</ul>
<pre><code class="language-js">$(&#39;.nav-box&#39;).click(function (e) {
    e.preventDefault();
    $(this).toggleClass(&#39;on&#39;).siblings(&#39;.item-sub&#39;).slideToggle();
})</code></pre>
<pre><code>a태그의 새로고침 방지 - e.preventDefault();
메뉴의 down img 180deg 회전 - toggleClass
아코디언 메뉴 하위 요소들 보이기 - slideToggle</code></pre><ul>
<li>메뉴 외 영역 클릭 시 닫기
<img src="https://velog.velcdn.com/images/cloud_kim/post/ea4a09c6-1c19-4219-a92a-b7483619d36d/image.gif" alt=""><pre><code class="language-js">$(document).click(function (e) {
  if ($(&#39;header&#39;).has(e.target).length == 0) {
      $(&#39;.side-nav&#39;).removeClass(&#39;on&#39;)
      $(&#39;body&#39;).removeClass(&#39;hidden&#39;)
  }
})</code></pre>
  클릭한 곳 기준 header에 e.target 존재하지 않으면 클래스 제거</li>
</ul>
<ul>
<li>메뉴 열렸을 때, body에 overflow:hidden 추가
메뉴가 열렸을 때 바깥 영역 스크롤 방지    <pre><code class="language-css">  .hidden{oveflow:hidden}</code></pre>
</li>
</ul>
<hr>
<h2 id="4-quick-button">4. quick button</h2>
<ul>
<li>스크롤을 내리면 없어지고 올리면 나타나는 퀵메뉴
<img src="https://velog.velcdn.com/images/cloud_kim/post/3c6c44f6-e8c4-4d03-9400-cf3b66d54d8f/image.gif" alt=""></li>
</ul>
<pre><code class="language-js">let lastScroll = 0;

$(window).scroll(function(){
    curr = $(this).scrollTop();

    if (curr &gt; lastScroll) {
        $(&#39;.quick-wrap&#39;).addClass(&#39;hide&#39;);
    } else {
        $(&#39;.quick-wrap&#39;).removeClass(&#39;hide&#39;);
    }

      lastScroll = curr;
})</code></pre>
<p>lastScroll의 값을 0으로 한다.
curr에 스크롤 값을 담는다.
스크롤 시 curr의 값이 lastscroll보다 크면 숨기고,
그렇지 않다면 보인다.
그런 후에 curr의 값을 lastscroll에 대입한다.</p>
<hr>
<h2 id="5-개선방안">5. 개선방안</h2>
<h3 id="--슬라이드-텍스트-배치">- 슬라이드 텍스트 배치</h3>
<p>슬라이드 텍스트 위치는 고정값으로 배치하는게 모바일 적응형 환경에 적합해 보인다.(모바일/태블릿)</p>
<p><img src="https://velog.velcdn.com/images/cloud_kim/post/fda44eee-d2a8-4f84-abdc-a91a5a42f678/image.png" alt=""></p>
<p>[기존 안다르]</p>
<p><img src="https://velog.velcdn.com/images/cloud_kim/post/39849551-8705-4b99-8fa3-c52f7c67d34f/image.png" alt=""></p>
<p>[개선 후]</p>
<h3 id="--h1-태그의-사용">- h1 태그의 사용</h3>
<p>h1 태그는 header의 로고나 중요한 곳에서 단 한 번만 사용한다. 각 용도에 맞는 태그로 변경해 주었다.</p>
<p><img src="https://velog.velcdn.com/images/cloud_kim/post/c2d8b703-9366-4d09-b291-24e26f8e6ac4/image.png" alt=""></p>
<p>[기존 안다르]</p>
<p><img src="https://velog.velcdn.com/images/cloud_kim/post/118d1933-0e9b-4538-a58f-64505ea5aa6b/image.png" alt=""></p>
<p>[개선 후]</p>
<h3 id="--svg-사용">- svg 사용</h3>
<p>위에서 언급했듯이 svg는 색상 변경이 있을 경우 img 태그가 아닌 svg코드로 넣는 것이 편리하다. 기존의 안다르 사이트는 background이미지 사용으로 두개의 파일을 사용하였는데, 개선 후 svg 코드로 넣은 뒤 fill로 색상 조절하는 것으로 수정하였다. 
<img src="https://velog.velcdn.com/images/cloud_kim/post/68b2861f-3bd4-4665-b41d-723ce386b849/image.png" alt=""></p>
<p>[기존 안다르]</p>
<p><img src="https://velog.velcdn.com/images/cloud_kim/post/2c6f39d8-b4f2-470f-bef5-e3adf95fe92e/image.png" alt=""></p>
<p>[개선 후]</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[NAVER]]></title>
            <link>https://velog.io/@cloud_kim/NAVER</link>
            <guid>https://velog.io/@cloud_kim/NAVER</guid>
            <pubDate>Tue, 20 Jun 2023 06:23:28 GMT</pubDate>
            <description><![CDATA[<h4 id="분류">분류</h4>
<ul>
<li>적응형 PC, 클론코딩</li>
<li>사용언어 : html, css</li>
<li>제작기간: 3일</li>
</ul>
<h4 id="point">Point</h4>
<ol>
<li>시멘틱 마크업</li>
<li>class 네이밍 규칙</li>
<li>IS/IR 기법</li>
</ol>
<hr>
<h2 id="1-시멘틱-마크업">1. 시멘틱 마크업</h2>
<p>시멘틱 마크업은 글자 그대로 해석하면, &#39;의미론적인 HTML 태그 문서 작성&#39;을 뜻합니다. 즉, 의미를 잘 전달 할 수 있도록 HTML 태그 문서를 작성하는 것을 말합니다.</p>
<h4 id="📌-사용시-장점">📌 <strong>사용시 장점</strong></h4>
<ul>
<li>가독성이 좋아 유지 보수가 편리하다.
  태그 이름으로 영역 확인 가능  <br></li>
<li>검색 엔진 최적화(SEO)에 유리하다.
  검색 엔진이 태그 목적에 부합하게 설계되어 있는  구조의 사이트에서 더욱 빨리 효율적으로 정보를 파악할 수 있어 검색 결과 노출에 유리할 수 있게 한다.  <br></li>
<li>웹 접근성에 효율적이다.<ul>
<li>스크린리더 환경에서 시각장애가 있는 사용자로 하여금 그 의미를 훨씬 잘 파악할 수 있다.<h4 id="📌-사용-방법">📌 <strong>사용 방법</strong></h4>
</li>
</ul>
</li>
<li>헤더/푸터 <pre><code>&lt;header&gt;&lt;/header&gt;
&lt;footer&gt;&lt;/footer&gt;</code></pre></li>
<li>메인 컨텐츠<pre><code>&lt;main&gt;
  &lt;section&gt;&lt;/section&gt;
&lt;/main&gt;
</code></pre></li>
</ul>
<pre><code>- 내비게이션 - 문서의 부분 중 현재 페이지 내, 또는 다른 페이지로의 링크를 보여주는 구획. 자주 쓰이는 예제는 메뉴, 목차, 색인이다.</code></pre><nav></nav>

<pre><code>- 독립적인 요소(article) - 블로그 및 SNS 영역, 뉴스, 신문 논평에 사용</code></pre><article></article>

<pre><code>- 최상위 제목 - h1</code></pre><h1></h1>

<pre><code>- 사이트의 정보 및 연락처 기입 - address</code></pre><address></address>

<pre><code>- form/fieldset/legend</code></pre><form> - 사용자 입력을 위한 다양한 형식의 컨트롤로 구성된 영역
    <fieldset> -폼 내의 관련 컨트롤을 하나의 그룹으로 묶은 것
        <legend></legend> - fieldset의 제목
    </fieldset>
</form>
```
- 이외 태그 사용
```<button>```: 클릭이 가능하며 form요소에 입력된 내용을 서버로 전송할 때 사용
```<a>```:클릭 가능하며 페이지 내의 다른 영역으로 링크 이동을 할 수 있는 영역에 사용 
```<strong>```: 문장 강조할 때
```<em>```: 단어 강조할 때
```<span>```: 의미 없는 텍스트, 블라인드 기법에 사용
```<p>```: 긴 문장 적을 때
```<i>```: 아이콘 요소

<h2 id="2-class-네이밍-규칙">2. class 네이밍 규칙</h2>
<h4 id="✅-각-계층별-class-네이밍-규칙">✅ 각 계층별 class 네이밍 규칙</h4>
<p><code>[header/section/footer] -&gt; [group] -&gt; [area] -&gt; [wrap] -&gt; [box]</code></p>
<h4 id="📌-각-태그별-클래스-명">📌 <strong>각 태그별 클래스 명</strong></h4>
<ul>
<li><strong>section 태그</strong><ul>
<li>sc-000</li>
</ul>
</li>
<li>*<em>a 태그 *</em><ul>
<li>link-000</li>
</ul>
</li>
<li><strong>button 태그</strong><ul>
<li>btn-000</li>
</ul>
</li>
<li><strong>ul/li 태그</strong><ul>
<li>ul : 000-list</li>
<li>li : 000-item<h2 id="3-iris-기법">3. IR&amp;IS 기법</h2>
</li>
</ul>
</li>
<li>IR(Image Replacement) 기법은 이미지를 볼 수 없는 사용자에게 적절한 대체 텍스트를 제공하는 것으로 이는 웹 접근성 준수를 위한 스크린 리더 사용자뿐 아니라 검색 엔진의 효과적인 내용 수집을 위해서도 필요하다.</li>
</ul>
<h4 id="네이버의-ir기법">네이버의 IR기법</h4>
<pre><code class="language-css">.blind {
    position: absolute;
    clip: rect(0 0 0 0);
    width: 1px;
    height: 1px;
    margin: -1px;
    overflow: hidden;
}</code></pre>
<ul>
<li>IS(Image sprite) 기법은 사용하고자 하는 이미지들을 모아 하나의 이미지로 만들어 그 이미지 파일만 서버에 요청하고, CSS의 background-image와 background-position 속성을 이용해 원하는 이미지가 있는 부분을 잘라서 사용한다. background-position은 배경 이미지의 위치를 지정하고 배치하는 속성이다.
<img src="https://velog.velcdn.com/images/cloud_kim/post/4d3922dc-6b09-45b7-ba79-be8f1e714cec/image.png" alt="">(네이버의 IS이미지)<h4 id="is기법-예시">IS기법 예시</h4>
<pre><code class="language-css">.sc-news .group-title .link-title::before,
.sc-news .group-title .link-title::after,
.sc-sidenews .btn-wrap .btn-nav.next::before,
.sc-sidenews .btn-wrap .btn-nav::before,
.scroll-top::before,
.sc-login .flex-area::before,
.sc-login .flex-area .link-join::before,
.gnb .nav-item .ico-mail{
  background-image: url(../img/sp-bg.png);
  background-size: 442px;
  background-repeat: no-repeat;
} </code></pre>
<pre><code class="language-css">.gnb .nav-item .ico-mail {
  display: inline-block;
  width: 21px;
  height: 21px;
  background-position: -420px -73px;</code></pre>
IS기법과 IR기법을 함께 사용하면 서버로의 요청 횟수를 최소화하여 웹 페이지의 로딩 속도를 줄일 수 있고, 이미지들을 관리하기 쉬워진다.</li>
</ul>
<p>📂 <strong><a href="http://www.spritecow.com/">http://www.spritecow.com/</a></strong> - image sprite 좌표값을 알 수 있는 사이트</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[태그]]></title>
            <link>https://velog.io/@cloud_kim/%ED%83%9C%EA%B7%B8</link>
            <guid>https://velog.io/@cloud_kim/%ED%83%9C%EA%B7%B8</guid>
            <pubDate>Thu, 15 Jun 2023 16:39:36 GMT</pubDate>
            <description><![CDATA[<pre><code>&lt;h&gt; - 제목 및 타이틀
&lt;em&gt; - 단어 강조
&lt;strong&gt; - 문장 강조
&lt;p&gt; - 긴 문장
&lt;span&gt; - 의미 없는 단어

&lt;img&gt; alt에 설명 없으면 =&quot;&quot; 뺴기
&lt;button&gt; 버튼에 aria-label로 설명 넣기
&lt;section&gt; 각 섹션을 나눌때 사용

.blind - 섹션 바로 밑에 섹션의 대제목을 작성 후 css로 숨겨줌</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[css] 말줄임]]></title>
            <link>https://velog.io/@cloud_kim/css-%EB%A7%90%EC%A4%84%EC%9E%84</link>
            <guid>https://velog.io/@cloud_kim/css-%EB%A7%90%EC%A4%84%EC%9E%84</guid>
            <pubDate>Wed, 24 May 2023 02:38:02 GMT</pubDate>
            <description><![CDATA[<pre><code>display: -webkit-box;
overflow: hidden;
max-height: 40px;
line-height: 20px;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
text-overflow: ellipsis;
white-space: normal;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[내가 보려고 만든 단축키 목록]]></title>
            <link>https://velog.io/@cloud_kim/%EB%82%B4%EA%B0%80-%EB%B3%B4%EB%A0%A4%EA%B3%A0-%EB%A7%8C%EB%93%A0-vscode-%EB%8B%A8%EC%B6%95%ED%82%A4-%EB%AA%A9%EB%A1%9D</link>
            <guid>https://velog.io/@cloud_kim/%EB%82%B4%EA%B0%80-%EB%B3%B4%EB%A0%A4%EA%B3%A0-%EB%A7%8C%EB%93%A0-vscode-%EB%8B%A8%EC%B6%95%ED%82%A4-%EB%AA%A9%EB%A1%9D</guid>
            <pubDate>Wed, 24 May 2023 02:21:34 GMT</pubDate>
            <description><![CDATA[<h1 id="vscode">vscode</h1>
<p>[화면분할]</p>
<ul>
<li>화면 수직 분할: Ctrl + K Ctrl + \</li>
<li>화면 분할: Ctrl + \</li>
<li><blockquote>
<p>맥은 ctrl 대신 cmd</p>
</blockquote>
</li>
</ul>
<h1 id="github-desktop">github desktop</h1>
<p>[vscode]</p>
<ul>
<li>켜기 : Ctrl + Shift + A</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[230502_기록]]></title>
            <link>https://velog.io/@cloud_kim/230502%EA%B8%B0%EB%A1%9D</link>
            <guid>https://velog.io/@cloud_kim/230502%EA%B8%B0%EB%A1%9D</guid>
            <pubDate>Tue, 02 May 2023 14:39:38 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h1 id="aria-label">aria-label</h1>
<p><strong>HTML요소에 접근 가능한 설명용 텍스트를 넣을 수 있다.</strong></p>
</blockquote>
<ul>
<li>화면에 현재 요소를 설명할 텍스트가 없을 경우에 사용하는 설명용 텍스트를 담고있다.</li>
</ul>
<blockquote>
<h1 id="aria-hiddentrue">aria-hidden:true</h1>
<p><strong>HTML요소에 접근 가능한 설명용 텍스트를 넣을 수 있다.</strong></p>
</blockquote>
<ul>
<li>웹페이지 제작자는 웹 페이지의 일부 콘텐츠를 숨길 필요가 있습니다. 대표적으로, 버튼을 클릭했을 때 관련 콘텐츠가 펼쳐지거나, 탭 위젯에서 탭을 활성화하는 등 사용자가 페이지에서 컨트롤과 상호작용한 후 불필요한 콘텐츠 등이 될 수 있습니다. 콘텐츠를 숨기는 대표적인 기술로는 CSS의 display:none, visibility:hidden 등이 있습니다. 이러한 기술은 웹페이지에서 콘텐츠가 보이지 않도록 시각적으로 콘텐츠를 숨길 뿐만 아니라 스크린 리더와 같은 보조기술로도 탐색할 수 없습니다. aria-hidden은 스크린 리더와 같은 보조 기술을 사용하는 사용자를 대상으로 콘텐츠의 탐색을 제한합니다. aria-hidden이 &quot;true&quot;로 설정되면, 스크린 리더로 해당 콘텐츠를 가상 커서로 탐색할 수 없습니다.</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>