Hiệu ứng Shake
Hiệu ứng Shake làm phần tử **rung lắc ngang** (translateX) qua lại giữa -10px và 10px. Thường dùng cho: form validation error, notification cảnh báo, "wrong password" feedback.
Keyframes
@keyframes shake {
0%, 100% { transform: translateX(0); }
10%, 30%, 50%, 70%, 90% { transform: translateX(-10px); } /* Sang trái */
20%, 40%, 60%, 80% { transform: translateX(10px); } /* Sang phải */
}
Ví dụ hoàn chỉnh
<!DOCTYPE html>
<html>
<head>
<style>
.animated {
width: 100px; height: 100px;
background: #F44336;
animation-duration: 0.8s; /* Nhanh hơn cho cảm giác rung */
animation-fill-mode: both;
animation-timing-function: ease-in-out;
}
@keyframes shake {
0%, 100% { transform: translateX(0); }
10%, 30%, 50%, 70%, 90% { transform: translateX(-10px); }
20%, 40%, 60%, 80% { transform: translateX(10px); }
}
.shake { animation-name: shake; }
</style>
</head>
<body>
<div class="animated shake"></div>
<button onclick="location.reload()">Chạy lại</button>
</body>
</html>
Các biến thể Shake
| Biến thể | Keyframes thay đổi | Dùng cho |
|---|---|---|
| Shake ngang (mặc định) | translateX(±10px) | Form error, input invalid |
| Shake dọc | translateY(±10px) | Button press feedback |
| Shake 3D | rotate(±5deg) hoặc rotateY(±10deg) | Card, image đính kèm |
| Shake + Opacity | Thêm opacity: 0.7 ở giữa | Nhấn mạnh hơn |
Ví dụ Shake 3D (Rotate)
@keyframes shake-3d {
0%, 100% { transform: rotate(0deg); }
10%, 30%, 50%, 70%, 90% { transform: rotate(-5deg); }
20%, 40%, 60%, 80% { transform: rotate(5deg); }
}
.shake-3d { animation: shake-3d 0.6s ease-in-out; }
Tích hợp JavaScript (Form validation)
function shakeElement(element) {
element.classList.add('shake');
element.addEventListener('animationend', () => {
element.classList.remove('shake');
}, { once: true });
}
// Sử dụng
const input = document.querySelector('input');
input.addEventListener('invalid', (e) => {
e.preventDefault();
shakeElement(input);
});
Mẹo hiệu năng
- Dùng
transform: translateX()- GPU accelerated, không trigger layout - Thêm
will-change: transformcho element hay shake - Duration ngắn (0.5-1s) - tránh gây chóng mặt
- Tuân thủ
prefers-reduced-motion:
@media (prefers-reduced-motion: reduce) {
.shake { animation: none; }
}