helbak 사이트 따라하기, 실무팁, 아이디어스 웹사이트 어제 한 부분 모바일버전 만들기
지난 시간까지는 kidsgao 웹사이트를 적응형으로 만들었는데, 이번엔 반응형 웹사이트 만드는 것을 연습하기 위해 helbak 사이트를 따라 만들어 보았다. 이 사이트는 특이하게 미디어쿼리 밖에서 모바일 버전을 먼저 작업하고 미디어쿼리 안에서 pc버전을 작성하였다.
github소스코드-helbak
*
: 모든 태그 선택. 레이아웃 배치 쉽게 하기 위해 margin, padding을 없애주고 box-sizing 조정해준다.body height:100%
->크롬에서 body의 크기 실시간 확인 가능font-weight
: 폰트 굵기. 100~900 백 단위로 올라가며 클수록 굵음<img>
-vertical-align:middle
: 이미지 하단 미세공백 제거<span>
-display:block
: 원래 inline 요소지만 여기서는 block으로 활용하기 위해 지정함* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html, body {
width: 100%;
height: 100%;
}
body {
overflow-x: hidden;
font-family: sans-serif;
color: #585858;
}
h1, h2, h3, h4, h5, h6, p {
font-weight: 400;
}
ul {
list-style: none;
}
a {
text-decoration: none;
}
img {
vertical-align: middle;
}
span {
display: block;
}
<svg>
: helbak 사이트의 로고가 svg 태그로 들어가있었다. 해당 코드를 붙여넣어보니 똑같은 이미지가 뜨는 것을 확인했다.svg는 백터(vector) 이미지를 표현하기 위한 포맷으로 w3c에서 만든 백터 이미지 표준입니다. (from 생활코딩)
position:relative
-> top:50%
+ transform: translateY(-50%)
#header .buttons li .menu-button img {
position: relative;
height: 20px;
top: 50%;
transform: translateY(-50%);
}
float
으로 3차원 속성 가지게 되면 부모 태그의 높이에 영향을 못 준다. 이때 부모 태그에 overflow:hidden
속성을 주어 자식 태그의 높이값을 가지게 할 수 있다.#header .buttons ul {
overflow: hidden;
}
#header .buttons ul li {
position: relative;
float: left;
width: 33.3333%;
height: 65px;
}
<ul>
-<li>
-<a>
순서로 부모자식 관계가 형성되는데, li의 width, height값을 정하고 a태그를 그 안에 block으로 가득 채워서 버튼을 완성하였다.#header .buttons ul li {
position: relative;
float: left;
width: 33.3333%;
height: 65px;
}
#header .buttons ul li .menu-button {
display: block;
width: 100%;
height: 100%;
text-align: center;
}
min-width
만 사용하여 최소 넓이를 초과하는 브라우저 넓이에 대해서 pc버전으로 적용되게 함position:absolute
사용 시 width값을 자동으로 인식하기가 어려우니 width값을 직접 정해주는 것이 좋다.buttons
요소에 position:absolute
를 주고 left로 일단 오른쪽으로 옮긴다음 top으로 위로 올렸다.@media (min-width: 47em) {
#header .buttons {
position: absolute;
width: 50%;
left: 50%;
top: 0;
}
#header .buttons {
position: absolute;
width: 50%;
left: 50%;
top: 0;
}
}
<article>
사용 시 내부에 <h>
태그 등을 사용하여 제목을 정해주어야 한다.<img>
태그를 사용할 때, 부모 태그인 공간의 크기를 내부 이미지 크기와 비슷하게 맞춰준다. 내부 이미지가 부모 공간을 가득 채우게 설정하면 브라우저 크기가 변화함에 따라 이미지도 부드럽게 리사이즈된다.<article>
<h2 class="link-text">Product1</h2>
<img src="https://via.placeholder.com/1000x563" alt="">
</article>
.main-content .product-group-link {
position: relative;
display: block;
width: 100%;
height: 56.3%;
border: solid 3px purple;
overflow: hidden;
}
.main-content .product-group-link img {
width: 100%;
height: 100%;
}
position:fixed
속성을 가지고 있어 그 아래 형제 태그인 main과 겹치게 된다. 따라서 header의 position이 변하는 min-width
값에 해당하는 미디어쿼리 안에 padding-top
을 사용해 header 크기만큼 공백을 넣어준다.@media (min-width: 47em) {
.main-content {
padding-top: 80px;
}
}
<span>
태그의 경우, 크기는 같지만 각각의 색상을 다르게 하기 위해 크기 조절용 class, 색상 조절용 class를 하나씩 만들었다.display:inline-block
속성을 주는 것만으로도 x축 정렬 할 수 있다.position:absolute
사용하였고 display:block
을 이용해 크기를 지정할 수 있게 변경한 후 위치를 조정해주었다.<li><span class="payment-icon one"></span></li>
<li><span class="payment-icon two"></span></li>
#footer {
position: relative;
padding-bottom: 66px;
}
#footer .right-methods li {
display: inline-block;
padding: 7px 4px;
}
#footer .right-methods .payment-icon {
display: inline-block;
width: 30px;
height: 20px;
}
#footer .right-methods .payment-icon.one {
background-color: black;
}
#footer .right-methods .payment-icon.two {
background-color: blue;
}
#footer .to-top-button {
position: absolute;
display: block;
width: 66px;
height: 66px;
background-color: coral;
bottom: 0;
left: 50%;
margin-left: -33px;
}
float
을 사용해 3차원 속성을 가지게 되었다. 즉 자식들의 높이값이 부모에게 영향을 주지 않고 있어서 padding-bottom
을 이용해 맨위로가는 버튼이 자리할 공간을 만들어주었다. 여기서 미디어쿼리 밖에 footer의 height가 아닌 padding-bottom을 조정한 이유는 모바일버전과 pc 둘 다 적용하기 위함이라고 이해했다. (모바일 버전은 내부 요소가 세로로 정렬되어 height가 더 커야 한다.)<a>
의 href 속성값으로 #id를 전달하면 해당 태그 클릭 시 href에 적힌 id 요소의 맨 위로 이동한다.<ul>
<li><a href="#one">one</a></li>
<li><a href="#two">two</a></li>
<li><a href="#three">three</a></li>
<li><a href="contact.html">contact</a></li>
</ul>
<div id="one">one</div>
<div id="two">two</div>
<div id="three">three</div>
원래 지정된 공간 안에 그 넓이를 벗어날만큼 글자를 많이 넣으면 자동으로 줄바꿈이 일어난다. 한 줄 안을 넘어가면 말줄임 표시하는 속성 세트가 있다. 이런 속성만을 가진 별도 클래스 ellipsis
를 따로 만들어서 사용하면 편리하다.
white-space: nowrap
: 자동 줄바꿈을 하지 않는 속성. 영역을 벗어나는 글자들이 한 줄에 길게 입력된다.overflow:hidden
: 넘어가는 내용을 안 보이게 처리한다.text-overflow: ellipsis
: 글자가 넘치는 경우 말줄임 표시하는 속성값<p class="text-box ellipsis">dkjalsfjiwefjaif</p>
.ellipsis {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
ellipsis
뿐만 아니라 clearfix:both
, padding
, margin
등 자주 사용되는 속성들만 가진 클래스를 css에 미리 설정해놓고 html에 적용할 수 있다. 코드도 간결해지고, html의 클래스명만 봐도 해당 태그에 적용된 css 효과를 유추할 수 있다는 장점이 있다. vscode에서는 미리 만들어 둔 class를 html에 작성할 때 자동완성 기능을 지원해서 좋았다.
<p class="text-box ellipsis">hello world</p>
<div class="clearfix"></div>
<h1 class="ellipsis m-b-10">hello world</h1>
.ellipsis {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.m-b-10 {
margin-bottom: 10px;
}
.clearfix {
clear: both;
}
<i>
태그 사용하는 것으론 뭔가 잘 안떠서 유니코드를 사용해서 넣었다. 지금 방법은 css 코드가 너무 길어지는데 다음에 다시 시도해봐야겠다.#nav-bot {
position: fixed;
display: none;
width: 100%;
height: 50px;
background-color: #fff;
border-top: 1px solid #d9d9d9;
bottom: 0;
z-index: 150;
}
#nav-bot ul li a .icon-art::before {
display: block;
content: "\f54e";
font-family: "Font Awesome 5 Free";
font-size: 1.0em;
font-weight: 600;
}
#today-art .today-frame ul .card {
position: relative;
width: 48%;
height: 350px;
font-size: 12px;
border: 1px solid #d9d9d9;
margin: 0 10px 20px 0;
}
#today-art .today-frame ul .card .product-img {
width: 100%;
height: 60%;
overflow: hidden;
}
#today-art .today-frame ul .card .product-img img {
width: 100%;
height: 100%;
}
처음부터 계획을 짜고 시작하지 않으니 되는대로 코드를 갖다붙이게 되는데 오늘 모바일용 미디어쿼리를 작성하면서 헷갈려서 고생했다. 다시보면 중복이라 삭제해야 하거나 합쳐도 되는 코드들이 많을 것 같다.
일단 클래스 명을 적절히 지은게 도움이 되었다.
어제 실습하면서 어려웠던 것 중 하나는 부모자식 관계의 태그 중 어느 곳을 조정해야 할 지 결정하는 것이었다. 오늘도 리스트 아이템 태그 안에 <a>
태그, 이미지 태그 등 다양하게 들어가 있었는데 자주 사용되는 패턴을 익혀야겠다.
강의를 들을 땐 html로 뼈대를 짜고 css로 넘어가면 html을 수정할 일이 없는데, 혼자 연습하면 css를 하다가도 html을 수정해야 할 일이 생긴다. 그냥 설계도 만드는 데 익숙해질때까지 많이 해보는 것 밖엔 답이 없는 것 같다.
어제 만든 아이디어스 홈페이지 부분의 모바일 버전 미디어쿼리 작업을 했다. 영상에 나온 코드를 그대로 보고 칠 땐 쉬워보였는데 역시 막상 혼자 해보니 코드도 중구난방이고 혼란스럽다. 그래도 어떻게든 했으니 뿌듯하다.