一、引言与项目概述

1.1 为什么企业需要官网?

在数字化时代,企业官网已成为企业的"线上门面"。无论是初创公司、个人工作室还是传统企业转型,一个专业、美观的官网都是建立品牌形象、获取客户信任的第一步。

然而,传统的官网开发往往面临以下痛点:

时间成本高
从需求分析、UI 设计、前端开发、后端开发到部署上线,整个流程可能需要数周甚至数月。对于急需上线的初创团队来说,时间就是金钱。

开发成本高
外包开发动辄上万,自己组建团队更是成本高昂。对于预算有限的中小企业和个人创业者来说,这是一笔不小的负担。

技术门槛高
需要掌握前端框架(React/Vue)、后端语言(Node.js/Python)、数据库、服务器运维等多项技术,学习曲线陡峭。

维护难度大
上线后的内容更新、功能迭代、服务器维护都需要专业技术支持,持续投入人力和成本。

1.2 本文的解决方案

本文将带你用最简单的技术栈,在 1 小时内 从零开发并上线一个功能完整、设计精美、响应式的企业官网。

技术选型:极简主义

  • 前端:纯 HTML + CSS + JavaScript(无框架依赖)
  • 后端:腾讯云 CloudBase(Serverless,无需服务器)
  • 部署:云托管(一键部署,自动运维)

为什么能这么快?

  1. 无框架:避免复杂的构建配置和学习成本
  2. Serverless:无需购买和配置服务器
  3. 组件化思维:可复用的代码模块
  4. 成熟方案:基于实战总结的最佳实践

1.3 最终效果展示

我们将实现一个包含以下功能的企业官网:

核心功能

  • ✅ 响应式设计:完美适配移动端、平板、PC
  • ✅ 单页滚动:流畅的页面导航体验
  • ✅ 轮播组件:产品图片展示
  • ✅ 动画效果:滚动触发动画,提升用户体验
  • ✅ SEO 优化:利于搜索引擎收录

页面结构

  1. 导航栏:品牌 Logo + 菜单导航
  2. 英雄区域:核心价值主张 + 行动按钮
  3. 服务展示:3个核心服务卡片
  4. 优势说明:4个核心优势
  5. 成功案例:3个案例展示(含轮播图片)
  6. 联系我们:联系人、邮箱、电话、微信
  7. 页脚:品牌信息与版权声明

技术亮点

  • 纯原生开发,0 依赖
  • 代码简洁,易于理解
  • 响应式布局,一套代码多端适配
  • 轮播组件,支持触摸滑动
  • 云托管部署,自动扩缩容

在线访问
本项目的实际运行效果:https://zhibiantong-环境ID.sh.run.tcloudbase.com

(示例项目:智编通人工智能工作室官网)


二、需求分析与设计

2.1 业务需求梳理

在开始编码之前,我们需要明确官网要解决什么问题,展示什么内容。

目标用户

  • 中小企业主:寻找 AI 解决方案
  • 个人创业者:了解服务与定价
  • 技术决策者:评估技术实力

核心目标

  • 建立品牌形象与专业度
  • 展示服务能力与成功案例
  • 提供便捷的联系方式
  • 获取潜在客户线索

功能需求

  • 清晰的服务介绍
  • 可信的案例展示
  • 响应式设计(移动端优先)
  • 快速加载(3秒内)
  • SEO 友好

2.2 页面布局设计

采用经典的单页滚动布局,用户只需滚动页面即可浏览全部内容,无需跳转。这种设计在移动端体验尤为出色。

布局结构(ASCII 艺术图)

+-------------------------------------------------------+
|  🚀 智编通人工智能工作室                              |
|  [Logo]                                               | ← 导航栏
+-------------------------------------------------------+
|                                                       |
|    "让每个好想法,都拥有一个AI智能体"                 |
|                                                       | ← 英雄区域
|    [ 查看解决方案 ]                                   |
|                                                       |
+-------------------------------------------------------+
|  🤖 我们的核心能力                                    |
|  +-------------+  +-------------+  +-------------+    |
|  |   AI智能体   |  |   知识库    |  | 定制开发    |    | ← 服务展示
|  | 定制与开发   |  | 构建与集成  |  | 与咨询      |    |
|  +-------------+  +-------------+  +-------------+    |
+-------------------------------------------------------+
|  💡 为何选择我们?                                    |
|  · 前沿技术:紧跟GPTs、Claude等最新模型              |
|  · 深度定制:不止于套壳,深入业务逻辑的解决方案      | ← 优势展示
|  · 快速交付:敏捷开发,快速验证您的AI想法            |
|  · 持续支持:上线后的维护与优化保障                  |
+-------------------------------------------------------+
|  📈 成功案例                                         |
|  [案例1轮播] [案例2轮播] [案例3轮播]                 | ← 案例展示
|  每个案例包含4张产品截图                             |
+-------------------------------------------------------+
|  📞 联系我们                                         |
|  联系人 | 邮箱 | 电话 | 微信                         | ← 联系方式
+-------------------------------------------------------+
|  © 2024 智编通人工智能工作室. 版权所有.              | ← 页脚
+-------------------------------------------------------+

2.3 技术架构设计

前端架构

frontend/
├── index.html              # 主页面(单文件)
├── css/
│   ├── style.css          # 基础样式
│   ├── responsive.css     # 响应式样式
│   └── animations.css     # 动画效果
├── js/
│   ├── main.js           # 主逻辑
│   ├── carousel.js       # 轮播组件
│   └── smooth-scroll.js  # 平滑滚动
└── assets/               # 图片资源

后端架构

  • CloudBase 云函数:处理业务逻辑
  • CloudBase 数据库:存储数据
  • CloudBase 云托管:部署前端

部署架构

  • Nginx:提供静态文件服务
  • Docker:容器化部署
  • CDN:加速访问

三、环境准备

3.1 开发工具安装

代码编辑器

推荐使用 VS Code 或 Cursor,两者都是免费且功能强大的代码编辑器。

安装建议插件(VS Code)

  • Live Server:本地预览
  • Prettier:代码格式化
  • Auto Rename Tag:HTML 标签自动重命名

