#javascript #html #css
#javascript #HTML #css
Вопрос:
Я хочу создать простую сквозную анимацию, и пока я здесь:
.strikethrough {
display: inline-block;
position: relative;
line-height: 1.5em;
}
.strikethrough:after {
content: '';
position: absolute;
display: block;
width: 100%;
height: 1px;
box-shadow: 0 1px rgba(252, 3, 3,0.7);
margin-top: -0.7em;
background: rgba(252, 3, 3,0.8);
transform-origin: center left;
animation: strikethrough 1s 0.5s cubic-bezier(.55, 0, .1, 1) 1;
}
@keyframes strikethrough {
from {
transform: scaleX(0);
}
to {
transform: scaleX(1);
}
}
<span class="strikethrough">Favor packaging over toy</span>
Как вы видите, все работает нормально, кроме двух вещей:
-
Теперь мы можем сначала увидеть строку, затем она скрывается и запускает анимацию, я хочу видеть только анимированную строку.
-
Я хочу инициировать анимацию с помощью javascript… но с этим псевдо-элементом (после) это кажется сложным!
Ответ №1:
Вы можете исправить свою анимацию с помощью animation-fill-mode
:
animation-fill-mode: backwards;
Чтобы запустить анимацию, просто добавьте класс зачеркивания. Я думаю, что это не сработает, если у вас есть многострочный текст, поскольку вы ::after
не будете его охватывать.
document.querySelector( '.strikethrough' ).addEventListener( 'click', event => { event.target.classList.toggle( 'strikethrough' ); });
.strikethrough {
display: inline-block;
position: relative;
line-height: 1.5em;
}
.strikethrough:after {
content: '';
position: absolute;
display: block;
width: 100%;
height: 1px;
box-shadow: 0 1px rgba(252, 3, 3,0.7);
margin-top: -0.7em;
background: rgba(252, 3, 3,0.8);
transform-origin: center left;
animation: strikethrough 1s 0.5s cubic-bezier(.55, 0, .1, 1) 1;
animation-fill-mode: backwards;
}
@keyframes strikethrough {
from {
transform: scaleX(0);
}
to {
transform: scaleX(1);
}
}
<span class="strikethrough">Favor packaging over toy</span>
Лично я бы воспользовался этим более простым способом, чтобы уменьшить количество реальных объектов на экране и объем кода, используя фоновое изображение для масштабирования. Если правильно настроить, вы могли бы даже сделать это многострочным (сделав фон высотой строки и добавив в него средний пиксель — а с помощью SVGS вы могли бы гарантировать, что он составляет всего 1 пиксель, независимо от растяжения и т. Д.).
document.querySelector( 'p' ).addEventListener( 'click', event => {
event.target.classList.toggle( 'strikethrough' );
})
@keyframes stretch {
to { background-size: 100% var(--line-height); }
}
:root {
--line-height: 1.2em;
}
p {
line-height: var(--line-height);
}
.strikethrough {
line-height: 1.2em;
background: url('data:image/svg xml;charset=utf8,<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="none"><line x1="0" y1="50%" x2="100%" y2="50%" stroke="black" stroke-width="1px" /></svg>') repeat-y 0 0 / 0 var(--line-height);
animation: stretch 4s;
animation-fill-mode: forwards;
}
<p>Hello World!<br />Another line, does it work?</p>
Комментарии:
1. И как инициировать анимацию с помощью javascript…
2. @Pixier я знаю, ПОЭТОМУ меня всегда раздражает публикация, когда я впадаю в панику после нажатия tab, и теперь он выбирает кнопку публикации, а затем публикует…. Вздох. Это был преждевременный пост.