레이블이 transition인 게시물을 표시합니다. 모든 게시물 표시
레이블이 transition인 게시물을 표시합니다. 모든 게시물 표시

2013년 9월 28일 토요일

CSS transition 이해하기

! 이 글의 예문에 적용된 transition 효과는 익스플로러 9 버젼 이하에서는 작동하지 않습니다.


  • transition-property
  • transition-duration
  • transition-timing-function
  • transition-delay

transition은 위 4가지 속성의 축약 속성(shorthand property)이다. 영어로 shorthand property 라고 지칭하니, 함축속성, 또는 대표속성이라고도 표현할 수 있을 것이다. 쉽게 말하면, transition 하나로 위 4가지를 다 표현할 수 있다는 얘기다.

예를 들어,

 transition-property:width;  
 transition-duration: 1s;  
 transition-timing-function: ease;  
 transition-delay: .5s;  
 transition: width 1s ease .5s;  

위 두개의 코드는 서로 같은 코드이다.




transition-property

transition 구문의 첫번째 자리에 오는 transition-property 는 어떤 속성에 transition 효과를 줄지를 설정한다.

transition-property의 값(value)

  • none : transition 효과를 지정하지 않는다.
  • all : 모든 속성이 transition 효과를 얻는다.
  • property : transition 효과를 얻게될 속성을 지정한다.

모든(all) 속성을 지정하는 것과 일부 속성을 지정하는 것은 다음과 같은 차이가 있다.


  예1

 .transitionpost1 {  
 width: 100px;  
 height: 50px;  
 background-color:DarkSeaGreen;  
 border:1px solid black;  
 transition:all 1s ease .1s;   
 }  
   
 .transitionpost1:hover {  
 width: 300px;  
 height:100px;  
 }  


<예1>에서는 transition-property를 all 로 설정했기 때문에, 너비 확장과 높이 확장 모두 transition 효과를 얻는다. 즉, 너비 확장과 높이 확장 모두 시간에 걸쳐 점진적으로 이루어진다.


  예2

 .transitionpost2 {  
 width: 100px;  
 height: 50px;  
 background-color:DarkSeaGreen;  
 border:1px solid black;  
 transition:width 1s ease .1s;   
 }  
   
 .transitionpost2:hover {  
 width: 300px;  
 height:100px;  
 }  

<예2>는 다른 조건들을 <예1>과 동일하게 하되, transition-property를 all 이 아닌 width로 설정했다. <예2>의 도형은 마우스 커서를 올렸을 때 똑같이 너비 300px, 높이 100px로 확장하지만, 높이 변화는 transition의 효과를 얻지 못한다.


복수의 속성을 지정할 때는 콤마로 구분하여 각각의 값을 설정한다.


  예3

예3 - 너비 변화는 1초, 배경색상 변화는 13초에 걸쳐 일어난다.
transition 속성을 지정하지 않은 height(높이)는 변화는 하되, 점진적으로 변화하는 transition 효과는 얻지 못한다.

 .transitionpost3 {  
 width: 100px;  
 height: 50px;  
 background-color:#8FBC8F;  
 border:1px solid black;  
 transition:width 1s ease, background-color 13s ease;  
 }  
   
 .transitionpost3:hover {  
 width: 300px;  
 height: 100px;
 background-color:#000000;  
 }  


transition-duration

transition 구문의 두번째 자리에 오는 transition-duration은 변화가 몇초, 또는 몇 밀리세컨드(1/1000초)에 걸쳐 일어날지를 설정한다. 6s, 0.5s, .3s, 120ms 이라고 적혀 있다면, 이는 각각 6초, 0.5초, 0.3초, 120밀리세컨드 라는 뜻이다.


  예4

예4 - 너비 변화는 11초, 높이 변화는 432ms(밀리세컨드), 배경색상 변화는 0.3초에 걸쳐 일어난다.
 .transitionpost4 {  
 width: 100px;  
 height: 50px;  
 background-color:#8FBC8F;  
 border:1px solid black;  
 transition:width 11s ease, height 432ms ease, background-color .3s ease;  
 }  
   
 .transitionpost4:hover {  
 width: 300px;  
 height:100px;  
 background-color:#2580a2;  
 }  