命令行工具

Windows 用户推荐使用 Git Bash:

  1. 下载 Git:https://git-scm.com/
  2. 安装时选择"Git Bash Here"选项
  3. 安装完成后,在任意文件夹右键即可打开 Git Bash

Mac/Linux 用户直接使用系统终端即可。

Node.js 安装(用于安装 CloudBase CLI)

  1. 访问 https://nodejs.org/
  2. 下载 LTS 版本(长期支持版)
  3. 安装后验证:
    node --version
    npm --version
    

3.2 CloudBase 账号准备

注册腾讯云账号

  1. 访问 https://cloud.tencent.com/
  2. 点击"免费注册"
  3. 完成实名认证(企业或个人)

创建 CloudBase 环境

  1. 登录控制台:https://console.cloud.tencent.com/tcb
  2. 点击"新建环境"
  3. 填写环境信息:
    • 环境名称:如 my-website
    • 套餐版本:选择"标准版"(有免费额度)
    • 地域:选择"上海"或就近地域
  4. 点击"立即开通"
  5. 等待环境创建完成(约1-2分钟)
  6. 记录环境 ID(格式如:env-xxxxxxxx

CloudBase 免费额度

  • 云函数:100万次调用/月
  • 数据库:2GB 存储
  • 云存储:5GB 存储
  • 静态托管:5GB 流量

对于个人或小型企业官网,免费额度完全够用!

3.3 本地环境配置

安装 CloudBase CLI

# 全局安装 CloudBase CLI
npm install -g @cloudbase/cli

# 验证安装
tcb --version

登录 CloudBase

# 执行登录命令
tcb login

# 浏览器会自动打开,完成授权
# 授权成功后返回终端

验证登录状态

# 查看当前登录用户
tcb whoami

# 查看环境列表
tcb env list

看到环境列表,说明登录成功!

3.4 创建项目目录

# 创建项目根目录
mkdir my-website
cd my-website

# 创建前端目录结构
mkdir -p frontend/css
mkdir -p frontend/js
mkdir -p frontend/assets/agent
mkdir -p frontend/assets/wechat
mkdir -p frontend/assets/law

# 创建云函数目录
mkdir -p cloudfunctions/contact-submit
mkdir -p cloudfunctions/query-contacts

# 创建文档目录
mkdir doc

目录结构

my-website/
├── frontend/              # 前端代码
│   ├── index.html        # 主页面
│   ├── css/              # 样式文件
│   ├── js/               # JavaScript文件
│   └── assets/           # 图片资源
├── cloudfunctions/       # 云函数
└── doc/                  # 项目文档

3.5 配置文件准备

创建 CloudBase 配置文件

在项目根目录创建 cloudbaserc.json

{
  "envId": "your-env-id",
  "framework": {
    "name": "my-website"
  },
  "functionRoot": "cloudfunctions",
  "hosting": {
    "public": "frontend"
  }
}

记得将 your-env-id 替换为你的实际环境 ID!

创建 .gitignore 文件

node_modules/
.env
*.log
.DS_Store
frontend.zip

四、HTML 结构搭建

4.1 创建基础 HTML 模板

在 frontend/ 目录下创建 index.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>智编通人工智能工作室 - AI智能体定制开发</title>
    <meta name="description" content="专业的AI智能体开发服务,为中小企业提供定制化AI解决方案">
    <meta name="keywords" content="AI智能体,知识库,定制开发,人工智能">
    <link rel="stylesheet" href="css/style.css">
    <link rel="stylesheet" href="css/responsive.css">
    <link rel="stylesheet" href="css/animations.css">
</head>
<body>
    <!-- 内容区域 -->
</body>
</html>

关键点解析

  1. <meta name="viewport">:这是响应式设计的核心,告诉浏览器按设备宽度渲染页面
  2. description 和 keywords:有利于 SEO 优化
  3. 三个样式文件:基础样式、响应式样式、动画效果分离管理

4.2 导航栏实现

<!-- 导航栏 -->
<nav class="navbar" id="navbar">
    <div class="container">
        <div class="nav-brand">
            <span class="brand-name">智编通人工智能工作室</span>
        </div>
        <div class="nav-menu" id="navMenu">
            <a href="#home" class="nav-link">首页</a>
            <a href="#services" class="nav-link">服务</a>
            <a href="#cases" class="nav-link">案例</a>
            <a href="#about" class="nav-link">关于我们</a>
            <a href="#contact" class="nav-link">联系我们</a>
        </div>
        <div class="mobile-menu-btn" id="mobileMenuBtn">
            <span></span>
            <span></span>
            <span></span>
        </div>
    </div>
</nav>

设计要点

  • 固定定位:导航栏始终可见
  • 双菜单:桌面端横向菜单 + 移动端汉堡菜单
  • 锚点导航:使用 #id 实现平滑滚动

4.3 英雄区域

<!-- 英雄区域 -->
<section class="hero" id="home">
    <div class="container">
        <div class="hero-content fade-in-up">
            <h1>让每个好想法,都拥有一个AI智能体</h1>
            <p class="hero-subtitle">我们专注于为个体创业者和小微企业提供轻量、强大、买得起的AI智能体与知识库解决方案</p>
            <div class="hero-buttons">
                <button class="btn btn-secondary" onclick="scrollToSection('services')">查看解决方案</button>
            </div>
        </div>
    </div>
</section>

设计理念

  • 简洁有力的标题:直击用户痛点
  • 清晰的副标题:说明你提供什么价值
  • 行动按钮:引导用户继续浏览

4.4 服务展示区域

<!-- 服务展示 -->
<section class="services" id="services">
    <div class="container">
        <h2 class="section-title">🤖 我们的核心能力</h2>
        <div class="services-grid">
            <div class="service-card fade-in-up">
                <div class="service-icon">🤖</div>
                <h3>AI智能体定制与开发</h3>
                <p>基于大语言模型,构建自动化客服、销售、内容创作等虚拟助手</p>
            </div>
            <div class="service-card fade-in-up">
                <div class="service-icon">📚</div>
                <h3>知识库构建与集成</h3>
                <p>将您的文档、数据转化为AI可理解的知识,打造专属问答系统</p>
            </div>
            <div class="service-card fade-in-up">
                <div class="service-icon">⚙️</div>
                <h3>定制开发与咨询</h3>
                <p>针对特定场景开发端到端的AI解决方案,提供技术选型建议</p>
            </div>
        </div>
    </div>
</section>

布局技巧

  • Grid 布局:自动响应式,PC 端3列,移动端1列
  • 图标使用 Emoji:无需图片资源,简单高效
  • fade-in-up 类:滚动触发动画

4.5 案例展示区域(含轮播)

<!-- 成功案例 -->
<section class="cases" id="cases">
    <div class="container">
        <h2 class="section-title">📈 成功案例</h2>
        <div class="cases-grid">
            <div class="case-card fade-in-up">
                <div class="case-image">📊</div>
                <h3>电商客服智能体</h3>
                <p>为某电商平台打造智能客服,处理效率提升50%</p>
                <!-- 轮播组件 -->
                <div class="case-carousel" data-carousel="agent">
                    <div class="carousel-container">
                        <div class="carousel-images">
                            <img src="assets/agent/1.png" alt="案例1" class="carousel-img active">
                            <img src="assets/agent/2.png" alt="案例2" class="carousel-img">
                            <img src="assets/agent/3.png" alt="案例3" class="carousel-img">
                            <img src="assets/agent/4.png" alt="案例4" class="carousel-img">
                        </div>
                        <button class="carousel-btn carousel-prev" onclick="changeSlide('agent', -1)">❮</button>
                        <button class="carousel-btn carousel-next" onclick="changeSlide('agent', 1)">❯</button>
                    </div>
                    <div class="carousel-dots">
                        <span class="dot active" onclick="currentSlide('agent', 0)"></span>
                        <span class="dot" onclick="currentSlide('agent', 1)"></span>
                        <span class="dot" onclick="currentSlide('agent', 2)"></span>
                        <span class="dot" onclick="currentSlide('agent', 3)"></span>
                    </div>
                </div>
            </div>
            <!-- 其他案例卡片类似... -->
        </div>
    </div>
</section>

轮播组件结构

  • carousel-container:轮播容器
  • carousel-images:图片层叠容器
  • carousel-btn:左右切换按钮
  • carousel-dots:底部指示点

五、CSS 样式设计

5.1 基础样式(style.css)

创建 frontend/css/style.css,先写重置样式和全局配置:

/* 重置样式 */
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
    line-height: 1.6;
    color: #333;
    overflow-x: hidden;
}

