我将为你提供一个功能简化但风格高度还原的抖音网页HTML代码,这个版本将包含:

(图片来源网络,侵删)
- 顶部导航栏:包含Logo、搜索框、发布按钮和用户头像。
- 左侧导航栏:包含“首页”、“朋友”、“消息”等选项。
- 中央视频流:这是核心部分,模拟无限滚动的短视频卡片。
- 右侧互动栏:包含点赞、评论、分享、收藏等按钮。
这个示例将使用纯HTML、CSS和一些基础的JavaScript来实现核心的交互效果。
最终效果预览
第一步:HTML 结构 (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>
<link rel="stylesheet" href="style.css">
<!-- 引入字体图标库,这里使用 Font Awesome -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
</head>
<body>
<div class="app-container">
<!-- 顶部导航栏 -->
<header class="top-nav">
<div class="nav-left">
<h1 class="logo">抖音</h1>
<div class="search-box">
<i class="fas fa-search"></i>
<input type="text" placeholder="搜索音乐、用户、标签">
</div>
</div>
<div class="nav-right">
<button class="upload-btn">
<i class="fas fa-plus"></i>
</button>
<div class="user-avatar">
<img src="https://via.placeholder.com/40" alt="用户头像">
</div>
</div>
</header>
<div class="main-content">
<!-- 左侧导航栏 -->
<nav class="side-nav">
<a href="#" class="nav-item active">
<i class="fas fa-home"></i>
<span>首页</span>
</a>
<a href="#" class="nav-item">
<i class="fas fa-compass"></i>
<span>朋友</span>
</a>
<a href="#" class="nav-item">
<i class="fas fa-comment"></i>
<span>消息</span>
</a>
<a href="#" class="nav-item">
<i class="fas fa-user"></i>
<span>我</span>
</a>
</nav>
<!-- 中央视频流区域 -->
<main class="video-feed" id="videoFeed">
<!-- 视频卡片将通过 JavaScript 动态生成 -->
</main>
<!-- 右侧互动栏 -->
<aside class="video-actions">
<!-- 互动按钮将通过 JavaScript 动态生成 -->
</aside>
</div>
</div>
<script src="script.js"></script>
</body>
</html>
第二步:CSS 样式 (style.css)
这部分代码负责页面的视觉呈现,包括布局、颜色、字体和动画。
/* 全局样式和变量 */
:root {
--primary-color: #FE2C55; /* 抖音红 */
--background-color: #000000; /* 黑色背景 */
--text-color: #FFFFFF; /* 白色文字 */
--secondary-text: #C7C7C7; /* 灰色辅助文字 */
--card-background: #1F1F1F; /* 卡片背景色 */
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
background-color: var(--background-color);
color: var(--text-color);
overflow-x: hidden; /* 防止水平滚动条 */
}
.app-container {
display: flex;
flex-direction: column;
height: 100vh;
}
/* 顶部导航栏 */
.top-nav {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 20px;
background-color: var(--background-color);
border-bottom: 1px solid #333;
}
.nav-left {
display: flex;
align-items: center;
gap: 20px;
}
.logo {
font-size: 24px;
font-weight: bold;
color: var(--primary-color);
}
.search-box {
display: flex;
align-items: center;
background-color: var(--card-background);
border-radius: 20px;
padding: 8px 15px;
width: 300px;
}
.search-box i {
color: var(--secondary-text);
margin-right: 10px;
}
.search-box input {
background: none;
border: none;
color: var(--text-color);
outline: none;
width: 100%;
}
.nav-right {
display: flex;
align-items: center;
gap: 15px;
}
.upload-btn {
width: 40px;
height: 40px;
border-radius: 50%;
background-color: var(--primary-color);
border: none;
color: white;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: transform 0.2s;
}
.upload-btn:hover {
transform: scale(1.1);
}
.user-avatar img {
width: 40px;
height: 40px;
border-radius: 50%;
cursor: pointer;
}
区域 */
.main-content {
display: flex;
flex: 1;
overflow: hidden;
}
/* 左侧导航栏 */
.side-nav {
width: 60px;
display: flex;
flex-direction: column;
align-items: center;
padding: 20px 0;
background-color: var(--card-background);
}
.nav-item {
display: flex;
flex-direction: column;
align-items: center;
text-decoration: none;
color: var(--secondary-text);
margin-bottom: 30px;
transition: color 0.2s;
}
.nav-item:hover, .nav-item.active {
color: var(--text-color);
}
.nav-item i {
font-size: 24px;
margin-bottom: 5px;
}
.nav-item span {
font-size: 12px;
}
/* 中央视频流 */
.video-feed {
flex: 1;
position: relative;
overflow-y: auto; /* 允许垂直滚动 */
scroll-snap-type: y mandatory; /* 实现滚动吸附效果 */
height: calc(100vh - 60px); /* 减去顶部导航栏高度 */
}
.video-card {
position: relative;
width: 100%;
height: 100%;
scroll-snap-align: start; /* 每个卡片对齐到顶部 */
background-color: var(--card-background);
}
.video-placeholder {
width: 100%;
height: 100%;
object-fit: cover; /* 使视频占满容器 */
}
/* 视频信息层 */
.video-info {
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 20px;
background: linear-gradient(to top, rgba(0,0,0,0.8), transparent);
}
.video-author {
display: flex;
align-items: center;
margin-bottom: 10px;
}
.author-avatar {
width: 40px;
height: 40px;
border-radius: 50%;
margin-right: 10px;
}
.author-name {
font-size: 14px;
font-weight: bold;
}
.video-description {
font-size: 14px;
line-height: 1.4;
}
/* 右侧互动栏 */
.video-actions {
width: 80px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 20px 0;
background-color: var(--card-background);
}
.action-btn {
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 30px;
text-decoration: none;
color: var(--text-color);
cursor: pointer;
transition: transform 0.2s;
}
.action-btn:hover {
transform: scale(1.1);
}
.action-btn i {
font-size: 32px;
margin-bottom: 8px;
}
.action-btn.liked i {
color: var(--primary-color);
}
.action-count {
font-size: 12px;
color: var(--secondary-text);
}
.music-info {
position: absolute;
bottom: 60px;
left: 20px;
right: 100px;
display: flex;
align-items: center;
}
.music-icon {
width: 24px;
height: 24px;
margin-right: 8px;
}
.music-title {
font-size: 12px;
color: white;
}
第三步:JavaScript 交互 (script.js)
这部分代码负责页面的动态行为,如生成视频卡片、处理点击事件和模拟无限滚动。

(图片来源网络,侵删)
document.addEventListener('DOMContentLoaded', () => {
// 模拟视频数据
const videoData = [
{ id: 1, author: '旅行博主', avatar: 'https://via.placeholder.com/40', likes: 12345, comments: 678, caption: '今天去了绝美的地方!#旅行 #风景', music: '背景音乐 - 梦中的婚礼' },
{ id: 2, author: '美食达人', avatar: 'https://via.placeholder.com/40', likes: 54321, comments: 234, caption: '今天做了一道超好吃的菜!#美食 #家常菜', music: '背景音乐 - 厨王争霸' },
{ id: 3, author: '搞笑日常', avatar: 'https://via.placeholder.com/40', likes: 89012, comments: 987, caption: '哈哈哈,这个也太真实了吧!#搞笑 #日常', music: '背景音乐 - 搞笑音效' },
{ id: 4, author: '健身教练', avatar: 'https://via.placeholder.com/40', likes: 23456, comments: 345, caption: '坚持打卡第30天!#健身 #自律', music: '背景音乐 - 动感单车' },
// 可以继续添加更多模拟数据
];
const videoFeed = document.getElementById('videoFeed');
const videoActions = document.querySelector('.video-actions');
// 生成单个视频卡片
function createVideoCard(video) {
const card = document.createElement('div');
card.className = 'video-card';
card.innerHTML = `
<img src="https://picsum.photos/seed/video${video.id}/720/1280.jpg" alt="视频 ${video.id}" class="video-placeholder">
<div class="video-info">
<div class="video-author">
<img src="${video.avatar}" alt="${video.author}" class="author-avatar">
<span class="author-name">${video.author}</span>
</div>
<p class="video-description">${video.caption}</p>
</div>
<div class="music-info">
<i class="fas fa-music music-icon"></i>
<span class="music-title">${video.music}</span>
</div>
`;
return card;
}
// 生成右侧互动按钮
function createActionButtons(video) {
const actionsContainer = document.createElement('div');
actionsContainer.innerHTML = `
<a href="#" class="action-btn" data-video-id="${video.id}">
<i class="far fa-heart"></i>
<span class="action-count">${formatNumber(video.likes)}</span>
</a>
<a href="#" class="action-btn">
<i class="far fa-comment"></i>
<span class="action-count">${formatNumber(video.comments)}</span>
</a>
<a href="#" class="action-btn">
<i class="fas fa-share"></i>
<span class="action-count">分享</span>
</a>
<a href="#" class="action-btn">
<i class="far fa-bookmark"></i>
<span class="action-count">收藏</span>
</a>
`;
return actionsContainer;
}
// 数字格式化 (e.g., 12345 -> 1.2w)
function formatNumber(num) {
if (num >= 10000) {
return (num / 10000).toFixed(1) + 'w';
}
return num.toString();
}
// 初始化视频流
function initializeFeed() {
videoData.forEach(video => {
const card = createVideoCard(video);
const actions = createActionButtons(video);
videoFeed.appendChild(card);
videoActions.innerHTML = ''; // 每次只显示当前视频的互动按钮
videoActions.appendChild(actions);
});
}
// 模拟无限滚动
videoFeed.addEventListener('scroll', () => {
// 当滚动到底部时,加载更多视频
if (videoFeed.scrollTop + videoFeed.clientHeight >= videoFeed.scrollHeight - 100) {
// 在实际应用中,这里会发送AJAX请求获取新数据
// 这里我们只是简单地复制现有卡片作为示例
const cards = videoFeed.querySelectorAll('.video-card');
cards.forEach(card => {
const clone = card.cloneNode(true);
videoFeed.appendChild(clone);
});
}
});
// 处理点赞按钮点击事件
videoActions.addEventListener('click', (e) => {
if (e.target.closest('.action-btn') && e.target.closest('.action-btn').querySelector('.fa-heart')) {
e.preventDefault();
const btn = e.target.closest('.action-btn');
const icon = btn.querySelector('i');
const countSpan = btn.querySelector('.action-count');
if (icon.classList.contains('far')) {
// 点赞
icon.classList.remove('far');
icon.classList.add('fas', 'liked');
// 增加点赞数
let count = parseInt(countSpan.textContent.replace('w', '')) * 10000;
count++;
countSpan.textContent = formatNumber(count);
} else {
// 取消点赞
icon.classList.remove('fas', 'liked');
icon.classList.add('far');
// 减少点赞数
let count = parseInt(countSpan.textContent.replace('w', '')) * 10000;
count--;
countSpan.textContent = formatNumber(count);
}
}
});
// 初始化页面
initializeFeed();
});
如何运行
- 创建文件:在你的电脑上创建三个文件,分别命名为
index.html、style.css和script.js。 - 复制代码:将上面提供的代码分别粘贴到对应的文件中。
- 打开网页:用浏览器(如 Chrome, Firefox)打开
index.html文件。
你就可以看到一个功能简化但风格高度还原的抖音网页了,你可以尝试滚动页面、点击点赞按钮来体验交互效果。

(图片来源网络,侵删)
