강사님의 깃헙페이지
웹페이지를 만들 때 할 것이 너무 많아서 우왕좌왕 할 것 같은데 어디서부터 시작하고 문제를 해결하려는 사고방식 같은 것을 주의하면서 배워보기
<html lang="ko">
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>Starbucks Coffee Korea</title>
탭 옆의 아이콘 띄우기
<link rel="icon" href="./favicon.png"/>
<img src="https://velog.velcdn.com/images/stel1ight/post/925cf5fd-d26b-4b61-aa59-26285b8c1054/image.png" width=150px/>
이렇게 설정을 해주지 않으면 브라우저는 자동으로 favicon.ico를 찾아 넣는다.
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/reset-css@5.0.1/reset.min.css"/>
<link rel="stylesheet" href="./css/main.css"/>
오픈 그래프 : 웹페이지가 공유될 때 우선적으로 활용 되는 메타정보
<meta property="og:type" content="website" />
<meta property="og:site_name" content="Starbucks" />
<meta property="og:title" content="Starbucks Coffee Korea" />
<meta property="og:description" content="스타벅스는 세계에서 가장 큰 다국적 커피 전문점으로, 64개국에서 총 23,187개의 매점을 운영하고 있습니다." />
<meta property="og:image" content="./images/starbucks_seo.jpg" />
<meta property="og:url" content="https://starbucks.co.kr" />
<meta property="twitter:card" content="summary" />
<meta property="twitter:site" content="Starbucks" />
<meta property="twitter:title" content="Starbucks Coffee Korea" />
<meta property="twitter:description" content="스타벅스는 세계에서 가장 큰 다국적 커피 전문점으로, 64개국에서 총 23,187개의 매점을 운영하고 있습니다." />
<meta property="twitter:image" content="./images/starbucks_seo.jpg" />
<meta property="twitter:url" content="https://starbucks.co.kr" />
이미지나 아이콘들이 필요할 때
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons"/>
<span class="material-icons">login</span>
데모의 헤더는 총 네부분으로 구성되어 있다
|로|서브메뉴|
|고|메인메뉴 |
뱃지
헤더는 스크롤 위치에 상관 없이 항상 위에 다른요소보다 떠있어야 함
HTML
CSS
HTML
.inner 안, .logo 아래에 .sub-menu div를 만들어준다
<div class="sub-menu">
<ul class="menu">
<li>
<a href="/signin">Sign In</a>
</li>
<li>
<a href="javascript:void(0)">My Starbucks</a>
</li>
<li>
<a href="javascript:void(0)">Customer Service & Ideas</a>
</li>
<li>
<a href="javascript:void(0)">Find a Store</a>
</li>
</ul>
<div class="search">
<input type="text"/>
<div class="material-icons">search</div>
</div>
</div>
.inner 안의 오른쪽 상단에 위치해야 한다
CSS
JS
돋보기 아이콘을 인풋 안에 놓긴 했지만 돋보기가 아닌 인풋 테두리를 클릭해야 효과가 나타나는 상황!
돋보기를 클릭했을 때도 그 효과가 나타나도록 해주자.
const searchEl = document.querySelector('.search');
const searchInputEl = searchEl.querySelector('input');
searchEl.addEventListener('click',function(){
searchInputEl.focus();
});
searchInputEl.addEventListener('focus',function(){
searchEl.classList.add('focused');
searchInputEl.setAttribute('placeholder','통합검색');
});
searchInputEl.addEventListener('blur',function(){
searchEl.classList.remove('focused');
searchInputEl.setAttribute('placeholder','');
});
<script defer src="./js/main.js"> </script>
CSS
인풋이 포커스 되었을 때는 돋보기를 숨겨주기
header .sub-menu .search.focused .material-icons {
opacity: 0;
}
JS에서 생성된 focused 클래스는 .search와 함께 사용되는 것이므로 바로 붙여서 명시한다 (.search.focused)
다른 줄에 배치 되어있던 검색창과 서브메뉴를 양 옆으로 배치되도록 해주기
메인메뉴
↳ 드롭다운 메뉴 li class="item":hover COFFEE
↳ class="item__name" 커피
↳ class="item__contents" 원두 비아 오리가미
↳ class="contents__texture" 어울리는 커피, 최상의 커피
html 구조를 확인하지 않아도 구조를 파악할 수 있다
언더바 두번: 상위 요소의 일부분
대쉬 두번: 동위 요소의 다른 버젼. 상태
HTML
<ul class="main-menu">
<li class="item">
<div class="item__name">COFFEE</div>
<div class="item__contents">
<div class="contents__menu">
<ul class="inner">
<li>
<h4>커피</h4>
<ul>
<li>스타벅스 원두</li>
<li>스타벅스 비아</li>
<li>스타벅스 오리가미</li>
</ul>
</li>
</ul>
</div>
<div class="contents__texture">
<div class="inner">
<h4>나와 어울리는 커피 찾기</h4>
<p>스타벅스가 여러분에게 어울리는 커피를 찾아드립니다.</p>
<h4>최상의 커피를 즐기는 법</h4>
<p>여러가지 방법을 통해 다양한 풍미의 커피를 즐겨보세요.</p>
</div>
</div>
CSS
header .main-menu {}
header .main-menu .item {}
/* item__name */
header .main-menu .item .item__name{}
header .main-menu .item:hover .item__name {}
/* item__contents */
header .main-menu .item .item__contents {}
header .main-menu .item:hover .item__contents {}
header .main-menu .item .item__contents .contents__menu {}
header .main-menu .item .item__contents .contents__menu > ul {}
header .main-menu .item .item__contents .contents__menu > ul > li {}
header .main-menu .item .item__contents .contents__menu > ul > li h4 {}
header .main-menu .item .item__contents .contents__menu > ul > li ul li {}
header .main-menu .item .item__contents .contents__menu > ul > li ul li:hover {}
header .main-menu .item .item__contents {}
/* item__texture */
.contents__texture {}
header .main-menu .item .item__contents .contents__texture h4 {}
header .main-menu .item .item__contents .contents__texture p {}
호버시 .item__name 드롭다운 메뉴를 내리고 .item__contents 드롭다운 메뉴를 보여준다
contents__menu의 여러 서브메뉴 정렬하기
사진 두개로 구성되고 화면 아래로 가면 사라지는 효과
<div class="badges">
<div class="badge">
<img src="./images/badge1.jpg" alt="Badge"/>
</div>
<div class="badge">
<img src="./images/badge2.jpg" alt="Badge"/>
</div>
</div>
header .badges {}
header .badges .badge {}
JS
아래로 스크롤 되면 사라지게 하기
const badgeEl= document.querySelector('header .badges');
window.addEventListener('scroll',_.throttle(function(){
// _.throttle(함수, 시간)
if (window.scrollY > 500) { //스크롤 위치에 따라서
// 배지 숨기기
// gsap.to(요소, 지속시간, 옵션)
gsap.to(badgeEl, .6, {
opacity: 0, // 시각적으로 없애주기
display: 'none' // 실제로 없애주기
});
} else {
// 배지 보이기
gsap.to(badgeEl, .6, {
opacity: 1,
display: 'block'
});
}
},300));
사진 배치 + 버튼 추가 + 요소들이 순차적으로 등장하게 하기
.visual .fade-in {
opacity: 0;
}
fade-in이라는 class를 추가해준다
const fadeEls = document.querySelectorAll('.visual .fade-in');
fadeEls.forEach(function(fadeEl, index){
gsap.to(fadeEl, 1, {
delay: (index + 1) * .7,
opacity: 1
});
});