#html #css #css-transitions
#HTML #css #css-переходы
Вопрос:
Я работаю над эффектом свечения для изображений. Чтобы сделать свечение более чем одним цветом, я фактически создаю копию псевдоэлемента изображения с применением фильтра размытия и насыщенности. Этот псевдоэлемент создается путем добавления класса в div изображения.
Теперь все это хорошо, но я бы хотел легко перенести эффект свечения, однако независимо от того, куда я помещаю атрибуты перехода, я просто не могу заставить его работать.
Я создал codepen для иллюстрации: https://codepen.io/anon/pen/eYGJGPG
function addGlow() {
document.getElementById('example').classList.toggle('mask')
}
.img {
height: fit-content;
width: fit-content;
display: block;
/* Doesn't transition */
transition: all 0.3s ease-out;
-webkit-transition: all 0.3s ease-out;
-moz-transition: all 0.3s ease-out;
-o-transition: all 0.3s ease-out;
}
.go {
height: 400px;
width: 400px;
background: url("https://upload.wikimedia.org/wikipedia/commons/3/32/RGB_color_wheel_72.svg");
background-size: initial;
}
.mask::after {
content: "";
width: inherit;
height: inherit;
position: absolute;
background: inherit;
background-position: center center;
filter: blur(10px) saturate(3);
z-index: -1;
}
<div id="example" class="img go"></div>
<button onclick="addGlow()">Press</button>
Ответ №1:
При удалении класса .mask
псевдоэлемент ::after
удаляется из DOM. Вам нужно постоянно сохранять ::after в DOM, чтобы видеть, как на нем происходят переходы:
function addGlow() {
document.getElementById('example').classList.toggle('mask')
}
.img {
height: fit-content;
width: fit-content;
display: block;
}
.go {
height: 400px;
width: 400px;
background: url("https://upload.wikimedia.org/wikipedia/commons/3/32/RGB_color_wheel_72.svg");
background-size: initial;
}
.img::after {
content: "";
width: inherit;
height: inherit;
position: absolute;
background: inherit;
background-position: center center;
z-index: -1;
/* initial state */
filter: blur(0px) saturate(0);
transition: all 1.3s ease-out;
-webkit-transition: all 1.3s ease-out;
-moz-transition: all 1.3s ease-out;
-o-transition: all 1.3s ease-out;
}
.mask::after {
/* glow */
filter: blur(30px) saturate(3);
}
<div id="example" class="img go"></div>
<button onclick="addGlow()">Press</button>
Ответ №2:
Возможно, рассмотрите возможность использования animation
вместо transition
. Смотрите рабочий фрагмент ниже.
function addGlow(){
document.getElementById('example').classList.toggle('mask')
}
.img {
height: fit-content;
width: fit-content;
display: block;
/* Doesn't transition */
}
.go {
height: 400px;
width: 400px;
background: url("https://upload.wikimedia.org/wikipedia/commons/3/32/RGB_color_wheel_72.svg");
background-size: initial;
}
.mask::after {
content: "";
width: inherit;
height: inherit;
position: absolute;
background: inherit;
background-position: center center;
z-index: -1;
animation: example-animation .5s ease-out;
animation-direction: normal;
animation-iteration-count: 1;
filter: blur(10px) saturate(3);
}
@keyframes example-animation {
0% {
filter: blur(0) saturate(3);
}
100% {
filter: blur(10px) saturate(3);
}
}
<div id="example" class="img go"></div>
<button onclick="addGlow()">Press</button>
Комментарии:
1. Я не думал об использовании анимации напрямую, спасибо! Однако в вашем примере, поскольку мы добавляем анимацию на маске, это облегчит работу только при добавлении класса, а не при его удалении, верно? Как бы я мог создать анимацию для упрощения ввода и вывода для добавляемого и удаляемого класса
2. Хороший вопрос ….. вы можете изменить анимацию, изменив
animation-direction: normal;
наanimation-direction: reverse;
, но как переключить это с помощью вашего JS-кода, я не совсем уверен. Если я смогу об этом подумать, я обновлю свой ответ.