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

抖音网页的html代码
(图片来源网络,侵删)
  1. 顶部导航栏:包含Logo、搜索框、发布按钮和用户头像。
  2. 左侧导航栏:包含“首页”、“朋友”、“消息”等选项。
  3. 中央视频流:这是核心部分,模拟无限滚动的短视频卡片。
  4. 右侧互动栏:包含点赞、评论、分享、收藏等按钮。

这个示例将使用纯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)

这部分代码负责页面的动态行为,如生成视频卡片、处理点击事件和模拟无限滚动。

抖音网页的html代码
(图片来源网络,侵删)
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();
});

如何运行

  1. 创建文件:在你的电脑上创建三个文件,分别命名为 index.htmlstyle.cssscript.js
  2. 复制代码:将上面提供的代码分别粘贴到对应的文件中。
  3. 打开网页:用浏览器(如 Chrome, Firefox)打开 index.html 文件。

你就可以看到一个功能简化但风格高度还原的抖音网页了,你可以尝试滚动页面、点击点赞按钮来体验交互效果。

抖音网页的html代码
(图片来源网络,侵删)