/* 容器 */
.container {
    max-width: 1200px;
    margin: 0 auto;
    padding: 0 20px;
}

为什么要重置样式?

  • 不同浏览器的默认样式不一致
  • box-sizing: border-box 让宽度计算更符合直觉
  • overflow-x: hidden 防止横向滚动条

5.2 导航栏样式

/* 导航栏 */
.navbar {
    position: fixed;
    top: 0;
    width: 100%;
    background: rgba(255, 255, 255, 0.95);
    backdrop-filter: blur(10px);
    z-index: 1000;
    padding: 1rem 0;
    transition: all 0.3s ease;
}

.navbar .container {
    display: flex;
    justify-content: space-between;
    align-items: center;
}

.nav-brand .brand-name {
    font-size: 1.3rem;
    font-weight: bold;
    color: #2563eb;
}

.nav-menu {
    display: flex;
    gap: 2rem;
}

.nav-link {
    text-decoration: none;
    color: #333;
    font-weight: 500;
    transition: color 0.3s ease;
}

.nav-link:hover {
    color: #2563eb;
}

设计亮点

  • position: fixed:导航栏固定在顶部
  • backdrop-filter: blur(10px):毛玻璃效果,现代感十足
  • transition:平滑过渡动画

5.3 英雄区域样式

/* 英雄区域 */
.hero {
    min-height: 40vh;
    display: flex;
    align-items: center;
    justify-content: center;
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    color: white;
    text-align: center;
    padding-top: 60px;
    padding-bottom: 40px;
}

.hero-content h1 {
    font-size: 2.5rem;
    font-weight: bold;
    margin-bottom: 1rem;
    line-height: 1.2;
}

.hero-subtitle {
    font-size: 1.1rem;
    margin-bottom: 1.5rem;
    opacity: 0.9;
    max-width: 600px;
    margin-left: auto;
    margin-right: auto;
}

视觉技巧

  • 渐变背景:linear-gradient 创建渐变色
  • Flexbox 居中:简单高效的垂直居中
  • 相对单位:rem 随屏幕缩放

5.4 卡片组件样式

/* 服务卡片 */
.service-card {
    background: white;
    padding: 2rem;
    border-radius: 12px;
    text-align: center;
    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
    transition: all 0.3s ease;
}

.service-card:hover {
    transform: translateY(-10px);
    box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
}

.service-icon {
    font-size: 3rem;
    margin-bottom: 1rem;
}

交互设计

  • transform: translateY(-10px):悬停时上浮
  • box-shadow 变化:增强立体感
  • transition:平滑过渡

5.5 轮播组件样式

/* 轮播容器 */
.carousel-container {
    position: relative;
    width: 100%;
    max-width: 600px;
    margin: 0 auto;
    border-radius: 12px;
    overflow: hidden;
    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}

.carousel-images {
    position: relative;
    width: 100%;
    height: 400px;
}

.carousel-img {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    opacity: 0;
    transition: opacity 0.5s ease-in-out;
}

.carousel-img.active {
    opacity: 1;
}

/* 切换按钮 */
.carousel-btn {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    background: rgba(0, 0, 0, 0.5);
    color: white;
    border: none;
    padding: 8px 12px;
    cursor: pointer;
    border-radius: 50%;
    transition: background 0.3s ease;
}

.carousel-btn:hover {
    background: rgba(0, 0, 0, 0.7);
}

.carousel-prev { left: 10px; }
.carousel-next { right: 10px; }

/* 指示点 */
.carousel-dots {
    display: flex;
    justify-content: center;
    gap: 8px;
    margin-top: 12px;
}

