본문 바로가기
프로그래밍/CS

반응형 웹, CSS 애니메이션

by 숙님 2022. 7. 22.
728x90

반응형 웹

- 정의: 여러 장치에 대응하는 하나의 웹 문서또는 사이트

브라우저의 크기에 실시간으로 반영하여 크기에 따라 레이아웃이 변하는 웹 사이트 

- 모바일 퍼스트(mobile first)

사용자 경험을 디자인할 때 모바일일 경우에 최우선으로 초점을 맞춰 디자인함 

현재 데스크탑 유저보다 모바일 유저가 공유하는 정보가 많아짐에 더욱더 각광받음 

- 장점: 

검색엔진 최적화(SEO)유리 

- 단점:

사이트 속도 저하 

웹 브라우저 호환성 문제, CSS3의 특성상 인터넷 익스플로러 8버전 이하에서는 사용이 불가능 

 

 

미디어 쿼리

- 정의: 뷰포트(브라우저 창)의 크기에 따라 스타일을 적용할 수 있도록 함 

적용하는 방법

 

1. CSS파일을 HTML파일에 적용하는 것처럼 적절한 태그에 위치 

<link href="css파일이름.css" media="screen and (min-width: 400px) and (max-width: 1000px)" rel="stylesheet">

 

2. <head>태그 안에서 <style>태그를 열어 미디어 쿼리를 작성

<style type="text/css" media="screen and (min-width: 400px) and (max-width: 1000px)">
	/* 여기 css를 작성합니다. */
</style>

 

3. CSS 파일 혹은 태그 안에서 직접 미디어 쿼리 작성 

@media 미디어 타입 (조건(너비 및 높이)) {
    (CSS 입력하는 부분)
}

--예제
@media screen (max-width: 400px) {
    body {
			color: red;
		}
}

- 미디어 타입

all: 모든 미디어 타입

print: 프린터

screen: 컴퓨터 화면

speech: 스크린 리더 

 

- 구현하는 코드 정리 

너비 및 높이 조건

@media screen and (width: 600px) {
	body {
		color : red;
	}
}
@media screen and (max-width: 400px) {
    body {
        color: blue;
    }
}

 

방향성(세로, 가로)

@media (orientation: landscape) {
    body {
        color: rebeccapurple;
    }
}

 

CSS애니메이션 

@keyframes

/* '%' 단위로 시간 진행에 따른 상태를 작성해주면 됩니다. */

@keyframes 애니메이션이름 {
	0% {            /* from 이라고 작성해도 됩니다.*/
		CSS속성 : 속성값; 
	}

	50% {           /* 애니메이션 진행도에 따른 스타일을 설정합니다. */
                  /* 필요하다면 1부터 99까지도, 소수점까지도 모두 작성해도 됩니다.*/
		CSS속성 : 속성값;
	}

	100% {          /* to 라고 작성해도 됩니다.*/
		CSS속성 : 속성값;
	}
}

 

예시: 회전하는 키프레임 애니메이션

@keyframes lotate {
	0% {
		transform : rotate(0deg)
	}

	50% {
		transform : rotate(180deg)
	}

	100% {
		transform : rotate(360deg)
	}
}

/* 시작 시점에선 0도, 50% 시점에선 180도, 완료 시점에선 360도 회전시키는 애니메이션입니다. */

 

animation 속성

  • animation : 띄어쓰기로 쭉 나열하면 아래의 속성들을 한 번에 지정할 수 있음
    • animation-name : 애니메이션의 중간 상태를 지정하는 이름.  @keyframes 블록에 작성
    • animation-duration : 한 싸이클의 애니메이션이 재생될 시간 지정
    • animation-delay : 애니메이션의 시작을 지연시킬 시간 지정
    • animation-direction : 애니메이션 재생 방향을 지정
    • animation-iteration-count : 애니메이션이 몇 번 반복될지 지정
    • animation-play-state : 애니메이션을 재생 상태. 멈추거나 다시 재생 시킬 수 있음
    • animation-timing-function : 중간 상태들의 전환을 어떤 시간간격으로 진행할지 지정
    • animation-fill-mode : 애니메이션이 재생 전 후의 상태 지정

 

애니메이션 내가 작성한 코드 

 

 

index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link rel="icon" href="%PUBLIC_URL%/logo.png" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="theme-color" content="#000000" />
    <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo.png" />
    <title>Responsive Web</title>
    <style type="text/css" media="screen and (min-width: 400px) and (max-width: 1000px)">
      /* 여기 css를 작성합니다. */
   

      body{
  

        background-color: red;
      }
      @media screen and (max-width: 1000px) {
        body{
          background-color: #008000;
        }
        @media screen and (max-width: 600px) {
        body{
          background-color: yellow;
        }
        #logo{
          animation : locate 3s;
        
        }
        
        }
      }
    </style>
  </head>
  <body>
    <div id="root"></div>
  </body>
</html>

 

App.js

* {
    font-family: sans-serif;
    box-sizing: border-box;
    padding: 0px;
    margin: 0px;
    list-style: none;
    text-decoration: none;
    -ms-overflow-style: none;
    scrollbar-width: none;
    animation: slide 1s ease;
  }
  *::-webkit-scrollbar {
    display: none;
  }
  
  body {
    height: 100%;
    overflow: scroll;
    animation: lotate 1s ease-out;
  }
  h1{
    font-size: 5em;
    width: 250px;
    color: purple;
    font-family:sans-serif;
    position: relative;
    top: 80px;
    left: 100px;
    animation: lotate 2s ease-out;
  }
 /* @keyframes slide {
   from{
    left: -100px;
   }to{
   left: 150px;
   opacity: 1;
   }
    */
