Остання активність 10 months ago

這段 HTML 結合 Lit 和 Tailwind CSS,建立了一個 自訂 Web Component <product-card>,用於顯示 商品資訊卡片。它包含 商品圖片、名稱、價格、庫存狀態、尺寸選擇、購買按鈕及收藏按鈕,適用於 電商網站、購物平台或商品展示頁面,並支援 響應式設計,提供現代且直覺的購物體驗。

product_card.html Неформатований
1<!DOCTYPE html>
2<html lang="en">
3<head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <title>Product Card</title>
7 <!-- 引入 Tailwind CSS -->
8 <script src="https://cdn.tailwindcss.com"></script>
9 <!-- 引入 Lit -->
10 <script type="module" src="https://cdn.jsdelivr.net/npm/lit@2.8.0/+esm"></script>
11</head>
12<body class="bg-gray-100 flex items-center justify-center min-h-screen">
13 <!-- 使用自訂元件 -->
14 <product-card></product-card>
15
16 <script type="module">
17 import { LitElement, html, css } from 'https://cdn.jsdelivr.net/npm/lit@2.8.0/+esm';
18
19 class ProductCard extends LitElement {
20 // 禁用 Shadow DOM,讓 Tailwind CSS 生效
21 createRenderRoot() {
22 return this; // 渲染到 Light DOM
23 }
24
25 render() {
26 return html`
27 <div class="flex font-sans bg-white shadow-lg rounded-lg overflow-hidden max-w-4xl">
28 <!-- 左側圖片 -->
29 <div class="flex-none w-1/3 relative">
30 <img src="https://dummyimage.com/300x400/ccc/000&text=Product+Image" alt="Product Image" class="absolute inset-0 w-full h-full object-cover" loading="lazy" />
31 </div>
32 <!-- 右側內容 -->
33 <form class="flex-auto p-6">
34 <div class="flex flex-wrap items-center">
35 <h1 class="flex-auto text-2xl font-bold text-slate-900">
36 Modern Utility Jacket
37 </h1>
38 <div class="text-xl font-semibold text-slate-500">
39 $129.00
40 </div>
41 <div class="w-full text-sm text-green-600 mt-2">
42 In stock and ready to ship
43 </div>
44 </div>
45 <div class="flex items-baseline mt-4 mb-6 pb-6 border-b border-slate-200">
46 <div class="space-x-2 flex text-sm">
47 <!-- 尺寸選擇 -->
48 ${['XS', 'S', 'M', 'L', 'XL'].map(
49 (size) => html`
50 <label>
51 <input class="sr-only peer" name="size" type="radio" value="${size.toLowerCase()}" />
52 <div class="w-9 h-9 rounded-lg flex items-center justify-center text-slate-700 peer-checked:font-semibold peer-checked:bg-slate-900 peer-checked:text-white">
53 ${size}
54 </div>
55 </label>
56 `
57 )}
58 </div>
59 </div>
60 <!-- 行動按鈕 -->
61 <div class="flex space-x-4 mb-6 text-sm font-medium">
62 <div class="flex-auto flex space-x-4">
63 <button class="h-10 px-6 font-semibold rounded-md bg-blue-500 text-white hover:bg-blue-600" type="submit">
64 Buy now
65 </button>
66 <button class="h-10 px-6 font-semibold rounded-md border border-slate-200 text-slate-900 hover:bg-gray-100" type="button">
67 Add to bag
68 </button>
69 </div>
70 <button class="flex-none flex items-center justify-center w-10 h-10 rounded-md text-slate-300 border border-slate-200 hover:text-red-500 hover:border-red-500" type="button" aria-label="Like">
71 <svg width="24" height="24" fill="currentColor" aria-hidden="true">
72 <path fill-rule="evenodd" clip-rule="evenodd" d="M3.172 5.172a4 4 0 015.656 0L10 6.343l1.172-1.171a4 4 0 115.656 5.656L10 17.657l-6.828-6.829a4 4 0 010-5.656z" />
73 </svg>
74 </button>
75 </div>
76 <!-- 說明文字 -->
77 <p class="text-sm text-slate-700">
78 Free shipping on orders over $100.
79 </p>
80 </form>
81 </div>
82 `;
83 }
84 }
85
86 customElements.define('product-card', ProductCard);
87 </script>
88</body>
89</html>
90