.dot {
    width: 10px;
    height: 10px;
    border-radius: 50%;
    background: #d1d5db;
    cursor: pointer;
    transition: background 0.3s ease;
}

.dot.active {
    background: #3b82f6;
}

实现原理

  • 图片层叠:使用 position: absolute 让图片重叠
  • 透明度切换:通过 opacity 实现淡入淡出
  • 按钮定位:绝对定位在图片两侧

六、响应式设计实战

6.1 响应式设计原理

响应式设计的核心是让同一套代码在不同设备上都能完美展示。关键技术是 CSS 媒体查询(Media Queries)

设计思路:Mobile First(移动端优先)

先写移动端样式(基础样式),再通过媒体查询为大屏幕添加增强样式。这样做的好处:

  • 代码更简洁
  • 性能更好(移动端加载更少的CSS)
  • 符合现代用户习惯(移动端流量占比越来越高)

6.2 断点设计

创建 frontend/css/responsive.css

/* 响应式设计 */

/* 移动端样式 (最大宽度 768px) */
@media (max-width: 768px) {
    .container {
        padding: 0 16px;
    }
    
    /* 导航栏 - 汉堡菜单 */
    .nav-menu {
        position: fixed;
        top: 70px;
        left: -100%;
        width: 100%;
        height: calc(100vh - 70px);
        background: white;
        flex-direction: column;
        padding-top: 2rem;
        transition: left 0.3s ease;
    }
    
    .nav-menu.active {
        left: 0;
    }
    
    .mobile-menu-btn {
        display: flex;
    }
    
    /* 英雄区域 */
    .hero-content h1 {
        font-size: 1.8rem;
    }
    
    .hero-subtitle {
        font-size: 0.9rem;
    }
    
    /* 服务网格 - 单列 */
    .services-grid {
        grid-template-columns: 1fr;
    }
}

/* 平板端样式 (769px - 1024px) */
@media (min-width: 769px) and (max-width: 1024px) {
    .services-grid {
        grid-template-columns: repeat(2, 1fr);
    }
    
    .cases-grid {
        grid-template-columns: repeat(2, 1fr);
    }
}

/* PC端样式 (1025px 以上) */
@media (min-width: 1025px) {
    .hero-content h1 {
        font-size: 3.5rem;
    }
    
    .services-grid {
        grid-template-columns: repeat(3, 1fr);
    }
    
    .cases-grid {
        grid-template-columns: repeat(3, 1fr);
    }
}

/* 大屏样式 (1440px 以上) */
@media (min-width: 1440px) {
    .container {
        max-width: 1400px;
    }
    
    .hero-content h1 {
        font-size: 4rem;
    }
}

断点选择说明

  • 768px:手机与平板的分界点
  • 1024px:平板与 PC 的分界点
  • 1440px:标准 PC 与大屏的分界点

6.3 移动端导航菜单

移动端的汉堡菜单需要配合 JavaScript 实现:

CSS 部分(在 responsive.css 中)

@media (max-width: 768px) {
    .mobile-menu-btn {
        display: flex;
        flex-direction: column;
        cursor: pointer;
    }
    
    .mobile-menu-btn span {
        width: 25px;
        height: 3px;
        background: #333;
        margin: 3px 0;
        transition: 0.3s;
    }
    
    /* 菜单激活状态 */
    .mobile-menu-btn.active span:nth-child(1) {
        transform: rotate(-45deg) translate(-5px, 6px);
    }
    
    .mobile-menu-btn.active span:nth-child(2) {
        opacity: 0;
    }
    
    .mobile-menu-btn.active span:nth-child(3) {
        transform: rotate(45deg) translate(-5px, -6px);
    }
}

动画效果

  • 三条横线变成 X 形
  • 菜单从右侧滑入
  • 点击菜单项后自动关闭

6.4 响应式图片

/* 轮播图片响应式 */
@media (max-width: 768px) {
    .carousel-container {
        max-width: 500px;
        height: 360px;
    }
    
    .carousel-btn {
        padding: 6px 10px;
        font-size: 14px;
    }
}

核心技术

  • max-width:限制最大宽度
  • height:固定高度
  • object-fit: cover:保持图片比例

6.5 弹性布局

Grid 布局天然支持响应式:

/* 基础样式 - 移动端 */
.services-grid {
    display: grid;
    grid-template-columns: 1fr;  /* 1列 */
    gap: 1.5rem;
}

/* PC端 - 3列 */
@media (min-width: 1025px) {
    .services-grid {
        grid-template-columns: repeat(3, 1fr);  /* 3列 */
    }
}

自动换行

  • 移动端:每行1个卡片
  • 平板端:每行2个卡片
  • PC端:每行3个卡片

七、JavaScript 交互功能

7.1 平滑滚动实现

创建 frontend/js/smooth-scroll.js

// 平滑滚动功能
document.addEventListener('DOMContentLoaded', function() {
    // 为所有内部链接添加平滑滚动
    const links = document.querySelectorAll('a[href^="#"]');
    
    links.forEach(link => {
        link.addEventListener('click', function(e) {
            e.preventDefault();
            const targetId = this.getAttribute('href');
            const targetElement = document.querySelector(targetId);
            
            if (targetElement) {
                const offsetTop = targetElement.offsetTop - 80;
                window.scrollTo({
                    top: offsetTop,
                    behavior: 'smooth'
                });
            }
        });
    });
});

// 滚动到指定区域
function scrollToSection(sectionId) {
    const targetElement = document.getElementById(sectionId);
    if (targetElement) {
        const offsetTop = targetElement.offsetTop - 80;
        window.scrollTo({
            top: offsetTop,
            behavior: 'smooth'
        });
    }
}

实现原理

  • 监听点击事件
  • 阻止默认跳转
  • 计算目标位置(减去导航栏高度)
  • 使用 scrollTo 平滑滚动

7.2 移动端菜单切换

创建 frontend/js/main.js

document.addEventListener('DOMContentLoaded', function() {
    initMobileMenu();
    initScrollAnimations();
});

