javascript网页设计案例详细讲解

news2024/9/24 15:20:58

在这里插## 标题入图片描述

大家好,我是程序员小羊!

前言:

我们将以深入讲解一个基于JavaScript的网页设计案例。这个案例不仅涵盖了基础的DOM操作、事件处理和动画效果,还将涉及更高级的主题,如异步数据加载、表单验证、模块化设计和响应式布局。我们将构建一个具有动态内容加载和互动功能的个人博客主页。

案例背景:个人博客主页设计

本案例的目标是构建一个简单但功能齐全的个人博客主页。这个主页将包含以下功能模块:

  1. 导航栏:用于在不同的页面(主页、关于、博客文章列表)之间切换。
  2. 动态内容加载:点击导航栏中的链接时,通过异步请求加载不同的页面内容。
  3. 博客文章展示:以卡片形式展示博客文章摘要,点击标题可查看详细内容。
  4. 表单处理:包括用户留言表单的前端验证和数据提交。
  5. 响应式设计:确保网页在不同设备上都有良好的显示效果。

一、HTML结构设计

首先,我们设计基础的HTML结构,定义页面的基本框架和布局。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>My Blog</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <header>
        <nav>
            <ul>
                <li><a href="#" data-page="home">Home</a></li>
                <li><a href="#" data-page="about">About</a></li>
                <li><a href="#" data-page="blog">Blog</a></li>
                <li><a href="#" data-page="contact">Contact</a></li>
            </ul>
        </nav>
    </header>

    <main id="main-content">
        <!-- 动态内容将加载到此处 -->
    </main>

    <footer>
        <p>&copy; 2024 My Blog. All rights reserved.</p>
    </footer>

    <script src="app.js"></script>
</body>
</html>

二、CSS样式设计

接着,我们使用CSS为网页添加样式。这个样式将包括布局、字体、颜色以及响应式设计的基本配置。

body {
    font-family: Arial, sans-serif;
    margin: 0;
    padding: 0;
    background-color: #f4f4f4;
}

header {
    background-color: #333;
    color: white;
    padding: 10px 0;
    text-align: center;
}

nav ul {
    list-style: none;
    padding: 0;
}

nav ul li {
    display: inline;
    margin: 0 15px;
}

nav ul li a {
    color: white;
    text-decoration: none;
    font-size: 18px;
}

main {
    padding: 20px;
    max-width: 1200px;
    margin: 0 auto;
    background-color: white;
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}

footer {
    text-align: center;
    padding: 20px;
    background-color: #333;
    color: white;
    position: relative;
    bottom: 0;
    width: 100%;
}

/* 响应式设计 */
@media only screen and (max-width: 768px) {
    nav ul li {
        display: block;
        margin: 10px 0;
        text-align: center;
    }
}

三、JavaScript实现

在这个部分,我们将重点讲解JavaScript的实现。JavaScript将主要负责处理页面的动态内容加载、事件处理、表单验证以及异步数据交互。

1. 基础的导航和内容加载

首先,我们实现一个基础的导航功能,当用户点击导航栏中的链接时,加载不同的页面内容。

document.addEventListener('DOMContentLoaded', () => {
    const mainContent = document.getElementById('main-content');
    const navLinks = document.querySelectorAll('nav ul li a');

    // 初始化页面内容
    loadPageContent('home');

    // 监听导航链接的点击事件
    navLinks.forEach(link => {
        link.addEventListener('click', (event) => {
            event.preventDefault();
            const page = event.target.getAttribute('data-page');
            loadPageContent(page);
        });
    });

    // 根据页面名称加载内容
    function loadPageContent(page) {
        fetch(`pages/${page}.html`)
            .then(response => response.text())
            .then(data => {
                mainContent.innerHTML = data;
            })
            .catch(error => {
                mainContent.innerHTML = '<p>Sorry, the page could not be loaded.</p>';
                console.error('Error loading page:', error);
            });
    }
});

在这个代码片段中,我们使用了 fetch API 异步加载页面内容。DOMContentLoaded 事件确保在DOM加载完成后执行JavaScript代码。导航链接的点击事件被监听,并阻止默认的链接行为。通过读取 data-page 属性值,我们动态加载不同的页面内容。

2. 实现博客文章的动态展示

博客文章通常以列表或网格形式显示,每篇文章包含标题、摘要、发布日期等信息。我们将使用JavaScript来动态生成这些内容。

<!-- pages/blog.html -->
<div class="blog-container">
    <div class="blog-post">
        <h2 class="post-title">文章标题1</h2>
        <p class="post-date">发布于 2024年8月1日</p>
        <p class="post-excerpt">这是文章1的摘要内容...</p>
        <a href="#" class="read-more" data-id="1">阅读全文</a>
    </div>
    <!-- 可以添加更多文章 -->