transition-timing-fuction

transition 구문의 세번째 자리에 오는 transition-timing-functing은 변화가 일어나는 속도를 설정한다. 속도 커브의 함수를 설정한다는 것이 더 정확한 표현이겠지만, 어려운 말 보다는 실제 움직임을 보면서 이해하는 것이 편하다.

transition-timing-function의 값(value)으로는


  linear

transition-timing-function을 linear로 설정하면 변화가 시작부터 종료까지 동일한 속도로 일어난다.
  ease

ease는 극초반은 느리게, 초반은 빠르게, 종료지점은 느리게 변화가 진행된다.
  ease-in

ease-in은 시작지점의 변화가 천천히 진행된다.
  ease-out

ease-out은 종료지점의 변화가 천천히 진행된다.
  ease-in-out

ease-in-out은 시작지점과 종료지점의 변화가 천천히 진행된다.

주로 쓰이는 5가지 외에 함수 값을 직접 지정하는 cubic-bezier,

  cubic-bezier(1,.02,1,.47)


그리고, 변화가 점진적으로 진행되지 않고, 주어진 설정과 간격에 따라 일시에 진행되는 step-start, step-end, steps 가 있다.

  step-start

step-start는 모든 변화가 시작지점에 이루어진다.
  step-end

step-end는 모든 변화가 종료지점에 이루어진다.
("transition:width 2s step-end;" 로 설정하였으므로, 마우스 오버 후 2초 뒤에 변화가 일어난다.)
  steps(4, start)

steps는 설정한 단계에 따라 간격을 두고 변화가 일어난다.

주로 쓰이는 것은 linear, ease, ease-in, ease-out, ease-in-out 이렇게 5가지이다. 이 5가지만 알고 있어도 transition을 활용하는데에는 큰 무리가 없다.

cubic-bezier로 함수 값을 직접 지정하려면, cubic-bezier 곡선 그래프를 이해해야 한다. cubic-bezier 곡선 그래프를 이해하는 것은 나머지 값들이 어떻게 다른지를 이해하는데에도 도움이 된다.

그림1

cubic-bezier 곡선에서 그래프의 가로축은 시간, 세로축은 변화의 진행 정도를 의미한다. 가로축과 세로축 모두 시작값은 0이며, 종료값은 1이다.

그림2

예를 들어, linear의 cubic-bezier 곡선은 <그림2>와 같은 모습을 하고 있다. transition-timing-function을 linear로 설정할 때 변화가 시작부터 종료까지 동일한 속도로 일어나는 것은 linear의 그래프가 시간이 흐른 만큼 변화가 동일한 비율로 일어나는 직선의 모습을 하고 있기 때문이다.

그림3

ease-in-out의 경우 시작지점과 종료지점의 변화는 시간 진행에 비해 더디게 진행되는 곡선의 모습을 하고 있다. ease-in-out으로 설정할 때 시작지점과 종료지점의 변화가 천천히 진행되는 이유는 이와 같은 이유 때문이다.

linear나 ease-in-out, ease, ease-in, ease-out 처럼 주어진 값(곡선)이 아닌, 자신이 원하는 함수(곡선)를 설정하고자 할 때 transition-timing-function의 값으로 cubic-bezier를 설정한다.

cubic-bezier(x1, y1, x2, y2)

! cubic-bezier 숫자값 지정시 x1과 x2의 값은 0과 1 사이여야 한다. y1과 y2는 0~1 범위를 초과할 수 있다.

cubic-bezier를 설정할 때 괄호안 4개의 숫자는 곡선을 함수로 나타낸 것이다. 원하는 함수값과 곡선을 얻을 수 있도록 도와주는 사이트가 많이 있으므로, 해당 사이트에서 원하는 곡선 모양을 만든 후 함수값을 추출하면 된다.

! 참고.
cubic-bezier.com
CSS cubic-bezier Builder - Rob La Placa


그림4

