Использование CSS box-shadow для импульсной анимации значительно снижает нагрузку на процессор
Требовалось отображать импульсную анимацию над меткой, чтобы выделить ожидающие уведомления. Я сталкивался с этим во время исследования в Интернете и реализовал то же самое. Это работает хорошо, однако, когда метка пульсирует, загрузка ЦП находится на постоянном уровне 50%, в то время как обычно почти ничего нет. Я хотел бы понять, что или почему это происходит, и, если возможно, исправить.
CSS:
.pulse {
/*margin:100px;*/
display: block;
/*width: 22px;*/
/*height: 22px;*/
/*border-radius: 100%;*/
background: #cca92c;
cursor: pointer;
box-shadow: 0 0 0 rgba(204,169,44, 0.4);
animation: pulse 2s infinite;
}
.pulse:hover {
animation: none;
}
@-webkit-keyframes pulse {
0% {
-webkit-box-shadow: 0 0 0 0 rgba(204,169,44, 0.4);
}
70% {
-webkit-box-shadow: 0 0 0 10px rgba(204,169,44, 0);
}
100% {
-webkit-box-shadow: 0 0 0 0 rgba(204,169,44, 0);
}
}
@keyframes pulse {
0% {
-moz-box-shadow: 0 0 0 0 rgba(204,169,44, 0.4);
box-shadow: 0 0 0 0 rgba(196,33,61, 0.85);
}
70% {
-moz-box-shadow: 0 0 0 10px rgba(204,169,44, 0);
box-shadow: 0 0 0 10px rgba(204,169,44, 0);
}
100% {
-moz-box-shadow: 0 0 0 0 rgba(204,169,44, 0);
box-shadow: 0 0 0 0 rgba(204,169,44, 0);
}
}
HTML:
<a class="dropdown-toggle" data-toggle="dropdown" id="alertingDashboardDropdown" href="#">Alerts Dashboard
<span class="label {{alertCount.totalOpenAlertsLabelClass}} dropdown-subscript-white pull-right">{{alertCount.totalOpenAlerts}}</span>
</a>
.
.
{{alertCount.totalOpenAlertsLabelClass}}
в основном возвращает "метка-первичный импульс"
1 ответ
Это происходит потому, что вы используете box-shadow
что не очень хорошо для анимации, потому что это вызовет перерисовку.
Здесь вы можете проверить, какие свойства вызывают изменения макета, рисования и составные изменения.
Лучшие из них opacity
а также transform
, может быть, вы можете изменить свою анимацию, чтобы использовать их.
РЕДАКТИРОВАТЬ: Создано 2 jsfiddle, один с box-shadow и другой с transform. Я отредактировал ваш код, но вы можете проверить производительность, изучить его, понять изменения и адаптировать его к вашим потребностям.
Как я это сделал:
Добавил :before
псевдоэлемент, в котором анимация будет выполняться под номером. will-change: transform;
сообщает браузеру, что преобразование элемента изменится, и браузер его оптимизирует.
.pulse {
position: relative;
display: inline-block;
width: 22px;
height: 22px;
line-height: 22px;
border-radius: 100%;
background-color: #cca92c;
text-align: center;
cursor: pointer;
}
.pulse:before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: #cca92c;
border-radius: 100%;
z-index: -1;
animation: pulse 2s infinite;
will-change: transform;
}
.pulse:hover:before {
animation: none;
}
@keyframes pulse {
0% {
transform: scale(1);
opacity: 1;
}
100% {
transform: scale(2);
opacity: 0;
}
}
<a class="dropdown-toggle" data-toggle="dropdown" id="alertingDashboardDropdown" href="#">
<span>Alerts Dashboard</span>
<span class="pulse">5</span>
</a>