@keyframes lotate {
  0%{
    transform: rotate(0deg)
  }
  50%{
    transform: rotate(180deg)
  }
  100%{
    transform: rotate(360deg)
  }
}
 

 .row{
   margin-left: -12px;
   margin-right: -12px;
   display: flex;
 }


  
@media screen and (max-width: 768px) {
     body{
     padding: 80px 0;
  }
   .row{
    flex-direction: column;
  }
  .col{
    width: 100%;
  }
}
  
@media screen and (max-width: 480) {
  body{
    padding: 40px 0;
  }
  .text-wrap h1{
    font-size: 36px;
    line-height: 48px;
  }
  .text-wrap p{
    font-size: 14px;
    line-height: 24px;
  }
  .root-wrap li{
    margin-bottom: 16px;
  }
  .root-wrap li a{
    padding: 16px;
    font-size: 18px;
    line-height: 20px;
  }
  .root-wrap li span{
    right: 12px;
    font-size: 14px;
    line-height: 20px;
  }
}

 

Render.js

import styled from 'styled-components';
import '../App.css';

const MainArea = styled.div`
  background-image: url('https://byline.network/wp-content/uploads/2018/10/discover_1x_30fps.gif');
  background-repeat: no-repeat;
  background-position: right;

  max-height: 864px;
  height: 100vh;
  width: 100%;
  overflow: hidden;
  padding: 128px 0px 0 0px;

  div.text {
    width: 1200px;
    margin: 0 auto;
    p {
      position: relative;
      top: 60px;
      width: 100%;
      height: auto;
      color: black;
      font-weight: 600;
      font-size: 60px;
      letter-spacing: 6px;
      line-height: 1.4;
    }
  }
`;

let mainText = document.querySelector("h1");

window.addEventListener("scroll", function(){
  let value = window.scrollY;
  console.log("scrollY", value);

  if(value > 50){
    mainText.style.animation= 'slide 1s ease-out'
  }
})


const Render = () => {
  return (
    <>
      <MainArea>
        <div className="text">
          <h1>pick your favorate</h1>
          <p>구글의 </p>
          <p>다양한</p>
          <p>기능을 활용해요</p>
        </div>
      </MainArea>
    </>
  );
};

export default Render;

 

canvas

html의 <canvas>태그와 자바스크립트를 사용하면 다양한 그래픽 요소 만들 수 있음

단순한 도형 및 시각화, 애니메이션 사용 

 

id 지정 

<canvas id="canvas">
	캔버스를 지원하지 않는 브라우저에서는 캔버스 대신 태그 사이 내용이 표시됩니다.
</canvas>

 

엘리먼트 선택

const canvas = document.querySelector("#canvas");

 

태그 속성 지정

<canvas id="canvas" width="500" height="500"></canvas>
		// 500픽셀 * 500픽셀로 설정됩니다.

<canvas id="canvas" width="50vw" height="40vh"></canvas>
		// vw, vh를 전달했지만 50픽셀 * 40픽셀로 설정됩니다.

 

DOM으로 지정

 canvas.width = 50vw;
   canvas.height = 40vh;
   	// DOM으로 설정하면 50vw * 40vh 로 단위값을 지정해도 설정이 됩니다.
   
   canvas.width = window.innerWidth;
   canvas.height = window.innerHeight;
   	// 화면 크기에 맞춰서 설정해줄 수도 있습니다.

 

차트 만들기 

<canvas id="popChart" width="600" height="400"></canvas>

let popCanvas = document.getElementById("popChart");

let barChart = new Chart(popCanvas, {
  type: 'bar',
  data: {
    labels: ["China", "India", "United States", "Indonesia", "Brazil", "Pakistan", "Nigeria", "Bangladesh", "Russia", "Japan"],
    datasets: [{
      label: 'Population',
      data: [1379302771, 1281935911, 326625791, 260580739, 207353391, 204924861, 190632261, 157826578, 142257519, 126451398],
      backgroundColor: [
        'rgba(255, 99, 132, 0.6)',
        'rgba(54, 162, 235, 0.6)',
        'rgba(255, 206, 86, 0.6)',
        'rgba(75, 192, 192, 0.6)',
        'rgba(153, 102, 255, 0.6)',
        'rgba(255, 159, 64, 0.6)',
        'rgba(255, 99, 132, 0.6)',
        'rgba(54, 162, 235, 0.6)',
        'rgba(255, 206, 86, 0.6)',
        'rgba(75, 192, 192, 0.6)',
        'rgba(153, 102, 255, 0.6)'
      ]
    }]
  }
});

'프로그래밍 > CS' 카테고리의 다른 글

CI/CD  (0) 2022.08.08
Lighthouse  (0) 2022.08.04
HTML/CSS 심화  (0) 2022.07.22
기술면접 준비(재귀, 웹표준, 보안)  (2) 2022.07.20
[인증/보안] Auth Oauth  (0) 2022.07.18

댓글