Реализовать динамический эффект передней пружины

внешний интерфейс JavaScript CSS Активный

Эффект пружинящего движения — это собственный эффект системы IOS.Например, эффект отображения большего изображения на iPhone представляет собой анимацию пружины, как показано на следующем рисунке:

У него есть процесс подпрыгивания, один большой и один маленький масштаб попеременно, как подпрыгивает пружина, а не простое линейное увеличение в прошлом.

Если вы используете функцию времени анимации CSS, вы меняете только скорость движения, а не направление движения.

И вручную напишите CSS, чтобы имитировать этот эффект увеличения, а затем уменьшения:

@keyframes spring-show {
    0% {
        transform: scale(0);
    }
    90% {
        transform: scale(1);
    }
    /* 先放大一点 */
    95% {
        transform: scale(1.1);
    }
    /* 然后再缩回去 */
    100% {
        transform: scale(1);
    }
}

Такого упругого движения нет.

Для достижения эффекта вибрации в виде весны требуется два параметра, аКоэффициент демпфирования, другойжесткость, коэффициент демпфирования определяет скорость затухания, а жесткость определяет длину цикла туда и обратно. Учитывая эти два параметра, а также начальное и конечное смещение пружины, смещение пружины в любой момент времени можно вывести в соответствии с некоторыми физическими формулами, и это смещение можно использовать как значение приведенного выше масштаба шкалы или значение переводить, вращать и т.

Так как считать? пустыня в "Как реализовать эффект весенней анимации в CSS" также подробно обсудил этот эффект и написал функцию SASS для его достижения, но CSS, сгенерированный таким образом, как правило, относительно велик, поэтому я переключился на реализацию JS, принцип заключается в том, чтобы вычислить анимацию ключевых кадров CSS в 1% , 2%, 3%, ..., 100%, каким должно быть значение атрибута, а затем динамически вставить тег стиля. Заимствовано здесьcss springБиблиотека, которая занимает всего 3 КБ после gzip, используется следующим образом:

import spring, { toString } from 'css-spring';
const keyframes = spring(
    { scale: 0 }, // from
    { scale: 1 }, // to
    // precision表示精度有2位
    { damping: 14, stiffness: 170, precision: 2}
);
const keyframeString = toString(keyframes);
console.log(keyframeString);

Сгенерированный CSS выглядит так, как показано на рисунке ниже:

У него будет процесс изменения размера: 0 -> 1 -> 1,1 -> 0,99 -> 1. Интуитивнее изобразить эти значения в виде графика:

Видно, что у него есть процесс дрожания и затухания периода. Фактический эффект показан на следующем рисунке:

В дополнение к увеличению и уменьшению масштаба, его также можно обрабатывать таким образом, и его также можно применять к вращению.Эффект показан на следующем рисунке:

Это генерируется с помощью следующего кода:

const keyframes = spring(
    { rotateZ: 30 }, // from
    { rotateZ: 0 }, // to
    { damping: 14, stiffness: 170, precision: 3}
);

Когда нам нужно использовать анимацию-задержку, чтобы 3 звезды появлялись одна за другой, нам нужно скрыть видимость: сначала скрыто, а затем снова появиться.В это время нам нужно добавить атрибут видимости к ключевым кадрам, как показано на следующий код:

let from = {rotateZ: '30', visibility: 'hidden' },
    to = {rotateZ: '0', visibility: 'visible' };
if (from.visibility) {
    keyframes['0%'].visibility = from.visibility;
    keyframes['1%'].visibility = to.visibility;
    // 最后结束animate-fill-mode: forwards使用
    keyframes['100%'].visibility = to.visibility;
}

Наконец, сгенерируйте ключевые кадры:

@keyframes spring-rotate {
    0% {transform:rotateZ(29.1deg);visibility:hidden;}
    1% {transform:rotateZ(27.507deg);visibility:visible;}
    /* ... */
    100% {transform:rotateZ(0deg);visibility:visible;}
}

Затем пусть анимация-задержка каждой звезды увеличивается по очереди:

.star {
    visibility: hidden;
    animation: spring-rotate .59s linear forwards;
}
.star:nth-of-type(2) {
    animation-delay: .15s;
}
.star:nth-of-type(3) {
    animation-delay: .3s;
}

Таким образом можно добиться эффекта, который появляется один за другим, как показано на следующем рисунке:

Этот пружинящий эффект усиливает ощущение движения и выглядит более динамично, чем обычный односторонний эффект.

В реальной реализации я написал утилиту, которая генерирует ключевые кадры при инициализации страницы, а затем вставляет тег стиля в заголовок. Потому что, если вы добавите префикс webkit, один ключевой кадр будет иметь 4 КБ, а 10 ключевых кадров будут иметь 40 КБ, Непосредственное использование метода динамического расчета JS сэкономит место и будет более гибким.


[Ренрен набирает среднего и старшего фронтенда]

1. Предыстория проекта: мы разрабатываем зарубежный продукт SAAS CRM (система управления клиентами) корпоративного уровня, и перед ним стоят очень большие технические задачи, такие как предоставление клиентам возможности совершать прямые интернет-звонки (прямые звонки на мобильные телефоны) на наш веб-сайт и отправлять электронные письма, автоматически обрабатывать бизнес в соответствии с пользовательскими сценариями и т. д.

2. История стека технологий: он также принимает более популярные фреймворки, такие как vue и vuex.Связь - WebRTC, а система распространения сообщений использует FCM Google и APN Apple. Сервисы развернуты на Amazon или Google Cloud. Обслуживайте клиентов по всему миру.

3. Кроме того, поскольку продукт является пользовательским продуктом корпоративного уровня, к нему предъявляются относительно высокие требования (такие как производительность, безопасность, многозадачность и т. д.). Поэтому технические требования к кандидатам относительно высокие.Если вас особенно волнует технология, то наши вакансии дают хорошую возможность талантам развиваться и расти.

Пожалуйста, отправьте свое резюме наshanshan.zhu@renren-inc.com


【Другие статьи】Реализация WebRTC P2P-соединений