50天50个前端项目 - HTML/CSS和JavaScript实战合集

news/2025/10/7 15:11:34/文章来源:https://www.cnblogs.com/qife122/p/19128523

50天50个前端项目 - HTML/CSS和JavaScript实战合集

项目概述

这是一个全面的前端项目集合,包含50个独立的Web开发项目,每个项目都专注于不同的前端技术和交互效果。从基础的DOM操作到复杂的动画实现,这个合集涵盖了现代前端开发的各个方面。

功能特性

  • 丰富的动画效果:包含3D盒子背景、旋转导航、模糊加载等多种动画
  • 实用的交互组件:进度步骤、自定义滑块、待办列表、笔记应用等
  • 响应式设计:所有项目都适配不同屏幕尺寸
  • 纯前端实现:仅使用HTML、CSS和JavaScript,无后端依赖
  • 模块化结构:每个项目独立,便于学习和复用
  • 现代API应用:包含Fetch API、Canvas绘图、本地存储等现代Web技术

安装指南

环境要求

  • 现代Web浏览器(Chrome、Firefox、Safari、Edge等)
  • 文本编辑器(VS Code、Sublime Text等)
  • 本地服务器(可选,用于某些需要HTTP协议的功能)

使用步骤

  1. 克隆或下载项目到本地
  2. 进入任意项目文件夹
  3. 用浏览器打开HTML文件即可运行
  4. 或使用本地服务器:
    # 使用Python
    python -m http.server 8000# 使用Node.js
    npx http-server
    

使用说明

基础项目示例

扩展卡片(Expanding Cards)

点击不同的卡片实现展开和收缩效果:

<div class="container"><div class="panel active" style="background-image: url('image1.jpg')"><h3>标题1</h3></div><div class="panel" style="background-image: url('image2.jpg')"><h3>标题2</h3></div>
</div>
const panels = document.querySelectorAll('.panel')panels.forEach(panel => {panel.addEventListener('click', () => {removeActiveClasses()panel.classList.add('active')})
})function removeActiveClasses() {panels.forEach(panel => {panel.classList.remove('active')})
}

进度步骤(Progress Steps)

实现多步骤表单的进度指示:

const progress = document.getElementById('progress')
const prev = document.getElementById('prev')
const next = document.getElementById('next')
const circles = document.querySelectorAll('.circle')let currentActive = 1next.addEventListener('click', () => {currentActive++if(currentActive > circles.length) {currentActive = circles.length}update()
})function update() {circles.forEach((circle, idx) => {if(idx < currentActive) {circle.classList.add('active')} else {circle.classList.remove('active')}})const actives = document.querySelectorAll('.active')progress.style.width = (actives.length - 1) / (circles.length - 1) * 100 + '%'
}

API集成项目

GitHub个人资料搜索

集成GitHub API实现用户搜索:

const APIURL = 'https://api.github.com/users/'async function getUser(username) {try {const { data } = await axios(APIURL + username)createUserCard(data)getRepos(username)} catch(err) {if(err.response.status == 404) {createErrorCard('未找到该用户名')}}
}function createUserCard(user) {const userID = user.name || user.loginconst userBio = user.bio ? `<p>${user.bio}</p>` : ''const cardHTML = `<div class="card"><div><img src="${user.avatar_url}" alt="${user.name}" class="avatar"></div><div class="user-info"><h2>${userID}</h2>${userBio}<ul><li>${user.followers} <strong>关注者</strong></li><li>${user.following} <strong>关注中</strong></li><li>${user.public_repos} <strong>仓库</strong></li></ul><div id="repos"></div></div></div>`main.innerHTML = cardHTML
}

核心代码详解

1. 动画倒计时实现