</div>
document.addEventListener('DOMContentLoaded', () => {
    const mainContent = document.getElementById('main-content');

    // 监听“阅读全文”按钮的点击事件
    mainContent.addEventListener('click', (event) => {
        if (event.target.classList.contains('read-more')) {
            event.preventDefault();
            const postId = event.target.getAttribute('data-id');
            loadPostDetail(postId);
        }
    });

    // 加载博客文章详情
    function loadPostDetail(postId) {
        fetch(`posts/post${postId}.html`)
            .then(response => response.text())
            .then(data => {
                mainContent.innerHTML = data;
            })
            .catch(error => {
                mainContent.innerHTML = '<p>Sorry, the post could not be loaded.</p>';
                console.error('Error loading post:', error);
            });
    }
});

在这段代码中,我们为博客文章的“阅读全文”按钮添加了事件监听器。当用户点击“阅读全文”时,我们通过 fetch API 加载文章的详细内容并动态替换 main-content 中的内容。

3. 实现留言表单的验证和提交

用户可能希望通过博客页面与博主互动。我们将实现一个留言表单,并添加前端验证功能。这个表单会验证用户输入的姓名和留言内容,确保它们不为空。

<!-- pages/contact.html -->
<div class="contact-form">
    <h2>给我们留言</h2>
    <form id="contactForm">
        <label for="name">姓名:</label>
        <input type="text" id="name" name="name" required>
        
        <label for="message">留言:</label>
        <textarea id="message" name="message" required></textarea>
        
        <button type="submit">提交</button>
    </form>
    <p id="form-feedback" class="hidden"></p>
</div>
document.addEventListener('DOMContentLoaded', () => {
    const mainContent = document.getElementById('main-content');

    // 监听表单提交事件
    mainContent.addEventListener('submit', (event) => {
        if (event.target.id === 'contactForm') {
            event.preventDefault();
            handleFormSubmit(event.target);
        }
    });

    // 处理表单提交
    function handleFormSubmit(form) {
        const name = form.name.value.trim();
        const message = form.message.value.trim();
        const feedback = document.getElementById('form-feedback');

        if (name === '' || message === '') {
            feedback.textContent = '所有字段都是必填的。';
            feedback.classList.remove('hidden');
            feedback.style.color = 'red';
        } else {
            feedback.textContent = '感谢您的留言!';
            feedback.classList.remove('hidden');
            feedback.style.color = 'green';
            form.reset();  // 清空表单
        }
    }
});

在这个代码段中,我们实现了简单的表单验证。当表单提交时,JavaScript会检查输入的字段是否为空。如果有任何字段为空,则显示一条错误信息;否则,显示提交成功的信息并重置表单。

4. 响应式布局和优化

为了确保我们的博客在不同设备上都能正常显示,我们已经在CSS中添加了一些基础的响应式设计。通过使用媒体查询,我们可以调整页面布局,例如在小屏幕设备上将导航链接堆叠显示。

为了进一步优化,我们可以添加以下功能:

  1. 延迟加载图片:对于包含大量图片的页面(例如博客文章页面),可以通过延迟加载图片来提高页面加载速度和性能。
  2. 缓存内容:利用浏览器的本地存储(LocalStorage)缓存已加载的内容,减少重复请求,提高用户体验。
5. 模块化设计和代码组织

随着项目规模的扩大,代码的组织和模块化变得至关重要。我们可以将不同功能的JavaScript代码拆分成模块,便于维护和扩展。

假设我们将前面实现的功能拆分成多个模块,每个模块负责特定的功能,如导航、内容加载、表单处理等。

// modules/navigation.js
export function setupNavigation() {
    const navLinks = document.querySelectorAll('nav ul li a');

    navLinks.forEach(link => {
        link.addEventListener('click', (event) => {
            event.preventDefault();
            const page = event.target.getAttribute('data-page');
            loadPageContent(page);
        });
    });
}

export function loadPageContent(page) {
    fetch(`pages/${page}.html`)
        .then(response => response.text())
        .then(data => {
            document.getElementById('main-content').innerHTML = data;
        })
        .catch(error => {
            document.getElementById('main-content').innerHTML = '<p>Sorry, the page could not be loaded.</p>';
            console.error('Error loading page:', error);
        });
}
// modules/formHandler.js
export function setupFormHandling() {
    document.getElementById('main-content').addEventListener('submit', (event) => {
        if (event.target.id === 'contactForm') {
            event.preventDefault();
            handleFormSubmit(event.target);
        }
    });
}

