>  기사  >  웹 프론트엔드  >  순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

青灯夜游
青灯夜游앞으로
2022-01-27 10:52:592426검색

이 기사에서는 순수 CSS를 사용하여 중국 매듭을 그리는 방법을 단계별로 설명하고 이 중국 매듭에 빨간 봉투 비 애니메이션 효과를 추가하는 것이 모든 사람에게 도움이 되기를 바랍니다.

순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

춘절은 중국인에게 가장 중요한 명절로, 동서남북에 따라 다양한 풍습이 있습니다. 새해의 풍미를 더하기 위해 모든 가정에서는 새해 동안 붉은 등, 붉은 대련, 붉은 축복 문자, 붉은 중국 매듭 등 가정을 번영시키기 위한 다양한 설날 상품과 장식을 구입합니다.

순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

중국 매듭의 원료는 단순한 빨간 밧줄로, 고대인의 독창적인 아이디어를 통해 다이아몬드 격자로 엮어졌습니다. 격자무늬의 밧줄은 촘촘하게 연결되어 있어 가족의 화합, 화합, 행복을 상징합니다.

순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

그렇다면 CSS를 사용하여 중국어 매듭을 만드는 방법은 무엇일까요? 먼저 최종 효과를 살펴보겠습니다.

순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

온라인 미리보기 코드펜 주소:
https://codepen.io/cliea/pen/LYOPbBr

이런 놀라운 효과도 만들 수 있으니 시작해 보세요!

1. 코딩하기 전

1. 재료는 간단할수록 좋습니다

먼저 인터넷에서 중국 매듭 사진을 검색해 보세요. 우리는 가장 고전적인 중국 매듭 직조 스타일을 선택합니다. 사진의 품질이 최종 제품의 품질을 결정합니다. 아래는 비교적 깔끔하고 선명한 중국매듭 사진입니다. CSS를 작성할 때 참고용으로 사용하세요.

순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

2. 세부 사항을 관찰하고 구현 가능성을 생각해 보세요

사진이 있으니 이제 코드 작성을 시작할 수 있나요? 물론 그렇지 않습니다.

우선 지금 해야 할 일을 생각해 보세요. CSS로 중국식 매듭을 그려보세요.

정말 생각해 보셨나요? 이것이 달성 가능한 목표인가? 리더가 당신에게 작업을 할당한다고 상상해 보세요. 앱의 테마 색상에 따라 휴대폰 케이스 색상을 변경하는 것입니다. 이제 코드 작성을 시작하시겠습니까?

두 가지 질문에 대해 생각하게 됩니다.

  • 소프트웨어로서 앱에 휴대폰 케이스와 상호 작용할 수 있는 인터페이스가 있나요?

  • 휴대폰 케이스가 색상 값을 받으면 어떻게 색상이 바뀌나요?

이것은 다소 극단적인 것입니다. 예를 들어 위의 두 가지를 모두 달성할 수 없습니다. CSS와 중국 매듭 이미지로 돌아갑니다. 가장 먼저 생각해야 할 것은 이 이미지를 얻기 위해 어떤 CSS 기술을 사용해야 합니까?입니다. 이제 다시 돌아가서 위의 그림을 자세히 살펴보세요.

짧은 관찰 끝에 다음과 같은 핵심 포인트를 발견했습니다.

  • 중국 매듭의 밧줄은 그라데이션 색상, 진한 빨간색, 연한 빨간색, 진한 빨간색

  • 으로 구성되어 있습니다. 중앙은 서로 22개로 구성되어 있으며 교차로를 지날 때마다 층위의 순서가 바뀌는 구조가 있고 색상의 그라데이션 과정은 직선과 동일하다. 모든 것이 빨간색이고 노란색 장식이 있습니다.

  • 그런 다음
  • predict

    구현 원칙
  • :
  • 직선 색상 그라데이션, 선형 그라데이션 또는 반복 선형 그라데이션

링 그라디언트, radial-gradient

    그리드 교차점 사용, 마스크 사용하여 교차점 효과
  • linear-gradient 或者 repeating-linear-gradient

  • 环状渐变,使用 radial-gradient

  • 网格的交叉,使用 mask 遮罩来达到交叉效果

  • 四分之三环以及底部两根弯曲的绳子使用 clip-path 来裁剪

  • 为了使编码更方便,采用 SCSS

  • 许多地方可以使用 ::before ::after 实现,减少html代码

3. 结构拆分,化整为零

上面是从技术角度从整体观察,下面就是对整个图片进行拆分,先确定其 html 结构。

  • 中间像棋盘一样的网格结构,可以作为一个 html 标签

순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

  • 四周16个小半圆,使用16个标签定位实现

순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

  • 两个四分之三圆,放在一组里,使用相同的样式,第二个基于第一个旋转180deg
  • 3- 링의 4분의 1과 하단 두 개의 곡선 로프는 clip-path

순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

를 사용하여 절단됩니다. 코딩을 더욱 편리하게 하려면 SCSS🎜🎜🎜🎜를 사용하세요. ::를 여러 곳에서 사용하세요. ::after 구현, html 코드🎜🎜🎜