const nums = document.querySelectorAll('.nums span')
const counter = document.querySelector('.counter')
const finalMessage = document.querySelector('.final')function runAnimation() {nums.forEach((num, idx) => {const nextToLast = nums.length - 1num.addEventListener('animationend', (e) => {// 处理进入动画结束if(e.animationName === 'goIn' && idx !== nextToLast) {num.classList.remove('in')num.classList.add('out')} // 处理离开动画结束else if(e.animationName === 'goOut' && num.nextElementSibling) {num.nextElementSibling.classList.add('in')} // 所有动画完成else {counter.classList.add('hide')finalMessage.classList.add('show')}})})
}

2. 自定义范围滑块

const range = document.getElementById('range')range.addEventListener('input', (e) => {const value = +e.target.valueconst label = e.target.nextElementSibling// 获取元素宽度进行计算const range_width = getComputedStyle(e.target).getPropertyValue('width')const label_width = getComputedStyle(label).getPropertyValue('width')const num_width = +range_width.substring(0, range_width.length - 2)const num_label_width = +label_width.substring(0, label_width.length - 2)const max = +e.target.maxconst min = +e.target.min// 计算标签位置const left = value * (num_width / max) - num_label_width / 2 + scale(value, min, max, 10, -10)label.style.left = `${left}px`label.innerHTML = value
})// 数值映射函数
const scale = (num, in_min, in_max, out_min, out_max) => {return (num - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
}

3. 本地存储笔记应用

const notes = JSON.parse(localStorage.getItem('notes'))// 初始化已有笔记
if(notes) {notes.forEach(note => addNewNote(note))
}function addNewNote(text = '') {const note = document.createElement('div')note.classList.add('note')note.innerHTML = `<div class="tools"><button class="edit"><i class="fas fa-edit"></i></button><button class="delete"><i class="fas fa-trash-alt"></i></button></div><div class="main ${text ? "" : "hidden"}"></div><textarea class="${text ? "hidden" : ""}"></textarea>`// 编辑功能const editBtn = note.querySelector('.edit')editBtn.addEventListener('click', () => {main.classList.toggle('hidden')textArea.classList.toggle('hidden')})// 自动保存到本地存储textArea.addEventListener('input', (e) => {const { value } = e.targetmain.innerHTML = marked(value)updateLS()})
}function updateLS() {const notesText = document.querySelectorAll('textarea')const notes = []notesText.forEach(note => notes.push(note.value))localStorage.setItem('notes', JSON.stringify(notes))
}

4. 电影搜索应用

const API_URL = 'https://api.themoviedb.org/3/discover/movie?sort_by=popularity.desc&api_key=YOUR_API_KEY&page=1'
const IMG_PATH = 'https://image.tmdb.org/t/p/w1280'async function getMovies(url) {const res = await fetch(url)const data = await res.json()showMovies(data.results)
}function showMovies(movies) {main.innerHTML = ''movies.forEach((movie) => {const { title, poster_path, vote_average, overview } = movieconst movieEl = document.createElement('div')movieEl.classList.add('movie')movieEl.innerHTML = `<img src="${IMG_PATH + poster_path}" alt="${title}"><div class="movie-info"><h3>${title}</h3><span class="${getClassByRate(vote_average)}">${vote_average}</span></div><div class="overview"><h3>剧情简介</h3>${overview}</div>`main.appendChild(movieEl)})
}// 根据评分设置颜色
function getClassByRate(vote) {if(vote >= 8) return 'green'else if(vote >= 5) return 'orange'else return 'red'
}

这些项目展示了现代前端开发的核心技术,包括DOM操作、事件处理、API集成、动画实现和本地存储等,为前端开发者提供了宝贵的学习资源和实践参考。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

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

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

相关文章

广东省住房城乡建设厅网站商城小程序价格

当我做了一个实体类&#xff0c;字段为del_flag的逻辑删除字段&#xff0c;要通过这个字段控制数据库中的数据逻辑删除。 重写mapper中的deleteById&#xff0c; 先按id查出数据&#xff0c;在更新此数据中的del_flag字段为1&#xff0c;调用update方法更新数据。 这种方式我…

【笔记】用命令手动下载并安装 tokenizers 库.whl文件(Python 3.12+) - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【办公类-48-04】202506每月电子屏台账汇总成docx-5(问卷星下载5月范围内容,自动获取excel文件名,并转移处理) - 实践

【办公类-48-04】202506每月电子屏台账汇总成docx-5(问卷星下载5月范围内容,自动获取excel文件名,并转移处理) - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !impor…

党徽

☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░░░░…

网站开发的概要设计模板抖音服务商平台

文章目录二、安装步骤1. 创建数据库2. 修改配置文件3. 调整数据库驱动4. 修改配置中心二、 启动和验证2.1. 启动nacos2.2. 启动TC Server2.3. 启动第二个节点2.4. 验证高可用二、安装步骤 1. 创建数据库 创建名称为ry_seata的数据库,并初始化ry_seata_20210128.sql脚本 2.…

ZKEACMS:基于ASP.Net Core开发的开源免费内容管理系统

前言 哈喽,大家好!我是码农刚子,大家应该都已和床分手,去上班了吧。国庆假期在家没事,试用了一下ZKEACMS,一个可视化拖拽的内容管理系统,今天给大家介绍一下。 简介 ZKEACMS也叫纸壳CMS,是由纸壳软件自主研发的…

文件系统的层次结构

![image-20251007145304913](/Users/tusier/Library/Application Support/typora-user-images/image-20251007145304913.png)1.用户需要通过操作系统提供的结构发出上述请求--用户接口 2.由于用户提供的是文件存放路径…

oracle 19c学习笔记2

知识来自元宝oracle 19C表没有使用序列,如何获取自增列的当前值? 引用 8 篇资料作为参考在 Oracle 19c 中,如果您的表使用了 IDENTITY列(自增列),虽然它底层基于序列,但您无法像操作普通序列那样直接查询其当前…

网站优化具体做哪些事情冀州网站制作

当构建卷积神经网络时&#xff0c;我们可以使用不同的卷积操作来提取图像特征。以下是一些常见的卷积操作&#xff0c;以及它们的 PyTorch 实现&#xff1a; 标准卷积层&#xff1a;通过 nn.Conv2d 实现标准的卷积操作。 conv_standard nn.Conv2d(in_channels3, out_channel…

京东网站开发技术腾讯企点是干嘛的

近年来&#xff0c;儿童硬件市场呈现出持续爆发态势。数据显示&#xff0c;2018 年国内玩具市场零售规模约为 680亿元&#xff0c;消费需求旺盛。同时&#xff0c;在消费升级的大环境下&#xff0c;伴随新兴教育理念的崛起&#xff0c;以陪护教育机器人、儿童智能玩具为代表的新…

dw做六个页面的网站广东省建设工程合同备案网站

一、定时器基本使用 周期性的进行某种操作,PyQt5就提供了一个定时器QTimer来实现这种操作 from PyQt5.QtCore import QTimer首先需要引入QTimer模块 self.timer = QTimer(self) #初始化一个定时器 self.timer.timeout.connect(self.operate) #计时结束调用operate()方法 sel…

上海民营企业500强名单seo优化排名软件

104规约从TCP往上&#xff0c;分成链路层和应用层。 如图&#xff0c;APCI就是链路层&#xff0c;ASDU的就是应用层 我们看到报文都是68打头的&#xff0c;因为应用层报文也要交给链路层发送&#xff0c;链路层增加了开头的6个字节再进行发送。 完全用于链路层的报文每帧都只有…

详细介绍:【学习笔记】TCP 与 UDP

详细介绍:【学习笔记】TCP 与 UDPpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&…

国外个人网站域名注册开发公司预案

不要尝试爆破哟!(misc) 下载图片&#xff0c;解析图片 拿到密码&#xff0c;解压压缩包&#xff0c;生成图片 扫描二维码 留个后门(misc) D盾扫描 打开文件寻找 师姐的旅游照片(misc) 随波逐流&#xff0c;然后base64解码 修改后缀为zip&#xff0c;解压 修改高度 Fuck! (C…

中山网站建设文化流程网站登录人太多进不去怎么办

目录 C设计模式-抽象工厂&#xff08;Abstract Factory&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-抽象工厂&#xff08;Abstract Factory&#xff09; 一、意图 提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们…

一些数数杂题

数数突然发现还是按照算法记录索引方便一点,反正只需要记录想了很久或者不会做的题。 ???

AI元人文:规则与人文的统一之路

AI元人文:规则与人文的统一之路 引言:从二元对立到辩证统一 在智能时代的伦理困境中,规则与人文常常被视为不可调和的二元对立。规则代表着确定性、普遍性和约束,人文则象征着灵活性、特殊性和创造。传统AI伦理试图…

qmd 模拟赛的一道题

。原题用下面的做法可以强制在线 没注意到支配对也是可以做的。 考虑如何求区间 mex,线段树扫描 \(r\),维护 \(lst_i\) 代表 \(i\) 最后一次出现的位置,只需要线段树二分即可。在线就把扫描线变成主席树。 回到这个…

详细介绍:Apache Druid

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站app软件下载安装如何做网站推广自己的产品

本文首发于个人博客 深度挖掘 Laravel 生命周期&#xff0c;转载请注明出处。这篇文章我们来聊聊 「Laravel 生命周期」 这个主题。虽然网络上已经有很多关于这个主题的探讨&#xff0c;但这个主题依然值得我们去研究和学习。 我想说的是当我们在决定使用某项技术的时候&#x…