📎 https://github.com/eveneul/naver
📎 https://eveneul.github.io/naver/
네이버 웹 사이트를 클론 코딩을 해 보았습니다.
기본적으로 section을 어떻게 나누는지, div를 어디에 적재적소로 사용해야 할지 많이 배웠고,
특히 반응형이 아닌 적응형 웹 사이트로서 분명한 px 단위를 사용하고, flex보다는 float로,
scss의 mixin을 사용해 간단하게 css 코드 구현을 연습했습니다.
크게 로고와 검색창, 퀵메뉴가 있는 nav는 header로,
콘텐츠가 있는 영역은 content로, 그리고 footer 총 세 단위로 나뉘었습니다.
📝 코드 입력
<header class="header"></header>
<div class="contanier"></div>
<footer class="footer"></footer>
웹 접근성을 고려한 콘텐츠 숨기기 (blind)
화면에서는 콘텐츠를 숨겨야 하지만 스크린 리더에서는 읽혀야 하는 경우가 있습니다.
❌ 좋지 못한 예
width: 0;
height: 0;
display: none;
visibility: hidden;
font-size: 0;
line-height: 0;
opacity: 0;
위와 같은 속성을 사용할 경우 화면에서 영역이 잡히지 않기 때문에 스크린 리더로 읽을 수 없어 웹 접근성에 좋지 않은 속성들입니다.
🔵 좋은 예
position: absolute;
width: 1px;
height: 1px;
overflow: hidden;
clip: rect(0 0 0 0);
margin: -1px;
위와 같은 속성들로 blind
라는 클래스에 적용하게끔 설정했습니다.
콘텐츠는 숨기면서 스크린 리더로는 웹을 정상적으로 읽히기 때문에 눈으로 웹을 사용하기 불편한 유저들에게 정확한 콘텐츠를 전달할 수 있습니다.
thumd-bd로 이미지에 border 설정
네이버는 웹 사이트에 있는 광고 이미지, 콘텐츠 이미지 등 모든 이미지에게 옅은 검정색의 border를 설정했습니다. 일일이 img
태그가 사용될 때마다 border: 1px solid #000
를 설정해 주는 것이 아닌 .thumb-bd
라는 클래스에 아래와 같은 속성들을 사용해 border가 필요한 태그에 클래스를 달아두어 간편하게 css를 활용했습니다.
📝 코드 입력
.thumb-bd {
display: block;
position: relative;
&::after {
content: '';
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
border: 1px solid #000;
opacity: 0.1;
}
}
.thumb-bd
클래스가 div
에도, img
나 a
태그에도 사용될 수 있기 때문에 display: block
을 사용하고,
가상요소 선택자인 after
에게 position: absoulte
를 달아 테두리를 적용하기 때문에 기준점을 설정해 주기 위한 position: relative
속성을 작성했습니다.
시맨틱 마크업
div
와 span
만 사용한 문서는 어떠한 영역이 중요한지 구분이 어렵기 때문에 검색 엔진 최적화(SEO)를 위해 각 영역의 의미에 맞는 적절한 태그를 사용하여 마크업했습니다. 또한 장애인과 고령자 등이 비장애인과 동등한 환경에서 웹에 접근하고 이해할 수 있도록 웹 접근성과 다른 개발자와 퍼블리셔와의 협업에 있어서도 가독성을 위해 시맨틱 마크업을 사용했습니다.
사용한 태그 | |
---|---|
header | <header></header> |
footer | <footer></footer> |
독립적인 콘텐츠 | <section></section> |
헤더 제목(로고) | <h1></h1> |
section 제목 | <h2></h2> |
footer 제목 | <h3></h3> |
순서 없는 리스트 | <ul><li></li></ul> |
메뉴(GNB메뉴) | <nav></nav> |
📝 코드 입력
@mixin floatClear {
&::after {
content: '';
display: block;
clear: both;
}
}
overflow: hidden
으로 간편하게 float
를 해제할 수 있지만 position: absolute
속성을 이용하는 경우 부모 요소에 벗어나는 부분은 가려져 보이지 않는 단점이 있으므로 clear: both
로 부모가 자식의 높이를 인식하게끔 설정했습니다. (이경우 display
속성이 block
이어야 해서 display: block
을 설정했습니다)
네이버에서는 웹에 사용하는 아이콘이 많습니다. 이럴 경우 필요할 때마다 각각의 이미지를 불러와서 서버의 과한 트래픽을 초래하기보다는 이런 이미지들을 한꺼번에 합쳐 background-position
으로 사용하고자 하는 아이콘의 위치만 잡아 주면 이미지(아이콘)을 손쉽게 불러올 수 있습니다.
scss를 사용했기 때문에 해당 속성은 일일이 작성하는 것이 아닌 @extend
를 통해 손쉽게 이미지를 불러왔습니다.
.sp-bg { // 초기 설정
background-image: url(../img/sp-bg.png);
background-size: 457px;
background-repeat: no-repeat;
}
&::after { // 사용할 때
@extend .sp-bg;
content: '';
display: inline-block;
width: 44px;
height: 44px;
background-position: 0 -299px;
}
header
에는 로고와 검색창이 있는 부분과 nav, 날씨를 알려 주는 영역이 있는 곳 총 두 가지로 class이름을 각각 group-flex1
, group-flex2
로 나뉘었습니다
group-flex1
에는 로고를 h1 > a
태그로 감싸서 웹 사이트의 정체성을 표현하고, 검색을 할 수 있는 input
은 form
태그로 감쌌습니다.group-flex2
에는 사용자가 자주 사용하는 퀵메뉴를 nav
태그와 현재 사용자가 거주하고 있는 지역의 날씨와 최저 기온, 최고 기온을 알려 주는 날씨 영역이 있습니다.📝 코드 입력
<header class="header">
<div class="group-flex1">
<h1 class="logo"> // 로고 영역
<a href=""><span class="blind">네이버</span></a>
</h1>
<div class="search-area"> // 검색창 영역
<form action="" method="get">
<fieldset>
<legend class="blind">검색</legend>
<input type="text" class="search-text">
<button class="btn-search">
<span class="blind">검색</span>
</button>
</fieldset>
</form>
<a href="" class="btn-keyboard">
<span class="blind">한글입력기 열기</span>
</a>
<a href="" class="btn-arw">
<span class="blind">최근검색어 열기</span>
</a>
</div>
<div class="service-area"> // 네이버, 쥬니버네이버, 해피빈으로 이동할 수 있는 링크 영역
<a href="" class="link-start">네이버를 시작페이지로</a>
<i class="bar"></i>
<a href="" class="link-junior"><span class="blind">쥬니버네이버</span></a>
<a href="" class="link-bin"><span class="blind">해피빈</span></a>
</div>
</div>
<div class="group-flex2">
<div class="inner">
<nav class="gnb-area"> // 퀵메뉴 영역
<ul class="gnb-list">
<li class="gnb-item"><a href="" class="mail"><span>메일</span></a></li>
<li class="gnb-item"><a href=""><span>카페</span></a></li>
<li class="gnb-item"><a href=""><span>블로그</span></a></li>
<li class="gnb-item"><a href=""><span>지식iN</span></a></li>
</ul>
</ul>
</nav>
<div class="weather-area"> // 날씨 영역
<a href="">
<strong class="weather">23.4° 흐림</strong>
<span class="min">22.0°</span>
<span class="max">30.0°</span>
<span class="location">영천동</span>
</a>
</div>
</div>
</div>
</header>
contant
왼쪽영역(column-left
)과 오른쪽영역(column-right
)으로 분리했습니다.
column-left
에는 광고 이미지(링크)와 뉴스, 주제별 포스트 영역 두 개의 section으로 나누었습니다.column-right
에는 로그인 영역, 주식, 환율, 코로나 이슈를 담은 사이드 뉴스, 그리고 트랜드 쇼핑 영역을 담은 세 개의 section
과 작은 광고 이미지(링크)를 배치했습니다특히 네이버에서는 사이드 뉴스 이름을 타임스퀘어로 설정하고 .blind
클래스를 주었는데, 제가 만약 웹 화면을 눈으로 보기 어려운 상황으로 스크린 리더를 사용해 웹을 사용하는 사용자라고 생각한다면 타임스퀘어라는 제목을 들었을 때 해당 영역의 의도나 사용법에 대해 의아할 것 같아서 타임스퀘어라는 section
의 이름보다는 조금 더 쉽게 의도하고자 하는 영역을 이해할 수 있게끔 사이드 뉴스로 수정했습니다.
📝 코드 입력
<div class="column-left">
<div class="ad-top">
<img src="" alt="">
</div>
<section class="sc-news">
<h2 class="blind">뉴스스탠드</h2>
<div class="group-issue"></div>
<div class="group-title"></div>
<div class="content"></div>
</section>
<section class="sc-themepost">
<h2 class="blind">주제별 포스트</h2>
<div class="group-title"></div>
<div class="group-theme"></div>
<div class="content"></div>
</section>
</div>
<div class="column-right">
<section class="sc-login">
<h2 class="blind">로그인</h2>
<p class="login-msg"></p>
<a href="" class="link-login"></a>
<div class="sub-area"></div>
</section>
<section class="sidenews">
<h2 class="blind">사이드뉴스</h2>
<a href="" class="link-sidenews"></a>
<div class="navi"></div>
</section>
<div class="ad-right"></div>
<div class="sc-shop">
<div class="group-title"></div>
<div class="contnent"></div>
</div>
</div>
footer에는 크게 3개의 배너가 있는 banner-area
, 공지사항이 있는 notice-area
, 네이버와 협업하려는 사용자들을 위한 사이트들인 aside-area
, 네이버를 소개하는 corp-area
가 있습니다.
각각의 div들마다 제목은 h3로 작성했습니다.
<footer>
<div class="inner">
<div class="banner-area"></div>
<div class="notice-area"></div>
<div class="aside-area"></div>
<div class="corp-area"></div>
</div>
</footer>