단일 요소 로더: Spinner PlatoBlockchain 데이터 인텔리전스. 수직 검색. 일체 포함.

단일 요소 로더: 스피너

CSS 전용 로더를 만드는 것은 제가 가장 좋아하는 작업 중 하나입니다. 그 무한한 애니메이션을 보는 것은 항상 만족스럽습니다. 그리고 물론 있습니다. 많은 기술과 접근 방식의 - 필요 없음 코드펜보다 더 멀리 바라보다 얼마나 많은지 확인하기 위해. 그러나 이 기사에서는 가능한 한 적은 코드를 작성하는 단일 요소 로더를 만드는 방법을 볼 것입니다.

내가 가진 500개 이상의 단일 div 로더 모음을 만들었습니다. 그리고 이 XNUMX부작 시리즈에서 저는 그 중 많은 것을 만드는 데 사용한 트릭을 공유할 것입니다. 우리는 작은 조정이 얼마나 재미있는 변형으로 이어질 수 있는지, 그리고 이 모든 것을 실현하기 위해 작성해야 하는 코드가 얼마나 적은지를 보여주는 수많은 예제를 다룰 것입니다!

단일 요소 로더 시리즈:

  1. 단일 요소 로더: 스피너 — 당신은 여기에있다
  2. 단일 요소 로더: 점 — 오는 17월 XNUMX일
  3. 단일 요소 로더: 바 — 오는 24월 XNUMX일
  4. 단일 요소 로더: 3D로 전환 — 오는 1월 XNUMX일

이 첫 번째 기사에서는 더 일반적인 로더 패턴 중 하나인 회전 막대를 만들 것입니다.

CodePen 임베드 폴백

접근 방식은 다음과 같습니다.

이 로더에 대한 간단한 구현은 부모 요소 안에 래핑된 각 막대에 대해 하나의 요소를 생성하는 것입니다(총 XNUMX개의 요소에 대해). opacitytransform 회전 효과를 얻으려면.

그러나 내 구현에는 단 하나의 요소만 필요합니다.

<div class="loader"></div>

… 그리고 10개의 CSS 선언:

.loader { width: 150px; /* control the size */ aspect-ratio: 1; display: grid; mask: conic-gradient(from 22deg, #0003, #000); animation: load 1s steps(8) infinite;
}
.loader,
.loader:before { --_g: linear-gradient(#17177c 0 0) 50%; /* update the color here */ background: var(--_g)/34% 8% space no-repeat, var(--_g)/8% 34% no-repeat space;
}
.loader:before { content: ""; transform: rotate(45deg);
}
@keyframes load { to { transform: rotate(1turn); }
}

그것을 분해하자

언뜻 보기에는 코드가 이상해 보일 수 있지만 생각보다 간단하다는 것을 알게 될 것입니다. 첫 번째 단계는 요소의 차원을 정의하는 것입니다. 우리의 경우에는 150px 정사각형. 우리는 넣을 수 있습니다 aspect-ratio 요소가 무엇이든 상관없이 정사각형을 유지하도록 사용합니다.

.loader { width: 150px; /* control the size */ aspect-ratio: 1; /* make height equal to width */
}

CSS 로더를 만들 때 항상 전체 크기를 제어하기 위해 하나의 값을 가지려고 합니다. 이 경우에는 width 그리고 우리가 다루는 모든 계산은 그 값을 참조할 것입니다. 이를 통해 로더를 제어하기 위해 단일 값을 변경할 수 있습니다. 많은 추가 값을 조정할 필요 없이 로더의 크기를 쉽게 조정할 수 있는 것이 항상 중요합니다.

다음으로 그라디언트를 사용하여 막대를 만듭니다. 이것은 가장 까다로운 부분입니다! 사용하자 만들 그라디언트 아래와 같은 막대:

background: linear-gradient(#17177c 0 0) 50%/34% 8% space no-repeat;
단일 요소 로더에 대한 두 그라데이션 선 사이의 공간을 표시합니다.
단일 요소 로더: 스피너

우리의 그라디언트는 하나의 색상과 두 개의 색상 정지점으로 정의됩니다. 결과는 페이딩이나 전환이 없는 단색입니다. 크기는 다음과 같습니다. 34% 넓고 8% 키가 큰. 또한 중앙(50%). 비결은 키워드 값을 사용하는 것입니다. space — 이것은 그라디언트를 복제하여 총 XNUMX개의 막대를 제공합니다.

~ 사양:

이미지는 잘리지 않고 배경 위치 지정 영역에 맞는 만큼 자주 반복된 다음 이미지가 해당 영역을 채우도록 간격을 둡니다. 첫 번째 이미지와 마지막 이미지가 영역의 가장자리에 닿습니다.

나는 다음과 같은 너비를 사용하고 있습니다. 34% 즉, XNUMX개 이상의 막대를 가질 수 없습니다(3*34% 보다 큰 100%) 그러나 두 개의 막대를 사용하면 빈 공간이 생깁니다(100% - 2 * 34% = 32%). 그 공간은 두 막대 사이의 중앙에 배치됩니다. 즉, 기울기에 너비를 사용합니다. 33%50% 최소한 두 개의 막대 사이에 약간의 공간이 있는지 확인합니다. 가치 space 우리를 위해 올바르게 배치하는 것입니다.

우리는 동일한 작업을 수행하고 상단과 하단에 두 개의 막대를 더 만들기 위해 두 번째 유사한 그라데이션을 만듭니다. background 속성 값:

background: linear-gradient(#17177c 0 0) 50%/34% 8% space no-repeat, linear-gradient(#17177c 0 0) 50%/8% 34% no-repeat space;

반복을 피하기 위해 CSS 변수를 사용하여 최적화할 수 있습니다.

--_g: linear-gradient(#17177c 0 0) 50%; /* update the color here */
background: var(--_g)/34% 8% space no-repeat, var(--_g)/8% 34% no-repeat space;

이제 우리는 XNUMX개의 막대를 갖게 되었고 CSS 변수 덕분에 색상 값을 한 번 작성할 수 있어 나중에 쉽게 업데이트할 수 있습니다(로더의 크기에 대해 수행한 것처럼).

나머지 막대를 만들려면 .loader 요소와 그 ::before 총 XNUMX개에 대해 XNUMX개의 막대를 추가로 얻기 위해 유사 요소를 사용합니다.

.loader { width: 150px; /* control the size */ aspect-ratio: 1; display: grid;
}
.loader,
.loader::before { --_g: linear-gradient(#17177c 0 0) 50%; /* update the color here */ background: var(--_g)/34% 8% space no-repeat, var(--_g)/8% 34% no-repeat space;
}
.loader::before { content: ""; transform: rotate(45deg);
}

사용 참고 display: grid. 이를 통해 그리드의 기본값에 의존할 수 있습니다. stretch 의사 요소가 상위 요소의 전체 영역을 덮도록 정렬합니다. 따라서 차원을 지정할 필요가 없습니다. 코드를 줄이고 많은 값을 처리하는 것을 피하는 또 다른 트릭입니다!

이제 의사 요소를 다음과 같이 회전해 보겠습니다. 45deg 나머지 막대의 위치를 ​​지정합니다. 트릭을 보려면 다음 데모를 가리키십시오.

CodePen 임베드 폴백

불투명도 설정

우리가 하려는 것은 원형 경로를 이동할 때 그 뒤에 희미한 막대의 흔적을 남기는 막대가 하나 있다는 인상을 주는 것입니다. 지금 우리에게 필요한 것은 그 흔적을 만들기 위해 막대의 투명도를 가지고 노는 것입니다. 우리는 CSS로 할 것입니다. mask 다음과 같이 원추 기울기와 결합:

mask: conic-gradient(from 22deg,#0003,#000);

트릭을 더 잘 보기 위해 다음을 풀 컬러 상자에 적용해 보겠습니다.

CodePen 임베드 폴백

빨간색의 투명도가 시계 방향으로 점차 증가합니다. 이것을 로더에 적용하고 불투명도가 다른 막대가 있습니다.

방사형 그라디언트 플러스, 스피너 막대는 그라디언트가 있는 스피너 막대와 같습니다.
단일 요소 로더: 스피너

실제로 각 막대는 그라디언트로 가려져 있고 두 개의 반투명 색상 사이에 있기 때문에 희미하게 보입니다. 이것이 실행되면 거의 눈에 띄지 않으므로 모든 막대의 불투명도 수준이 다른 동일한 색상을 갖는다고 말할 수 있습니다.

회전

로더를 가져오기 위해 회전 애니메이션을 적용해 보겠습니다. 연속 애니메이션이 아니라 단계별 애니메이션이 필요하므로 steps(8). 8 막대의 수에 불과하므로 사용하는 막대의 수에 따라 값이 변경될 수 있습니다.

.loader { animation: load 3s steps(8) infinite;
} /* Same as before: */
@keyframes load { to { transform: rotate(1turn) }
}
CodePen 임베드 폴백

그게 다야! 단 하나의 요소와 몇 줄의 CSS만 있는 로더가 있습니다. 하나의 값을 조정하여 크기와 색상을 쉽게 제어할 수 있습니다.

CodePen 임베드 폴백

우리는 만 사용했기 때문에 ::before 유사 요소, 다음을 사용하여 막대를 XNUMX개 더 추가할 수 있습니다. ::after 총 12개의 막대와 거의 동일한 코드로 끝납니다.

CodePen 임베드 폴백

고려할 의사 요소의 회전을 업데이트합니다. 30deg60deg 대신 45deg XNUMX단계가 아닌 XNUMX단계 애니메이션을 사용하는 동안 높이도 줄였어요 5% 대신 8% 막대를 조금 더 얇게 만들기 위해.

우리가 가지고 있는 grid-area: 1/1 의사 요소에. 이를 통해 서로 같은 영역에 서로 겹쳐서 배치할 수 있습니다.

뭔지 맞춰봐? 다른 구현을 사용하여 동일한 로더에 도달할 수 있습니다.

CodePen 임베드 폴백

코드 이면의 논리를 파악할 수 있습니까? 여기에 힌트가 있습니다: 불투명도는 더 이상 CSS로 처리되지 않습니다 mask 그러나 그라디언트 내부에서도 사용하고 있습니다. opacity 재산.

대신 점을 사용하지 않는 이유는 무엇입니까?

우리는 완전히 할 수 있습니다:

CodePen 임베드 폴백

코드를 확인하면 선형 그래디언트 대신 방사형 그래디언트로 작업하고 있음을 알 수 있습니다. 그렇지 않으면 마스크가 불투명한 느낌을 주는 개념과 완전히 동일하지만 모양을 선 대신 원으로 만들었습니다.

다음은 새로운 그래디언트 구성을 설명하는 그림입니다.

단일 요소 로더에서 점의 배치를 표시합니다.
단일 요소 로더: 스피너

Safari를 사용하는 경우 데모에 버그가 있을 수 있습니다. Safari는 현재 지원이 부족하기 때문입니다. at 방사형 그라디언트의 구문 그러나 이를 극복하기 위해 기울기를 약간 재구성할 수 있습니다.

.loader,
.loader:before,
.loader:after { background: radial-gradient( circle closest-side, currentColor 90%, #0000 98% ) 50% -150%/20% 80% repeat-y, radial-gradient( circle closest-side, currentColor 90%, #0000 98% ) -150% 50%/80% 20% repeat-x;
}
CodePen 임베드 폴백

더 많은 로더 예제

다음은 이전 것과 유사한 스피너 로더에 대한 또 다른 아이디어입니다.

CodePen 임베드 폴백

이것 하나만으로 나는 의지한다. backgroundmask 모양을 생성합니다(의사 요소가 필요하지 않음). 또한 동일한 코드에서 많은 변형을 생성할 수 있도록 CSS 변수를 사용하여 구성을 정의하고 있습니다. 이는 CSS 변수의 능력에 대한 또 다른 예입니다. 이 기술에 대한 다른 기사를 썼습니다. 더 자세한 내용을 원하시면.

일부 브라우저는 여전히 -webkit- 접두사 mask-composite 고유한 값 집합이 있으며 데모에 스피너를 표시하지 않습니다. 여기에 그것을하는 방법이 있습니다 없이 mast-composite 더 많은 브라우저 지원을 위해.

당신을 위한 또 다른 것이 있습니다:

CodePen 임베드 폴백

이를 위해 나는 사용하고 있습니다. background-color 색상을 제어하고 사용하려면 maskmask-composite 최종 모양을 만들려면:

원 모양의 요소에 마스터를 적용하는 여러 단계.
단일 요소 로더: 스피너

끝내기 전에 제가 얼마전에 만든 스피닝 로더를 몇 개 더 소개합니다. 나는 다른 기술에 의존하고 있지만 여전히 그라디언트, 마스크, 의사 요소 등을 사용하고 있습니다. 각각의 논리를 파악하고 동시에 새로운 트릭을 배우는 것은 좋은 연습이 될 수 있습니다. 즉, 질문이 있는 경우 아래에 의견 섹션이 있습니다.

CodePen 임베드 폴백
CodePen 임베드 폴백
CodePen 임베드 폴백

최대 포장

보십시오, 단일 div, 두 개의 그라디언트, 의사 요소, 변수 외에는 CSS에서 할 수 있는 일이 너무 많습니다. 다양한 회전 로더를 만든 것처럼 보이지만 약간의 수정만 가하면 기본적으로 모두 동일합니다.

이것은 시작일 뿐입니다. 이 시리즈에서는 CSS 로더를 만들기 위한 더 많은 아이디어와 고급 개념을 살펴볼 것입니다.

단일 요소 로더 시리즈:

  1. 단일 요소 로더: 스피너 — 당신은 여기에있다
  2. 단일 요소 로더: 점 — 오는 17월 XNUMX일
  3. 단일 요소 로더: 바 — 오는 24월 XNUMX일
  4. 단일 요소 로더: 3D로 전환 — 오는 1월 XNUMX일

단일 요소 로더: 스피너 원래에 게시 CSS 트릭. 너는해야한다. 뉴스레터 받기.

타임 스탬프 :

더보기 CSS 트릭