// 移动端菜单功能
function initMobileMenu() {
    const mobileMenuBtn = document.getElementById('mobileMenuBtn');
    const navMenu = document.getElementById('navMenu');
    
    if (mobileMenuBtn && navMenu) {
        mobileMenuBtn.addEventListener('click', function() {
            mobileMenuBtn.classList.toggle('active');
            navMenu.classList.toggle('active');
            
            // 防止背景滚动
            if (navMenu.classList.contains('active')) {
                document.body.style.overflow = 'hidden';
            } else {
                document.body.style.overflow = '';
            }
        });
        
        // 点击菜单项时关闭菜单
        const navLinks = navMenu.querySelectorAll('.nav-link');
        navLinks.forEach(link => {
            link.addEventListener('click', function() {
                mobileMenuBtn.classList.remove('active');
                navMenu.classList.remove('active');
                document.body.style.overflow = '';
            });
        });
    }
}

功能特性

  • 点击汉堡按钮切换菜单
  • 防止背景滚动穿透
  • 点击菜单项自动关闭

7.3 滚动动画触发

// 滚动动画功能
function initScrollAnimations() {
    const observerOptions = {
        threshold: 0.1,
        rootMargin: '0px 0px -50px 0px'
    };
    
    const observer = new IntersectionObserver(function(entries) {
        entries.forEach(entry => {
            if (entry.isIntersecting) {
                entry.target.classList.add('visible');
            }
        });
    }, observerOptions);
    
    // 观察需要动画的元素
    const animatedElements = document.querySelectorAll('.fade-in-up');
    animatedElements.forEach(el => {
        observer.observe(el);
    });
}

Intersection Observer API

  • 监测元素是否进入视口
  • 性能优于滚动事件监听
  • 自动触发动画

对应的 CSS(在 animations.css 中)

.fade-in-up {
    opacity: 0;
    transform: translateY(30px);
    transition: all 0.6s ease;
}

.fade-in-up.visible {
    opacity: 1;
    transform: translateY(0);
}

7.4 轮播组件 JavaScript

创建 frontend/js/carousel.js

// 轮播状态管理
const carouselState = {
    agent: 0,
    wechat: 0,
    law: 0
};

// 切换幻灯片
function changeSlide(carouselId, direction) {
    const carousel = document.querySelector(`[data-carousel="${carouselId}"]`);
    if (!carousel) return;
    
    const images = carousel.querySelectorAll('.carousel-img');
    const dots = carousel.querySelectorAll('.dot');
    const totalImages = images.length;
    
    // 更新当前索引
    carouselState[carouselId] += direction;
    
    // 循环处理
    if (carouselState[carouselId] >= totalImages) {
        carouselState[carouselId] = 0;
    } else if (carouselState[carouselId] < 0) {
        carouselState[carouselId] = totalImages - 1;
    }
    
    // 更新显示
    updateCarousel(carouselId, carouselState[carouselId]);
}

// 跳转到指定幻灯片
function currentSlide(carouselId, slideIndex) {
    carouselState[carouselId] = slideIndex;
    updateCarousel(carouselId, slideIndex);
}

// 更新轮播显示
function updateCarousel(carouselId, activeIndex) {
    const carousel = document.querySelector(`[data-carousel="${carouselId}"]`);
    if (!carousel) return;
    
    const images = carousel.querySelectorAll('.carousel-img');
    const dots = carousel.querySelectorAll('.dot');
    
    // 更新图片
    images.forEach((img, index) => {
        img.classList.toggle('active', index === activeIndex);
    });
    
    // 更新指示点
    dots.forEach((dot, index) => {
        dot.classList.toggle('active', index === activeIndex);
    });
}

核心逻辑

  • 状态管理:记录每个轮播的当前索引
  • 循环切换:前后无限循环
  • 同步更新:图片和指示点同步

八、轮播组件深度解析

8.1 为什么需要轮播组件

在企业官网中,案例展示是建立信任的关键。但如果每个案例都展示多张图片,页面会变得很长,影响用户体验。

轮播组件的优势

  • 节省空间:4张图片只占1张的空间
  • 交互清晰:用户主动查看感兴趣的图片
  • 移动端友好:支持触摸滑动
  • 视觉聚焦:一次只展示一张,更突出

8.2 轮播组件完整实现

HTML 结构

<div class="case-carousel" data-carousel="agent">
    <!-- 图片容器 -->
    <div class="carousel-container">
        <div class="carousel-images">
            <img src="assets/agent/1.png" class="carousel-img active">
            <img src="assets/agent/2.png" class="carousel-img">
            <img src="assets/agent/3.png" class="carousel-img">
            <img src="assets/agent/4.png" class="carousel-img">
        </div>
        <!-- 左右切换按钮 -->
        <button class="carousel-btn carousel-prev" onclick="changeSlide('agent', -1)">❮</button>
        <button class="carousel-btn carousel-next" onclick="changeSlide('agent', 1)">❯</button>
    </div>
    <!-- 底部指示点 -->
    <div class="carousel-dots">
        <span class="dot active" onclick="currentSlide('agent', 0)"></span>
        <span class="dot" onclick="currentSlide('agent', 1)"></span>
        <span class="dot" onclick="currentSlide('agent', 2)"></span>
        <span class="dot" onclick="currentSlide('agent', 3)"></span>
    </div>
</div>

设计要点

  • data-carousel="agent":标识轮播组件
  • 第一张图片添加 active 类
  • 按钮的 onclick 调用切换函数
  • 每个指示点对应一张图片

8.3 CSS 实现图片切换

关键技术:绝对定位 + 透明度

.carousel-images {
    position: relative;
    width: 100%;
    height: 400px;
}

.carousel-img {
    position: absolute;  /* 所有图片重叠 */
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;  /* 保持比例填满容器 */
    opacity: 0;         /* 默认透明 */
    transition: opacity 0.5s ease-in-out;  /* 淡入淡出效果 */
}

.carousel-img.active {
    opacity: 1;  /* 当前图片不透明 */
}

为什么这样设计?

  • 绝对定位让图片重叠在同一位置
  • 透明度切换比位移切换更流畅
  • object-fit: cover 保证图片不变形

8.4 JavaScript 状态管理

