21-12-01 Layout#3 CSS 애니메이션
*별도의 CSS 파일을 만들고 HTML 파일과 연결하기
-> CSS 폴더와 파일을 만들고 HTML 파일의 타이틀 밑에
<link rel="stylesheet" type="text/css" href="css 폴더이름/css파일 이름" />
을 적어준다.
css파일은 다른 내용 없이 @charset "UTF-8"; 밑에 스타일을 바로 적는다.
이미지를 배경으로 설정하고 위치를 조절하기
해당 이미지의 인스타그램 로고만 사용하고 싶다면 인스타그램 부분만 따로 잘라서 이용하지 않고 background-image와 background-position 을 이용할 수 있다.
<html>
<head>
<meta charset="UTF-8">
<title>Layout02</title>
<style type="text/css">
#base {position:relative; width:500px; height:500px; background:white; border:3px dotted black;}
#box1 {position:relative; width:400px; height:400px; background-image:url(images/icon.png); background-position: -790px -320px;
border:1px solid black; margin:50px auto;}
</style>
</head>
<body>
<div id="base">
<div id="box1"></div>
</div>
</body>
</html>
해당 이미지의 가장 좌측 상단이 background-position: 0px 0px 이고 아래로, 우측으로 이동하기 위해서는 음수가 되어야한다. 원하는 이미지가 나오도록 위치를 조정하면 끝
Viscode HTML 기본 양식 단축키 : ! 입력 후 tab 키
viscode 라이브서버 : 확장 - liveserver 설치
-> 설치 후에 ALT를 누른 상태에서 L O를 순서대로 누르면 창이 열린다.
-> viscode에서 내용을 수정 후 저장만 해도 바로 적용된다
CSS 코드를 이용한 애니메이션
변형 속성
애니메이션을 적용할 떄 사용하는 기능
종류
1) transition : 모든 transition 속성을 한 번에 적용
2) transition-delay : 이벤트 발생 후 몇 초 후에 재생할지 지정
3) transition-duration : 몇 초 동안 재생할 지 지정
4) transition-property : 어떤 속성을 변형할지 지정
5) transition-timing-function : 수치 변형 함수를 지정
*transition-duration (duration은 생략하고 transition만 써도 같은 결과)
<style type="text/css">
.box{width:100px; height:100px; background: rgb(255, 166, 0); transition-duration: 2s;}
.box:hover{width: 300px; height: 300px; background: green;}
</style>
</head>
<body>
<div class="box"></div>
</body>
변형함수 (2D)
1) translate(x,y) : 지정한 크기만큼 x축과 y축으로 이동
2) translateX(x) : 지정한 크기만큼 x축으로 이동
3) translateY(y) : 지정한 크기만큼 y축으로 이동
4) scale(x,y) : 지정한 크기만큼 x축과 y축으로 확대 축소
5) scaleX(x) : 지정한 크기만큼 x축으로 확대 축소
6) scaleY(y) : 지정한 크기만큼 y축으로 확대 축소
7) rotate(각도) : 지정한 각도만큼 회전 (단위 : deg)
8) skew(x,y) : 지정한 크기만큼 x축과 y축으로 왜곡
9) skewX(x) : 지정한 크기만큼 x축으로 왜곡
10) skewY(y) : 지정한 크기만큼 y축으로 왜곡
*translate
<style type="text/css">
.origin{width: 200px; height:134px; border: 1px solid black; float: left; margin: 40px;}
.movex, .movey, .movexy {transition: 1s;}
.movex:hover {transform:translateX(50px);}
.movey:hover {transform:translateY(50px);}
.movexy:hover {transform:translate(30px, 30px);}
</style>
</head>
<body>
<div class="origin">
<div class="movex"><img src="images/bus.jpg"></div>
</div>
<div class="origin">
<div class="movey"><img src="images/bus.jpg"></div>
</div>
<div class="origin">
<div class="movexy"><img src="images/bus.jpg"></div>
</div>
</body>
(hover: 에 left값이나 top값의 변형을 적용하여도 같은 결과를 만들 수 있지만 이들은 절대좌표에 의해 움직이며 translate로 인한 변형은 상대좌표에 의해 적용된다.)
브라우저별 연동을 위해
.movex:hover {
transform:translateX(50px);
-webkit-transform: translateX(50px);
-ms-transform: translateX(50px);
-moz-transform: translateX(50px);
-o-transform: translateX(50px);
}
위와 같이 적어야하지만 모든 브라우저에서 translate명령어가 똑같이 동작하기 때문에 생략이 가능하다.
(명령어가 다른 브라우저가 있다면 적어줘야 함)
*Scale
<title>03_Transform_Scale</title>
<style type="text/css">
.origin{width: 200px; height:134px; border: 1px solid black; float: left; margin: 40px;
overflow: hidden;}
.scalex, .scaley, .scale {transition: 1s;}
.scalex:hover {transform:scaleX(1.2);}
.scaley:hover {transform:scaley(1.5);}
.scale:hover {transform:scale(1.7);}
</style>
</head>
<body>
<div class="origin">
<div class="scalex"><img src="images/fruit.jpg"></div>
</div>
<div class="origin">
<div class="scaley"><img src="images/fruit.jpg"></div>
</div>
<div class="origin">
<div class="scale"><img src="images/fruit.jpg"></div>
</div>
</body>
*Rotate
<style type="text/css">
.origin{width: 200px; height:200px; border: 1px solid black; float: left; margin: 40px;}
.rotate1, .rotate2 {transition: 1s;}
.rotate1:hover {transform:rotate(40deg);}
.rotate2:hover {transform:rotate(-40deg);}
</style>
</head>
<body>
<div class="origin">
<div class="rotate1"><img src="images/fruit.jpg"></div>
</div>
<div class="origin">
<div class="rotate2"><img src="images/fruit.jpg"></div>
</div>
</body>
*rotate의 중심점 이동 : orgin
<style type="text/css">
.origin{width: 160px; height: 240px; border: 1px solid black; float: left; margin: 40px;}
.ltop .rose {transform-origin: left top; transition: 1s;}
.rtop .rose {transform-origin: right top; transition: 1s;}
.lbottom .rose {transform-origin: left bottom; transition: 1s;}
.rbottom .rose {transform-origin: right bottom; transition: 1s;}
.rose:hover{transform: rotate(20deg);}
</style>
</head>
<body>
<div class="origin">
<div class="ltop"><img src="images/rose.jpg" class="rose"></div>
</div>
<div class="origin">
<div class="rtop"><img src="images/rose.jpg" class="rose"></div>
</div>
<div class="origin">
<div class="lbottom"><img src="images/rose.jpg" class="rose"></div>
</div>
<div class="origin">
<div class="rbottom"><img src="images/rose.jpg" class="rose"></div>
</div>
</body>
*Skew
<style type="text/css">
.origin{width: 160px; height: 240px; border: 1px solid black; float: left; margin: 40px;
overflow: hidden;}
.skewx, .skewy, .skewxy {transition: 1s;}
.skewx:hover {transform:skewX(30deg);}
.skewy:hover {transform:skewY(20deg);}
.skewxy:hover {transform:skew(25deg, 15deg);}
</style>
</style>
</head>
<body>
<div class="origin">
<div class="skewx"><img src="images/rose.jpg"></div>
</div>
<div class="origin">
<div class="skewy"><img src="images/rose.jpg"></div>
</div>
<div class="origin">
<div class="skewxy"><img src="images/rose.jpg"></div>
</div>
</body>
*여러개의 transform 적용하기
<style type="text/css">
#wrap{position:relative; width: 800px; height: 400px; border: 1px solid black;}
#circle{position: relative; width:200px; height: 200px; top: 100px; text-align: center;
background: orangered; border-radius: 50%; line-height: 200px; transition-duration: 2s;
color: white; font-weight: bold; font-size: 50px;}
#wrap:hover #circle{transform:translateX(400px) rotate(180deg) scale(1.5); }
</style>
</head>
<body>
<div id="wrap">
<div id="circle">타이어</div>
</div>
<!-- wrap에 마우스를 올리면 circle이 오른쪽으로 이동+회전+크기증가 -->
</body>
(순서가 바뀌면 이상하게 작동할 수 있으므로 이동 먼저 써주기)
※A영역에 hover했을 때 B영역이 transform되게 하려면 A와 B는 서로 형제나 부모자식 관계여야한다.
(#A:hover #B 양식으로 작성 (class라면 # 대신 .))
예제
전에 만들었던 위 예제를 transform을 이용해 구현하기
(hover 세로 메뉴 만들기 : https://omp14.tistory.com/33)
<style type="text/css">
#base{width:250px; height:1000px; background:#595959;}
#top{width:100%; height:150px; border:1px solid white;}
.menuall{width:100%; height:40px; border:1px solid yellow;
background:#232323; color:white; line-height:0px; text-align:center;}
.submenuall{width:100%; height:1px;
background:#989898;}
.menuall:hover{color:orange}
#menu1:hover~#submenu1{display:block; transform-origin: top; transform: scaleY(100);}
#menu1:hover~#menu2{transform: translateY(100px);}
#menu1:hover~#menu3{transform: translateY(100px);}
#menu1:hover~#menu4{transform: translateY(100px);}
#menu1:hover~#menu5{transform: translateY(100px);}
#menu1:hover~#submenu2{transform: translateY(100px);}
#menu1:hover~#submenu3{transform: translateY(100px);}
#menu1:hover~#submenu4{transform: translateY(100px);}
#menu1:hover~#submenu5{transform: translateY(100px);}
#menu2:hover~#submenu2{display:block; transform-origin: top; transform: scaleY(100);}
#menu2:hover~#menu3{transform: translateY(100px);}
#menu2:hover~#menu4{transform: translateY(100px);}
#menu2:hover~#menu5{transform: translateY(100px);}
#menu2:hover~#submenu3{transform: translateY(100px);}
#menu2:hover~#submenu4{transform: translateY(100px);}
#menu2:hover~#submenu5{transform: translateY(100px);}
#menu3:hover~#submenu3{display:block; transform-origin: top; transform: scaleY(100);}
#menu3:hover~#menu4{transform: translateY(100px);}
#menu3:hover~#menu5{transform: translateY(100px);}
#menu3:hover~#submenu4{transform: translateY(100px);}
#menu3:hover~#submenu5{transform: translateY(100px);}
#menu4:hover~#submenu4{display:block; transform-origin: top; transform: scaleY(100);}
#menu4:hover~#menu5{transform: translateY(100px);}
#menu4:hover~#submenu5{transform: translateY(100px);}
#menu5:hover~#submenu5{display:block; transform-origin: top; transform: scaleY(100);}
</style>
※scale을 이용하면 위 아래로 커지기 때문에 transform-orgin:top; 으로 윗부분 고정하기
※scale을 이용하면 height를 이용했을 때와 달리 하위 div들이 자동으로 이동되지 않기 때문에 일일히 이동시켜주어야한다.
예제
상품 사진 위에 마우스를 올렸을 때 상품 정보가 올라오는 화면 구현
<style type="text/css">
ul{list-style-type: none; margin:0; padding: 0;}
.item{position:relative; width: 300px; height: 200px; margin: 10px 10px 10px 10px; float:left;
overflow:hidden;}
.caption{position: absolute; width: 300px; height: 200px; top:200px; left:0; opacity: 0.7;
background: black; transition-duration: 0.5s; color:white; margin:0 auto; text-align: center;}
.item:hover .caption{transform:translateY(-200px)}
/* .item:hover .caption{top:0px} 와 같은 결과*/
</style>
</head>
<body>
<ul>
<li class="item">
<img src ="images/prod1.jpg">
<div class="caption">
<h1>상품1</h1>
<p>상품1 : 설명 텍스트</p>
<p>가격 : 12,345원</p>
</div>
</li>
<li class="item">
<img src ="images/prod2.jpg">
<div class="caption">
<h1>상품2</h1>
<p>상품2 : 설명 텍스트</p>
<p>가격 : 12,345원</p>
</div>
</li>
<li class="item">
<img src ="images/prod3.jpg">
<div class="caption">
<h1>상품3</h1>
<p>상품4 : 설명 텍스트</p>
<p>가격 : 12,345원</p>
</div>
</li>
</ul>
</body>
caption의 top값을 0으로 하고 opacity만 조절하면 아래와 같은 효과도 구현이 가능하다
.caption{position: absolute; width: 300px; height: 200px; top:0px; left:0; opacity:0;
background: black; transition-duration: 0.5s; color:white; margin:0 auto; text-align: center;}
.item:hover .caption{opacity: 0.7;}