[CSS - keyframes, border-radius] 원 도형 아티클 디자인

2022. 9. 23. 17:31· 프론트엔드/CS
목차
  1. 기본 제작
  2. 1. HTML
  3. 2. CSS 작성
  4. 2-1. 구조
  5. 2-2. 애니메이션
  6. 2-3. 가상 클래스를 사용한 세부 설정

기본 제작

위처럼 기본적으로 3개의 도형이 움직이는 아티클을 만들고, 마우스를 올렸을 때 색상을 부여하는 방식의 디자인이다.

 

1. HTML

<!DOCTYPE html>
<html lang="ko">

<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <link rel="stylesheet" href="css/style.css">
</head>

<body>

  <div class="square">
    <span></span>
    <span></span>
    <span></span>
    <div>
      <h2>Heading Text</h2>
      <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Alias qui aperiam ducimus omnis enim. Consequuntur
        esse quisquam laborum aspernatur, officiis ipsum fugit optio et hic suscipit ipsam veritatis vero consectetur.
      </p>
      <a href="#none">Read More</a>
    </div>
  </div>
  
</body>

</html>

HTML 구조는 아래와 같다.

└ div .square
	├ span
    ├ span
    ├ span
    └ div
    	├ h2
        ├ p
        └ a

2. CSS 작성

2-1. 구조

body {
  font-family: "Raleway", sans-serif;
  line-height: 1.5em;
  margin: 0;
  font-weight: 300;
  background-color: #333;
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
}

a {
  text-decoration: none;
}

기본적으로 가장 부모인 .square div 태그를 정중앙에 정렬시키고자 flex를 사용했다. 

 

.square {
  width: 400px;
  height: 400px;
  position: relative;
}
.square span {
  position: absolute;
  width: inherit;
  height: inherit;
  border: 1px solid #fff;
  border-radius: 40% 60% 65% 35% / 40% 50% 55% 60%;
  transition: 0.5s;
  animation: circle 5s linear infinite;
}
  • 일단 가장 바깥에서 모든 span 태그를 감싸는 div 태그의 크기를 지정했다(지금 보면 웬만해서 여러 태그가 있는 경우 하나로 감싸는 태그를 사용해서 구조를 작성하신다. 좋은 방법인 것 같다).

 

그런데 신기하게 위치 조정을 굳이 하지 않는데 position 속성을 각각 적절하게 부여하였다. 왜인지 궁금해서 이것저것 주석을 넣었다 빼며 확인해봤는데, position을 absolute 로 주면서 자식 요소는 부모요소를 기준으로 절대적으로 위치를 옮길 수 있으며, 이는 높이값도 영향을 가질 수 있게 된다. 실제로, 부모 요소의 높이값을 200px로 줄였더니 도형이 아래로 이동했다. 즉 부모 요소의 기준 값이 아래로 이동했기 때문에 span태그 요소의 위치도 아래로 이동한 것이다. 참 신기하면서도 어렵다!

  • 그 다음 span 태그에는 각각 크기를 상속받도록 했으며 처음에는 가장자리를 하얀 색으로 칠해준다. 여기서 border-radius를 두 개 사용함으로써 원을 더 다양하게 변형시킬 수 있다. 그리고 애니메이션에서 background-color를 바꿀 예정이라서 transition 을 0.5로 설정했다.
.square > div {
  text-align: center;
  position: absolute;
  width: 70%;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  color: #fff;
}

.square > div > a {
  color: #fff;
  text-decoration: none;
  padding: 10px;
  border: 1px solid #fff;
  border-radius: 60% 50% 90% 60% / 70% 90% 50% 70%;
}

도형에 들어갈 글과 a 태그의 설정을 정해준다.

2-2. 애니메이션

@keyframes circle {
  0% {
    transform: rotate(0);
  }
  100% {
    transform: rotate(360deg);
  }
}

circle이라는 애니메이션은 0도부터 360도까지 회전하는 애니메이션으로 구성했다.

2-3. 가상 클래스를 사용한 세부 설정

.square:hover span {
  background-color: crimson;
  border: none;
}

.square span:nth-child(1) {
  animation: circle 6s linear infinite;
}
.square span:nth-child(2) {
  animation: circle 4s linear infinite;
  animation-direction: reverse;
}
.square span:nth-child(3) {
  animation: circle 10s linear infinite;
}

