#css #css-animations #gradient #noise
#css #css-анимации #градиент #шум
Вопрос:
Как я мог бы улучшить этот анимированный эффект статического шума, используя градиент css?
Только CSS, никакого javascript, никакого svg, никакого изображения, использование только градиента и его настройка.
Эффект шума без сигнала телевизора — это то, что я ищу, используя градиент css.
Кто-нибудь знает, как этот эффект можно улучшить, сделать лучше?
Есть ли лучший способ, которым это можно написать?
Я ищу что-то, что более точно соответствует эффекту телевизионного шума.
Я думаю, что способ написания этого эффекта может быть улучшен.
Есть ли какие-либо изменения или корректировки, которые можно внести в него, чтобы он лучше отображал эффект телевизионного шума?
Градиент может быть любым, главное, чтобы это был градиент, не имеет значения, какого рода.
В этом случае используется радиальный градиент:
https://jsfiddle.net/xhdkza5w/
html,
body {
width: 100%;
height: 100%;
display: flex;
}
.tv-static {
width: 500px;
height: 300px;
margin: auto;
background-image: repeating-radial-gradient(circle at 17% 32%, white, black 0.00085px);
animation: back 5s linear infinite;
}
@keyframes back {
from {
background-size: 100% 100%;
}
to {
background-size: 200% 200%;
}
}
<div class="tv-static"></div>
В этом случае используется конический градиент: https://jsfiddle.net/bkx50apm /
html,
body {
width: 100%;
height: 100%;
display: flex;
}
.tv-static {
width: 500px;
height: 300px;
margin: auto;
background-image: repeating-conic-gradient(white, black 0.00085%);
animation: back 25s linear infinite;
}
@keyframes back {
from {
background-size: 100% 100%;
}
to {
background-size: 200% 200%;
}
}
<div class="tv-static"></div>
Комментарии:
1. Пожалуйста, проверьте мой ответ. Я думаю, вы ищете один из них.
2. Будет ли javascript в порядке? или вы хотите только CSS?
3. Только CSS, без javascript.
Ответ №1:
Вы имеете в виду этот эффект?
html,
body {
width: 100%;
height: 100%;
display: flex;
}
.animation {
width: 240px;
height: 240px;
margin: auto;
background-image: repeating-radial-gradient(circle at 17% 32%, white, black 0.00085px);
animation: animation 5s linear infinite;
}
@keyframes animation {
from {
background-position: 0px 0px;
}
to {
background-position: 240px 240px;
}
}
<div class="animation"></div>
Или этот эффект?
html,
body {
width: 100%;
height: 100%;
display: flex;
}
.animation {
width: 240px;
height: 240px;
margin: auto;
background-image: repeating-radial-gradient(circle at 17% 32%, white, black 0.00085px);
background-position: center;
animation: back 5s linear infinite;
}
@keyframes back {
from {
background-size: 100% 100%;
}
to {
background-size: 200% 200%;
}
}
<div class="animation"></div>
Редактировать: добавлено background-position: center
.
Комментарии:
1. Вероятно, второе, кстати, очень хорошо сделано.
2. Существует огромная проблема с этой 2-й анимацией, анимация не остается посередине. Он не остается центрированным посередине.
Ответ №2:
Накладывая 2 из этих эффектов друг на друга, и каждый div имеет разную анимацию, вы можете создавать помехи между ними, которые устраняют артефакты, связанные с наличием только 1 статического шума, создаваемого одним div.
Это может быть улучшено, поскольку я не очень хорошо разбираюсь в css, но доказательство концепции работает
html,
body {
width: 100%;
height: 100%;
display: flex;
}
.container_row {
display: flex;
}
.layer1 {
width: 100%;
background-color: rgba(255, 255, 255, 0.5);
}
.layer2 {
width: 100%;
margin-left: -100%;
background-color: rgba(255, 255, 255, 0.5);
}
.tv-static {
width: 500px;
height: 300px;
margin: auto;
background-image: repeating-radial-gradient(circle at 17% 32%, white, black 0.00085px);
}
.animation1 {
animation: back1 1s linear infinite;
}
.animation2 {
animation: back2 0.1s linear infinite;
}
@keyframes back1 {
from {
background-size: 100% 100%;
}
to {
background-size: 99% 100%;
}
}
@keyframes back2 {
from {
background-size: 48.56% 50%;
}
to {
background-size: 43.9% 50.1%;
}
}
<div class="layer1">
<div class="tv-static animation1"></div>
</div>
<div class="layer2">
<div class="tv-static animation2"></div>
</div>
Комментарии:
1. В анимации back2, если вы переключаете проценты x и y, это улучшает эффект
@keyframes back2 {from {background-size: 50% 48.56%;}to {background-size: 50% 43.9%;}}
Ответ №3:
С функцией плавной синхронизации анимации не дают такого эффекта, нам нужно использовать функцию пошаговой синхронизации, чтобы придать эффект внезапного изменения.
Решение 1: Я изменил анимацию. И немного изменил ваш градиент. Я думаю, что использование градиента не является надежным решением, потому что браузеры выполняют вычисления по-разному, а дроби, округление изменяют вывод. Вы используете радиальный градиент, и кажется, что все выходит наружу из центра размещения. Вам придется протестировать его на каждой платформе и в каждом браузере, чтобы увидеть, выглядит ли он одинаково.
Решение 2: вместо градиента используется SVG. Фильтр feTurbulence создает эффект шума. Вы можете использовать svg в качестве фонового изображения.
Решение 3: вместо градиента использовалось изображение с той же анимацией. Преимущество использования изображения в том, что оно будет выглядеть одинаково во всех браузерах и на экранах.
Решение 3. Просто используйте шумовое gif-изображение. Анимация не требуется. 🙂
Просмотр следующего в режиме «полная страница»:
body {
text-align: center;
}
.tv {
width: 400px;
height: 200px;
border: 6px solid black;
margin: 0 auto;
overflow: hidden;
position: relative;
border-radius: 50% / 10%;
}
.tv-static {
position: absolute;
top: -200px;
left: -200px;
margin: auto;
height: 800px;
width: 800px;
background-image: repeating-radial-gradient(circle at 17% 132%, white 0.0005px, black 0.00085px);
animation: anim 1s steps(2, jump-both) infinite both;
transform: translate3d(0, 0, 0);
}
/******************************/
.tv0 {
width: 400px;
height: 200px;
border: 6px solid black;
margin: 0 auto;
overflow: hidden;
position: relative;
border-radius: 50% / 10%;
isolation: isolate;
}
.tv-static0 {
position: absolute;
top: 0px;
left: 0px;
margin: auto;
height: 300%;
width: 300%;
animation: anim 1s steps(2, end) infinite both;
transform: translate3d(0, 0, 0);
filter: contrast(300%) brightness(50%);
}
.tv-static0 svg {
height: 200%;
width: 100%;
transform: scale(2.5);
}
/******************************/
.tv1 {
width: 400px;
height: 200px;
border: 6px solid black;
margin: 0 auto;
overflow: hidden;
position: relative;
border-radius: 50% / 10%;
}
.tv-static1 {
position: absolute;
top: -500px;
right: -500px;
bottom: -500px;
left: -500px;
margin: auto;
background-image: url(https://i.stack.imgur.com/uzEM4.png);
animation: anim 1s steps(2, end) infinite both;
transform: translate3d(0, 0, 0);
}
/******************************/
.tv2 {
width: 400px;
height: 200px;
border: 6px solid black;
margin: 0 auto;
overflow: hidden;
position: relative;
border-radius: 50% / 10%;
}
.tv-static2 {
position: absolute;
top: -500px;
right: -500px;
bottom: -500px;
left: -500px;
margin: auto;
background-image: url(https://i.stack.imgur.com/9Be02.gif);
transform: translate3d(0, 0, 0);
}
@keyframes anim {
0% {
transform: translateX(0px, 0px);
}
10% {
transform: translate(-100px, 100px);
}
20% {
transform: translate(150px, -100px);
}
30% {
transform: translate(-100px, 100px);
}
40% {
transform: translate(100px, -150px);
}
50% {
transform: translate(-100px, 200px);
}
60% {
transform: translate(-200px, -100px);
}
70% {
transform: translateY(50px, 100px);
}
80% {
transform: translate(100px, -150px);
}
90% {
transform: translate(0px, 200px);
}
100% {
transform: translate(-100px, 100px);
}
}
Your original code. modified. May not work on every browser.
<div class="tv">
<div class="tv-static"></div>
</div>
<br> Using SVG `feTurbulence` filter
<div class="tv0">
<div class="tv-static0">
<svg viewBox="0 0 200% 200%" xmlns='http://www.w3.org/2000/svg'>
<filter id='noiseFilter'>
<feTurbulence type='turbulence' result='noise' baseFrequency='0.7' numOctaves='6' seed='2'
stitchTiles='noStitch' />
</filter>
<rect width='100%' height='100%' filter='url(#noiseFilter)' />
</svg>
<div class="overlay"></div>
</div>
</div>
<br>
<br> Animating image. Color TV
<div class="tv1">
<div class="tv-static1"></div>
</div>
<br> Using gif. No animation.
<div class="tv2">
<div class="tv-static2"></div>
</div>