核心功能设计

这个代码生成器将包含以下核心功能,让用户可以快速生成常见的网页组件代码:

HTML网页代码生成器官网
(图片来源网络,侵删)
  1. 按钮生成器: 可自定义文字、颜色、大小、边框、圆角、悬停效果。
  2. 卡片生成器: 可自定义标题、内容、图片URL、背景色、阴影、边框圆角。
  3. 导航栏生成器: 可自定义链接数量、链接文字、Logo、背景色。
  4. 表单元素生成器: 可生成包含标签、输入框、文本域、提交按钮的表单块。
  5. 实时预览: 右侧即时显示生成组件的视觉效果。
  6. 一键复制: 一键复制生成的HTML和CSS代码,方便用户使用。
  7. 代码高亮: 使用 Prism.js 美化显示的代码,提升专业感。

最终效果预览

这是一个完整的、可以直接运行的HTML文件。 您只需将下面的所有代码复制到一个 .html 文件中,然后用浏览器打开即可看到效果。


完整HTML代码

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">HTML网页代码生成器 - 快速、高效、专业的前端开发工具</title>
    <meta name="description" content="一个在线的HTML和CSS代码生成器,帮助您快速创建按钮、卡片、导航栏等常用网页组件,一键复制代码,提升开发效率。">
    <!-- Tailwind CSS for modern styling -->
    <script src="https://cdn.tailwindcss.com"></script>
    <!-- Prism.js for code syntax highlighting -->
    <link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css" rel="stylesheet" />
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-css.min.js"></script>
    <style>
        /* Custom styles for smooth transitions and better UX */
        .generator-panel {
            transition: all 0.3s ease-in-out;
        }
        .code-output pre {
            max-height: 500px;
            overflow-y: auto;
        }
        /* Hide Prism.js default line numbers */
        pre[class*="language-"].line-numbers {
            padding-left: 2.5em;
        }
        .line-numbers .line-numbers-rows {
            left: 0;
        }
    </style>
