제작기간 : 23.02.25 ~ 23.02.27 (3일)
사용 : HTML, CSS
분류 : 클론코딩, mobile
- index.html
- assets/css/common.css
- assets/css/font.css
- assets/css/layout.css
- assets/css/main.css
- assets/css/reset.css
- assets/fonts/폰트파일
- assets/images/이미지파일
- assets/js/main.js
<path>
: 경로를 정의함. 선, 곡선 등 다양한 형태를 그릴 수 있음. fill 속성으로 이미지 색깔을 채움방문자의 로컬 컴퓨터의 폰트 설치 여부와 상관없이 온라인의 특정 서버에 위치한 폰트파일을 다운로드하여 화면에 표시해주는 웹 전용 폰트
@font-face { /* 웹 브라우저에게 내려받을 폰트의 이름과 경로를 알려줌 */
font-family: 'Gilory'; /* 사용할 폰트명 */
src: url('../fonts/Gilroy-Regular.woff2') format('woff2'); /* 저장 위치, 확장자 */
font-weight: 400; /* 두께 */
}
WOFF : Web Open Font Format. 웹용 글자 포맷으로, 최신 웹 브라우저 대부분에서 지원함. 확장자는 .woff
WOFF2 : WOFF보다 30% ~ 50% 정도 더 압축되어 훨씬 가벼움. WOFF처럼 최신 웹 브라우저 대부분에서 지원함. 따라서 가장 좋은 폰트 포맷. 확장자는 .woff2
개발자모드 켜기 -> Network 클릭 -> font 클릭 -> 새로고침 -> 원하는 font 더블클릭
$(window).trigger()
새로고침 했을 때 가끔 인식이 안 되는 경우가 있음! - 새로고침 했을 때, 스크롤 이벤트를 한 건 아니라서 이벤트가 실행이 안 되어서 그럼. 그래서, $(window).trigger('scroll')를 넣어줌. 이것은 페이지가 로드될 때 스크롤 이벤트를 한 번 실행한 효과를 줌.
/* 최상단의 이벤트 슬라이드 높이가 40px이기 때문에 헤더는 그만큼 밑에 위치시켰음 */
.header{
position: absolute;
top: 40px;
width: 100%;
z-index: 10;
}
...
/* 헤더가 고정됐을 때 */
.header.fixed{
position: fixed;
top: 0;
}
$(window).scroll(function(){
curr=$(this).scrollTop();
if (curr > 0) { // 현재 스크롤바 위치가 0보다 크다면,
$('.header').addClass('fixed'); // header를 고정해라
} else { // 현재 스크롤바 위치가 0이라면,
$('.header').removeClass('fixed'); // header를 고정하지 말아라
};
});
$(window).trigger('scroll'); // 페이지가 로드될 때 스크롤 이벤트를 한 번 실행한 효과
📌html
<nav class="gnb">
<div class="group-nav">
<span class="all-text">전체메뉴</span>
<ul class="nav-list">
<li class="nav-item hot"><a href="">봄 신상</a></li>
<li class="nav-item hot"><a href="">베스트</a></li>
<li class="nav-item"><a href="">우먼즈</a></li>
<li class="nav-item"><a href="">맨즈</a></li>
<li class="nav-item hot"><a href="">릴레어</a></li>
<li class="nav-item"><a href="">아울렛</a></li>
</ul>
<button class="btn-all"><span class="blind">전체메뉴 보기</span></button>
</div>
<div class="group-all">
<ul class="nav-list">
<li class="nav-item hot"><a href="">봄 신상</a></li>
<li class="nav-item hot"><a href="">베스트</a></li>
<li class="nav-item"><a href="">우먼즈</a></li>
<li class="nav-item"><a href="">맨즈</a></li>
<li class="nav-item hot"><a href="">릴레어 시리즈</a></li>
<li class="nav-item"><a href="">아울렛</a></li>
<li class="nav-item"><a href="">홈트용품&액세서리</a></li>
<li class="nav-item"><a href="">서스테이너블</a></li>
<li class="nav-item"><a href="">요기니 요가복</a></li>
</ul>
</div>
</nav>
📌css
/* 기본적으로 gnb는 안 보임 */
.gnb{
visibility: hidden;
opacity: 0;
...
}
/* 헤더가 고정되면 gnb가 보임 */
.header.fixed .gnb{
visibility: visible;
opacity: 1;
}
.gnb .group-nav .nav-list{ /* 보임 */
display: flex;
}
.gnb .group-nav .all-text{ /* 안 보임 */
display: none;
...
}
.gnb .group-all{ /* 안 보임 */
display: none;
...
}
/* open */
.gnb.open .group-nav .btn-all{
transform: rotate(180deg);
}
.gnb.open .group-nav .nav-list{ /* .open이 들어가면 .group-nav .nav-list는 숨겨짐 */
visibility: hidden;
}
.gnb.open .group-nav .all-text{ /* .open이 들어가면 .all-text는 보여짐 */
display: block;
}
📌js
$('.gnb .btn-all').click(function(){
$('.gnb').toggleClass('open'); // gnb .all-text와 .group-nav .nav-list 토글
$('.gnb .group-all').slideToggle(); // gnb .group-all 슬라이드 토글
});
📌css
.hidden{
overflow: hidden;
}
.dimmed{
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 15;
background: rgba(0,0,0,.5);
/* 기본적으로 dimmed는 보이지 않음 */
visibility: hidden;
opacity: 0;
}
body.hidden .dimmed{ /* dimmed는 body에 hidden 클래스가 들어갔을 때만 보임!*/
visibility: visible;
opacity: 1;
}
📌js
$('.btn-menu').click(function(){
$('.side-nav').addClass('on');
$('body').addClass('hidden'); // body 스크롤 불가
});
$('.side-nav .btn-close, .dimmed').click(function(){
// 닫기 버튼을 누르거나 dimmed를 클릭하면 팝업창이 닫힘.
$('.side-nav').removeClass('on');
$('body').removeClass('hidden'); // body 스크롤 가능
});
.prd-list라는 알맹이 클래스를 만들어서 비슷한 레이아웃에 공통적으로 사용했음.
제품이 두 개씩 나오는 영역에는 .list1,
제품이 수평으로 나오는 영역에는 .list2라는 클래스를 추가로 줘서
다르게 꾸밀 수밖에 없는 부분에 대응했음.
BEST 영역과 이달의 신상 영역은 레이아웃이 아예 똑같이 생겼기 때문에 .sc-prd 클래스로 한번에 꾸몄음.
📌html
<header class="header">
<div class="group-flex">
<h1 class="logo">
<a href="">
<span class="blind">안다르 로고</span>
<svg width='80' height='21' viewBox='0 0 80 21' xmlns='... 생략'>
<path ... 생략 fill='#fff'/>
<!-- 기본으로 지정한 path의 fill 속성값이 #fff, 즉 svg는 흰색 -->
</svg>
</a>
</h1>
<div class="util-area">
<button class="btn btn-menu">
<span class="blind">메뉴</span>
<svg width='20' height='17' viewBox='0 0 20 17' xmlns='... 생략'>
<path ... 생략 fill='#fff'/>
</svg>
</button>
<button class="btn btn-search">
<span class="blind">검색</span>
<svg width='20' height='21' viewBox='0 0 20 21' xmlns='... 생략'>
<path ... 생략 fill='#fff'/>
</svg>
</button>
</div>
<div class="util-area">
<a href="" class="btn btn-cart">
<span class="blind">장바구니</span>
<span class="count">0</span>
<svg width='20' height='21' viewBox='0 0 20 21' xmlns='... 생략'>
<path ... 생략 fill='#fff'/>
</svg>
</a>
<a href="" class="btn btn-mypage">
<span class="blind">마이페이지</span>
<svg width='20' height='21' viewBox='0 0 20 21' xmlns='... 생략'>
<path ... 생략 fill='#fff'/>
</svg>
</a>
</div>
</div>
</header>
📌css
/* 헤더가 고정됐을 때 */
.header.fixed{
position: fixed;
top: 0;
}
.header.fixed .group-flex svg path{ /* 동일하게 꾸미기 위해서 똑같은 클래스를 줌 */
/* header 클래스가 fixed일 때, path의 fill 속성값을 #000로 지정, 즉 svg는 검정색 */
fill: #000;
}
.sc-intro .intro-slide{
width: 100%;
height: calc(100vh - 140px);
min-height: 430px;
}
The W3C Markup Validation Service의 Nu Html Checker를 통해 index.html의 마크업이 웹 표준에 적합함을 확인했습니다.