Bạn biết bao nhiêu về box shadow?
Box shadow là gì?
- Box shadow là một dạng drop shadow, tức một dạng bộ lọc hình ảnh
- Drop shadow là bộ lọc tạo hiệu ứng bóng đổ bằng cách dịch chuyển các pixel của ảnh theo trục x và y
- Trong CSS, có thể áp dụng drop shadow bằng thuộc tính
filter
div {
filter: drop-shadow(xOffset yOffset rgba(0, 0, 0, 0.5));
}
- CSS còn hỗ trợ thêm giá trị blur để áp dụng cho drop shadow
div {
filter: drop-shadow(xOffset yOffset blurSize rgba(0, 0, 0, 0.5));
}
Box shadow
- Box shadow là một dạng drop filter chỉ hỗ trợ hình hộp
- Box shadow có lợi thế về mặt hiệu năng
- Cách triển khai box shadow trong CSS dùng các thủ thuật toán học để vẽ hộp bo tròn với chi phí thấp
- Có thể xếp chồng nhiều box shadow để tạo ra nhiều thiết kế đa dạng
function randomizeAndColor(e) {
randomize(e);
const spread = Math.random() > 0.8 ? 2 : 0;
const x1 = Math.floor(3 - Math.random() * 6) / (1 + spread);
const y1 = Math.floor(3 - Math.random() * 6) / (1 + spread);
const y2 = 2 + Math.floor(Math.random() * 4);
const blur2 = 8 + Math.floor(Math.random() * 12);
e.style.boxShadow = `${x1}px ${y1}px 0px ${spread}px ${getRandomPastelColor()}, 0 ${y2}px ${blur2}px #0006`;
}
Cách dùng box shadow sai
- Thông thường, nhà thiết kế bố trí các hình chữ nhật bằng cách dùng margin, padding và typography nhất quán
- Có thể dùng box shadow để tạo ra các hiệu ứng nghệ thuật với nhiều hình dạng khác nhau
- Có thể dùng box shadow để tạo hiệu ứng hoạt ảnh
const tick = (timestamp: number) => {
gameState.frame++;
gameState.deltaTime = Math.min((timestamp - gameState.prevFrameStartTime) / 1000, 0.1);
gameState.prevFrameStartTime = timestamp;
update(gameState);
render(gameState);
winContext._gameFrame = window.requestAnimationFrame(tick);
};
Cách dùng box shadow sai một cách nghiêm trọng
- Có thể dùng box shadow để tạo hiệu ứng 3D
- Có thể tạo hoạt ảnh quả bóng nảy
- Có thể dùng box shadow để vẽ một đám mây điểm
const pixels = await getImagePixels("/images/starry_night_full.jpg", width);
const dx = window.innerWidth / pixels[0].length;
const dy = window.innerHeight / pixels.length;
for (let y = 0; y < pixels.length; y++) {
for (let x = 0; x < pixels[0].length; x++) {
const px = x * dx + dx / 2, py = y * dy + dy / 2, pz = 60 + Math.random() * 3;
state.particles.push({ size: pSize, x: px, y: py, z: pz, ox: px, oy: py, oz: pz, dx: Math.random() * 3, dy: Math.random() * 3, dz: Math.random() * 3, color: pixels[y][x] });
}
}
Ray tracing bằng box shadow
- Ray tracing là một phương pháp tạo ảnh chính xác nhưng chậm
- Có thể triển khai ray tracing bằng box shadow
- Có thể dùng web worker để triển khai đa luồng
const gameState = {
frame: 0,
prevFrameStartTime: 0,
deltaTime: 0,
renderContainerSize: 32,
cam: new PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 100),
spheres: [
{ position: new Vector3(0, 1.3, 0), radius: 1.3, material: CreateMat({ color: new Color(1, 0.2, 0.3) }) },
{ position: new Vector3(-3, 1.3, 0), radius: 1.3, material: CreateMat({ color: new Color(0.9, 0.9, 0.9), smoothness: 0.9 }) },
{ position: new Vector3(0, 10.8, 0), radius: 3.6, material: CreateMat({ color: new Color(0, 0, 0), emissive: new Color(1, 1, 1), emissiveStrength: 8 }) }
]
};
# Tóm tắt của GN⁺
- Box shadow là một dạng drop shadow, hữu ích để tăng cảm giác chiều sâu cho hình ảnh
- Có thể dùng CSS để triển khai nhiều hiệu ứng box shadow khác nhau, từ đó tạo ra các thiết kế sáng tạo
- Có thể dùng box shadow để tạo hiệu ứng 3D và hoạt ảnh
- Việc triển khai ray tracing bằng box shadow là không hiệu quả nhưng vẫn khả thi
- Bài viết này khám phá những cách dùng box shadow sáng tạo và phi chuẩn, qua đó gợi mở các khả năng thiết kế mới
Chưa có bình luận nào.