function handleFormSubmit(form) {
    const name = form.name.value.trim();
    const message = form.message.value.trim();
    const feedback = document.getElementById('form-feedback');

    if (name === '' || message === '') {
        feedback.textContent = '所有字段都是必填的。';
        feedback.classList.remove('hidden');
        feedback.style.color = 'red';
    } else {
        feedback.textContent = '感谢您的留言!';
        feedback.classList.remove('hidden');
        feedback.style.color = 'green';
        form.reset();
    }
}

在最终的 app.js 中,我们可以通过 import 导入这些模块,并在 DOMContentLoaded 事件中初始化它们。

import { setupNavigation } from './modules/navigation.js';
import { setupFormHandling } from './modules/formHandler.js';

document.addEventListener('DOMContentLoaded', () => {
    setupNavigation();
    setupFormHandling();
});

通过模块化,我们可以更清晰地组织代码,使其更易于管理和扩展。

结语

在本案例中,我们使用JavaScript实现了一个功能丰富的个人博客主页。我们涵盖了从基本的DOM操作、事件处理,到高级的内容动态加载和表单验证。通过模块化设计和响应式布局,我们创建了一个易于扩展且用户体验良好的网页。希望这个案例能够帮助你更好地理解JavaScript在网页设计中的应用,并为你在实际项目中提供一些参考。

结尾

今天这篇文章就到这里了,大厦之成,非一木之材也;大海之阔,非一流之归也。感谢大家观看本文

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2090156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【动态规划】两个数组 / 字符串的dp问题(子序列、子数组问题、匹配问题、字符串问题)

文章目录 前言算法题1.最长公共子序列2.不相交的线3.不同的子序列4.通配符匹配5.正则表达式匹配6.交错字符串7.两个字符串的最小ASCII删除和8.最长重复子数组 前言 两个数组或字符串的动态规划问题通常涉及到比较和匹配元素。以下是两个常见的例子&#xff1a; 最长公共子序列…

「OC」CAlayer——巧用动画实现一个丝滑的折叠cell

「OC」CAlayer——巧用动画实现一个丝滑的折叠cell 前言 在这个暑假集训后的时间&#xff0c;都在家里做着学习笔记的整理&#xff0c;深入学习了CALayer的相关知识&#xff0c;掌握了第三方库Masonry自动布局的用法&#xff0c;以及学习了MVC的相关内容&#xff0c;正好组内…

在Postgresql中计算工单的对应的GPS轨迹距离

一、概述 在某个App开发中&#xff0c;要求记录用户的日常轨迹&#xff0c;在用户巡逻设备的时&#xff0c;将记录的轨迹点当做该设备巡逻时候的轨迹。 由于业务逻辑上没有明确的指示人员巡逻工单-GPS位置之间的关系&#xff0c;所以通过时间关系进行轨迹划定。 二、创建测试表…

Core ML

本文翻译整理自&#xff1a;Core ML : https://developer.apple.com/cn/documentation/coreml/ 文章目录 一、概览二、获取 Core ML 模型三、将 Core ML 模型集成到你的 App 中1、将模型添加到您的Xcode项目2、在代码中创建模型3、获取要传递给模型的输入值4、使用模型进行预测…

vue2踩坑记录:el-select如何绑定对象

页面上的下拉框&#xff1a; 选中人员之后&#xff0c;需要使用人员的其它信息做后续操作。所以不能只绑定用户Id&#xff0c;需要绑定整个item(用户对象)&#xff0c;这样每次change事件所获取到的newValue是整个对象&#xff0c;而且v-model中的变量指向的也是整个对象&#…

Windows bat脚本学习五(函数)

一、简介 使用bat脚本时&#xff0c;经常要使用函数&#xff0c;而函数的传参和返回值也是非常重要的&#xff0c;今天就总结一下bat中函数相关的使用方法。 二、函数 1.函数调用 :函数名 在Bat中&#xff0c;使用“:函数名”来定义一个函数。 见如下代码&#xff1a; echo o…

安装KataGo+Sabaki围棋引擎

1.由于我的用户名是中文名,修改TMP和TEMP为SystemRoot(后续修改回来) 2.加入xx.bin文件后,cmd输入katago.exe genconfig -model model.bin -output gtp_custom.cfg 3.KataGo下载完成 4.配置GUI界面

ubuntu录屏解决ubuntu下无法播放MP4格式文件的方法

参考 gnome gnome是系统自带的录屏&#xff0c;通过ctrlshiftaltr触发 保存到了视频目录下&#xff0c;webm格式文件。 screencastify 这是一个chrome扩展&#xff0c;&#xff0c;一般不推荐使用 recapp 比gnome自由一些&#xff0c;可以自由屏幕录制。但是无法修改录制…

利用流水线实现版本一键发布

目录 1. 背景2. 实现步骤3.1 前置条件3.2 更新版本号和拉出发布分支3.3 生成 diffCommit3.4 自动触发联动编译3.5 让通知更友好 3. 总结 1. 背景 通常我们发布版本时会有这样几个步骤&#xff0c;更改版本号&#xff0c;拉出 release 分支&#xff0c;生成发布包。但是博主所在…

