Khoảng giá
Từ: 0 triệu
Đến: Không giới hạn
Túi máy ảnh Peak Design Everyday Messenger 15 Inch (Charcoal)
Vui lòng gọi
Balo máy ảnh Peak Design Everyday Backpack Zip 20L (Midnight)
Vui lòng gọi
Balo máy ảnh Peak Design Everyday Backpack Zip 20L (Ash)
Vui lòng gọi
Dây đeo tay Peak Design Cuff - CF-AS-3 (Sage Green) | Nhập khẩu
Đơn giá
875,000đ
Dây đeo tay Peak Design Cuff - CF-AS-3 (Midnight Blue) | Nhập khẩu
Đơn giá
875,000đ
Dây đeo Peak Design Leash - L-AS-3 (Ash) | Nhập khẩu
Đơn giá
1,850,000đ
Dây đeo Peak Design Leash L-BL-3 (Black) | Nhập khẩu
Đơn giá
1,850,000đ
Dây đeo Peak Design Slide Lite - SLL-BK-3 (Black) | Nhập khẩu
Đơn giá
1,850,000đ
Dây đeo Peak Design Slide Lite - SLL-AS-3 (Ash) | Nhập khẩu
Đơn giá
1,850,000đ
Dây đeo Peak Design Slide - SL-AS-3 (Ash) | Nhập khẩu
Đơn giá
1,850,000đ
Dây đeo Peak Design Slide - SL-BK-3 (Black) | Nhập khẩu
Đơn giá
1,850,000đ
Dây đeo tay Peak Design Clutch - CL-3
Đơn giá
1,250,000đ
Balo máy ảnh Peak Design Everyday Backpack Zip 15L (Midnight)
Đơn giá
4,750,000đ
Balo máy ảnh Peak Design Everyday Backpack Zip 15L (Black)
Đơn giá
4,750,000đ
Balo máy ảnh Peak Design Everyday Backpack Zip 20L (Black)
Đơn giá
5,500,000đ
Balo máy ảnh Peak Design Everyday Backpack v2 (20L, Midnight) | Nhập khẩu
Đơn giá
7,500,000đ
Túi máy ảnh Peak Design Everyday Sling v2 3L (Black) | Nhập khẩu
Vui lòng gọi
Túi máy ảnh Peak Design Everyday Sling v2 6L (Midnight) | Nhập khẩu
Vui lòng gọi
Túi máy ảnh Peak Design Everyday Sling v2 6L (Black) | Nhập khẩu
Vui lòng gọi
Dây đeo tay Peak Design Cuff - CF-AS-3 (Ash) | Nhập khẩu
Đơn giá
840,000đ
Dây đeo tay Peak Design Cuff - CF-BL-3 (Black) | Nhập khẩu
Đơn giá
840,000đ
Peak Design PL-S-2 - Standard Plate
Đơn giá
1,890,000đ
Túi máy ảnh Peak Design Everyday Messenger 13 Inch (Black)
HÀNG MỚI ĐÃ TẠM HẾT
Peak Design Capture Camera Clip V3 (Silver) | Nhập khẩu
HÀNG MỚI ĐÃ TẠM HẾT
Peak Design Capture Camera Clip V3 (Black) | Nhập khẩu
HÀNG MỚI ĐÃ TẠM HẾT
Chân máy Peak Design Travel Tripod | Aluminum | Nhập khẩu
HÀNG MỚI ĐÃ TẠM HẾT
(function () {
const requestAnimFrame = (function () {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
function (callback) {
window.setTimeout(callback, 1000 / 60);
};
})();
const hieuUngPhaoHoa = {
canvas: document.getElementById('hieuUngPhaoHoa__canvas'),
ctx: null,
cw: window.innerWidth,
ch: window.innerHeight,
fireworks: [],
particles: [],
colors: [0, 60, 300], // Mảng các màu
hue: 0,
timerTotal: 30, // Giảm thời gian giữa các lần bắn
timerTick: 0,
isActive: true, // Biến để kiểm soát trạng thái hoạt động
init: function () {
this.ctx = this.canvas.getContext('2d');
this.canvas.width = this.cw;
this.canvas.height = this.ch;
this.loop();
// Tự động dừng sau 5 giây
setTimeout(() => {
this.isActive = false;
}, 5000);
},
calculateDistance: function (p1x, p1y, p2x, p2y) {
const xDistance = p1x - p2x;
const yDistance = p1y - p2y;
return Math.sqrt(Math.pow(xDistance, 2) + Math.pow(yDistance, 2));
},
random: function (min, max) {
return Math.random() * (max - min) + min;
},
createParticles: function (x, y) {
let particleCount = 30;
// Chọn màu ngẫu nhiên từ mảng
this.hue = this.colors[Math.floor(Math.random() * this.colors.length)];
while (particleCount--) {
this.particles.push(new Particle(x, y, this));
}
},
// Main loop
loop: function () {
if (!this.isActive && this.fireworks.length === 0 && this.particles.length === 0) {
return; // Dừng animation khi hết pháo hoa
}
requestAnimFrame(this.loop.bind(this));
this.hue += 0.5;
this.ctx.globalCompositeOperation = 'destination-out';
this.ctx.fillStyle = 'rgba(0, 0, 0, 0.5)';
this.ctx.fillRect(0, 0, this.cw, this.ch);
this.ctx.globalCompositeOperation = 'lighter';
let i = this.fireworks.length;
while (i--) {
this.fireworks[i].draw();
this.fireworks[i].update(i);
}
i = this.particles.length;
while (i--) {
this.particles[i].draw();
this.particles[i].update(i);
}
// Tự động bắn pháo hoa nếu đang hoạt động
if (this.isActive && this.timerTick >= this.timerTotal) {
this.fireworks.push(new Firework(
this.cw / 2, this.ch,
this.random(0, this.cw),
this.random(0, this.ch / 2),
this
));
this.timerTick = 0;
} else {
this.timerTick++;
}
}
};
// Firework class
class Firework {
constructor(sx, sy, tx, ty, main) {
this.main = main;
this.x = sx;
this.y = sy;
this.sx = sx;
this.sy = sy;
this.tx = tx;
this.ty = ty;
this.distanceToTarget = main.calculateDistance(sx, sy, tx, ty);
this.distanceTraveled = 0;
this.coordinates = [];
this.coordinateCount = 3;
while (this.coordinateCount--) {
this.coordinates.push([this.x, this.y]);
}
this.angle = Math.atan2(ty - sy, tx - sx);
this.speed = 2;
this.acceleration = 1.05;
this.brightness = main.random(50, 70);
this.targetRadius = 1;
}
update(index) {
this.coordinates.pop();
this.coordinates.unshift([this.x, this.y]);
if (this.targetRadius < 8) {
this.targetRadius += 0.3;
} else {
this.targetRadius = 1;
}
this.speed *= this.acceleration;
const vx = Math.cos(this.angle) * this.speed;
const vy = Math.sin(this.angle) * this.speed;
this.distanceTraveled = this.main.calculateDistance(
this.sx, this.sy, this.x + vx, this.y + vy
);
if (this.distanceTraveled >= this.distanceToTarget) {
this.main.createParticles(this.tx, this.ty);
this.main.fireworks.splice(index, 1);
} else {
this.x += vx;
this.y += vy;
}
}
draw() {
this.main.ctx.beginPath();
this.main.ctx.moveTo(
this.coordinates[this.coordinates.length - 1][0],
this.coordinates[this.coordinates.length - 1][1]
);
this.main.ctx.lineTo(this.x, this.y);
this.main.ctx.strokeStyle = `hsl(${this.main.hue}, 100%, ${this.brightness}%)`;
this.main.ctx.stroke();
}
}
// Particle class
class Particle {
constructor(x, y, main) {
this.main = main;
this.x = x;
this.y = y;
this.coordinates = [];
this.coordinateCount = 5;
while (this.coordinateCount--) {
this.coordinates.push([this.x, this.y]);
}
this.angle = main.random(0, Math.PI * 2);
this.speed = main.random(1, 10);
this.friction = 0.95;
this.gravity = 1;
this.hue = main.random(main.hue - 20, main.hue + 20);
this.brightness = main.random(50, 80);
this.alpha = 1;
this.decay = main.random(0.015, 0.03);
}
update(index) {
this.coordinates.pop();
this.coordinates.unshift([this.x, this.y]);
this.speed *= this.friction;
this.x += Math.cos(this.angle) * this.speed;
this.y += Math.sin(this.angle) * this.speed + this.gravity;
this.alpha -= this.decay;
if (this.alpha <= this.decay) {
this.main.particles.splice(index, 1);
}
}
draw() {
this.main.ctx.beginPath();
this.main.ctx.moveTo(
this.coordinates[this.coordinates.length - 1][0],
this.coordinates[this.coordinates.length - 1][1]
);
this.main.ctx.lineTo(this.x, this.y);
this.main.ctx.strokeStyle = `hsla(${this.hue}, 100%, ${this.brightness}%, ${this.alpha})`;
this.main.ctx.stroke();
}
}
// Khởi chạy khi trang load xong
window.addEventListener('load', () => hieuUngPhaoHoa.init());
})();