Эффект соответствует названию, и вы, должно быть, видели снег (кроме южан, ха-ха), но эффект снега — это просто название типа эффекта, который может представлять собой некоторые эффекты движения свободного падения, такие как дождь из красных конвертов. статья использует чистыйcss
Имитация эффекта снега.
1. Введение
Из-за активности продукта компании необходимо смоделировать эффект снега. Браузеры реализуют анимациюcss3
а такжеcanvas
(а такжеgif
), для сравненияcss3
а такжеcanvas
Преимущества и недостатки:
- Степени свободы анимации:
canvas
победить; - сложность:
canvas
победить; - совместимость:
canvas
победить; - представление:
css3
победить (requestAnimationFrame
аппаратное ускорение).
В связи с определенными требованиями к производительности,canvas
В сравненииcss3
Будет больше вычислений и производительность может быть не очень хорошей, поэтому выбирайтеcss3
Имитация эффекта снега (пс: доступноcss
Проблема, которую нужно решить, не обязательноjavascript
решено, ха-ха).
прикрепить адрес
2. Принцип
В этой статье используетсяcss3
изanimation
. дляdom
добавление элементаanimation
Свойства могут имитировать анимацию, как на примере w3school:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>animation</title>
<style>
.animation{
width:100px;
height:100px;
background:red;
position:relative;
animation:mymove 5s infinite;
-webkit-animation:mymove 5s infinite;
}
@keyframes mymove{
from {
left:0px;
}
to {
left:200px;
}
}
</style>
</head>
<body>
<div class="animation"></div>
</body>
</html>
Конечно, это может сделать каждый, но есть проблема, что снег - это не местонахождение машины, а скорость и медлительность, амплитуда качания и неопределенность во времени. рационально.
- Случайная начальная точка снега в браузере;
- Скорость снега случайна;
- Время от начала снега до его падения на землю является случайным (случайным является время задержки и случайное время всего процесса снегопада);
- Качайтесь случайным образом во время снегопада.
Мы можем найти соответствующие свойства этих случайностей в CSS:
- Отправная точка:
position
Левая и правая ориентация (в анимации мы обычно используем позиционирование, потому что это может уменьшить ненужную перестановку и перерисовку); - скорость:
animation-timing-function
(обеспечивает богатые атрибуты скорости); - время:
animation-duration
а такжеanimation-delay
; - качать:
transform: translateX()
(смещение в горизонтальном направлении).
Некоторые люди могут спросить, эти атрибуты не случайны, не похожиMath.random
как случайная функция. Давайте подумаем в другом направлении: случайность, упомянутая в этой статье, — это случайный снег, а не свойства случайного снега. Время падения, скорость падения и диапазон качания каждого снега фиксированы, а время падения, скорость падения и диапазон качания различаются для разных снегов, поэтому эффект достигается.
Понимая это, остается последний вопрос: как придать каждому снегу разное время падения, скорость падения и амплитуду колебания? Здесь мы используем истинную случайную функциюMath.random
, используйте настраиваемый атрибут данных для соответствияMath.random
Эффект анимации можно определить, сопоставив правила со свойствами css.
3. Создание формы снега
3.1 Линейный градиент
.linear{
width: 100px;
height: 100px;
background: linear-gradient(0, green 40%, red 40%, red 60%, green 60%);
}
3.2 Несколько линейных градиентов для рисования снежинок
.linear{
width: 100px;
height: 100px;
border-radius: 50%;
background-image: linear-gradient(0, rgba(255,255,255,0) 40%, #fff 40%, #fff 60%, rgba(255,255,255,0) 60%),
linear-gradient(45deg, rgba(255,255,255,0) 43%, #fff 43%, #fff 57%, rgba(255,255,255,0) 57%),
linear-gradient(90deg, rgba(255,255,255,0) 40%, #fff 40%, #fff 60%, rgba(255,255,255,0) 60%),
linear-gradient(135deg, rgba(255,255,255,0) 43%, #fff 43%, #fff 57%, rgba(255,255,255,0) 57%);
}
4. Создайте снежную анимацию
я используюsass
написаноcss
Для построения анимации, по сути, язык не имеет значения, упор делается на принцип.
4.1 отправная точка
@for $i from 1 through 100 {
.animation[data-animation-position='#{$i}'] {
left: #{$i}vw;
}
}
использовать здесьsass
Функция цикла для создания совпадений от 1 до 100class
названныйanimation
и селектор атрибутов[data-animation-position=1~100vw]
значение, например, мы хотим, чтобы элементleft
для50vw
, просто добавьclass
имяdata-animation-position=50vw
. Здесь следует отметить два момента:
- Диапазон 1~100
vw
: Обратите внимание, что устройствоvw
, мы хотим, чтобы начальная точка снежинки появилась в любом месте в горизонтальном направлении, иvw
разделить экран на равные части100
доля,100vw
полноэкранный режим; - Зачем нам зацикливать от 1 до 100: Только так мы сможем сопоставить нужные нам значения в диапазоне.
4.2 Скорость
$timing: (
linear: linear,
ease: ease,
ease-in: ease-in,
ease-out: ease-out,
ease-in-out: ease-in-out
);
@each $key, $value in $timing {
.animation[data-animation-timing='#{$key}'] {
transition-timing-function: $value;
}
}
4.3 Время
Время включает время движения анимации и время задержки.
@for $i from 1 through 4 {
.animation[data-animation-delay='#{$i}'] {
animation-delay: #{$i}s;
}
}
@for $i from 4 through 8 {
.animation[data-animation-duration='#{$i}'] {
animation-duration: #{$i}s;
}
}
4.4 Качели
Снег состоит из двух анимаций, одна падаетfall
и качелиswing
, анимация падения исправлена, только качание должно быть случайным, поэтому я настроил правила сопоставления атрибутов, и оно может качаться случайным образом.
@for $i from 1 through 4 {
.animation[data-animation-name='#{$i}'] {
animation-name: fall, swing#{$i};
}
}
@for $i from 1 through 4 {
@keyframes swing#{$i}{
25% {
transform: translateX(-#{$i * 10}px);
}
50% {
transform: translateX(#{$i * 10}px);
}
75%{
transform: translateX(-#{$i * 10}px);
}
100%{
transform: translateX(#{$i * 10}px);
}
}
}
5. Случайность
использовать здесьreact
Чтобы продемонстрировать код или это предложение, если вы понимаете принцип, язык на самом деле не важен.
5.1 Элемент снежинки
<div className='page'>
{
Array(10).fill().map((v, i) => (
<span
key={i}
className='animation span'
data-animation-position={this.position()}
data-animation-timing={this.timing()}
data-animation-delay={this.delay()}
data-animation-duration={this.duration()}
data-animation-name={this.name()}
/>
))
}
</div>
Наш элемент снежинки содержит несколько значений свойств:
-
data-animation-position
: Запуск бита; -
data-animation-timing
: скорость снегопада; -
data-animation-delay
: задерживать; -
data-animation-duration
: общее время снегопада; -
data-animation-name
: Анимация падения и анимация качания.
5.1 Функция случайного диапазона
random(min, max){
return Math.floor(Math.random() * (max - min + 1) + min)
}
5.2 Случайное назначение атрибутов
position(){
return this.random(1, 100)
}
delay(){
return this.random(1, 4)
}
duration(){
return this.random(4, 8)
}
name(){
return this.random(1, 4)
}
timing(){
return ['linear', 'ease', 'ease-in', 'ease-out', 'ease-in-out'][this.random(0, 4)]
}
6. Резюме
Xinsan Чжан Синьсюй не имеет правил: ни ширины, ни изображения, ни плавающего положения.
Я лично думаю, что если вам нужно добавить четвертое нет, это может бытьбезjs
Ха-ха, шучу). вместе сcss
развития, его область можно охарактеризовать как очень широкую, глубокую и незаменимую Во многих случаях, еслиcss
При правильном использовании сэкономит много времени иjs
Код, сложность реализации всей функции будет уменьшаться, и поощрять друг друга.