L-PLATE FOR SONY ALPHA A7R MARK III
Giá từ:
350,000đ
KHUNG PLATE L FOR FUJIFILM X-A3/X-A5
Giá từ:
300,000đ
KHUNG PLATE L FOR FUJIFILM X-H1
Vui lòng gọi
GRIP FUJIFILM X-E4
Vui lòng gọi
Tay cầm Sigma Large Hand Grip HG-21
Vui lòng gọi
Tay cầm Sigma Hand Grip HG-11
Vui lòng gọi
HLD-10 Power Battery Holder – Grip pin mở rộng cho OM-1
Vui lòng gọi
Phụ kiện SmallRig Super Clamp Mount with 1/4" Screw Ball Head Mount - 1124
Đơn giá
250,000đ
Case Silicone Sony A7 II (Đen)
Đơn giá
240,000đ
Insta360 X5 Carry Case
Đơn giá
710,000đ
SmallRig Silicone Handgrip cho Sony A6 Series Cage CCS2310 2788
Đơn giá
305,000đ
SmallRig Multi-function Super Clamp with Double Ball Heads & 1/4" Screw -1138
Đơn giá
360,000đ
L-Plate Sony A7ii A7r2
Đơn giá
480,000đ
SmallRig L Bracket cho máy ảnh Nikon Z5/Z6/Z6 II/Z7/Z7 II - 2947
Đơn giá
1,250,000đ
Phụ kiện báng tay cầm không dây Sony GP - VPT2BT | Nhập khẩu
HÀNG MỚI ĐÃ TẠM HẾT
Halfcase Canon EOS M10
HÀNG MỚI ĐÃ TẠM HẾT
Case Silicone cho Sony A6300 (Đen)
HÀNG MỚI ĐÃ TẠM HẾT
Case Silicone Sony A6500 (Xanh lá)
HÀNG MỚI ĐÃ TẠM HẾT
HalfCase Sony A5000/A5100 LCS-EBD
HÀNG MỚI ĐÃ TẠM HẾT
Halfcase Fujifilm X-T2
HÀNG MỚI ĐÃ TẠM HẾT
Halfcase Fujifilm X-T1 (Đen)
HÀNG MỚI ĐÃ TẠM HẾT
Halfcase Fujifilm X-T10/X-T20 (Đen)
HÀNG MỚI ĐÃ TẠM HẾT
Halfcase Fujifilm X-E (Đen)
HÀNG MỚI ĐÃ TẠM HẾT
Halfcase Fujifilm X-A (Black)
HÀNG MỚI ĐÃ TẠM HẾT
Halfcase cho Fujifilm X-A5 (Black)
HÀNG MỚI ĐÃ TẠM HẾT
Halfcase Fujifilm Leather BLC X-T10
HÀNG MỚI ĐÃ TẠM HẾT
Halfcase Fujifilm Leather BLC-XT1
HÀNG MỚI ĐÃ TẠM HẾT
Halfcase Fujifilm Leather BLC-1
HÀNG MỚI ĐÃ TẠM HẾT
Phụ kiện báng tay cầm không dây Sony GP - VPT2BT | Chính hãng
HÀNG MỚI ĐÃ TẠM HẾT
Grip Pin Canon BG-E22
HÀNG MỚI ĐÃ TẠM HẾT
Giá Đỡ SmallRig L Bracket cho FUJIFILM X-H2S - 3928
L-Plate SmallRig cho Fujifilm X-T3 và X-T2 Camera - 2253
Hộp đựng ống kính 7Artisans (Brown) | Chính Hãng
Case máy ảnh 7Artisans (Brown) | Chính Hãng
Túi đựng ống kính 7Artisans (Grey) | Chính Hãng
SmallRig Mounting Plate cho DJI Ronin-S và Ronin-SC - BSS2263
Hand grip MHG-XE3
L-Plate Sony A6000
L-Plate Sony A6300
Halfcase cho Fujifilm X-A5 (Brown)
Metal Hand Grip Fujifilm X-T1 (MHG X-T1)
Halfcase cho FUJIFILM X-T20/X-T30 | Chính hãng
SmallRig Vlogging Mounting Plate Pro cho máy ảnh Nikon Z50 LCN2667
SmallRig L Bracket cho máy ảnh Panasonic S5 -2984
SmallRig L-Bracket for Sony Alpha 7S III A7S III A7S3 - 3003
Halfcase BLC-X-A3 (Black) | Chính Hãng
L-Plate SmallRig cho Sony A6600 - LCS2503
Phụ kiện SmallRig L-Bracket for FUJIFILM X-S10 Camera 3086
L-Plate SmallRig cho Sony A6400/A6300/A6100 - APL2331B
SmallRig L Bracket cho Fujifilm X-E4 - 3231
SmallRig 15mm LWS Universal Lens Support BSL - 2644
L-Plate SmallRig cho Fujifilm X-T20 và X-T30 - APL2357
SmallRig Magic Arm với Double Ballhead- 2116
SmallRig L-Shape Grip cho máy ảnh Fujifilm X-T4 - LCF2813
Báng tay cầm Sony GP-VPT1
L-Plate SmallRig cho Canon EOS R - LCC2397
SmallRig L Bracket cho Fujifilm GFX 100S - 3232
L-Plate SmallRig cho FUJIFILM X-T4 Camera - LCF2811
Grip Pin VG-XT4 | Chính Hãng
Case cho Fujifilm X100F/X100V (Black) | Chính hãng
Case cho Fujifilm X100F/X100V (Brown) | Chính hãng
(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());
})();