>  기사  >  웹 프론트엔드  >  CSS 팁: CSS의 난수에 대해 이야기하기

CSS 팁: CSS의 난수에 대해 이야기하기

高洛峰
高洛峰원래의
2017-02-04 16:08:506847검색

최근 우연히 흥미로운 문제에 직면했습니다. 애니메이션 지속 시간 값을 무작위로 설정하고 싶습니다. 다음은 무작위가 아닌 예입니다.

CodePen에서 Robin Rendle(@robinrendle)이 작성한 CSS 난수 #1의 예를 확인하세요.

CSS로 작성한 애니메이션입니다:

@keyframes flicker {
  0% {
    opacity: 1;
  }
  100% {
    opacity: 0;
  }}#red {
  animation: flicker 2s ease alternate infinite;}

현재는 잘 작동하고 있는데 여기서는 랜덤화가 없고 애니메이션 실행 시간이 2초로 고정되어 있습니다.

내가 원하는 애니메이션은 실행 시간이 2초 이내인 임의의 숫자입니다. 제가 원하는 효과는 다음과 같습니다:

.element {
  animation: flicker $randomNumber alternate infinite;}

여기서 $randomNumber는 특정 함수에 의해 생성된 난수입니다.

Sass와 같은 CSS 전처리기는 다음과 같은 기능을 제공합니다.

$randomNumber: random(5);.thing {
  animation-duration: $randomNumber + s;}

이것은 원하는 것일 수도 있지만 제가 원하는 것은 아닙니다. 전처리기는 난수를 생성합니다.

Sass에서 난수 생성 과정은 스토리에서 이름을 선택하는 과정과 같습니다. 작성한 후 무작위로 꺼내면 더 이상 변경되지 않습니다.

즉, CSS 전처리기가 실행되면 무작위화 과정이 종료되고 생성된 난수는 영원히(즉, CSS 전처리기가 다시 실행될 때까지) 특정 값으로 고정되어 다시 생성됩니다. . )

JavaScript의 임의 함수(예: Math.random())처럼 JavaScript가 실행될 때 난수를 생성하지 않습니다.

정말 죄송하면서도 CSS 변수(CSS 고유의 속성)를 활용해볼 수 있는 절호의 기회였다는 걸 깨달았어요! 이를 사용하여 난수를 생성하는 것은 쉬운 작업이 아니지만 여전히 도움이 될 수 있습니다.

낯설더라도 걱정하지 마세요. 실제로 CSS 변수는 내장되어 있으며 SASS 및 LESS와 같은 CSS 전처리기에서 이미 익숙한 변수와는 다릅니다. Chris가 나열한 다양한 이점을 여기에서 확인하세요.

전처리를 사용하지 않고도 사용할 수 있습니다.

계단식으로 연결되어 있습니다. 이 변수의 값을 설정하거나 모든 선택기에서 현재 변수 참조를 재정의할 수 있습니다.

값이 변경되면(예: 미디어 쿼리 또는 기타 상태 변경) 브라우저가 다시 렌더링됩니다.

JavaScript를 사용하여 해당 값에 액세스하고 조작할 수 있습니다.

마지막 점이 우리에게 중요합니다. JavaScript에서 난수를 생성하고 생성된 값을 CSS 변수로 설정합니다.

CSS 사용자 정의 속성을 설정하고 기본값을 지정합니다(값을 작성할 때 어떤 이유로 JavaScript가 실패하는 경우에 유용합니다).

/* 设置默认的动画执行时间 */:root {
  --animation-time: 2s; }

이제 다음에서 이 변수를 사용할 수 있습니다. CSS는 다음과 같습니다.

#red {
  animation: flicker var(--animation-time) ease alternate infinite;}

더 이상 고민하지 말고 바로 시작하겠습니다. 이 애니메이션은 이전 SVG 애니메이션 중 하나처럼 보이지만 CSS 변수를 사용하여 작성되었으며 변수 값을 변경하여 어떻게 작동하는지 테스트할 수 있습니다. 실시간으로 효과를 미리 볼 수 있습니다.

이제 JavaScript를 사용하여 이 변수에 액세스하고 조작합니다.

var time = Math.random();

여기서 SVG를 사용하여 생성된 빨간색 원을 찾고 setProperty를 사용하여 --animation-time 값을 변경할 수 있습니다.

var red = document.querySelector('#red');red.style.setProperty('--animation-time', time +'s');

여기를 보세요! SVG 애니메이션 요소에 임의의 숫자가 설정되었습니다.

CodePen에서 Robin Rendle(@robinrendle)이 작성한 CSS 난수 #3의 예를 살펴보세요.

값이 JavaScript 실행 시 생성되는 난수이고, 매번 변경되기 때문에 이전보다 크게 개선되었습니다. 이렇게 하면 우리가 원하는 효과를 성공적으로 얻을 수 있지만 여전히 약간의 문제가 있습니다. 런타임에 임의의 숫자가 주기적으로 애니메이션되는 기간입니다.

다행히도 이제 JavaScript를 사용할 수 있습니다. 사용자 정의 변수의 값 우리가 원하는 대로 업데이트될 수 있습니다. 다음은 애니메이션 지속 시간 값을 매초마다 업데이트하는 예입니다.

var red = document.querySelector('#red');function setProperty(duration) {
  red.style.setProperty('--animation-time', duration +'s');}function changeAnimationTime() {
  var animationDuration = Math.random();
  setProperty(animationDuration);}setInterval(changeAnimationTime, 1000);

이것이 바로 제가 원하는 것입니다. CodePen에서 Robin Rendle(@robinrendle)이 작성한 CSS 난수 #4의 예를 확인하세요.

그러나 CSS 변수(맞춤 속성)에 대한 지원은 아직 썩 좋지 않으니 사용 시 주의하시기 바랍니다. 다음과 같이 점진적인 향상 애니메이션을 구현할 수 있습니다.

#red {
  animation: flicker .5s ease alternate infinite;
  animation: flicker var(--animation-time) ease alternate infinite;}

CSS 변수가 지원되지 않으면 애니메이션의 일부를 볼 수도 있습니다. 비록 제 생각에는 완벽하지는 않지만요.

다행히 , CSS 변수가 임의의 애니메이션 지속 시간 값을 생성할 수 있는 유일한 방법은 아닙니다. JavaScript를 사용하여 DOM을 조작하고 스타일에 직접 값을 설정할 수 있습니다.

var red = document.querySelector('#red');red.style.animationDuration = Math.floor(Math.random() * 5 + 1) + "s";

이러한 효과를 원한다면 새 시간을 설정하기 전에 애니메이션이 완료될 때까지 기다릴 수도 있습니다.

var red = document.querySelector('#red');function setRandomAnimationDuration() {
  red.style.animationDuration = Math.floor(Math.random() * 10 + 1) + "s";}red.addEventListener("animationiteration", setRandomAnimationDuration);

다음은 이를 달성할 수 있는 방법의 목록입니다. EQCSS를 사용하여 이 효과를 얻을 수도 있습니다.

@element '#animation' {
  .element {
    animation-duration: eval('rand')s;
  }}
var rand = Math.random();EQCSS.apply();

CSS 자체가 올바른 난수를 생성할 수 있기를 바라시나요? 관련 정보를 보지 못했습니다. 있다고 해도 실제로 사용하려면 시간이 좀 걸릴 수 있습니다.

더 많은 CSS 기술: CSS의 난수에 대해 이야기하려면 PHP 중국어 웹사이트를 참고하세요. !

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.