HTML5:从网页到富应用的跨越
全球顶级HTML5入门案例:构建高效与互动的富应用之旅
什么是富应用?富应用(Rich Application)是指那些提供丰富用户体验的应用程序,与传统的基于表单和简单交互的Web应用相比,它们在交互性、媒体内容、响应速度以及桌面应用相似的功能方面有着显著的提升。这类应用通常利用现代Web技术,如HTML5, CSS3, JavaScript, WebAssembly等,来实现流畅的动画、离线存储、拖放功能、实时通信、音频/视频处理以及硬件访问(如地理位置、摄像头、陀螺仪等)等功能。举个例子:像B站的弹幕网,就是富应用的实例,在传统页面的基础上还加了弹幕的样式。
在全球数字化浪潮中,HTML5作为网页开发的核心技术,已经从简单的网页构造进化到支持丰富多媒体内容和高度互动体验的富应用平台。接下来,让我们一起用HTML5来开发一个“富应用”式的网页;带大家一起领略HTML5打造现代Web应用的精髓。
在如上网页中,我们可以通过敲击键盘上的键来实现播放声音的效果;就如同用你的键盘击打架子鼓一般;这也是“富应用”的一种,丰富了用户对网页的体验感。
模块化与解耦:构建可维护的代码
模块化是现代前端开发的重要原则。通过将CSS按模块或组件分离,不仅提升了代码的可读性和可维护性,也便于团队协作。在HTML结构设计时,采用模块化思维,使得每个部分独立且易于复用,这同样适用于JavaScript的组织结构,确保逻辑清晰,减少不必要的依赖。
我们在写页面的时候,要有编程的素养和习惯;一般来说我们都是先写页面结构html,再写页面的样式css,最后再通过js完成页面上的交互功能。根据顺序,我们可以开始编写代码:
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Rich Web Application With HTML5</title>
</head>
<body>
<div class="keys">
<div class="key" data-key="65">
<div class="title">A</div>
<span class="sound">clap</span>
<audio data-key="65" src="./打击鼓 Cymbals (17)_爱给网_aigei_com.mp3"></audio>
</div>
<div class="key" data-key="83">
<div class="title">S</div>
<span class="sound">hihat</span>
<audio data-key="83" src="./飞溅01(Splash 01)_爱给网_aigei_com.mp3"></audio>
</div>
<div class="key" data-key="68">
<div class="title">D</div>
<span class="sound">kick</span>
<audio data-key="68" src="./打击鼓 Cymbals (17)_爱给网_aigei_com.mp3"></audio>
</div>
<div class="key" data-key="70">
<div class="title">F</div>
<span class="sound">openhat</span>
<audio data-key="70" src="./飞溅01(Splash 01)_爱给网_aigei_com.mp3"></audio>
</div>
<div class="key" data-key="71">
<div class="title">G</div>
<span class="sound">boom</span>
<audio data-key="71" src="./打击鼓 Cymbals (17)_爱给网_aigei_com.mp3"></audio>
</div>
<div class="key" data-key="72">
<div class="title">H</div>
<span class="sound">sound</span>
<audio data-key="72" src="./飞溅01(Splash 01)_爱给网_aigei_com.mp3"></audio>
</div>
<div class="key" data-key="74">
<div class="title">J</div>
<span class="sound">snare</span>
<audio data-key="74" src="./打击鼓 Cymbals (17)_爱给网_aigei_com.mp3"></audio>
</div>
<div class="key" data-key="75">
<div class="title">K</div>
<span class="sound">tom</span>
<audio data-key="75" src="./飞溅01(Splash 01)_爱给网_aigei_com.mp3"></audio>
</div>
<div class="key" data-key="76">
<div class="title">L</div>
<span class="sound">tink</span>
<audio data-key="76" src="./打击鼓 Cymbals (17)_爱给网_aigei_com.mp3"></audio>
</div>
</div>
</body>
</html>
基本架构就已经写好了:
再来看,要把内容都放到页面中间,最常用的就是弹性布局display: flex;
css
/* CSS Reset 部分 - 重置默认样式以消除浏览器之间的差异 */
html {
font-size: 10px; /* 设置基础字体大小为10px,便于其他地方使用rem单位继承字体大小 */
background: url('./img-1640794817413398d71d7ab92803953cd860a417e5c97.jpg') bottom center; /* 设置背景图片位置及平铺方式 */
background-size: cover; /* 让背景图片覆盖整个元素容器,适应不同屏幕尺寸 */
}
html, body {
height: 100%; /* 确保html和body高度占满全屏 */
}
/* 键盘布局样式 */
.keys {
display: flex; /* 使用弹性盒子布局 */
min-height: 100%; /* 确保至少占据全屏高度 */
align-items: center; /* 垂直居中对齐子元素 */
justify-content: center; /* 水平居中对齐子元素 */
}
/* 单个按键样式 */
.key {
border: 4px solid #f7c5c5; /* 边框设置 */
border-radius: 5px; /* 圆角边框 */
margin: 10px; /* 外边距,与其他按键保持距离 */
font-size: 15px; /* 字体大小 */
padding: 10px 5px; /* 内边距,上下10px,左右5px */
transition: all .7s ease; /* 过渡动画,所有属性变化0.7秒完成,效果平滑 */
width: 100px; /* 宽度固定 */
text-align: center; /* 文字居中 */
color: rgb(245, 200, 200); /* 文字颜色 */
background: rgba(248, 210, 210, 0.4); /* 背景颜色,带有透明度 */
text-shadow: 0 0 5px #000; /* 文字阴影,增强立体感 */
}
/* 按键内标题样式 */
.key .title {
font-size: 40px; /* 标题字体放大 */
}
/* 按键音效标签样式 */
.sound {
font-size: 12px; /* 字体较小 */
text-transform: uppercase; /* 文本转大写 */
letter-spacing: 1px; /* 字母间距 */
color: #f4b4b4; /* 颜色调整 */
}
/* 按键按下状态样式 */
.playing {
transform: scale(1.1); /* 放大10%模拟按键按下效果 */
border-color: #f3c5c5; /* 边框颜色变化 */
box-shadow: 0 0 5px #ebcbcb; /* 添加阴影增强效果 */
}
完成页面样式后,就能得到这样的页面了:
最后我们再来编写js代码来实现敲击键盘出现的动态效果以及发出声音的功能;
js
// 获取所有class为key的元素
const keys = document.querySelectorAll('.key');
// 遍历所有按键元素
for (let i = 0; i < keys.length; i++) {
let key = keys[i];
// 这里原本可能计划给每个按键绑定事件监听器,但实际上事件处理函数playSound是在窗口级别绑定的,因此这一步可以省略或根据具体需求进行修改
}
// 定义播放声音的函数,该函数作为键盘按键事件的处理器
const playSound = (event) => {
// 打印日志,可用来调试,实际发布时可删除
// console.log('sound');
// 获取触发事件的键盘按键的keyCode
const keyCode = event.keyCode;
// 打印按键的keyCode,便于了解哪个键被按下,实际发布时可删除
// console.log(keyCode);
// 根据keyCode查找对应的数据键(data-key)的元素
const ele = document.querySelector(`.key[data-key="${keyCode}"]`);
// 打印找到的元素,便于调试,实际发布时可删除
// console.log(ele);
// 同样根据keyCode获取对应的音频元素
const audioEle = document.querySelector(`audio[data-key="${keyCode}"]`);
// 如果找到了相应的音频元素
if (audioEle) {
// 将音频播放指针重置到开始位置,确保每次按键都是从音频开头播放
audioEle.currentTime = 0;
// 播放音频
audioEle.play();
// 如果按键元素存在
if (ele) {
// 给按键元素添加"playing"类,可能用于改变样式表示按键被按下
ele.classList.add('playing');
// 使用setTimeout在0.8秒后移除"playing"类,实现动画效果
setTimeout(() => {
ele.classList.remove('playing');
}, 800);
}
}
}
// 在窗口级别监听键盘按下事件,并在事件发生时调用playSound函数处理
window.addEventListener('keydown', playSound);
其中;const ele = document.querySelector(.key[data-key="${keyCode}"]
) 表示选择具有 data-key 属性且属性值等于 keyCode 变量值的元素
给HTML文件添加上css,js代码后,就能实现上述功能了。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Rich Web Application With HTML5</title>
<link rel="stylesheet" href="./common.css">
</head>
<body>
<div class="keys">
<div class="key" data-key="65">
<div class="title">A</div>
<span class="sound">clap</span>
<audio data-key="65" src="./打击鼓 Cymbals (17)_爱给网_aigei_com.mp3"></audio>
</div>
<div class="key" data-key="83">
<div class="title">S</div>
<span class="sound">hihat</span>
<audio data-key="83" src="./飞溅01(Splash 01)_爱给网_aigei_com.mp3"></audio>
</div>
<div class="key" data-key="68">
<div class="title">D</div>
<span class="sound">kick</span>
<audio data-key="68" src="./打击鼓 Cymbals (17)_爱给网_aigei_com.mp3"></audio>
</div>
<div class="key" data-key="70">
<div class="title">F</div>
<span class="sound">openhat</span>
<audio data-key="70" src="./飞溅01(Splash 01)_爱给网_aigei_com.mp3"></audio>
</div>
<div class="key" data-key="71">
<div class="title">G</div>
<span class="sound">boom</span>
<audio data-key="71" src="./打击鼓 Cymbals (17)_爱给网_aigei_com.mp3"></audio>
</div>
<div class="key" data-key="72">
<div class="title">H</div>
<span class="sound">sound</span>
<audio data-key="72" src="./飞溅01(Splash 01)_爱给网_aigei_com.mp3"></audio>
</div>
<div class="key" data-key="74">
<div class="title">J</div>
<span class="sound">snare</span>
<audio data-key="74" src="./打击鼓 Cymbals (17)_爱给网_aigei_com.mp3"></audio>
</div>
<div class="key" data-key="75">
<div class="title">K</div>
<span class="sound">tom</span>
<audio data-key="75" src="./飞溅01(Splash 01)_爱给网_aigei_com.mp3"></audio>
</div>
<div class="key" data-key="76">
<div class="title">L</div>
<span class="sound">tink</span>
<audio data-key="76" src="./打击鼓 Cymbals (17)_爱给网_aigei_com.mp3"></audio>
</div>
</div>
<script src="./common.js">
// 静态页面
</script>
</body>
</html>
在这里,css文件放在头部,而js代码放在尾部原因主要是:将CSS文件放置在文档头部以尽早渲染页面样式,而JavaScript脚本则置于底部,避免阻塞页面的渲染过程。每个环节节省0.1秒,对于拥有千万用户的网站而言,累积效果显著。
HTML5仿真:模拟真实世界的交互体验
HTML5仿真能力让你能够创建接近现实的用户体验,比如利用WebGL技术实现3D场景,或者通过Web Audio API创造沉浸式音频环境。这些功能不仅丰富了应用的表现力,也为游戏、教育、虚拟现实等领域打开了新的大门。HTML5入门之旅是一场关于技术创新与实践智慧的探索。通过把握“快”与“高效”的核心,注重基础,灵活运用模块化思维,以及不断探索HTML5的新特性,你将能够开发出既美观又功能强大的Web应用,满足日益增长的用户需求,成为全球顶级开发者行列中的一员。始终记得,技术的迭代永不停歇,持续学习与实践,方能在这一领域保持领先。
转载自:https://juejin.cn/post/7370244444282896410