[웹 UI 개발] 반응협 웹 - 2 / 모바일 환경
이전 포스트에서 만든 PC버전 웹페이지를 그대로 사용한다.
아래 조건에 맞는 모바일 버전 웹페이지를 제작
- header : 배경색 lightseagreen, 로고 폰트 크기 40px, 로고 폰트 색 #fff
- header GNB : 배경색 lightslategray, 메뉴 폰트 크기 25px, 메뉴 폰트 색 #fff
- content : 리스트 폰트 크기 14px, 리스트 폰트 색 #fff
- footer : 배경색 lightcoral, 폰트 크기 14px, 폰트 색 #000
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width==device-width, initial-scale=1.0">
<title>반응형 웹</title>
<link rel="stylesheet" href="css/reset.css">
<link rel="stylesheet" href="css/responsive.css">
</head>
<body>
<div class="wrap">
<header>
<a href="#" class="logo"><h1>LOGO</h1></a>
<a href="#" class="gnb_menu">gnb_menu</a>
<nav>
<a href="#">MENU1</a>
<a href="#">MENU2</a>
<a href="#">MENU3</a>
<a href="#">MENU4</a>
<a href="#">MENU5</a>
<a href="#">MENU6</a>
<a href="#">MENU7</a>
<a href="#">MENU8</a>
</nav>
</header>
<section>
<ul class="list">
<li>
<a href="" class="inner">
<div class="thumb">
<img src="img/thumb.png" alt="썸네일이미지">
</div>
<div class="title">
긴~~~~~~~~~~~~~~~~~~~~~~~~~~~~~타이틀
</div>
</a>
</li>
<li>
<a href="" class="inner">
<div class="thumb">
<img src="img/thumb.png" alt="썸네일이미지">
</div>
<div class="title">
타이틀입니다.
</div>
</a>
</li>
<li>
<a href="" class="inner">
<div class="thumb">
<img src="img/thumb.png" alt="썸네일이미지">
</div>
<div class="title">
타이틀입니다.
</div>
</a>
</li>
<li>
<a href="" class="inner">
<div class="thumb">
<img src="img/thumb.png" alt="썸네일이미지">
</div>
<div class="title">
타이틀입니다.
</div>
</a>
</li>
<li>
<a href="" class="inner">
<div class="thumb">
<img src="img/thumb.png" alt="썸네일이미지">
</div>
<div class="title">
타이틀입니다.
</div>
</a>
</li>
<li>
<a href="" class="inner">
<div class="thumb">
<img src="img/thumb.png" alt="썸네일이미지">
</div>
<div class="title">
타이틀입니다.
</div>
</a>
</li>
<li>
<a href="" class="inner">
<div class="thumb">
<img src="img/thumb.png" alt="썸네일이미지">
</div>
<div class="title">
타이틀입니다.
</div>
</a>
</li>
<li>
<a href="" class="inner">
<div class="thumb">
<img src="img/thumb.png" alt="썸네일이미지">
</div>
<div class="title">
타이틀입니다.
</div>
</a>
</li>
<li>
<a href="" class="inner">
<div class="thumb">
<img src="img/thumb.png" alt="썸네일이미지">
</div>
<div class="title">
타이틀입니다.
</div>
</a>
</li>
<li>
<a href="" class="inner">
<div class="thumb">
<img src="img/thumb.png" alt="썸네일이미지">
</div>
<div class="title">
타이틀입니다.
</div>
</a>
</li>
</ul>
</section>
<footer>
<p>footer--footer--footer--footer--footer--footer</p>
</footer>
</div>
</body>
</html>
@charset "UTF-8";
a {
text-decoration: none;
}
header {
overflow: hidden;
background-color: pink;
padding: 20px;
}
.logo {
float: left;
font-size: 20px;
color: #fff;
}
nav {
float: right;
}
nav a {
padding: 0 5px;
font-size: 20px;
color: #fff;
}
.gnb_menu {
display: none;
}
footer {
height: 50px;
line-height: 50px;
text-align: center;
background-color: #ccc;
font-size: 14px;
color: #000;
}
section {
overflow: hidden;
max-width: 900px;
margin: 50px auto;
}
.list {
margin: -5px;
overflow: hidden;
}
.list li {
float: left;
width: 20%;
}
.inner {
display: block;
margin: 5px;
border: 1px solid #000;
}
.thumb img {
width: 100%;
height: auto;
}
.title {
padding: 5px 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
text-align: center;
font-size: 14px;
color: #555;
}
@media screen and (min-width: 768px) and (max-width: 1024px),
screen and (min-height: 768px) and (max-height: 1024px) and (orientation: landscape) {
header {
background-color: lightseagreen;
}
.logo {
width: 100px;
float: none;
display: block;
margin: 0 auto;
font-size: 40px;
text-align: center;
}
nav {
overflow-x: auto;
overflow-y: hidden;
margin-top: 20px;
float: none;
white-space: nowrap;
}
nav a {
font-size: 25px;
}
footer {
background-color: lightcoral;
color: #fff;
}
.list {
margin: -4px;
}
.list li {
width: 25%;
}
.inner {
position: relative;
margin: 4px;
}
.title {
position: absolute;
right: 0;
bottom: 0;
left: 0;
padding: 10px 0;
background-color: rgba(0, 0, 0, 0.2);
color: #fff;
}
}
@media screen and (max-width: 767px),
screen and (max-height: 767px) and (orientation: landscape) {
header {
padding: 10px 0;
background-color: lightseagreen;
}
.logo {
width: 100px;
float: none;
display: block;
margin: 0 auto;
font-size: 40px;
text-align: center;
}
nav {
position: absolute;
top: 60px;
bottom: 0;
left: 0;
z-index: 10;
display: none;
width: 200px;
margin: 0;
background-color: lightslategray;
}
nav a {
display: block;
padding: 20px 10px;
font-size: 20px;
border-bottom: 1px solid #fff;
}
.gnb_menu {
position: absolute;
top: 12px;
left: 12px;
display: block;
width: 40px;
height: 35px;
font-size: 1px;
color: transparent;
background: linear-gradient(#fff 50%, transparent 50%);
background-size: 100% 10px;
}
footer {
background-color: lightcoral;
color: #fff;
}
section {
margin: 0;
}
.list li {
width: 100%;
}
.inner {
display: table;
table-layout: fixed;
width: 100%;
margin: 0;
border: none;
border-top: 1px solid #000;
}
.thumb {
display: table-cell;
width: 100px;
}
.title {
display: table-cell;
position: relative;
right: auto;
bottom: auto;
left: auto;
vertical-align: middle;
background-color: #fff;
padding: 8px;
color: #000;
text-overflow: inherit;
white-space: inherit;
text-align: left;
}
}
<header>
<a href="#" class="logo"><h1>LOGO</h1></a>
<a href="#" class="gnb_menu">gnb_menu</a>
<nav>
<a href="#">MENU1</a>
<a href="#">MENU2</a>
<a href="#">MENU3</a>
<a href="#">MENU4</a>
<a href="#">MENU5</a>
<a href="#">MENU6</a>
<a href="#">MENU7</a>
<a href="#">MENU8</a>
</nav>
</header>
좌측 GNB 구현을 위해 <a> 태그를 추가한다.
@media screen and (max-width: 767px),
screen and (max-height: 767px) and (orientation: landscape) {
...
}
미디어 쿼리를 이용해서 브라우저 가로 길이가 ~767px 일 때 css코드가 동작하도록 한다.
추가로 현재 기기가 가로모드이면서 세로 길이가 ~767px이면 마찬가지로 css코드가 동작하도록한다.
가로모드에 관한 코드 추가는 태블릿 PC 미디어 쿼리에도 동일하게 추가한다.
.gnb_menu {
position: absolute;
top: 12px;
left: 12px;
display: block;
width: 40px;
height: 35px;
font-size: 1px;
color: transparent;
background: linear-gradient(#fff 50%, transparent 50%);
background-size: 100% 10px;
}
gnb를 구현한다.
position을 absolute로 수정해서 위치를 조정하고, 가이드에 나와있는 것처럼 햄버거 버튼 모양을 css로 구현한다.
"font-size: 1px;", "color: transparent;"속성으로 텍스트는 숨겨준다.
background에 linear-gradient를 사용하고 bacground-size를 적절하게 조정해서 햄버거 버튼을 만든다.
nav {
position: absolute;
top: 60px;
bottom: 0;
left: 0;
z-index: 10;
display: none;
width: 200px;
margin: 0;
background-color: lightslategray;
}
nav a {
display: block;
padding: 20px 10px;
font-size: 20px;
border-bottom: 1px solid #fff;
}
햄버거 버튼을 누르면 나오는 메뉴를 구현한 css이다.
다른 요소들보다 앞에 있어야 하기 때문에 z-index를 적절하게 조정해준다.
기본적으로 display가 none이어야 하며 추후에 스크립트를 추가해서 특정 동작을 했을 때 display를 block이 되도록 변경해주면 된다.
display를 block으로 변경했을 때 모양은 아래 이미지와 같다.
section {
margin: 0;
}
.list li {
width: 100%;
}
모바일 디자인 가이드에 맞게 section과 list의 디자인을 수정한다.
.inner {
display: table;
table-layout: fixed;
width: 100%;
margin: 0;
border: none;
border-top: 1px solid #000;
}
.thumb {
display: table-cell;
width: 100px;
}
.title {
display: table-cell;
position: relative;
right: auto;
bottom: auto;
left: auto;
vertical-align: middle;
background-color: #fff;
padding: 8px;
color: #000;
text-overflow: inherit;
white-space: inherit;
text-align: left;
}
inner의 display를 table로, thumb, title의 display를 table-cell로 수정해서 테이블처럼 동작하도록 한다.
title은 position을 다시 relative로 수정하고 고정되어 있던 위치값을 원래대로 돌려준다.
텍스트가 중앙에 오도록 vertical-align을 middle로 둔다.
그리고 모바일 버전에서는 말줄임이 필요없기 때문에 한 줄 말줄임 처리를 위해 추가했던 속성들을 모두 원래대로 돌려준다.
부스트코스의 강의 내용을 정리한 포스트입니다.
https://www.boostcourse.org/web344
웹 UI 개발
부스트코스 무료 강의
www.boostcourse.org
'공부 > 웹 UI 개발' 카테고리의 다른 글
[웹 UI 개발] 반응형 웹 - 1 / 태블릿 PC 환경 (0) | 2023.03.30 |
---|---|
[웹 UI 개발] 반응협 웹 - 0 (0) | 2023.03.30 |
[웹 UI 개발] 폼 - 4 / 폼 커스텀 (셀렉트 메뉴) (0) | 2023.03.29 |
[웹 UI 개발] 폼 - 3 / 폼 커스텀 (파일 찾기 버튼) (0) | 2023.03.29 |
[웹 UI 개발] 폼 - 2 / 폼 커스텀 (체크 박스, 라디오 버튼) (0) | 2023.03.27 |