const carouselState = {
    agent: 0,    // 电商客服智能体,当前第0张
    wechat: 0,   // 智能应用小程序,当前第0张
    law: 0       // AI 法律助手,当前第0张
};

function changeSlide(carouselId, direction) {
    // 1. 更新索引
    carouselState[carouselId] += direction;
    
    // 2. 处理边界(循环)
    const totalImages = 4;
    if (carouselState[carouselId] >= totalImages) {
        carouselState[carouselId] = 0;  // 到末尾回到开头
    } else if (carouselState[carouselId] < 0) {
        carouselState[carouselId] = totalImages - 1;  // 到开头跳到末尾
    }
    
    // 3. 更新显示
    updateCarousel(carouselId, carouselState[carouselId]);
}

状态管理

  • 每个轮播独立维护索引
  • 支持无限循环
  • 边界处理逻辑清晰

8.5 触摸滑动支持

为移动端添加触摸滑动功能:

// 初始化触摸支持
document.querySelectorAll('.carousel-container').forEach(container => {
    let startX = 0;
    let endX = 0;
    
    container.addEventListener('touchstart', (e) => {
        startX = e.touches[0].clientX;
    });
    
    container.addEventListener('touchend', (e) => {
        endX = e.changedTouches[0].clientX;
        const carouselId = container.closest('[data-carousel]').getAttribute('data-carousel');
        const diff = startX - endX;
        
        if (Math.abs(diff) > 50) {  // 最小滑动距离
            if (diff > 0) {
                changeSlide(carouselId, 1);  // 向左滑,下一张
            } else {
                changeSlide(carouselId, -1);  // 向右滑,上一张
            }
        }
    });
});

交互逻辑

  • 记录触摸起点和终点
  • 计算滑动距离
  • 超过阈值才触发切换
  • 左滑下一张,右滑上一张

8.6 性能优化

图片懒加载

// 只加载可见区域的图片
const imageObserver = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
        if (entry.isIntersecting) {
            const img = entry.target;
            img.src = img.dataset.src;
            imageObserver.unobserve(img);
        }
    });
});

document.querySelectorAll('img[data-src]').forEach(img => {
    imageObserver.observe(img);
});

优化效果

  • 首屏加载更快
  • 节省流量
  • 提升用户体验

九、CloudBase 后端集成(可选)

虽然我们的官网是纯展示型,但如果后续需要添加联系表单等功能,CloudBase 提供了简单的后端支持。

9.1 CloudBase 简介

什么是 CloudBase?

CloudBase(云开发)是腾讯云提供的 Serverless 平台,无需购买和管理服务器,就能使用云函数、数据库、存储等服务。

核心优势

  • 按量付费:用多少花多少
  • 自动扩缩容:应对流量波动
  • 运维简单:无需管理服务器
  • 免费额度:个人项目够用

9.2 云函数开发

如果需要联系表单功能,创建云函数处理提交。

创建 contact-submit 云函数

在 cloudfunctions/contact-submit/ 目录下创建 index.js

const cloud = require('wx-server-sdk');
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
});

const db = cloud.database();

exports.main = async (event, context) => {
  try {
    const { name, email, phone, message } = event;
    
    // 数据验证
    if (!name || !email || !message) {
      return {
        success: false,
        error: '缺少必要字段'
      };
    }
    
    // 保存到数据库
    const result = await db.collection('contacts').add({
      data: {
        name: name.trim(),
        email: email.trim(),
        phone: phone || '',
        message: message.trim(),
        status: 'pending',
        createTime: new Date(),
        ip: context.CLIENTIP || ''
      }
    });
    
    return {
      success: true,
      data: {
        id: result._id,
        message: '提交成功'
      }
    };
    
  } catch (error) {
    console.error('提交失败:', error);
    return {
      success: false,
      error: '服务器错误'
    };
  }
};

创建 package.json

{
  "name": "contact-submit",
  "version": "1.0.0",
  "description": "联系表单提交云函数",
  "main": "index.js",
  "dependencies": {
    "wx-server-sdk": "~2.4.0"
  }
}

9.3 部署云函数

# 部署云函数
tcb fn deploy contact-submit

# 查看云函数列表
tcb fn list

# 测试调用
tcb fn invoke contact-submit

9.4 前端调用云函数

在 HTML 中引入 CloudBase SDK:

<script src="https://imgcache.qq.com/qzone/biz/qqun/qzone_act/static/js/cloudbase-js-sdk-1.3.0.min.js"></script>

JavaScript 调用:

// 初始化 CloudBase
const app = cloudbase.init({
    env: 'your-env-id'
});

// 调用云函数
async function submitForm(formData) {
    const result = await app.callFunction({
        name: 'contact-submit',
        data: formData
    });
    
    return result.result;
}

9.5 数据库设计

在 CloudBase 控制台创建 contacts 集合,用于存储咨询信息。

数据结构

{
  "_id": "自动生成",
  "name": "张三",
  "email": "zhangsan@example.com",
  "phone": "13800138000",
  "message": "咨询AI智能体开发",
  "status": "pending",
  "createTime": "2024-10-05T12:00:00.000Z",
  "ip": "192.168.1.1"
}

字段说明

  • _id:自动生成的唯一ID
  • status:处理状态(pending/processed/completed)
  • createTime:提交时间
  • ip:用户IP(用于统计和防刷)

9.6 为什么选择 CloudBase

对比传统方案

对比项 传统方案 CloudBase
服务器 需购买云服务器 无需服务器
成本 固定费用100+/月 按量付费,低至0元
运维 需要技术人员 自动运维
扩容 手动配置 自动扩缩容
学习成本 Linux、Nginx等 只需会 JavaScript

适用场景

  • 中小型企业官网
  • 个人作品展示
  • 初创公司官网
  • 活动落地页

十、部署上线

10.1 准备 Dockerfile

CloudBase 云托管使用容器化部署,需要创建 Dockerfile。

在 frontend/ 目录下创建 Dockerfile

# 使用官方 Nginx 镜像
FROM nginx:alpine

# 删除默认配置
RUN rm /etc/nginx/conf.d/default.conf