</head>
<body class="bg-gray-50 text-gray-800">
    <!-- Header -->
    <header class="bg-white shadow-sm">
        <div class="container mx-auto px-4 py-4 flex justify-between items-center">
            <div class="flex items-center space-x-2">
                <svg class="w-8 h-8 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
                    <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"></path>
                </svg>
                <h1 class="text-2xl font-bold">CodeCraft Pro</h1>
            </div>
            <nav>
                <ul class="flex space-x-6">
                    <li><a href="#generators" class="hover:text-blue-600 transition">生成器</a></li>
                    <li><a href="#about" class="hover:text-blue-600 transition">lt;/a></li>
                    <li><a href="#docs" class="hover:text-blue-600 transition">文档</a></li>
                </ul>
            </nav>
        </div>
    </header>
    <!-- Hero Section -->
    <section class="bg-gradient-to-r from-blue-500 to-indigo-600 text-white py-20">
        <div class="container mx-auto px-4 text-center">
            <h2 class="text-4xl md:text-5xl font-bold mb-4">HTML & CSS 代码生成器</h2>
            <p class="text-xl mb-8 max-w-2xl mx-auto">告别重复编码,通过直观的界面快速生成高质量的网页组件代码,专注于创意,而非繁琐。</p>
            <a href="#generators" class="bg-white text-blue-600 font-semibold px-8 py-3 rounded-lg shadow-lg hover:bg-gray-100 transition transform hover:-translate-y-1 inline-block">
                立即开始
            </a>
        </div>
    </section>
    <!-- Main Generator Section -->
    <main id="generators" class="container mx-auto px-4 py-12">
        <div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
            <!-- Control Panel -->
            <div class="bg-white rounded-xl shadow-lg p-6">
                <h3 class="text-2xl font-bold mb-6 text-center">组件控制面板</h3>
                <!-- Generator Type Selector -->
                <div class="mb-6">
                    <label class="block text-sm font-medium mb-2">选择生成器类型</label>
                    <select id="generatorType" class="w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent">
                        <option value="button">按钮</option>
                        <option value="card">卡片</option>
                        <option value="navbar">导航栏</option>
                        <option value="form">表单</option>
                    </select>
                </div>
                <!-- Dynamic Options Container -->
                <div id="optionsContainer" class="space-y-4">
                    <!-- Options will be dynamically inserted here by JavaScript -->
                </div>
                <button id="generateCode" class="w-full mt-6 bg-blue-600 text-white font-semibold py-3 rounded-lg hover:bg-blue-700 transition">
                    生成代码
                </button>
            </div>
            <!-- Preview & Code Output Panel -->
            <div class="bg-white rounded-xl shadow-lg p-6">
                <h3 class="text-2xl font-bold mb-6 text-center">预览与代码</h3>
                <!-- Live Preview -->
                <div class="mb-6">
                    <h4 class="text-lg font-semibold mb-3">实时预览</h4>
                    <div id="preview" class="border-2 border-dashed border-gray-300 rounded-lg p-8 min-h-[200px] flex items-center justify-center bg-gray-50">
                        <p class="text-gray-500">请在左侧配置并点击“生成代码”</p>
                    </div>
                </div>
                <!-- Code Output -->
                <div class="code-output">
                    <div class="flex justify-between items-center mb-3">
                        <h4 class="text-lg font-semibold">生成的代码</h4>
                        <button id="copyCodeBtn" class="text-sm bg-gray-200 hover:bg-gray-300 px-4 py-2 rounded transition flex items-center space-x-1">
                            <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
                                <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"></path>
                            </svg>
                            <span>复制代码</span>
                        </button>
                    </div>
                    <pre class="language-html"><code id="codeOutput" class="language-html">// 等待生成代码...</code></pre>
                </div>
            </div>
        </div>
    </main>
    <!-- Footer -->
    <footer class="bg-gray-800 text-white py-8 mt-16">
        <div class="container mx-auto px-4 text-center">
            <p>&copy; 2025 CodeCraft Pro. All rights reserved. Made with ❤️ for developers.</p>
        </div>
    </footer>
    <!-- Toast Notification for Copy Action -->
    <div id="toast" class="fixed bottom-4 right-4 bg-green-500 text-white px-6 py-3 rounded-lg shadow-lg transform translate-y-full transition-transform duration-300">
        代码已复制到剪贴板!
    </div>
    <script>
        // --- State Management ---
        const state = {
            generatorType: 'button',
            options: {
                button: { text: '点击我', bgColor: '#3B82F6', textColor: '#FFFFFF', padding: '12px 24px', borderRadius: '8px', hoverBgColor: '#2563EB' },
                card: { title: '卡片标题', content: '这是一张示例卡片,你可以自定义它的内容、样式和图片。', imgSrc: 'https://via.placeholder.com/400x200', bgColor: '#FFFFFF', borderRadius: '12px', shadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1)' },
                navbar: { links: ['首页', '#39;, '服务', '联系'], logoText: 'MyLogo', bgColor: '#1F2937', linkColor: '#F9FAFB' },
                form: { label: '用户名', placeholder: '请输入您的用户名', buttonText: '提交' }
            }
        };
        // --- DOM Elements ---
        const generatorTypeSelect = document.getElementById('generatorType');
        const optionsContainer = document.getElementById('optionsContainer');
        const generateCodeBtn = document.getElementById('generateCode');
        const previewDiv = document.getElementById('preview');
        const codeOutputPre = document.getElementById('codeOutput');
        const copyCodeBtn = document.getElementById('copyCodeBtn');
        const toast = document.getElementById('toast');
        // --- Event Listeners ---
        generatorTypeSelect.addEventListener('change', (e) => {
            state.generatorType = e.target.value;
            renderOptions();
        });
        generateCodeBtn.addEventListener('click', generateAndRender);
        copyCodeBtn.addEventListener('click', copyCode);
        // --- Core Functions ---
        function renderOptions() {
            const options = state.options[state.generatorType];
            optionsContainer.innerHTML = '';
            Object.keys(options).forEach(key => {
                const div = document.createElement('div');
                div.className = 'mb-4';
                let label = getOptionLabel(key);
                let input = '';
                if (typeof options[key] === 'boolean') {
                    input = `<label class="inline-flex items-center mt-3">
                                <input type="checkbox" id="${key}" class="form-checkbox h-5 w-5 text-blue-600" ${options[key] ? 'checked' : ''}>
                                <span class="ml-2 text-gray-700">${label}</span>
                            </label>`;
                } else if (key === 'links') {
                    input = `<textarea id="${key}" rows="3" class="w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500" placeholder="每行一个链接">${options[key].join('\n')}</textarea>`;
                } else {
                    input = `<input type="${key.includes('color') ? 'color' : 'text'}" id="${key}" value="${options[key]}" class="w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500">`;
                }
                div.innerHTML = `<label for="${key}" class="block text-sm font-medium mb-2">${label}</label>${input}`;
                optionsContainer.appendChild(div);
                // Add event listener to update state on input change
                const inputElement = div.querySelector(`#${key}`);
                inputElement.addEventListener('input', (e) => {
                    if (key === 'links') {
                        state.options[state.generatorType][key] = e.target.value.split('\n').filter(link => link.trim() !== '');
                    } else {
                        state.options[state.generatorType][key] = e.target.type === 'checkbox' ? e.target.checked : e.target.value;
                    }
                });
            });
        }
        function getOptionLabel(key) {
            const labels = {
                text: '按钮文字',
                bgColor: '背景颜色',
                textColor: '文字颜色',
                padding: '内边距 (e.g., 10px 20px)',
                borderRadius: '圆角 (e.g., 8px)',
                hoverBgColor: '悬停背景色',
                title: '卡片标题',
                content: '卡片内容',
                imgSrc: '图片 URL',
                shadow: '阴影 (e.g., 0 4px 6px rgba(0,0,0,0.1))',
                links: '导航链接 (每行一个)',
                logoText: 'Logo 文字',
                label: '输入框标签',
                placeholder: '输入框占位符',
                buttonText: '提交按钮文字'
            };
            return labels[key] || key;
        }
        function generateAndRender() {
            let html = '';
            let css = '';
            switch (state.generatorType) {
                case 'button':
                    const btnOpts = state.options.button;
                    html = `<button class="generated-btn">${btnOpts.text}</button>`;
                    css = `.generated-btn { background-color: ${btnOpts.bgColor}; color: ${btnOpts.textColor}; padding: ${btnOpts.padding}; border-radius: ${btnOpts.borderRadius}; border: none; cursor: pointer; font-size: 16px; transition: background-color 0.3s; } .generated-btn:hover { background-color: ${btnOpts.hoverBgColor}; }`;
                    break;
                case 'card':
                    const cardOpts = state.options.card;
                    html = `<div class="generated-card">
                                <img src="${cardOpts.imgSrc}" alt="Card Image" class="w-full h-48 object-cover rounded-t-lg">
                                <div class="p-6">
                                    <h3 class="text-xl font-bold mb-2">${cardOpts.title}</h3>
                                    <p class="text-gray-600">${cardOpts.content}</p>
                                </div>
                            </div>`;
                    css = `.generated-card { background-color: ${cardOpts.bgColor}; border-radius: ${cardOpts.borderRadius}; box-shadow: ${cardOpts.shadow}; overflow: hidden; } .generated-card img { width: 100%; height: 48px; object-fit: cover; } .generated-card h3 { margin-bottom: 0.5rem; } .generated-card p { color: #4B5563; }`;
                    break;
                case 'navbar':
                    const navOpts = state.options.navbar;
                    const linksHtml = navOpts.links.map(link => `<a href="#" class="generated-nav-link">${link}</a>`).join('');
                    html = `<nav class="generated-navbar">
                                <div class="generated-logo">${navOpts.logoText}</div>
                                <div class="generated-links">
                                    ${linksHtml}
                                </div>
                            </nav>`;
                    css = `.generated-navbar { background-color: ${navOpts.bgColor}; padding: 1rem 2rem; display: flex; justify-content: space-between; align-items: center; } .generated-logo { font-size: 1.5rem; font-weight: bold; color: white; } .generated-links { display: flex; gap: 2rem; } .generated-nav-link { color: ${navOpts.linkColor}; text-decoration: none; font-size: 1rem; transition: color 0.3s; } .generated-nav-link:hover { color: #9CA3AF; }`;
                    break;
                case 'form':
                    const formOpts = state.options.form;
                    html = `<form class="generated-form">
                                <div class="form-group">
                                    <label for="user-input">${formOpts.label}</label>
                                    <input type="text" id="user-input" placeholder="${formOpts.placeholder}">
                                </div>
                                <button type="submit" class="generated-form-btn">${formOpts.buttonText}</button>
                            </form>`;
                    css = `.generated-form { display: flex; flex-direction: column; gap: 1rem; } .form-group { display: flex; flex-direction: column; gap: 0.5rem; } .form-group label { font-weight: 600; } .form-group input { padding: 0.75rem; border: 1px solid #D1D5DB; border-radius: 0.375rem; } .generated-form-btn { padding: 0.75rem 1.5rem; background-color: #3B82F6; color: white; border: none; border-radius: 0.375rem; cursor: pointer; }`;
                    break;
            }
            // Render preview
            previewDiv.innerHTML = html;
            // Apply styles to preview
            const styleTag = document.createElement('style');
            styleTag.textContent = css;
            // Remove old style if exists
            const oldStyle = previewDiv.querySelector('style');
            if(oldStyle) previewDiv.removeChild(oldStyle);
            previewDiv.appendChild(styleTag);
            // Render code output
            const fullCode = `<!-- HTML -->\n${html}\n\n/* CSS */\n${css}`;
            codeOutputPre.textContent = fullCode;
            // Re-highlight code with Prism.js
            Prism.highlightElement(codeOutputPre);
        }
        function copyCode() {
            const codeToCopy = codeOutputPre.textContent;
            navigator.clipboard.writeText(codeToCopy).then(() => {
                // Show toast notification
                toast.classList.remove('translate-y-full');
                setTimeout(() => {
                    toast.classList.add('translate-y-full');
                }, 2000);
            }).catch(err => {
                console.error('Failed to copy text: ', err);
                // Fallback for older browsers
                const textArea = document.createElement("textarea");
                textArea.value = codeToCopy;
                document.body.appendChild(textArea);
                textArea.select();
                document.execCommand('copy');
                document.body.removeChild(textArea);
                 // Show toast notification
                 toast.classList.remove('translate-y-full');
                 setTimeout(() => {
                     toast.classList.add('translate-y-full');
                 }, 2000);
            });
        }
        // --- Initial Render ---
        renderOptions();
    </script>
</body>
</html>

如何使用和部署

  1. 复制代码: 将上面所有的代码复制下来。
  2. 创建文件: 创建一个新的文本文件,将其命名为 index.html (或任何你喜欢的 .html 结尾的文件名)。
  3. 粘贴并保存: 将复制的代码粘贴到这个新文件中,并保存文件。
  4. 打开: 用任何现代浏览器(如 Chrome, Firefox, Edge, Safari)打开这个 index.html 文件。

你就可以看到一个功能齐全、设计精美的代码生成器官网了。

技术栈和设计思路

  • HTML5 语义化标签: 使用 <header>, <main>, <footer> 等标签,使结构清晰,对搜索引擎友好。
  • Tailwind CSS: 通过 CDN 引入,快速构建响应式、现代化的用户界面,无需编写大量自定义 CSS,开发效率极高。
  • 原生 JavaScript: 没有使用任何重型框架,保证了页面的轻量和快速加载,通过 querySelectoraddEventListener 管理所有交互逻辑。
  • 状态管理: 使用一个简单的 state 对象来管理所有生成器的配置和选项,数据流向清晰。
  • 动态渲染: renderOptions 函数根据用户选择的生成器类型,动态渲染出对应的配置表单,避免了大量的 if/else 判断。
  • 用户体验:
    • 实时预览: 用户修改任何选项后,点击“生成代码”即可立即看到效果。
    • 一键复制: 使用 navigator.clipboard API 实现现代浏览器的无缝复制,并带有友好的 Toast 提示。
    • 代码高亮: 集成 Prism.js,让生成的代码在展示时更加专业、易读。
    • 响应式设计: 使用 Tailwind 的网格系统,在桌面端左右分栏,在移动端上下堆叠,适配各种屏幕尺寸。

这个项目是一个很好的范例,展示了如何结合现代前端工具链,创建一个既美观又实用的 Web 应用。

HTML网页代码生成器官网
(图片来源网络,侵删)