만약 <그림4>와 같은 곡선을 함수값으로 지정하면 어떻게 되는가. <그림4>의 곡선을 함수값으로 설정하면, 실제로 변화가 진행되다가 마이너스 변화 과정을 겪은 후 다시 변화가 진행된다.


  예5

 .transitionpost5 {  
 width: 100px;  
 height: 50px;  
 background-color:DarkSeaGreen;  
 border:1px solid black;  
 transition:width 2s cubic-bezier(0,1.59,1,-0.75);  
 }  

 .transitionpost5:hover {  
 width: 300px;  
 }  


그림5

step-start의 cubic-bezier 그래프는 <그림5>와 같으며, step-start는 steps(1,start)와 같다. step-start는 시작 지점에서 모든 변화가 완료된다.


그림6

step-end의 cubic-bezier 그래프는 <그림6>과 같으며, step-start는 steps(1,end)와 같다. step-start는 종료 지점에서 모든 변화가 완료된다.

그림7

steps는 step-start, step-end와 같은 개념이되, 단계(간격)를 지정할 수 있다. 각 단계의 시작 지점에서 변화가 일어날지, 아니면 종료 지점에서 변화가 일어날지는 변수(start, 또는 end)로 설정한다.

steps(단계, start), 또는 steps(단계, end)

  예6

예6 - 너비 변화가 2초 동안 8단계를 거쳐 각 단계의 종료 시점에 일어난다.
 .transitionpost6 {  
 width: 100px;  
 height: 50px;  
 background-color:DarkSeaGreen;  
 border:1px solid black;  
 transition:width 2s steps(8, end);  
 }  
   
 .transitionpost6:hover {  
 width: 300px;  
 }  

steps의 두번째 변수(start, 또는 end)는 생략이 가능하다. 두번째 변수를 생략하면, default값인 end 값이 주어진다.


  예7

 .transitionpost7 {  
 width: 100px;  
 height: 50px;  
 background-color:DarkSeaGreen;  
 border:1px solid black;  
 transition:width 2s steps(7);  
 }  
   
 .transitionpost7:hover {  
 width: 300px;  
 }  


참고 - linear, ease, ease-in, ease-out, ease-in-out 의 cubic bezier 그래프

그림8


transition-delay

transition 구문의 마지막 네번째 자리에 오는 transition-delay 는 transition 효과가 언제 시작할지를 설정한다. 말 그대로, 딜레이(delay)를 설정한다.


  예8

예8 - 마우스 커서를 올리면 1초가 지난 후 2초에 걸쳐 너비가 확장된다.
 .transitionpost8 {  
 width: 100px;  
 height: 50px;  
 background-color:DarkSeaGreen;  
 border:1px solid black;  
 transition:width 2s ease-in 1s;  
 }  
   
 .transitionpost8:hover {  
 width: 300px;  
 }  



transition의 default 값

transition의 default 값은

all 0 ease 0

이다.


transition 구문에서 생략된 값은 default 값으로 대체된다. transition 효과가 나타나기 위해서 반드시 주어져야 하는 값, 즉 생략해선 안되는 값은 transition-duration 이다. 0초에 걸친 점진적인 변화라는 것은 있을 수 없기 때문이다.


  예9

 .transitionpost9 {  
 width: 100px;  
 height: 50px;  
 background-color:DarkSeaGreen;  
 border:1px solid black;  
 transition:2s;  
 }  
   
 .transitionpost9:hover {  
 width: 300px;  
 }  

<예9>에서는 transition의 값으로 '2s'만 입력했다. 생략된 값은 default 값으로 대체되므로,

 transition:2s;  

 transition:all 2s ease 0;  

과 같다.


transition 효과를 얻을 수 있는 속성들(properties)

꼭 그렇다고는 할 수 없지만, 보통 숫자값을 갖는 속성(property)들은 transition을 통해 점진적인 효과를 낼 수 있다.

예 : opacity, border-radius, margin, color, font-size, padding 등등

transition 효과가 가능한 속성(property)의 목록은

http://www.w3.org/TR/css3-transitions/

페이지 하단의 7.1. Properties from CSS 에 열거된 항목. 또는,

https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_animated_properties

페이지에서 animatable이 yes인 항목들을 통해 확인할 수 있다.

