Анимированный эффект как в airDrop из IOS17.
https://www.youtube.com/watch?v=sTvLdtYjbkE
……
npm install --save airdrop_animation
import 'airDrop' from 'airdrop_animation'
function someEvent(){
airDrop(settings) // fire animation with custom settings
//or
airDrop() // fire animation with default settings or after another calls
}
Создаётся “скриншот” страницы и на нём проигрывается анимация. html2canvas отправляет страницу на canvas, это изображение передаётся как текстура в webgl. Применяются эффекты stretch, после половины анимации - bang, blur, и 2 blob.
Есть настройки анимации и jsDoc для них. Стандартные:
const settings = {
// элемент, которого будет сделан скриншот
// высота и ширина должна быть как у window!
frameElementSelector: '#content',
performance: {
blur: { // устанавливаются в шейдере единожды при первом вызове airDrop()
directions: '13.0', // кол-во направлений для радиального размытия. должно быть строкой из float
quality: '4.0', // должно быть строкой из float
},
maxPixelRatio: Infinity, // ограничение window.devicePixelRatio
},
}
- Статичность. Анимация проигрывается на скриншоте, поэтому изменения страницы не будут видны в это время.
- Несовершенство html2canvas. Иногда заметны различия между реальной страницей и “скриншотом”. Пока заметил только отсутствие поддержки paint worklet.
При очень большом количестве потомковsettings.frameElementSelector
“скриншот” может создаваться медленно.
- Избавиться от three js. Лишняя огромная библиотека только для применения фрагментного шейдера.
- Найти способ создавать эффект в реальном времени, а не на скриншоте.
Этот metal шейдер был переписан под glsl и немного изменён чтобы, на мой взгляд, больше быть похожим на оригинал