.square:hover span:nth-child(1) {
  opacity: 0.3;
}

.square:hover span:nth-child(2) {
  opacity: 0.5;
}

.square:hover span:nth-child(3) {
  opacity: 0.8;
}
  • 첫 번째는 전체적으로 hover가 됐을 때 span 태그에 색상을 부여하고 테두리를 없애준다.
  • 그 다음 각 span 태그들이 서로 다른 속도로 회전하도록 구성한다. 그리고, 역방향으로도 이동할 수 있도록 animation-direction: reverse 를 사용했다.
  • 그 다음 각각 투명도도 다르게 해줬다 이건 굳이 hover가 아니어도 상관 없다.

여기서 중요한 것은 굳이 div를 여러 번 사용하지 않고 span태그를 사용해서 조금 더 클래스를 덜 사용하는 방법이다~!

 

클래스를 덜 사용하여 조금 더 가독성도 있고 선택자를 자유롭게 사용할 수 있다!

저작자표시 비영리

'프론트엔드 > CS' 카테고리의 다른 글

[CSS - Hover, Opacity] Hover시 디테일 표시  (0) 2022.09.25
[CSS - Hover, Display] 드롭다운 네비게이션  (0) 2022.09.25
[CSS - Keyframes] 로딩 애니메이션(사각형 회전 이동, 색상 변화)  (1) 2022.09.23
[CSS - keyframes] 로딩 애니메이션(원 도형 크기, 투명도 변화)  (0) 2022.09.22
  1. 기본 제작
  2. 1. HTML
  3. 2. CSS 작성
  4. 2-1. 구조
  5. 2-2. 애니메이션
  6. 2-3. 가상 클래스를 사용한 세부 설정
'프론트엔드/CS' 카테고리의 다른 글
  • [CSS - Hover, Opacity] Hover시 디테일 표시
  • [CSS - Hover, Display] 드롭다운 네비게이션
  • [CSS - Keyframes] 로딩 애니메이션(사각형 회전 이동, 색상 변화)
  • [CSS - keyframes] 로딩 애니메이션(원 도형 크기, 투명도 변화)
턴태
턴태
import { Dream } from "future";
턴태
턴태의 밑바닥부터 시작하는 de-vlog
턴태
전체
오늘
어제
  • ROOT (187)
    • Node.js (37)
      • ES6 (1)
      • TypeScript (3)
      • Express.js (16)
      • NestJS (16)
      • JS (24)
    • 프론트엔드 (29)
      • CS (5)
    • 백엔드 (1)
      • 검색 (2)
      • Database (1)
    • 기타 툴 (1)
      • git (1)
    • 데브옵스 & 인프라 (19)
      • Kubernetes (15)
      • Docker (2)
      • Monitoring (1)
      • IaC (1)
    • Algorithm (90)
      • Implementation & simulation (5)
      • Math (4)
      • Brute Force (1)
      • String (0)
      • Graph (5)
      • Recursion & Backtracking (19)
      • Divide & Conquer (2)
      • Dynamic Programming (18)
      • Greedy (13)
      • Priority Queue (2)
      • Binary Search (6)
      • Data Structure (7)
      • Shortest Path (5)
      • Minimum Spanning Tree (1)
      • Sorting (1)
      • Prefix Sum (1)
    • Linux (1)
      • Ubuntu (1)
    • Diary (5)
      • Algorithm (1)
      • Conference (1)
      • Retrospective (3)
    • Book (0)
      • Self-Development (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 디프만
  • baekjoon
  • 토이프로젝트
  • k8s
  • 노드
  • Express
  • Toy Project
  • node.js
  • nestjs
  • dynamic programming
  • Omuk
  • GREEDY
  • 쿠버네티스
  • 타입스크립트
  • 인프런
  • backtracking
  • python
  • 파이썬
  • 자바스크립트
  • 백준
  • 백트래킹
  • 네스트
  • 익스프레스
  • TypeScript
  • 함수형 프로그래밍
  • 다이나믹 프로그래밍
  • Kubernetes
  • N과 M
  • 인프런X디프만
  • 오먹

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
턴태
[CSS - keyframes, border-radius] 원 도형 아티클 디자인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.