# 复制网站文件到 Nginx 目录
COPY . /usr/share/nginx/html/

# 创建 Nginx 配置
RUN echo 'server {' > /etc/nginx/conf.d/default.conf && \
    echo '    listen 80;' >> /etc/nginx/conf.d/default.conf && \
    echo '    server_name localhost;' >> /etc/nginx/conf.d/default.conf && \
    echo '    root /usr/share/nginx/html;' >> /etc/nginx/conf.d/default.conf && \
    echo '    index index.html;' >> /etc/nginx/conf.d/default.conf && \
    echo '    location / {' >> /etc/nginx/conf.d/default.conf && \
    echo '        try_files $uri $uri/ /index.html;' >> /etc/nginx/conf.d/default.conf && \
    echo '    }' >> /etc/nginx/conf.d/default.conf && \
    echo '}' >> /etc/nginx/conf.d/default.conf

# 暴露 80 端口
EXPOSE 80

# 启动 Nginx
CMD ["nginx", "-g", "daemon off;"]

Dockerfile 说明

  • 基础镜像:nginx:alpine(轻量级,仅5MB)
  • 复制文件:将前端文件复制到 Nginx 目录
  • 配置 Nginx:设置静态文件服务
  • 端口:80(HTTP 标准端口)

10.2 打包前端代码

创建部署脚本 deploy-frontend.bat(Windows):

@echo off
echo 创建部署包...
if exist "frontend.zip" del "frontend.zip"
powershell -command "Compress-Archive -Path 'frontend\*' -DestinationPath 'frontend.zip'"
echo 部署包创建完成:frontend.zip
pause

Mac/Linux 用户:

cd frontend
zip -r ../frontend.zip .

10.3 CloudBase 云托管部署

步骤1:登录控制台

  1. 访问 https://console.cloud.tencent.com/tcb
  2. 进入你的环境
  3. 左侧菜单选择"云托管"

步骤2:创建服务

  1. 点击"新建服务"
  2. 服务名称:my-website
  3. 部署类型:选择"容器型服务"

步骤3:上传代码

  1. 选择"通过本地代码部署"
  2. 代码包类型:选择"压缩包"
  3. 上传 frontend.zip

步骤4:配置参数

  • 端口:80
  • Dockerfile 名称:留空(自动识别)
  • 环境变量:不填
  • 公网访问:开启

步骤5:部署

  1. 点击"部署"
  2. 等待构建完成(约2-3分钟)
  3. 构建成功后,服务自动运行

10.4 获取访问地址

部署成功后,在服务详情页可以看到:

默认域名

https://服务名-环境ID.region.run.tcloudbase.com

例如:

https://my-website-189415.sh.run.tcloudbase.com

测试访问

  1. 复制默认域名
  2. 在浏览器中打开
  3. 测试功能是否正常

10.5 部署日志解读

部署过程会显示以下日志:

----------- 检出 ZIP 包 -----------
[检出 ZIP 包] inflating: index.html
[检出 ZIP 包] creating: css/
[检出 ZIP 包] creating: js/
[检出 ZIP 包] creating: assets/
✅ ZIP package extracted.

----------- 构建并推送 Docker 镜像 -----------
[构建] Building Docker image...
[推送] Pushing image...
✅ Image pushed successfully.

----------- 服务部署 -----------
[部署] create_eks_virtual_service : creating
[部署] check_eks_virtual_service : succ
✅ 部署成功

关键步骤

  1. 解压代码包
  2. 构建 Docker 镜像
  3. 推送到镜像仓库
  4. 创建并启动服务

10.6 自定义域名绑定(可选)

步骤

  1. 准备已备案域名
  2. 在服务详情页点击"域名管理"
  3. 添加自定义域名
  4. 配置 DNS 解析:
    • 类型:CNAME
    • 主机记录:www 或 @
    • 记录值:默认域名
  5. 申请 SSL 证书(免费)
  6. 等待生效(10分钟内)

优势

  • 品牌专业度提升
  • 用户记忆更容易
  • SEO 效果更好

十一、性能优化与最佳实践

11.1 性能优化技巧

图片优化

  1. 压缩图片

    • 使用 TinyPNG:https://tinypng.com/
    • 压缩率可达 70% 且不影响视觉效果
    • 推荐格式:WebP(比 PNG/JPG 小 30%)
  2. 响应式图片

<img src="image-small.jpg" 
     srcset="image-small.jpg 320w,
             image-medium.jpg 768w,
             image-large.jpg 1200w"
     sizes="(max-width: 768px) 100vw, 50vw"
     alt="描述">
  1. 懒加载
<img src="placeholder.jpg" data-src="actual-image.jpg" loading="lazy">

CSS 优化

  1. 压缩 CSS

  2. 关键 CSS 内联

<style>
    /* 首屏关键样式内联,加快首屏渲染 */
    .hero { min-height: 40vh; }
</style>

JavaScript 优化

  1. 延迟加载非关键脚本
<script src="js/carousel.js" defer></script>
  1. 使用事件委托
// 不好的做法
document.querySelectorAll('.dot').forEach(dot => {
    dot.addEventListener('click', handleClick);
});

// 更好的做法
document.querySelector('.carousel-dots').addEventListener('click', (e) => {
    if (e.target.classList.contains('dot')) {
        handleClick(e);
    }
});

11.2 SEO 优化

Meta 标签完善

<head>
    <!-- 基础 SEO -->
    <title>智编通人工智能工作室 - AI智能体定制开发</title>
    <meta name="description" content="专业的AI智能体开发服务">
    <meta name="keywords" content="AI智能体,知识库,定制开发">
    
    <!-- Open Graph(社交分享) -->
    <meta property="og:title" content="智编通人工智能工作室">
    <meta property="og:description" content="专业的AI智能体开发服务">
    <meta property="og:image" content="https://yourdomain.com/og-image.jpg">
    <meta property="og:url" content="https://yourdomain.com">
    
    <!-- Twitter Card -->
    <meta name="twitter:card" content="summary_large_image">
    <meta name="twitter:title" content="智编通人工智能工作室">
</head>

语义化 HTML