关于ThinkPHP 5 框架开启自动搜索控制器 无法访问的问题坑

假如当前有一个登陆接口功能 因为后续会有不同版本的 登陆接口 这时候 我们可以在控制器中 新建文件夹 做区分 方便管理即 新建了一个 api 模块 文件路径是 api/controller/V1/Login 正常情况下 controller 目录下 是 控制器文件 login.php 文件&#xff0c;由于我们有多个…

地下车库电车这样充电,必须改

文 | AUTO芯球 作者 | 响铃 我是真的害怕啊 你们看&#xff0c;我住的小区&#xff0c; 都是这样子啊 一个这样子的塑料盒&#xff0c;最多一个铝板盒子&#xff0c;就给车充电了 你看看 这样的塑料电槽 就这样裸露在外面了 有些摸一下 电线都在发烫 现在我们小区内这…

【NCom】:通用负压退火方法构建超高负载单原子催化剂库

摘要&#xff1a;由高密度单原子填充的催化剂系统对于提高催化活性和选择性至关重要&#xff0c;这可以最大限度地发挥异质单原子催化剂 (SAC) 的工业前景。然而&#xff0c;实现金属含量超过 10 wt% 的高负载 SAC 仍然具有挑战性。在这里&#xff0c;我们描述了一种通用的负压…

【UCB CS61C】Lecture 4 - C Memory Management Usage

目录 C 的内存布局&#xff08;Memory Layout&#xff09;栈&#xff08;Stack&#xff09;静态数据&#xff08;Static Data&#xff09;代码&#xff08;Code&#xff09; 寻址&#xff08;Addressing&#xff09;地址&#xff08;Address&#xff09;字节序&#xff08;Endi…

电脑缺少dll文件怎么解决?Dll文件修复工具使用教程(方法合集)

众所周知&#xff0c;dll文件是计算器中的一类文件。占据了Windows操作系统的重要地位&#xff0c;主要作用就是可以让多个程序在运行时加以使用。dll文件包含了数字、文本、界面的等内容。 电脑缺少dll文件怎么解决&#xff1f;如果你启动某个程序时&#xff0c;发现电脑提示缺…

如何共享EC2 AMI给其他AWS账户

在本篇文章中&#xff0c;我们将详细介绍如何通过Amazon Web Services (AWS) 的Elastic Compute Cloud (EC2) 平台&#xff0c;将自定义AMI&#xff08;Amazon Machine Image&#xff09;共享给其他AWS账户。接下来&#xff0c;我们九河云将一步步引导您完成整个过程&#xff0…

数据驱动,智领办公!陀螺匠·企业助手 v1.7公测版发布

在数字化转型浪潮中&#xff0c;企业对办公自动化系统的需求愈加强烈&#xff0c;追求高效、灵活、智能的办公管理解决方案成为行业共识&#xff0c;我们深知&#xff0c;只有不断创新和完善&#xff0c;才能满足企业日益增长的需求。此次&#xff0c;我们带来陀螺匠企业助手 v…

【GeoScenePro】知识图谱

视频教程: ArcGIS/GeoScene知识图谱入门篇_哔哩哔哩_bilibili 所需软件: GeoScene Pro桌面端产品 Geoscene Enterprise四大组件(GeoScene_Server、GeoScene_DataStore、GeoScene_Portal、GeoScene_Web_Adaptor) 安装 【GeoScenePortal】安装和部署-CSDN博客

2024年下半年软考备考前的注意细节点

一、备考教材信息——选择官方正版&#xff08;电子、纸质都可以&#xff09; 中项 书名&#xff1a;《系统集成项目管理工程师教程》&#xff08;第三版&#xff09; 出版社&#xff1a;清华大学出版社 书籍类型&#xff1a;全国计算机技术与软件专业技术资格&#xff08;…

centos安装docker并配置加速器

docker安装与卸载&#xff1a; 1、检查当前是否安装docker yum list installed | grep docker2、卸载docker 根据yum list installed | grep docker查询出来的内容&#xff0c;逐个进行删除 yum remove docker.x86 64 -y3、启动与关闭docker 4、删除/etc/docker文件夹 如果…

少走弯路,ESP32 读取Micro SD(TF)播放mp3的坑路历程。

这个坑采的非常冤枉和巨大&#xff0c;非常大的冤枉路&#xff0c;只能一声叹息 说一下我是如何踩坑的&#xff0c;原本是打算用esp32 读取SD卡播放mp3,在esp32 读取自己打的SD卡已经踩了无数坑了&#xff0c;详情见&#xff1a; 少走弯路&#xff0c;ESP32 使用Micro SD(TF)…