Tao Trang web giong google Jamboard

 Dưới đây là một đoạn mã HTML/JavaScript hoàn chỉnh để bạn có thể đưa vào Blogspot (ví dụ qua “Layout” → “Add a Gadget” → “HTML/JavaScript”). Đoạn mã này tích hợp nhiều tính năng như Google Jamboard:

  • Vẽ tự do trên canvas (hỗ trợ cả chuột và cảm ứng)
  • Chọn màu vẽ
  • Hỗ trợ nhiều slide (2 slide mẫu, có thể mở rộng thêm)
  • Tải ảnh từ điện thoại và vẽ lên canvas
  • Xóa canvas
  • Chụp hình (preview ảnh từ canvas)
  • Gửi ảnh lên server qua AJAX (với URL endpoint bạn tự cấu hình)

Hãy thay thế "YOUR_SERVER_URL" bằng URL server thật nếu có, hoặc bỏ qua chức năng gửi nếu bạn không có server xử lý.

html
<!DOCTYPE html> <html lang="vi"> <head> <meta charset="UTF-8"> <title>Jamboard Tương Tự Google Jamboard</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> body { margin: 20px; font-family: Arial, sans-serif; } .jamboard-container { text-align: center; } .controls { margin-bottom: 10px; } canvas { border: 1px solid #ccc; margin-bottom: 10px; } .hidden { display: none; } #preview img { max-width: 100%; margin-top: 10px; } </style> </head> <body> <div class="jamboard-container"> <!-- Điều khiển slide --> <div class="controls"> <button id="prevSlide">← Slide Trước</button> <span id="slideIndicator">Slide 1/2</span> <button id="nextSlide">Slide Sau →</button> </div> <!-- Công cụ điều khiển --> <div class="controls"> <input type="color" id="colorPicker" value="#000000"> <input type="file" id="uploadImage" accept="image/*"> <button id="clearCanvas">Xóa Canvas</button> </div> <!-- Các slide: mỗi slide là một canvas --> <div id="canvasContainer"> <canvas id="canvas1" width="800" height="600"></canvas> <canvas id="canvas2" width="800" height="600" class="hidden"></canvas> </div> <!-- Các nút chức năng chụp và gửi --> <div class="controls"> <button id="captureButton">Chụp Hình Ảnh</button> <button id="sendButton">Gửi Lên Server</button> </div> <!-- Phần xem trước ảnh đã chụp --> <div id="preview"></div> </div> <script> // Khai báo các biến toàn cục const totalSlides = 2; let currentSlide = 1; const canvases = []; const contexts = []; // Lấy canvas và context for (let i = 1; i <= totalSlides; i++) { const canvas = document.getElementById('canvas' + i); canvases.push(canvas); contexts.push(canvas.getContext('2d')); } let currentContext = contexts[currentSlide - 1]; // Cập nhật chỉ số slide function updateSlideIndicator() { document.getElementById('slideIndicator').textContent = "Slide " + currentSlide + "/" + totalSlides; } updateSlideIndicator(); // Hàm chuyển slide function switchSlide(slide) { currentSlide = slide; canvases.forEach((canvas, index) => { if (index === (currentSlide - 1)) { canvas.classList.remove('hidden'); } else { canvas.classList.add('hidden'); } }); currentContext = contexts[currentSlide - 1]; updateSlideIndicator(); } document.getElementById('prevSlide').addEventListener('click', function() { if (currentSlide > 1) switchSlide(currentSlide - 1); }); document.getElementById('nextSlide').addEventListener('click', function() { if (currentSlide < totalSlides) switchSlide(currentSlide + 1); }); // Vẽ tự do: hỗ trợ chuột và cảm ứng let drawing = false, lastX = 0, lastY = 0; const colorPicker = document.getElementById('colorPicker'); function startDrawing(x, y) { drawing = true; lastX = x; lastY = y; } function draw(x, y) { if (!drawing) return; currentContext.strokeStyle = colorPicker.value; currentContext.lineWidth = 2; currentContext.beginPath(); currentContext.moveTo(lastX, lastY); currentContext.lineTo(x, y); currentContext.stroke(); lastX = x; lastY = y; } function stopDrawing() { drawing = false; } // Sự kiện chuột canvases.forEach(canvas => { canvas.addEventListener('mousedown', function(e) { const rect = canvas.getBoundingClientRect(); startDrawing(e.clientX - rect.left, e.clientY - rect.top); }); canvas.addEventListener('mousemove', function(e) { const rect = canvas.getBoundingClientRect(); draw(e.clientX - rect.left, e.clientY - rect.top); }); canvas.addEventListener('mouseup', stopDrawing); canvas.addEventListener('mouseout', stopDrawing); }); // Sự kiện cảm ứng (touch) canvases.forEach(canvas => { canvas.addEventListener('touchstart', function(e) { e.preventDefault(); const rect = canvas.getBoundingClientRect(); const touch = e.touches[0]; startDrawing(touch.clientX - rect.left, touch.clientY - rect.top); }); canvas.addEventListener('touchmove', function(e) { e.preventDefault(); const rect = canvas.getBoundingClientRect(); const touch = e.touches[0]; draw(touch.clientX - rect.left, touch.clientY - rect.top); }); canvas.addEventListener('touchend', function(e) { e.preventDefault(); stopDrawing(); }); }); // Tải ảnh từ điện thoại và vẽ lên canvas hiện tại document.getElementById('uploadImage').addEventListener('change', function(e) { const file = e.target.files[0]; if (!file) return; const reader = new FileReader(); reader.onload = function(event) { const img = new Image(); img.onload = function() { currentContext.clearRect(0, 0, canvases[currentSlide - 1].width, canvases[currentSlide - 1].height); currentContext.drawImage(img, 0, 0, canvases[currentSlide - 1].width, canvases[currentSlide - 1].height); } img.src = event.target.result; } reader.readAsDataURL(file); }); // Nút Xóa canvas hiện tại document.getElementById('clearCanvas').addEventListener('click', function() { currentContext.clearRect(0, 0, canvases[currentSlide - 1].width, canvases[currentSlide - 1].height); }); // Nút Chụp Hình: Hiển thị preview ảnh của canvas hiện tại document.getElementById('captureButton').addEventListener('click', function() { const imageData = canvases[currentSlide - 1].toDataURL("image/png"); const imgPreview = document.createElement('img'); imgPreview.src = imageData; document.getElementById('preview').innerHTML = ""; document.getElementById('preview').appendChild(imgPreview); }); // Nút Gửi ảnh lên server qua AJAX document.getElementById('sendButton').addEventListener('click', function() { const imageData = canvases[currentSlide - 1].toDataURL("image/png"); // Thay YOUR_SERVER_URL bằng URL endpoint của bạn nếu có server xử lý const serverUrl = "YOUR_SERVER_URL"; const xhr = new XMLHttpRequest(); xhr.open("POST", serverUrl, true); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { alert("Hình ảnh đã được gửi thành công!"); } else { alert("Lỗi khi gửi ảnh: " + xhr.status); } } }; xhr.send("image=" + encodeURIComponent(imageData)); }); </script> </body> </html>

Hướng dẫn sử dụng trên Blogspot:

  1. Vào trang quản trị Blogspot và chọn “Layout”.
  2. Thêm Gadget HTML/JavaScript và dán toàn bộ mã trên vào hộp nội dung.
  3. Lưu lại và kiểm tra giao diện trên blog (trên desktop và điện thoại).

Đoạn mã này cung cấp trải nghiệm tương tự Google Jamboard với nhiều slide, công cụ chọn màu, khả năng vẽ tự do, tải ảnh từ thiết bị, chụp ảnh preview và gửi ảnh (với cấu hình server nếu cần). Bạn có thể tùy chỉnh CSS, kích thước canvas hay số lượng slide theo nhu cầu của mình.

Comments

Popular posts from this blog

The World at a Crossroads: Donald Trump’s Presidency and Its Global Impact

Cho tam giác ABC vuông tại A có AB < AC. Vẽ AH vuông góc với BC ( H thuộc BC), D là điểm trên cạnh AC sao cho AD=AB. Vẽ DE vuông góc với BC( E thuộc BC). Chứng minh rằng : HA=HE.

Cho tam giác ABC vuông ở B, kéo dài AC về phía C một đoạn CD=AB=1, góc CBD=30 độ. Tính AC.