Tao Trang web giong google Jamboard
- Get link
 - X
 - Other Apps
 
By
Jane Wilde
-
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:
- Vào trang quản trị Blogspot và chọn “Layout”.
 - Thêm Gadget HTML/JavaScript và dán toàn bộ mã trên vào hộp nội dung.
 - 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.
- Get link
 - X
 - Other Apps
 
Comments
Post a Comment