предисловие
После долгого отсутствия я снова нашла время написать блог (づ ̄3 ̄)づ╭❤~~
Сегодня хочу поделиться реализацией небольшой анимацииАватар прыгает, а блики проходят через отображение эффектовВы можете сначала нажать, чтобы увидеть эффект ~Нажмите на аватар, чтобы активировать эффект анимации~
Или просто посмотрите на две картинки для иллюстрации ~ все коды вставлены внизу текста, или вы можете перейти по ссылкеCodePen
думать
Сложность здесь в том, как добиться бликов? Я не первый раз делаю эту анимацию.Я думал, что это все реализовано с помощью нарезанных изображений.Это потому, что я делал это много раз.Интересно, можно ли это реализовать с помощью чистого кода CSS в этот раз?
Ответ - да (●´∀`●)ノ
Сначала первый шаг! Для меня это также первый шаг к тому, чтобы отказаться от вырезания картинок!
Чтобы все ясно видели. Ставлю черный фон, по идее, если картинку обрезать, то будет прозрачный PNG.
Я не буду обсуждать, что лучше между реализацией CSS и PNG~
Во-первых, я разработал два метода реализации CSS для выделения.
Устаревший вариант один
Внедрение прямоугольников и цветовых градиентовbackground: linear-gradient(90deg, transparent 15%, #fff);
После этого заставьте его вращатьсяtransform: rotate(?deg);
. Дополнительная часть будет аватаркойoverflow:hidden
, то есть кажется, что этой изюминки легко добиться? Но сложность заключается в том, что для полного согласования ширины, высоты и угла поворота с проектным чертежом требуются определенные математические расчеты по геометрии плоскости (и это я уже вернула учителю...).
Устаревший второй вариант
Непосредственно реализуйте прямоугольный цветовой градиент, а затем реализуйте маленькие треугольники в верхнем левом и нижнем правом углах для вырезания маски. К сожалению, мои навыки Photoshop лучше, чем навыки CSS в этом отношении... (Кажется, я не могу найти это поддержка в CSS: Маска элемента на другой элемент, если кто знает, можете оставить сообщение и сообщить мне)
выполнить
Когда я изо всех сил пытался вернуться к схеме листов, мне вспомнилось свойство CSSclip-path
, вы можете нажать на этот MDN, чтобы увидеть это свойство. Учащиеся, которым небезразлична совместимость, также могут пойти и посмотретьСовместимость
Введение в документ MDN:Свойство CSS clip-path создает область отсечения, в которой может отображаться только часть элемента. Часть внутри области отображается, а часть вне области скрыта. Область отсечения — это путь, определяемый встроенным URL-адресом или внешним svg, на который ссылаются, или фигурой, такой как circle(). Свойство clip-path заменяет устаревшее свойство clipping clip.
Это свойство очень сильное. Вы можете вырезать эллипсы, многоугольники, контуры SVG, а также в соответствии с геометрической блочной моделью~
отлично! Я хочу параллелограмм,clip-path: polygon(50% 0, 100% 0%, 50% 100%, 0% 100%);
, очень легко достичь ~
Следующие конкретные требования к анимации: 300 мс, чтобы аватар стал больше, 500 мс, чтобы подсветка рисовалась слева направо, и 300 мс, чтобы аватар увеличился до исходного размера.
Этого можно добиться с помощью комбинации анимации из двух элементов~animation: heartbeat 1.1s linear forwards;
animation: highlight 1.1s linear forwards;
Поскольку эффект необходимо активировать в подходящее время, он неотделим от помощи Javascript. Реализация здесь состоит в том, чтобы добавить имя класса анимации, когда эффект необходим, и активно удалить имя класса после окончания анимации~
Если вам интересно, вы можете взглянуть на код, PS: CSS использует формат less~
код
<div class="user-headpic"></div>
@size: 50px;
.user-headpic {
position: relative;
display: block;
width: @size;
height: @size;
background:
url("https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2018/10/25/166a8fc6cd14bf6f~tplv-t2oaga2asx-image.image")
center/cover
no-repeat;
border-radius: 100%;
border: 2px solid silver;
overflow: hidden;
&:after {
.cube(@size);
.highlight(@size);
}
&.starring {
animation: heartbeat 1.1s linear forwards;
&:after {
animation: highlight 1.1s linear forwards;
}
}
}
.cube(@w) {
content: '';
position: absolute;
width: @w;
height: @w;
}
.highlight(@w) {
position: absolute;
width: @w;
height: @w;
left: -@w;
top: 0;
background: linear-gradient(90deg, transparent 15%, #fff);
-webkit-clip-path: polygon(50% 0, 100% 0%, 50% 100%, 0% 100%);
clip-path: polygon(50% 0, 100% 0%, 50% 100%, 0% 100%);
z-index: 3;
}
@keyframes highlight {
0 {
transform: translateX(-@size);
}
27.27% {
transform: translateX(-@size);
}
72.73% {
transform: translateX(2 * @size);
}
100% {
transform: translateX(2 * @size);
}
}
@keyframes heartbeat {
0 {
transform: scale(1);
}
27.27% {
transform: scale(1.2);
}
72.73% {
transform: scale(1.2);
}
100% {
transform: scale(1);
}
}
думать
Эта совместимость свойств CSS не очень дружелюбна. Тем не менее, неплохо играть в духе обучения, может быть, это пригодится через несколько лет, хахаха~