! 브라우저마다 약간씩 다르고, 또 이 항목들은 바뀔 수 있으므로 웹 사이트나 블로그 설계 시 주의를 기울여야 한다.



  예10

 .transitionpost10 {  
 opacity:1;  
 width: 100px;  
 height: 50px;  
 background-color:DarkSeaGreen;  
 border:1px solid black;  
 transition:opacity .5s ease-in;  
 }  
   
 .transitionpost10:hover {  
 opacity:0;  
 }  


  예11

 .transitionpost11 {  
 border-radius:0;  
 width: 100px;  
 height: 50px;  
 background-color:DarkSeaGreen;  
 border:1px solid black;  
 transition:border-radius .5s ease-in-out;  
 }  
   
 .transitionpost11:hover {  
 border-radius:50%;  
 }  
   


  예12

 .transitionpost12 {  
 margin-left:0;  
 width: 100px;  
 height: 50px;  
 background-color:DarkSeaGreen;  
 border:1px solid black;  
 transition:margin-left 1.5s ease-in-out;  
 }  
   
 .transitionpost12:hover {  
 margin-left:200px;  
 }  



예13
긴 글 읽느라 고생하셨습니다.
감사합니다. :D



! 참고한 글 및 참고할 만한 글
W3C CSS Transitions
Mozilla Developer Network, timing-function
Mozilla Developer Network, Using CSS transitions
CSS-Tricks, transition-timing-function
w3schools.com, CSS3 transitions
w3schools.com, CSS3 transition-property Property
w3schools.com, CSS3 transition-duration Property
w3schools.com, CSS3 transition-timing-function Property
w3schools.com, CSS3 transition-delay Property


2013년 8월 17일 토요일

CSS 텍스트 링크 Hover 효과 #2 - 글씨 크기 확대




링크에 마우스를 갖다대면 링크의 폰트를 확장시켜주는, CSS의 transform을 이용한 효과입니다.



CSS 텍스트 링크 Hover 효과 #1 - 자체 발광




링크 위에 마우스 커서를 갖다대면 빛을 발하는 것과 같은 효과를 내주는,
CSS의 transition을 이용한 hover 효과입니다.
CSS의 동적인 효과는 글이나 그림으로는 설명하기 힘든 부분이 많은 것 같네요.



2013년 8월 9일 금요일

블로거 포스트 이미지에 투명 효과 주기

CSS transition의 opacity 속성을 이용하여 블로거 포스트 이미지에 마우스를 갖다대면 약간의 투명효과를 주는, 간단한 코드를 소개합니다.

CSS의 동적인 효과를 말로 설명하는데에는 한계가 있으므로, 데모를 먼저 보시기 바랍니다.

데모

두 가지 방식이 가능합니다.

하나는 데모 사이트에서처럼 이미지에 마우스 커서를 올리면 이미지가 일정 % 투명하게 변화는 방식이고, (아래 그림에서 그림2 에서 그림1로 변화)

다른 하나는 역으로, 처음부터 일정 % 투명처리된 이미지를 먼저 보여준 후 독자가 마우스를 갖다대면 정상이미지로 전환하는 방식입니다. (그림1에서 그림2로 변화)

그림1

그림2
첫번째 방식, 즉 [그림2 → 그림1]로 변화를 주는 코드는 아래와 같습니다.

 .post-body img {  
 opacity:1.0;  
 -webkit-transition: all 0.3s;  
 -moz-transition: all 0.3s;  
 -ms-transition: all 0.3s;  
 -o-transition: all 0.3s;  
 transition: all 0.3s;  
 }  
    
 .post-body img:hover {  
 opacity:0.7;  
 }  
<코드 출처 stramaxon >

코드 삽입 위치는 [대시보드 → 템플릿 → 맞춤설정 → 고급 → CSS 추가] 입니다. 투명 정도를 설정하고 싶다면 'opacity:0.7;' 이라고 적힌 부분을 조정하시기 바랍니다.

두번째 방식, 즉 [그림1 → 그림2] 로 변화를 주려면 같은 위치에 아래의 코드를 대신 입력합니다.

 .post-body img {  
 opacity:0.7;  
 -webkit-transition: all 0.3s;  
 -moz-transition: all 0.3s;  
 -ms-transition: all 0.3s;  
 -o-transition: all 0.3s;  
 transition: all 0.3s;  
 }  
    
 .post-body img:hover {  
 opacity:1.0;  
 }  
