В последнее время CSS используется для достижения некоторых эффектов, которые кажутся выходящими за рамки возможностей CSS:
- Разумное использование градиентов для достижения высокого уровня анимации фонового света
- Удивительно! ! Может ли CSS также достичь сияния?
Эта статья продолжает серию статей, в основном посвящена изучению того, лучше ли использовать CSS для достижения некоторых целей.эффект дыма. Так:
Присмотревшись к эффекту дыма, можно выделить еще две важные особенности:
- эффект размытия
- зернистый
Сначала посмотрите на эффект размытия, подумайте о размытии, большинство студентов сначала подумают об использованииfilter: blur()
.
Конечно, да, но в CSS, кроме фильтров, мы также можем использовать класс других средств для имитацииразмытоЭффект.
Чистый CSS для анимации дыма
Давайте сначала посмотрим на этот эффект:
Предположим, у нас есть такой персонаж:
<span>C</span>
мы просто проходимtext-shadow
+ opacity
Изменение может имитировать эффект дыма:
span {
text-shadow: 0 0 0 whitesmoke;
animation: smoky 5s;
}
@keyframes smoky {
to {
text-shadow: 0 0 20px whitesmoke;
opacity: 0;
}
}
Взгляните на эффект:
На основе вышеизложенного мы можем добавить смещение, вращение, масштабирование, немного изменить вышеприведенный код, добавить немногоtransform
Преобразование:
span {
text-shadow: 0 0 0 whitesmoke;
animation: smoky 5s;
}
@keyframes smoky {
to {
transform:
translate3d(200px, -80px, 0)
rotate(-40deg)
skewX(70deg)
scale(1.5);
text-shadow: 0 0 20px whitesmoke;
opacity: 0;
}
}
Вы можете получить следующие эффекты:
наложенныйtransform
После этого казалось, что слово унесло ветром и превратило в дым. Исходя из этого, нам нужно всего лишь соединить несколько слов, используяanimation-delay
Последовательно управляйте каждым словом, чтобы вызвать эффект анимации, и тогда можно будет получить полный эффект дыма, описанный выше.
Псевдокод выглядит следующим образом:
<div>
<span>C</span>
<span>S</span>
<span>S</span>
// ...
</div>
// ... 上述所有 CSS 代码
@for $item from 1 through 21 {
span:nth-of-type(#{$item}){
animation-delay: #{(($item/10))}s;
}
}
Можно получить такое слово, которое сдуло ветром и превратилось в дым:
Вышеупомянутый эффект не является моим оригиналом, впервые увиденным у этого автора.CodePen Demo -- Smoky Text By Bennett Feely
Эффект дыма с фильтром SVG feturbulence
Дым в приведенной выше анимации дыма все еще относительно грубый. Главным образом отсутствие небольшой зернистости? Некоторые дымчатые текстуры отсутствуют.
Чтобы добиться более изысканного эффекта дыма, мы должны использовать SVG.<feturbulence>
Фильтр, если вы мало знаете об этом фильтре, вы можете ознакомиться с этими моими статьями:
- интересно! Мощные фильтры SVG
- Шок! Можно ли использовать фильтры SVG для создания смайликов?
- Реализовать движущийся логотип Hongmeng
буду использовать следующийfilter: blur()
Сотрудничать<feturbulence>
фильтр, чтобы получить более реалистичный эффект дыма.
В качестве простого примера предположим, что есть следующие слова:
<div">SMOKE</div>
Простой CSS:
div {
background: linear-gradient(#fff, #999, #ddd, #888);
background-clip: text;
}
Получите несколько слов с градиентным цветом, например:
мы используем<feturbulence>
Работа с фильтром проста:
<div>SMOKE</div>
<svg width="0">
<filter id="filter">
<feTurbulence id="turbulence" type="fractalNoise" baseFrequency=".03" numOctaves="20" />
<feDisplacementMap in="SourceGraphic" scale="30" />
</filter>
</svg>
Использование CSSfilter: url()
Внедрить этот фильтр, здесь для лучшего эффекта я прямо в<body>
Этот фильтр был представлен на:
body {
filter: url('#filter');
}
div {
background: linear-gradient(#fff, #999, #ddd, #888);
background-clip: text;
}
Наш шрифт<feturbulence>
Фильтры дают ощущение жидкости:
Можно сказать, что этот эффект не имеет ничего общего с эффектом дыма, но просто добавьте фильтр размытия, и произойдет волшебство:
body {
filter: url('#filter');
}
div {
background: linear-gradient(#fff, #999, #ddd, #888);
background-clip: text;
filter: blur(5px);
}
Весь эффект мгновенныйаэрозолизацияМного:
Что ж, добавьте к нему эффект циклической анимации и просто обработайте его с помощью JavaScript:
const filter = document.querySelector("#turbulence");
let frames = 1;
let rad = Math.PI / 180;
let bfx, bfy;
function freqAnimation() {
frames += .2
bfx = 0.03;
bfy = 0.03;
bfx += 0.005 * Math.cos(frames * rad);
bfy += 0.005 * Math.sin(frames * rad);
bf = bfx.toString() + " " + bfy.toString();
filter.setAttributeNS(null, "baseFrequency", bf);
window.requestAnimationFrame(freqAnimation);
}
window.requestAnimationFrame(freqAnimation);
Взгляните на эффект:
Полный код выше, вы можете ударить здесь:CodePen CSS + SVG Text Smoke Effect
Конечно, вышеуказанный эффект может быть достигнут за счет:
- контроль
<feTurbulence>
изbaseFrequency
корректировка свойств - контроль
<feTurbulence>
изnumOctaves
корректировка свойств - контроль
<feDisplacementMap>
изscale
корректировка свойств
Буду<feTurbulence>
изnumOctaves
При изменении атрибута с 30 на 70 контур текста практически невидим, а весь текст затуманен. Мы можем сделать эффект наведения следующим образом:
Полный код выше, вы можете ударить здесь:CodePen CSS + SVG Text Smoke Hover Effect
Таким образом, на основеfilter: blur()
Сотрудничать<feturbulence>
фильтр, мы можем получить очень реалистичный эффект дыма.Основываясь на приведенной выше демонстрации, мы также можем накопать много интересных эффектов, которые не будут повторяться в этой статье.
наконец
Хорошо, это конец этой статьи, я надеюсь, что эта статья поможет вам :)
Если вы хотите получить самую интересную информацию о CSS, не пропустите мой официальный аккаунт --Интересные факты о внешнем интерфейсе iCSS😄
Другие замечательные технические статьи по CSS собраны в моемGithub -- iCSS, продолжайте обновлять, добро пожаловать, нажмите звездочку, чтобы подписаться на коллекцию.
Если у вас есть какие-либо вопросы или предложения, вы можете общаться больше.Оригинальные статьи ограничены в написании и знаниях.Если в статье есть какие-либо неточности, пожалуйста, дайте мне знать.