kidsgao 웹페이지 만들기 전반부
github소스코드
pc버전
mobile 버전
이번에 kidgao 페이지 실습하기 전 완성된 html, css 파일 및 이미지파일 디렉토리를 받았는데, 지금까지와 다르게 파일들이 좀 더 자세하게 나누어져 있었다. 이 웹사이트는 원페이지 사이트라 html은 하나밖에 없었지만 사용된 이미지들이 여러 폴더에 세분화되어서 들어있어서 실제 제작할 때 필요한 자료를 찾기 쉬웠다.
3개의 css파일을 미리 연결하고 미디어쿼리 사용을 위해 <meta>
태그로viewport
를 정의해주었다.
<head>
<meta charset="UTF-8">
<meta name="description" content="우리쌀 점토로 만든 키즈가오 웹사이트 소개">
<meta name="keywords" content="키즈가오, 점토, 장난감">
<meta name="author" content="yesollee">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>키즈가오</title>
<link rel="stylesheet" href="css/style.css">
<link rel="stylesheet" href="css/mobile.css">
<link rel="stylesheet" href="css/animation.css">
</head>
overflow-x:hidden
: 브라우저 창의 최대 넓이를 넘어가는 요소가 있으면 그것을 보여주기 위해 원치않는 가로스크롤이 생기기 때문에 이 속성을 이용해 넘어가는 요소는 보이지 않게 처리해준다. 웹페이지 만들 때 기본적으로 들어가는 속성이라고 한다.button
: 초기 속성으로 border
, background-color
를 가지고 있어 둘 다 안 보이게 초기화했다.clearfix
: float를 초기화하는 clear:both
속성을 가진 class를 하나 미리 만들어주었다./* Default css */
html, body {
margin: 0;
padding: 0;
}
body {
overflow-x: hidden;
}
h1, h2, h3, h4, h5, h6, p {
margin: 0;
padding: 0;
}
button {
border: none;
background-color: transparent;
}
.clearfix {
clear: both;
}
background-image
는 주어진 공간 전체를 이미지로 채우려는 속성이 있다. background-repeat:no-repeat
를 하면 공간의 남은 부분이 공백이 되는 문제가 있으니 공간 크기를 이미지에 맞춰주는게 좋다.#intro {
width: 100%;
height: 1600px;
background-image: url(../img/intro/intro_bg.png);
}
left:50%
+ margin: (1/2 width)
absolute
속성을 가진 3차원 자식들의 위치를 조정할 때 부모를 기준으로 조정하기 위해: 부모 포지션 상태에 따라 3차원 자식의 top, left 등의 속성의 기준점이 달라진다. (2차원: 브라우저기준, 3차원: 부모기준)intro padding-top의 결과: intro 전체 길이가 길어져서 레이아웃 틀어짐이 일어남. intro에 box-sizing:border-box
를 적용했더니 틀어짐이 사라졌다. 의외로 모바일 버전에서도 문제는 없어보였다.
introWrap margin-top의 결과: 부모까지 따라 내려와버리는 margin 병합 현상이 일어났다.
z-index
를 사용하기 위해: float을 사용해 위치를 조정할 경우 브라우저 크기가 바뀌면 줄바꿈 현상이 일어난다.#intro .introWrap .logo {
position: absolute;
width: 760px;
height: 516px;
background-image: url(../img/intro/logo.png);
z-index: 100;
}
...
#intro .introWrap .bear {
position: absolute;
background-image: url(../img/intro/bear.png);
width: 112px;
height: 105px;
margin: 310px 0 0 560px;
z-index: 200;
}
#intro .introWrap .lion {
animation: spinLion 1500ms linear infinite alternate;
}
@keyframes spinLion {
from {
transform: rotate(-10deg);
}
to {
transform: rotate(10deg);
}
}
시작은 이미지 너비만큼 left로 땡겨서 보이지 않게 했다. 끝 지점의 경우 브라우저 크기에 따라 끝이 바뀔 수 있어서 고정 픽셀값을 넣기가 애매했다. left
속성의 경우 요소의 왼쪽 끝을 기준으로 움직이기 때문에 100%값을 넣어주니 브라우저 크기가 변해도 오른쪽 끝으로 완전히 사라졌다.
#intro .cloudWrap .dragonFly {
animation: flyDragonfly 7s linear infinite;
}
@keyframes flyDragonfly {
from {
left: -366px;
}
to {
left: 100%;
}
}
지난 연습들과 다르게 모바일 버전을 위해 미디어쿼리만 작성하는 별도의 css파일을 생성했다. 또한 모바일 버전을 위한 별도 이미지도 준비되어 있었다. max-width:767px
로 하여 767px이하는 모바일 버전으로 표시되도록 하였다. 공간의 크기, 배경이미지, 위치를 변경하고 필요없는 부분은 display:none
으로 감추어 주었다.
/* 모바일버전 이미지 별도 준비 */
@media (max-width: 767px) {
#intro {
height: 1150px;
background-image: url(../img/mobile/intro/mobile_intro_bg.png);
}
#intro .introWrap {
width: 189px;
height: 129px;
margin-left: -94.5px;
top: 230px;
}
#intro .introWrap .logo {
width: 189px;
height: 129px;
background-image: url(../img/mobile/intro/mobile_logo.png);
}
/* 필요없는 부분 감추기 */
#intro .introWrap .lion,
#intro .introWrap .rabbit,
#intro .introWrap .bear,
#intro .introWrap .monkey,
#intro .cloudWrap .dragonFly {
display: none;
}
#intro .cloudWrap {
height: 350px;
top: 280px;
}
#intro .cloudWrap .leftCloud {
width: 267px;
height: 314px;
background-image: url(../img/mobile/intro/mobile_cloud1.png);
}
#intro .cloudWrap .rightCloud {
width: 237px;
height: 309px;
background-image: url(../img/mobile/intro/mobile_cloud2.png);
}
intro 부분과 마찬가지로 공간의 크기, position:absolute
및 배경 이미지를 설정하고 위치를 조정해주었다. 여기서 특이한 점은 설명문이 이미지와 겹쳐져 있는 부분이다. 설명문 이전의 형제 태그들이 전부 absolute
로 3차원이기 때문에 그 다음에 나온 설명문 요소는 차원에 상관없이 레이어가 겹치게 된다. 이 요소가 3차원이 된 후에도 가장 나중에 사용된 설명문 부분이 가장 앞에 배치되어 자연스럽게 이미지 위에 글자가 위치하게 되었다.
#farm1 {
position: relative;
width: 100%;
height: 800px;
background-image: url(../img/farm/farm1/farm1_bg.png);
}
#farm1 .leftRice1 {
position: absolute;
width: 390px;
height: 670px;
background-image: url(../img/farm/farm1/leftrice.png);
left: 0;
}
...
#farm1 .farmSpeechWrap {
position: relative;
top: 250px;
left: 150px;
#farm1 .farmSpeechWrap .farmSpeech {
color: #895C2F;
font-size: 18px;
line-height: 27px;
}
farmSpeech
가 이미지와 겹치지 않고 이미지 아래에 중앙정렬되어있다. left
, margin-left
로 전체 farmSpeechWrap
을 브라우저 중앙에 정렬했고, text-align: center
를 이용해 inline 요소인 img(inline-block)
와 p
를 중앙정렬했다.
#farm1 .farmSpeechWrap {
width: 300px;
text-align: center;
left: 50%;
margin-left: -150px
}
farm1과 거의 동일한 방법으로 제작됨 (공간 크기 지정->배경이미지 지정->위치 지정->모바일 버전 조정)
전체 기계 그림이 있고, 그 중 움직이는 부분의 그림이 따로 있었다. 움직일 때 그림자도 같이 돌아가면 어색하므로 그림자 부분도 따로 있었다. z-index를 적극 활용해 요소들 사이 앞에 나올 우선 순위를 정해주었다.
방향은 다르지만 360도 회전한다는 애니메이션은 똑같아서 하나의 애니메이션을 만들고 animation-direction:reverse
를 적용해주었다.
/* farm3 */
#farm3 .machineWrap .saw1,
#farm3 .machineWrap .timer {
animation: spinSaw linear 9s infinite;
}
#farm3 .machineWrap .saw2 {
animation: spinSaw linear 9s infinite reverse;
}
@keyframes spinSaw {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
이전과 같이 공간 크기, 배경이미지, 위치, display여부 등을 수정해주었다.
강의를 처음 듣기 시작했을 때 보고 정말 신기하다고 생각했던 웹페이지를 직접 구현할 수 있게 된 것이 기쁘다. 웹페이지의 여러 파트를 나누어 작업했는데, 처음엔 복잡했지만 비슷한 구조가 반복되고 있어 여러 번 연습하니 처음만큼 어렵게 느껴지지는 않았다.