<코드 출처 stramaxon >


2013년 8월 8일 목요일

CSS의 transition을 이용한 링크 색상의 부드러운 전환

그림1

지금 제 블로그에서 탭 메뉴에 마우스 커서를 올려보시면, 검은색에서 청색으로의 색상 전환이나 흰색 화살표의 움직임이 마우스를 올리자마자 즉각적으로 이루어지는 것이 아니라 (비록 짧은 시간이긴 하지만) 점진적으로 이루어지는 것을 보실 수 있습니다.

이는 CSS의 transition이라는 속성을 이용했기 때문인데요. CSS의 transition을 이용하면 모양이나 색상의 변화를 시간을 두고, 마치 애니메이션처럼 부드럽게 할 수 있습니다.

이 블로그는 제가 여러가지 코드들을 배우고, 또 테스트 해보는 공간이기도 하므로, 저 탭 메뉴가 1년 뒤에도 그대로 있으리라는 보장이 없습니다. 훗날 템플릿이 바뀐 상태에서 이 글을 보는 분들을 위해 예가 될 수 있는 다른 페이지를 링크해두겠습니다.

transition 적용의 예 :
http://nettuts.s3.amazonaws.com/581_cssTransitions/demos.html
http://everhooddesign.com/node/39
http://css3.bradshawenterprises.com/transitions/

그림2
블로그나 웹사이트에서 색상 전환을 가장 쉽게 접하는 경로 중 하나가 바로 링크 위에 마우스 커서를 올리는 경우인데요. 아래의 코드는 transition 속성을 이용하여 블로거에서 텍스트 링크에 마우스커서를 올렸을 때, 색상 전환을 부드럽게 만들어 줍니다.

 a { color:#2580a2;   
  -moz-transition:color .2s ease;   
  -o-transition:color .2s ease;   
  -ms-transition:color .2s ease;   
  -webkit-transition:color .2s ease;   
  transition:color .2s ease;   
  } a:hover { color:#666666; }  

코드 삽입 위치는 [대시보드→템플릿→맞춤설정→고급→CSS추가] 입니다.

첫번째 줄의 색상(2580a2)은 링크에 마우스를 올리기 전의 색상이고, 마지막 줄의 색상(666666)은 링크에 마우스를 올렸을 때의 색상입니다. 자신이 원하는 색상으로 대체해 줍니다.

CSS의 transition 속성은 잘 공부해두면, 블로거를 동적으로 만드는데 상당히 유용할 것 같습니다. 저는 CSS 마스터까지는 필요 없고, 내가 삽입하는 코드들이 어떤 의미를 가지고 있고 어떻게 변형이나 편집이 가능한가 정도를 이해할 수 있을 정도면 만족합니다. 그런 의미에서 위의 코드들을 조금 뜯어보자면,

앞의 -moz-니 -o-니 하는 단어들은 특정 브라우저에서 transition 속성이 작동하도록 지원해주는 접두사입니다. 여기에 대해서는 CSS 브라우저 지원 접두사들 이라는 글에서 정리를 해두었습니다.

transition:color는 색상의 전환을 지정하는 속성이고, 우리가 재량적으로 설정할 수 있는 부분은 앞에서 언급한 색상, 그리고 '.2s', 'ease'라고 적혀있는 부분입니다.

'.2s'는 변화가 몇초에 걸쳐 일어날지를 설정하는 부분입니다. 10s(10s는 10초), 5.5s, 1.5s, .5s, .25s 등등 자신이 원하는 속도로 설정할 수 있습니다.

'ease'는 변화가 어떤 형식으로 이루어질지를 설정하는 값입니다. ease 외에 linear, ease-in, ease-out, ease-in-out 등으로 대체할 수 있으며, 값에 따라서 처음부터 끝까지 같은 속도로 변할 지 아니면 처음엔 느리게 변하다가 뒤에는 빠르게 변할지 등등으로 설정할 수 있습니다. 이에 대한 설명과 예는 아래의 링크에서 자세히 살펴보시기 바랍니다.

http://htmlcss.kr/?s=transition
http://htmlcss.kr/css3/transition/transition-timing-function/