<!-- 使用语义化标签 -->
<header>...</header>
<nav>...</nav>
<main>
    <section>...</section>
    <article>...</article>
</main>
<footer>...</footer>

结构化数据

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "智编通人工智能工作室",
  "url": "https://yourdomain.com",
  "logo": "https://yourdomain.com/logo.png",
  "contactPoint": {
    "@type": "ContactPoint",
    "telephone": "+86-15914091461",
    "contactType": "customer service"
  }
}
</script>

11.3 用户体验优化

加载状态

/* 页面加载动画 */
.loading {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
}

.spinner {
    border: 3px solid #f3f3f3;
    border-top: 3px solid #3498db;
    border-radius: 50%;
    width: 40px;
    height: 40px;
    animation: spin 1s linear infinite;
}

@keyframes spin {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
}

错误处理

// 图片加载失败处理
document.querySelectorAll('img').forEach(img => {
    img.addEventListener('error', function() {
        this.src = 'assets/placeholder.png';  // 使用占位图
    });
});

无障碍优化

<!-- 添加 ARIA 属性 -->
<button aria-label="下一张图片" onclick="changeSlide('agent', 1)">❯</button>

<!-- 键盘导航支持 -->
<a href="#services" tabindex="0">服务</a>

11.4 安全考虑

HTTPS 强制跳转

CloudBase 云托管自动提供 HTTPS,但建议添加强制跳转:

在 Nginx 配置中添加:

if ($scheme != "https") {
    return 301 https://$host$request_uri;
}

输入验证(如有表单)

function validateEmail(email) {
    const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    return regex.test(email);
}

function validatePhone(phone) {
    const regex = /^1[3-9]\d{9}$/;
    return regex.test(phone);
}

防止 XSS

function escapeHtml(text) {
    const map = {
        '&': '&amp;',
        '<': '&lt;',
        '>': '&gt;',
        '"': '&quot;',
        "'": '&#039;'
    };
    return text.replace(/[&<>"']/g, m => map[m]);
}

十二、总结与资源

12.1 项目总结

开发时间统计

  • 环境准备:10 分钟
  • HTML 结构:15 分钟
  • CSS 样式:20 分钟
  • JavaScript 功能:10 分钟
  • 轮播组件:15 分钟
  • 部署上线:10 分钟

总计:约 80 分钟(在熟练的情况下可控制在 1 小时内)

技术亮点回顾

  1. 响应式设计

    • 一套代码,多端适配
    • Mobile First 设计思路
    • 4个断点覆盖所有设备
  2. 轮播组件

    • 原生 JavaScript 实现
    • 支持触摸滑动
    • 性能优秀
  3. Serverless 部署

    • 无需服务器管理
    • 自动扩缩容
    • 成本可控
  4. 代码质量

    • 无框架依赖
    • 代码简洁易懂
    • 易于维护和扩展

适用场景

  • ✅ 中小企业官网
  • ✅ 个人作品集
  • ✅ 产品介绍页
  • ✅ 活动落地页
  • ✅ 创业公司官网
  • ❌ 大型电商网站
  • ❌ 复杂后台系统

12.2 常见问题 FAQ

Q1:为什么不用 Vue/React?

A:对于简单的展示型官网,原生开发有以下优势:

  • 零学习成本(只需懂 HTML/CSS/JS)
  • 无构建步骤(开发即所见)
  • 体积更小(无框架代码)
  • 性能更好(无虚拟 DOM 开销)

Q2:默认域名有效期多久?

A:CloudBase 默认域名长期有效,但建议尽快绑定自定义域名,原因:

  • 默认域名不利于品牌传播
  • 自定义域名更专业
  • SEO 效果更好

Q3:如何更新网站内容?

A:修改本地文件后重新部署:

# 1. 修改代码
# 2. 重新打包
# 3. 重新部署(在云托管控制台操作)

Q4:成本预估是多少?

A:使用免费额度的情况下:

  • 小流量官网:0 元/月
  • 中等流量:10-50 元/月
  • 大流量:需按实际使用量计算

12.3 扩展方向

功能扩展

  1. 添加博客模块

    • 使用 Markdown 渲染
    • CloudBase 数据库存储文章
    • 标签分类与搜索
  2. 在线客服

    • 集成第三方客服插件
    • 使用 WebSocket 实时通信
    • AI 智能问答
  3. 数据统计

    • Google Analytics
    • 百度统计
    • CloudBase 自定义统计

技术升级

  1. 使用框架重构

    • Vue.js:渐进式框架
    • React:组件化开发
    • Next.js:SSR 支持
  2. TypeScript

    • 类型安全
    • 更好的代码提示
    • 减少运行时错误
  3. PWA 支持

    • 离线访问
    • 桌面图标
    • 推送通知

12.4 学习收获

通过这个项目,你应该掌握:

前端技能

  • ✅ 响应式设计原理与实践
  • ✅ CSS Grid 与 Flexbox 布局
  • ✅ 原生 JavaScript 操作 DOM
  • ✅ 轮播组件开发
  • ✅ 移动端触摸事件处理

后端技能

  • ✅ CloudBase Serverless 平台使用
  • ✅ 云函数开发与部署
  • ✅ 云数据库基础操作

部署技能

  • ✅ Docker 容器化部署
  • ✅ Nginx 静态文件服务
  • ✅ 云托管平台使用

软技能

  • ✅ 项目规划与需求分析
  • ✅ 技术选型能力
  • ✅ 快速原型开发

在线演示

12.7 结语

恭喜你!你已经完成了一个功能完整的企业官网,从设计到开发再到部署上线。

核心要点回顾

  1. 简单不等于简陋:原生开发也能做出专业的网站
  2. 响应式是标配:一套代码多端适配是趋势
  3. Serverless 是未来:降低成本,提升效率
  4. 实践出真知:动手做比看十遍文档更有用

下一步建议

  • 添加更多功能(表单、博客等)
  • 优化性能和 SEO
  • 绑定自定义域名
  • 持续迭代改进

如果你觉得这个教程有帮助,欢迎点赞、收藏、分享!

© 2024 智编通人工智能工作室. 本文原创,转载请注明出处。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