3. 구조 분할 및 재구성 제로입니다🎜🎜위는 기술적인 관점에서 전체적인 관찰이고, 다음은 전체 이미지를 분할하고 먼저 html 구조를 결정하는 것입니다. 🎜
    🎜중앙에 있는 바둑판 모양의 그리드 구조는 html 태그로 사용할 수 있습니다🎜🎜🎜순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!🎜
      🎜주위에 16개의 작은 반원, 16개의 라벨 위치 지정을 사용하여🎜🎜🎜순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!🎜
        🎜둘 ​​셋- 같은 스타일을 사용하여 그룹에 배치된 원, 첫 번째 180deg🎜🎜🎜🎜🎜을 기준으로 두 번째 회전
        • 십자매듭 2개는 같은 스타일이므로 그룹으로 묶기도 합니다

        순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        • 위의 작은 구조물 3개를 하나의 그룹으로 묶고, 바깥층은 header로 명명합니다 header

        순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        • 底部左右两部分高度相似,也放在一组,命名为footer

        1순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        这样我们得到了 html 的结构

        <div class="chinese-knot">
          <div class="grid"></div>
          <div class="ring-small">
            <i></i>
            <i></i>
            <i></i>
            <i></i>
            <i></i>
            <i></i>
            <i></i>
            <i></i>
            <i></i>
            <i></i>
            <i></i>
            <i></i>
            <i></i>
            <i></i>
            <i></i>
            <i></i>
          </div>
          <div class="ring-big">
            <i><b></b></i>
            <i><b></b></i>
          </div>
          <div class="cross-node">
            <div class="node">
              <i></i>
              <i></i>
              <i></i>
              <i></i>
            </div>
            <div class="node">
              <i></i>
              <i></i>
              <i></i>
              <i></i>
            </div>
          </div>
          <div class="header">
            <i></i>
            <b></b>
            <span></span>
          </div>
          <div class="footer">
            <b></b>
            <b></b>
            <div class="tassels">
              <i></i>
              <i></i>
            </div>
          </div>
        </div>

        实际编码当中,html 并不是一次写成,而是经过不断调整才成为上面这个样子。

        二、CSS逐个实现中国结部件

        1. 网格

        网格最终效果是个菱形,也就是正方形旋转了45deg,我们先不旋转,看看它是什么样子

        1순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        先设定一个变量,表示绳子的宽度,我们设为--width,这个尺寸很重要,后面所有尺寸都是基于这个宽度,这样后面我们调整整个图形的大小,只要改这一个--width就行了。

        :root {
          --width: 1.7vh;
        }

        垂直和水平都各有11根绳,绳子之间的间隙约为绳子宽度的 0.5 倍,所以可以得到网格的宽高都为 11 + 0.5 * 10 = 16 倍的绳子宽度,所以我们可以这样写:

        :root {
          --width: 1.7vh;
          --grid-width: calc(var(--width) * 16);
        }
        .grid {
          width: var(--grid-width);
          height: var(--grid-width);
        }

        body 加上一些样式,让盒子居中,再加一个深色背景

        body{
          margin: 0;
          display: flex;
          justify-content: center;
          align-items: center;
          height: 100vh;
          background: #1d1e22;
          overflow: hidden;
        }

        再给 .grid 也加一个白色背景色,测试一下:

        1순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        这样屏幕正中间就出现了一个白色方块,下面我们把白色背景改成11根线的样式:

        :root{
          --width: 1.7vh;
          --red-1: #f40001;
          --red-2: #d40000;
          --red-3: #8c0703;
          --rope: 
            var(--red-3), 
            var(--red-2) calc(var(--width) * 0.25), 
            var(--red-1) calc(var(--width) * 0.45), 
            var(--red-1) calc(var(--width) * 0.55), 
            var(--red-2) calc(var(--width) * 0.75), 
            var(--red-3) var(--width);
          --grid-width: calc(var(--width) * 16);
          --bg-line: linear-gradient(90deg, var(--rope), transparent var(--width)) 0 0 / calc(var(--width) * 1.5) calc(var(--width) * 1.5);
        }
        .grid{
          width: var(--grid-width);
          height: var(--grid-width);
          background: var(--bg-line);
        }

        就得到了下面的效果:

        순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        可能你有点蒙圈。发生了什么事情?

        还是让事情变得简单点,我们先画一根不带渐变的红线:

        .grid{
          background: linear-gradient(
            90deg, 
            var(--red-1), 
            var(--red-1) var(--width), 
            transparent var(--width)
          );
        }

        1순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        先是一个线性渐变 linear-gradient,然后旋转角度设为90deg,让它从左到右渐变(默认是从下往上),然后起始值设为--red-1(你问我red-1red-3哪来的?效果图上吸来的),在--width处也设置为--red-1,这样就得到了一根宽为 --width 的红线。但这还没完,得接着在--width 处加一个透明transpanrent,这样从--width直到图形的最右侧就都不填充颜色了。

        但这不太像根绳子,让红线渐变起来:

        .grid{
          background: linear-gradient(
            90deg, 
            var(--red-3), 
            var(--red-2) calc(var(--width) * 0.25), 
            var(--red-1) calc(var(--width) * 0.45), 
            var(--red-1) calc(var(--width) * 0.55), 
            var(--red-2) calc(var(--width) * 0.75), 
            var(--red-3) var(--width), 
            transparent var(--width)
          );
        }

        1순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        这样就得到了一根有一点点立体效果的绳子。可是怎么让它横向重复11次,并且间隔0.5倍的--width呢?看下面的代码:

        .grid{
          background: linear-gradient(
            90deg, 
            var(--red-3), 
            var(--red-2) calc(var(--width) * 0.25), 
            var(--red-1) calc(var(--width) * 0.45), 
            var(--red-1) calc(var(--width) * 0.55), 
            var(--red-2) calc(var(--width) * 0.75), 
            var(--red-3) var(--width), 
            transparent var(--width)
          ) 0 0 / calc(var(--width) * 1.5) calc(var(--width) * 1.5);
        }

        大家来找茬:这段代码和上一段有什么不同?眼尖的你可能已经看出来了,多了这一行:

        0 0 / calc(var(--width) * 1.5) calc(var(--width) * 1.5)

        /为分界线,左边的含义是background-positoin,右边的含义是background-size

        0 0也就是左上角。calc(var(--width) * 1.5) calc(var(--width) * 1.5) 也就是一个正方形,宽度为1.5倍绳宽。

        1순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        这样一个小方块,在垂直和水平方向上重复,就得了我们想要的结果:

        1순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        可是我们想要的是网格,现在顶多也就算个栅格。

        那就使用伪类复制一份,并且旋转90deg

        순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!1순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        하단 왼쪽과 오른쪽 두 부분은 매우 유사하며 footer

        순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!1순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        🎜이런 방식으로 html🎜
        :root{
          --width: 1.7vh;
          --red-1: #f40001;
          --red-2: #d40000;
          --red-3: #8c0703;
          --rope: 
            var(--red-3), 
            var(--red-2) calc(var(--width) * 0.25), 
            var(--red-1) calc(var(--width) * 0.45), 
            var(--red-1) calc(var(--width) * 0.55), 
            var(--red-2) calc(var(--width) * 0.75), 
            var(--red-3) var(--width);
          --grid-width: calc(var(--width) * 16);
          --bg-line: linear-gradient(90deg, var(--rope), transparent var(--width)) 0 0 / calc(var(--width) * 1.5) calc(var(--width) * 1.5);
        }
        .grid {
          width: var(--grid-width);
          height: var(--grid-width);
          background: var(--bg-line);
          &:after {
            content: "";
            display: block;
            width: var(--grid-width);
            height: var(--grid-width);
            background: var(--bg-line);
            transform: rotate(90deg);
          }
        }
        🎜의 구조를 얻습니다. 실제 인코딩에서는 html 한번에 작성한 것이 아니고, 계속해서 수정을 거쳐 지금의 모습이 되었습니다. 🎜

        2. CSS는 중국어 매듭 구성요소를 하나씩 구현합니다.

        1. 그리드

        🎜최종 효과 그리드의 모양은 마름모, 즉 사각형이 45deg 회전한 것입니다. 지금은 회전하지 않고 어떻게 보이는지 살펴보겠습니다🎜🎜1순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!🎜🎜먼저 로프 너비를 나타내는 변수를 설정합니다. >, --width로 설정하겠습니다. 이 크기는 매우 중요입니다. 이후의 모든 크기는 이 너비를 기반으로 하므로 나중에 전체 그래픽의 크기를 조정합니다. --width code>를 변경하면 됩니다. 🎜
        :root{
            ...
            --conic: #000 0 90deg, transparent 0 100%;
        }
        
        .grid {
          ...
          &:after {
            ...
            -webkit-mask: conic-gradient(from 0deg at var(--width) calc(var(--width) * 1.5), var(--conic)) 0 0 / calc(var(--width) * 3) calc(var(--width) * 3),
              conic-gradient(from 90deg at calc(var(--width) * 2.5) 0, var(--conic)) 0 0 / calc(var(--width) * 3) calc(var(--width) * 3),
              conic-gradient(from 180deg at calc(var(--width) * 1.5) var(--width), var(--conic)) 0 0 / calc(var(--width) * 3) calc(var(--width) * 3),
              conic-gradient(from 90deg at 0 calc(var(--width) * 2.5), var(--conic)) 0 0 / calc(var(--width) * 3) calc(var(--width) * 3);
          }
        }
        🎜수직과 수평으로 각각 11개의 로프가 있습니다. 로프 사이의 간격은 로프 너비의 약 0.5이므로 그리드의 너비와 높이는 로프 폭의 11 + 0.5 * 10 = 16배로 얻어지므로 다음과 같이 쓸 수 있습니다. 🎜
        :root{
          --width: 1.7vh;
          --red-1: #f40001;
          --red-2: #d40000;
          --red-3: #8c0703;
          --rope: 
            var(--red-3), 
            var(--red-2) calc(var(--width) * 0.25), 
            var(--red-1) calc(var(--width) * 0.45), 
            var(--red-1) calc(var(--width) * 0.55), 
            var(--red-2) calc(var(--width) * 0.75), 
            var(--red-3) var(--width);
          --grid-width: calc(var(--width) * 16);
          --bg-line: linear-gradient(90deg, var(--rope), transparent var(--width)) 0 0 / calc(var(--width) * 1.5) calc(var(--width) * 1.5);
          --conic: #000 0 90deg, transparent 0 100%;
        }
        body{
          margin: 0;
          display: flex;
          justify-content: center;
          align-items: center;
          height: 100vh;
          background: #1d1e22;
          overflow: hidden;
        }
        .grid {
          width: var(--grid-width);
          height: var(--grid-width);
          background: var(--bg-line);
          &:after {
            content: "";
            display: block;
            width: var(--grid-width);
            height: var(--grid-width);
            background: var(--bg-line);
            transform: rotate(90deg);
            -webkit-mask: conic-gradient(from 0deg at var(--width) calc(var(--width) * 1.5), var(--conic)) 0 0 / calc(var(--width) * 3) calc(var(--width) * 3),
              conic-gradient(from 90deg at calc(var(--width) * 2.5) 0, var(--conic)) 0 0 / calc(var(--width) * 3) calc(var(--width) * 3),
              conic-gradient(from 180deg at calc(var(--width) * 1.5) var(--width), var(--conic)) 0 0 / calc(var(--width) * 3) calc(var(--width) * 3),
              conic-gradient(from 90deg at 0 calc(var(--width) * 2.5), var(--conic)) 0 0 / calc(var(--width) * 3) calc(var(--width) * 3);
          }
        }
        🎜 본문에 몇 가지 스타일을 추가하여 상자를 중앙에 배치하고 심도 색상 배경 ​​추가🎜
        <div class="grid"></div>
        🎜.grid에 흰색 배경 색상을 추가하고 테스트해 보세요:🎜🎜1순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!🎜🎜화면 중앙에 흰색 사각형이 나타납니다. 이제 흰색 배경을 11루트 라인의 스타일: 🎜<pre class="brush:html;toolbar:false;"> &lt;div class=&quot;ring-small&quot;&gt; &lt;i&gt;&lt;/i&gt; &lt;/div&gt;</pre>🎜은 다음과 같은 효과를 얻습니다: 🎜🎜<img src="https://img.php.cn/upload/image/379/730/637/164325083675438%EC%88%9C%EC%88%98%20CSS%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%A4%91%EA%B5%AD%EC%8B%9D%20%EB%A7%A4%EB%93%AD%EC%9D%84%20%EA%B7%B8%EB%A6%AC%EA%B3%A0%20%EC%95%A0%EB%8B%88%EB%A9%94%EC%9D%B4%EC%85%98%20%ED%9A%A8%EA%B3%BC%EB%A5%BC%20%EC%B6%94%EA%B0%80%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%84%20%EB%8B%A8%EA%B3%84%EB%B3%84%EB%A1%9C%20%EC%95%88%EB%82%B4%ED%95%B4%20%EB%93%9C%EB%A6%AC%EA%B2%A0%EC%8A%B5%EB%8B%88%EB%8B%A4!" title=" 164325083675438순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!" alt="순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!">🎜🎜아마도 조금 혼란스러우실 겁니다. 무슨 일이에요? 🎜🎜일을 더 간단하게 만들어 먼저 그라데이션 없이 빨간색 선을 그려 보겠습니다. 🎜<pre class="brush:css;toolbar:false;">.ring-small { i { position: absolute; width: calc(var(--width) * 2.5); height: calc(var(--width) * 1.5); background: radial-gradient( circle at 50% 100%, transparent calc(var(--width) * 0.25), var(--red-3) calc(var(--width) * 0.25), var(--red-2) calc(var(--width) * (0.25 + 0.25)), var(--red-1) calc(var(--width) * (0.25 + 0.45)), var(--red-1) calc(var(--width) * (0.25 + 0.55)), var(--red-2) calc(var(--width) * (0.25 + 0.75)), var(--red-3) calc(var(--width) * (0.25 + 1)), transparent calc(var(--width) * (0.25 + 1)) ); } }</pre>🎜<img src="https://img.php.cn/upload/image/924/565/363/1643250840811960%20.png" title="1643250840811960.png" alt="1순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!">🎜🎜먼저 선형 그래디언트 <code>linear-gradient, 그리고 회전 각도를 90deg로 설정하고, 왼쪽에서 오른쪽으로 그라데이션을 적용한 다음(기본값은 아래에서 위로) 시작 값을 --red-1로 설정합니다(red-1에서 red-3는 어디에서 왔습니까?) --width--red-1로 설정합니다. 다음과 같이 빨간색 선이 표시됩니다. 너비는 --width입니다. 하지만 이것이 아직 끝나지 않았습니다. --width에 투명한 transpanrent를 추가해야 --width에서 맨 오른쪽으로 그래픽 측면 더 이상 색상 채우기가 없습니다. 🎜🎜하지만 밧줄처럼 보이지는 않습니다. 빨간색 선 그라데이션을 적용하세요. 🎜
        /* 先给最外层加个相对定位,后面的绝对定位都相对这一层 */
        .chinese-knot {
          width: var(--grid-width);
          height: var(--grid-width);
          position: relative;
        }
        .ring-small {
          i {
            position: absolute;
            top: calc(var(--width) * -1.5);
            left: calc(var(--width) * 3);
          }
        }
        🎜1순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!🎜🎜이렇게 하면 약간의 입체감이 있는 로프를 얻을 수 있습니다. 그런데 0.5 x --width 간격으로 수평으로 11 번 반복하게 하려면 어떻게 해야 할까요? 아래 코드를 보세요: 🎜
        .ring-small {
          i {
            &:before,
            &:after {
              content: "";
              position: absolute;
              bottom: calc(var(--width) * -0.5 + 1px);
              width: var(--width);
              height: calc(var(--width) * 0.5);
              background: var(--bg-line);
            }
            &:after {
              right: 0;
            }
          }
        }
        🎜 결함을 찾아봅시다: 이 코드와 이전 코드의 차이점은 무엇인가요? 눈썰미가 있으신 분들은 다음과 같은 추가 줄이 있다는 것을 눈치채셨을 것입니다: 🎜
        <div class="grid"></div>
        <i></i> <i></i> <i></i> <i></i> <i></i> <i></i> <i></i> <i></i> <i></i> <i></i> <i></i> <i></i> <i></i> <i></i> <i></i> <i></i>
        🎜 /를 구분선으로 사용하면 왼쪽의 의미는 Background-positoin입니다. 오른쪽의 의미는 배경 크기입니다. 🎜🎜0 0은 왼쪽 상단입니다. calc(var(--width) * 1.5) calc(var(--width) * 1.5)는 너비가 로프 너비의 1.5배인 정사각형입니다. 🎜🎜1순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!🎜🎜이것 way 수직과 수평으로 반복되는 작은 사각형은 우리가 원하는 결과를 제공할 것입니다: 🎜🎜🎜🎜하지만 우리가 원하는 것은 그리드이고, 이제는 기껏해야 그리드일 뿐입니다. 🎜🎜그런 다음 의사 클래스를 사용하여 복사하고 90deg 회전합니다. 🎜
        .ring-small {
          i {
            position: absolute;
            width: calc(var(--width) * 2.5);
            height: calc(var(--width) * 1.5);
            background: radial-gradient(
                circle at 50% 100%, 
                transparent calc(var(--width) * 0.25), 
                var(--red-3) calc(var(--width) * 0.25), 
                var(--red-2) calc(var(--width) * (0.25 + 0.25)),
                var(--red-1) calc(var(--width) * (0.25 + 0.45)), 
                var(--red-1) calc(var(--width) * (0.25 + 0.55)), 
                var(--red-2) calc(var(--width) * (0.25 + 0.75)),
                var(--red-3) calc(var(--width) * (0.25 + 1)), 
                transparent calc(var(--width) * (0.25 + 1))
            );
            &:before,
            &:after {
              content: "";
              position: absolute;
              bottom: calc(var(--width) * -0.5 + 1px);
              width: var(--width);
              height: calc(var(--width) * 0.5);
              background: var(--bg-line);
            }
            &:after {
              right: 0;
            }
            &:nth-child(-n + 4) {
              top: calc(var(--width) * -2 + 2px);
            }
            &:nth-child(1) {
              left: calc(var(--width) * 3);
            }
            &:nth-child(2) {
              left: calc(var(--width) * 6);
            }
            &:nth-child(3) {
              left: calc(var(--width) * 9);
            }
            &:nth-child(4) {
              left: calc(var(--width) * 12);
            }
            &:nth-child(-n + 8):nth-child(n + 5) {
              bottom: calc(var(--width) * -2 + 2px);
              transform: rotate(180deg);
            }
            &:nth-child(5) {
              left: calc(var(--width) * 1.5);
            }
            &:nth-child(6) {
              left: calc(var(--width) * 4.5);
            }
            &:nth-child(7) {
              left: calc(var(--width) * 7.5);
            }
            &:nth-child(8) {
              left: calc(var(--width) * 10.5);
            }
            &:nth-child(-n + 12):nth-child(n + 9) {
              left: calc(var(--width) * -2.5 + 2px);
              transform: rotate(-90deg);
            }
            &:nth-child(9) {
              top: calc(var(--width) * 3.5);
            }
            &:nth-child(10) {
              top: calc(var(--width) * 6.5);
            }
            &:nth-child(11) {
              top: calc(var(--width) * 9.5);
            }
            &:nth-child(12) {
              top: calc(var(--width) * 12.5);
            }
            &:nth-child(-n + 16):nth-child(n + 13) {
              right: calc(var(--width) * -2.5 + 2px);
              transform: rotate(90deg);
            }
            &:nth-child(13) {
              top: calc(var(--width) * 2);
            }
            &:nth-child(14) {
              top: calc(var(--width) * 5);
            }
            &:nth-child(15) {
              top: calc(var(--width) * 8);
            }
            &:nth-child(16) {
              top: calc(var(--width) * 11);
            }
          }
        }
        🎜🎜🎜🎜참조 사진 비교: 🎜🎜🎜🎜

        不能说完全不相干,但是人家一看就经过了能工巧匠的编织,咱们这只能算简单的叠加,怎么才能让上面变成下面呢?

        经过仔细的观察,发现只要把上面一层横着的线,稍加一些遮挡就能实现交叉编织的效果。用哪个css属性实现呢?那就只有mask 了。

        下图蓝色框是需要遮挡的部分,绿色框是需要重复的部分。

        2순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        仔细分析一下绿框的构成:

        2순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        本质上是在一个3×3的正方形上挖两个1×1的小洞,位置分别是0 01.5 1.5。我们要如何画这样一张图?并把这张图应用到mask上呢?

        mask是通过传入的图片进行遮罩处理,而背景图除了传入一张png以外,CSS还内置了几个生成背景图的函数:

        • linear-gradient:线性渐变
        • repeating-linear-gradient:重复线性渐变
        • radial-gradient:径向渐变
        • conic-gradient:圆锥渐变

        这些函数都可以和mask配合。这里我们使用conic-gradient实现上面的图形。

        conic-gradient 实现上图,思路要反着来:不是在方形上挖孔,而是用多个矩形将要渲染的部分填充颜色,剩下的部分自然就是透明的:

        2순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        CSS实现如下:

        :root{
            ...
            --conic: #000 0 90deg, transparent 0 100%;
        }
        
        .grid {
          ...
          &:after {
            ...
            -webkit-mask: conic-gradient(from 0deg at var(--width) calc(var(--width) * 1.5), var(--conic)) 0 0 / calc(var(--width) * 3) calc(var(--width) * 3),
              conic-gradient(from 90deg at calc(var(--width) * 2.5) 0, var(--conic)) 0 0 / calc(var(--width) * 3) calc(var(--width) * 3),
              conic-gradient(from 180deg at calc(var(--width) * 1.5) var(--width), var(--conic)) 0 0 / calc(var(--width) * 3) calc(var(--width) * 3),
              conic-gradient(from 90deg at 0 calc(var(--width) * 2.5), var(--conic)) 0 0 / calc(var(--width) * 3) calc(var(--width) * 3);
          }
        }

        预览效果

        순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        目前为止完整代码

        :root{
          --width: 1.7vh;
          --red-1: #f40001;
          --red-2: #d40000;
          --red-3: #8c0703;
          --rope: 
            var(--red-3), 
            var(--red-2) calc(var(--width) * 0.25), 
            var(--red-1) calc(var(--width) * 0.45), 
            var(--red-1) calc(var(--width) * 0.55), 
            var(--red-2) calc(var(--width) * 0.75), 
            var(--red-3) var(--width);
          --grid-width: calc(var(--width) * 16);
          --bg-line: linear-gradient(90deg, var(--rope), transparent var(--width)) 0 0 / calc(var(--width) * 1.5) calc(var(--width) * 1.5);
          --conic: #000 0 90deg, transparent 0 100%;
        }
        body{
          margin: 0;
          display: flex;
          justify-content: center;
          align-items: center;
          height: 100vh;
          background: #1d1e22;
          overflow: hidden;
        }
        .grid {
          width: var(--grid-width);
          height: var(--grid-width);
          background: var(--bg-line);
          &:after {
            content: "";
            display: block;
            width: var(--grid-width);
            height: var(--grid-width);
            background: var(--bg-line);
            transform: rotate(90deg);
            -webkit-mask: conic-gradient(from 0deg at var(--width) calc(var(--width) * 1.5), var(--conic)) 0 0 / calc(var(--width) * 3) calc(var(--width) * 3),
              conic-gradient(from 90deg at calc(var(--width) * 2.5) 0, var(--conic)) 0 0 / calc(var(--width) * 3) calc(var(--width) * 3),
              conic-gradient(from 180deg at calc(var(--width) * 1.5) var(--width), var(--conic)) 0 0 / calc(var(--width) * 3) calc(var(--width) * 3),
              conic-gradient(from 90deg at 0 calc(var(--width) * 2.5), var(--conic)) 0 0 / calc(var(--width) * 3) calc(var(--width) * 3);
          }
        }
        <div class="grid"></div>

        没错,这个图形,只用了.grid这一个标签!

        但是只有网格还不够,让我们继续。

        2. 半圆环

        回头看一下参考图:

        2순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        嗯,环形渐变,那就是radial-gradient了:

          <div class="ring-small">
            <i></i>
          </div>
        .ring-small {
          i {
            position: absolute;
            width: calc(var(--width) * 2.5);
            height: calc(var(--width) * 1.5);
            background: radial-gradient(
                circle at 50% 100%, 
                transparent calc(var(--width) * 0.25), 
                var(--red-3) calc(var(--width) * 0.25), 
                var(--red-2) calc(var(--width) * (0.25 + 0.25)),
                var(--red-1) calc(var(--width) * (0.25 + 0.45)), 
                var(--red-1) calc(var(--width) * (0.25 + 0.55)), 
                var(--red-2) calc(var(--width) * (0.25 + 0.75)),
                var(--red-3) calc(var(--width) * (0.25 + 1)), 
                transparent calc(var(--width) * (0.25 + 1))
            );
          }
        }

        2순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        这样就得到了半个环形图,让我们使用定位把它和网格结合看看

        /* 先给最外层加个相对定位,后面的绝对定位都相对这一层 */
        .chinese-knot {
          width: var(--grid-width);
          height: var(--grid-width);
          position: relative;
        }
        .ring-small {
          i {
            position: absolute;
            top: calc(var(--width) * -1.5);
            left: calc(var(--width) * 3);
          }
        }

        2순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        对比素材图,发现环形不是直接紧贴在网格上的,而是先延伸了一小段直线,再接的曲线。那我们就给它增个高吧:

        .ring-small {
          i {
            &:before,
            &:after {
              content: "";
              position: absolute;
              bottom: calc(var(--width) * -0.5 + 1px);
              width: var(--width);
              height: calc(var(--width) * 0.5);
              background: var(--bg-line);
            }
            &:after {
              right: 0;
            }
          }
        }

        上面使用两个伪类,为半圆环加了两截高度为 0.5--width的增高垫,效果如下图

        2순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        接着复制16个这样的图形,分别定位到各自的位置上:

        <div class="grid"></div>
        <i></i> <i></i> <i></i> <i></i> <i></i> <i></i> <i></i> <i></i> <i></i> <i></i> <i></i> <i></i> <i></i> <i></i> <i></i> <i></i>
        .ring-small {
          i {
            position: absolute;
            width: calc(var(--width) * 2.5);
            height: calc(var(--width) * 1.5);
            background: radial-gradient(
                circle at 50% 100%, 
                transparent calc(var(--width) * 0.25), 
                var(--red-3) calc(var(--width) * 0.25), 
                var(--red-2) calc(var(--width) * (0.25 + 0.25)),
                var(--red-1) calc(var(--width) * (0.25 + 0.45)), 
                var(--red-1) calc(var(--width) * (0.25 + 0.55)), 
                var(--red-2) calc(var(--width) * (0.25 + 0.75)),
                var(--red-3) calc(var(--width) * (0.25 + 1)), 
                transparent calc(var(--width) * (0.25 + 1))
            );
            &:before,
            &:after {
              content: "";
              position: absolute;
              bottom: calc(var(--width) * -0.5 + 1px);
              width: var(--width);
              height: calc(var(--width) * 0.5);
              background: var(--bg-line);
            }
            &:after {
              right: 0;
            }
            &:nth-child(-n + 4) {
              top: calc(var(--width) * -2 + 2px);
            }
            &:nth-child(1) {
              left: calc(var(--width) * 3);
            }
            &:nth-child(2) {
              left: calc(var(--width) * 6);
            }
            &:nth-child(3) {
              left: calc(var(--width) * 9);
            }
            &:nth-child(4) {
              left: calc(var(--width) * 12);
            }
            &:nth-child(-n + 8):nth-child(n + 5) {
              bottom: calc(var(--width) * -2 + 2px);
              transform: rotate(180deg);
            }
            &:nth-child(5) {
              left: calc(var(--width) * 1.5);
            }
            &:nth-child(6) {
              left: calc(var(--width) * 4.5);
            }
            &:nth-child(7) {
              left: calc(var(--width) * 7.5);
            }
            &:nth-child(8) {
              left: calc(var(--width) * 10.5);
            }
            &:nth-child(-n + 12):nth-child(n + 9) {
              left: calc(var(--width) * -2.5 + 2px);
              transform: rotate(-90deg);
            }
            &:nth-child(9) {
              top: calc(var(--width) * 3.5);
            }
            &:nth-child(10) {
              top: calc(var(--width) * 6.5);
            }
            &:nth-child(11) {
              top: calc(var(--width) * 9.5);
            }
            &:nth-child(12) {
              top: calc(var(--width) * 12.5);
            }
            &:nth-child(-n + 16):nth-child(n + 13) {
              right: calc(var(--width) * -2.5 + 2px);
              transform: rotate(90deg);
            }
            &:nth-child(13) {
              top: calc(var(--width) * 2);
            }
            &:nth-child(14) {
              top: calc(var(--width) * 5);
            }
            &:nth-child(15) {
              top: calc(var(--width) * 8);
            }
            &:nth-child(16) {
              top: calc(var(--width) * 11);
            }
          }
        }

        就得到了这样的效果

        2순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        哈哈,很像下水管道~

        3. 四分之三圆环

        还是先看素材:

        순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        嗯,不得不怀疑网易云的 LOGO 的灵感是不是就是中国结。

        30-순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        单个环形已经实现了,两个环也不难吧:

        <div class="ring-big">
            <i><b></b></i>
        </div>
        .ring-big {
          i {
            position: absolute;
            width: calc(var(--width) * 6);
            height: calc(var(--width) * 6);
            b {
              position: absolute;
              left: 0;
              top: 0;
              width: 100%;
              height: 100%;
              background: radial-gradient(
                circle at 50% 50%,
                transparent calc(var(--width) * 0.5),
                var(--red-3) calc(var(--width) * 0.5),
                var(--red-2) calc(var(--width) * (0.5 + 0.25)),
                var(--red-1) calc(var(--width) * (0.5 + 0.45)),
                var(--red-1) calc(var(--width) * (0.5 + 0.55)),
                var(--red-2) calc(var(--width) * (0.5 + 0.75)),
                var(--red-3) calc(var(--width) * (0.5 + 1)),
                transparent calc(var(--width) * (0.5 + 1)),
                transparent calc(var(--width) * 2),
                var(--red-3) calc(var(--width) * 2),
                var(--red-2) calc(var(--width) * (2 + 0.25)),
                var(--red-1) calc(var(--width) * (2 + 0.45)),
                var(--red-1) calc(var(--width) * (2 + 0.55)),
                var(--red-2) calc(var(--width) * (2 + 0.75)),
                var(--red-3) calc(var(--width) * (2 + 1)),
                transparent calc(var(--width) * (2 + 1))
              );
            }
          }
        }

        3순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        为什么 <i></i> 标签里要再套一个标签呢,因为接下来我们要执行 clip-path,还要给圆环增高,而clip-path 会给增高的部分也裁剪掉,所以只能再套一层,让内层的 <b></b> 自己 clip,增高则使用 <i></i> 的伪类实现。下面就是将圆环右下角 1/4 裁剪掉并且加一个增高垫的代码:

        .ring-big {
          i {
            ...
            b {
              ...
              clip-path: polygon(0 0, 100% 0, 100% 50%, 50% 50%, 50% 100%, 0 100%);
            }
            &:before,
            &:after {
              content: "";
              position: absolute;
              top: calc(var(--width) * 3 - 1px);
              left: calc(var(--width) * 3.5);
              width: calc(var(--width) * 2.5);
              height: calc(var(--width) * 0.5 + 2px);
              background: repeating-linear-gradient(
                90deg, 
                var(--red-3), 
                var(--red-2) calc(var(--width) * 0.25), 
                var(--red-1) calc(var(--width) * 0.45), 
                var(--red-1) calc(var(--width) * 0.55), 
                var(--red-2) calc(var(--width) * 0.75), 
                var(--red-3) var(--width), 
                transparent var(--width), 
                transparent calc(var(--width) * 1.5)
              );
            }
            &:after {
              transform: rotate(90deg);
              transform-origin: left top;
              top: calc(var(--width) * 3.5);
              left: calc(var(--width) * 3.5 + 1px);
            }
          }
        }

        3순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        复制一份并定位:

        .ring-big {
          i {
            ...
            &:nth-child(1) {
              left: calc(var(--width) * -3.5);
              top: calc(var(--width) * -3.5);
            }
            &:nth-child(2) {
              left: auto;
              top: auto;
              right: calc(var(--width) * -3.5);
              bottom: calc(var(--width) * -3.5);
              transform: rotate(180deg);
            }
          }
        }

        3순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        到这里,工作的一半就已经完成了~继续

        4. 十字结

        순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        这个图形,相对于上面几个,已经没什么难度了,五个1×1 的正方形,中间的渐变方向和周围四个垂直。

        中间的正方形,用父级本身实现,里面周围四个,用四个子<i></i>标签实现:

        <div class="cross-node">
            <div class="node">
              <i></i>
              <i></i>
              <i></i>
              <i></i>
            </div>
            <div class="node">
              <i></i>
              <i></i>
              <i></i>
              <i></i>
            </div>
          </div>
        .cross-node {
          .node {
            position: absolute;
            z-index: 2;
            width: var(--width);
            height: var(--width);
            background: var(--bg-line);
            i {
              position: absolute;
              width: var(--width);
              height: var(--width);
              background: var(--bg-line);
              transform: rotate(90deg);
              &:nth-child(1) {
                left: calc(var(--width) * -1);
              }
              &:nth-child(2) {
                left: var(--width);
              }
              &:nth-child(3) {
                top: calc(var(--width) * -1);
              }
              &:nth-child(4) {
                top: var(--width);
              }
            }
            &:nth-child(1) {
              right: calc(var(--width) * -1);
              top: calc(var(--width) * -1);
            }
            &:nth-child(2) {
              left: calc(var(--width) * -1);
              bottom: calc(var(--width) * -1);
            }
          }
        }

        3순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        3순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        5. 挂绳

        前面我们都是让中国结处于一个斜躺的姿态,写头部和尾部之前,让我们先把它摆正:

        .chinese-knot {
          ...
          transform: rotate(-45deg) translate(calc(var(--width) * 4), calc(var(--width) * -4));
        }

        3순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        回头看素材图:

        3순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        先确定一下html结构:

        <div class="header">
            <i></i>
            <b></b>
            <span></span>
        </div>

        i 是上面的吊绳,b 是圆环,span 是衔接处的短绳,带点黄色装饰。为了方便调整定位,我们从下往上实现,先写短绳:

        :root {
          --yellow-1: #fced00;
          --yellow-2: #f28a00;
          --yellow-3: #da571b;
          --bg-yellow: linear-gradient(
            90deg,
            var(--yellow-3),
            var(--yellow-2) 20%,
            var(--yellow-1) 40%,
            var(--yellow-1) 60%,
            var(--yellow-2) 80%,
            var(--yellow-3) 100%
          );
        }
        .header {
          position: absolute;
          right: 0;
          top: 0;
          transform: rotate(45deg);
          i {
            position: absolute;
            bottom: calc(var(--width) * 1);
            left: calc(var(--width) * -0.5);
            width: calc(var(--width) * 1);
            height: calc(var(--width) * 2);
            background: var(--bg-line);
            &:before {
              content: "";
              display: block;
              height: calc(var(--width) * 0.5);
              background: var(--bg-yellow);
            }
          }
        }

        然后是圆环:

        .header {
          ...
          b {
            position: absolute;
            bottom: calc(var(--width) * 3);
            left: calc(var(--width) * -1.5);
            width: calc(var(--width) * 3);
            height: calc(var(--width) * 3);
            background: radial-gradient(
              circle at 50%,
              transparent calc(var(--width) * 0.75),
              var(--red-3) calc(var(--width) * 0.75),
              var(--red-2) calc(var(--width) * (0.75 + 0.15)),
              var(--red-1) calc(var(--width) * (0.75 + 0.3)),
              var(--red-1) calc(var(--width) * (0.75 + 0.45)),
              var(--red-2) calc(var(--width) * (0.75 + 0.6)),
              var(--red-3) calc(var(--width) * (0.75 + 0.75)),
              transparent calc(var(--width) * (0.75 + 0.75))
            );
          }
        }

        最后是长的吊绳:

        .header {
          ...
          span {
            position: absolute;
            bottom: calc(var(--width) * 5);
            left: calc(var(--width) * -0.25);
            width: calc(var(--width) * 0.5);
            height: calc(var(--width) * 30);
            background: linear-gradient(90deg, var(--red-2), var(--red-1) 20%, var(--red-2) 70%, var(--red-3));
            border-radius: calc(var(--width) * 0.25);
          }
        }

        单独效果

        3순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        整体效果

        순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        6. 流苏

        4순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        确定html结构:

        <div class="footer">
            <b></b>
            <b></b>
            <div class="tassels">
              <i></i>
              <i></i>
            </div>
        </div>

        可以看到,流苏部分,有两个弯曲的 1/8 环,我们用两个b 标签来表示。这个形状依然还是先画一个完整的环,然后裁剪来实现:

        .footer {
          position: absolute;
          left: 0;
          bottom: 0;
          b {
            position: absolute;
            width: calc(var(--width) * 15);
            height: calc(var(--width) * 15);
            background: radial-gradient(
              circle at 50%,
              transparent calc(var(--width) * 6.5),
              var(--red-3) calc(var(--width) * 6.5),
              var(--red-2) calc(var(--width) * (6.5 + 0.25)),
              var(--red-1) calc(var(--width) * (6.5 + 0.45)),
              var(--red-1) calc(var(--width) * (6.5 + 0.55)),
              var(--red-2) calc(var(--width) * (6.5 + 0.75)),
              var(--red-3) calc(var(--width) * (6.5 + 1)),
              transparent calc(var(--width) * (6.5 + 1))
            );
          }
        }

        4순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        加上裁剪并定位:

        .footer {
          ...
          b {
            ...
            &:nth-child(1) {
              left: calc(var(--width) * -8.5);
              top: calc(var(--width) * 1);
              clip-path: polygon(50% 0, 50% 50%, 10% 0);
            }
            &:nth-child(2) {
              left: calc(var(--width) * -16);
              top: calc(var(--width) * -6.5);
              clip-path: polygon(100% 50%, 50% 50%, 100% 90%);
            }
          }
        }

        4순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        两个小尾巴就实现了。

        最后是流苏。先画一下背景上的垂直细线,这里我们用 repeating-linear-gradient 实现,每隔 2px 画一条 1px 宽的透明度为 0.2 的黑线:

        .footer {
          .tassels {
            i {
              position: absolute;
              width: calc(var(--width) * 2.5);
              height: calc(var(--width) * 14);
              background: var(--red-2) repeating-linear-gradient(90deg, rgba(0, 0, 0, 0.2) 0, rgba(0, 0, 0, 0.2) 1px, transparent 1px, transparent 3px) 50% 50% / 3px 1px;}
          }
        }

        순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        再蒙上一层黄色的装饰:

        .footer {
          .tassels {
            i {
              ...
              &:before {
                content: "";
                position: absolute;
                top: calc(var(--width) * 0.5);
                width: 100%;
                height: calc(var(--width) * 3.6);
                background: var(--bg-yellow);
                clip-path: polygon(0 0, 100% 0, 100% 10%, 0 10%, 0 15%, 100% 15%, 100% 85%, 0 85%, 0 90%, 100% 90%, 100% 100%, 0 100%, 0 0);
              }
          }
        }

        4순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        上面代码中使用 clip-path 对黄色背景裁剪,露出两条红线,裁剪路径可以用下图表示:

        4순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        最终效果:

        4순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        三、加点动画

        本来到这里就应该结束了。但是我想让这个中国结有点实际用途,比如加点交互什么的。

        红包也是春节的习俗之一,那就加一个拉一下中国结掉落红包雨的特效吧~

        1. 拉一下

        给中国结在:active状态下加个位移即可实现:

        .chinese-knot {
          width: var(--grid-width);
          height: var(--grid-width);
          position: relative;
          transform: rotate(-45deg) translate(calc(var(--width) * 4), calc(var(--width) * -4));
          cursor: pointer;
          -webkit-tap-highlight-color: transparent;
          transition: all 0.5s;
          &:active {
            transform: rotate(-45deg) translate(calc(var(--width) * 2), calc(var(--width) * -2));
          }
        }

        순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        2. 画个红包

        先搜索一个红包素材:

        4순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        观察一下红包结构,深红背景,浅红弧形开口,加一个黄色圆形封口,上面写着一个繁体的开字。

        我们可以先确定 html 结构。.rain 作为外层,代表整个红包雨,一个i标签代表一个红包:

        <div class="rain">
          <i></i>
        </div>

        一个标签怎么实现上面提到的三种元素呢?看代码:

        .rain {
          position: absolute;
          top: 0;
          left: 0;
          right: 0;
          display: flex;
          justify-content: space-around;
          i {
            position: relative;
            display: block;
            width: calc(var(--width) * 5);
            height: calc(var(--width) * 8);
            background: var(--red-3);
            border-radius: calc(var(--width) * 0.4);
            overflow: hidden;
            box-shadow: 0 calc(var(--width) * 1) calc(var(--width) * 1) rgba(0, 0, 0, 0.3);
            &:before {
              content: "";
              position: absolute;
              left: 50%;
              transform: translate(-50%, -50%);
              width: calc(var(--width) * 8);
              height: calc(var(--width) * 8);
              background: var(--red-1);
              opacity: 0.5;
              border-radius: 50%;
            }
            &:after {
              content: "開";
              position: absolute;
              left: 50%;
              transform: translate(-50%, 140%);
              width: calc(var(--width) * 2);
              height: calc(var(--width) * 2);
              background: var(--yellow-2);
              border-radius: 50%;
              display: flex;
              align-items: center;
              justify-content: center;
              font-style: normal;
              font-size: calc(var(--width) * 0.5);
              color: var(--yellow-1);
              text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.1);
            }
          }
        }

        순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        使用i标签自身实现红包主体,:before 伪类实现弧形的开口,:after 伪类实现黄色圆形封口,在content中写上字。

        一个红包完成了,再复制 9 个:

        <div class="rain">
          <i></i>
          <i></i>
          <i></i>
          <i></i>
          <i></i>
          <i></i>
          <i></i>
          <i></i>
          <i></i>
          <i></i>
        </div>

        5순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        这样就得到了 10 个固定在顶部,并且整齐排列的红包了。

        3. 红包雨动画

        下雨嘛,从上往下运动就好了:

        .rain {
          ...
          i {
            ...
            animation: fall 3s ease-in infinite;
          }
        }
        @keyframes fall {
          0% {
            transform: translate(0, 0);
          }
          100% {
            transform: translate(0, 100vh);
          }
        }

        순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        聪明的你估计已经猜到了这样的结果:谁家的雨是这样齐刷刷的下来的?

        那我们就红包的垂直位置错落一点,使用 sassrandom 函数来实现随机:

        .rain {
          ...
          i {
            ...
            @for $i from 1 through 10 {
              &:nth-child(#{$i}) {
                top: random(60) + vh;
              }
            }
          }
        }

        순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        额,效果怎么和想象的不一样。依旧还是齐刷刷下落,只不过是"错落"的齐刷刷。

        那我们让每个红包的开始时间也随机不就行了嘛:

        .rain {
          ...
          i {
            ...
            @for $i from 1 through 10 {
              &:nth-child(#{$i}) {
                top: random(60) + vh;
                animation-delay: random(30) * 0.1s;
              }
            }
          }
        }

        5순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        嗯,好了一点点。但是有一个问题,屏幕上的雨点,有时候很多,有时候很少,不够均匀。那我们把动画的持续时间也随机会怎么样呢?

        .rain {
          ...
          i {
            ...
            @for $i from 1 through 10 {
              &:nth-child(#{$i}) {
                top: random(60) + vh;
                animation-delay: random(30) * 0.1s;
                animation-duration: random(10) * 0.1s + 2s; /* 2s ~ 3s 之间随机 */
              }
            }
          }
        }

        순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        终于更像雨了~

        但是现在雨滴是凭空出现的,很生硬,我们只要把开始的位置挪到负一屏,然后让它下落到正二屏就行了:

        .rain {
          ...
          top: -100vh;
        }
        @keyframes fall {
          0% {
            transform: translate(0, 0);
          }
          100% {
            transform: translate(0, 200vh);
          }
        }

        순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        这样就有了源源不断下落的效果。

        4. 拉一下触发红包雨

        CSS 不是 JS ,怎么触发点击事件呢?

        我们就要运用 CSS 本身的特性了,checkbox 复选框有个选中状态 :checked,而复选框可以用点击切换这个状态,再使用 CSS 的兄弟选择器 element ~ element 即可实现点击添加样式的效果。

        样式可以触发了,那如何触发动画呢?

        animation 属性添加到元素上后,播放状态默认是 running ,我们需要先把初始播放状态改为 paused (暂停), 然后通过上面的方法,把元素的播放状态改回 running 来实现播放动画的效果:

        <input type="checkbox" id="switch">
        <label class="chinese-knot" for="switch">...</label>
        <div class="rain">...</div>
        .rain {
          ...
          i {
            ...
            animation: fall 3s ease-in infinite;
            /* 默认不播放动画 */
            animation-play-state: paused;
          }
        }
        
        #switch {
          visibility: hidden;
          pointer-events: none;
        }
        /* checkbox 选中时播放动画 */
        #switch:checked ~ .rain i {
          animation-play-state: running;
        }
        /* 点击时重置动画,否则取消checkbox选中状态,动画会中止并停留在当前位置 */
        .chinese-knot:active ~ .rain i {
          animation: none;
        }

        上面的 html 中,我们让.chinese-knotdiv 改为 label 来指向 checkbox,方法是 labelforcheckboxid 设为相同的值。

        순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        效果很不错,我们再给红包雨下落时加个背景,以提醒用户当前的状态。并且下红包雨时,调低中国结的透明度,以突出红包的存在感。

        <input type="checkbox" id="switch">
        <div class="bg"></div>
        <label class="chinese-knot" for="switch">...</label>
        <div class="rain">...</div>
        .bg {
          position: absolute;
          left: 0;
          top: 0;
          height: 100vh;
          width: 100vw;
          background: linear-gradient(0deg, #171a4b, #96367f);
          opacity: 0;
          transition: all 0.5s;
        }
        #switch:checked ~ .bg {
          opacity: 1;
        }
        #switch:checked ~ .chinese-knot {
          opacity: 0.2;
          &:hover {
            opacity: 0.5;
          }
        }

        순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!

        完结撒花~~~

        总结

        这篇文章整理了我从搜集素材开始,创作一个作品的全部过程,代码写了一天,这篇文章写了半天。希望能让 CSS 初学者对 CSS 燃起兴趣,也希望让接触了一段时间 CSS 的朋友获得一些灵感和帮助。

        (学习视频分享:css视频教程

위 내용은 순수 CSS를 사용하여 중국식 매듭을 그리고 애니메이션 효과를 추가하는 방법을 단계별로 안내해 드리겠습니다!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제