【热门主题】000028 JavaScript 网页设计案例:创新与实践
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕
目录
- 【热门主题】000028 JavaScript 网页设计案例:创新与实践
- 📚 一、JavaScript 在网页设计中的重要性
- 📘(一)增强用户体验
- 📘(二)提升交互性
- 📚二、JavaScript 网页设计基础
- 📘(一)JavaScript 基础特性
- 📘(二)常用设计模式
- 📚三、JavaScript 网页设计案例展示
- 📘(一)响应式导航栏
- 📘(二)动态数据表格
- 📘(三)待办事项列表
- 📘(四)图片画廊
- 📘(五)简易天气应用
- 📘(六)计算器应用
- 📘(七)动态时钟
- 📘(八)图片轮播
- 📘(九)计数器应用
- 📘(十)简单表单验证
- 📘(十一)模态框弹窗
- 📘(十二)动态下拉菜单
- 📘(十三)任务列表应用
- 📚四、JavaScript 网页设计高级技巧
- 📘(一)动画与过渡
- 🔖1. CSS 过渡
- 🔖2. JavaScript 动画 API
- 📘(二)组件化设计
- 🔖1. 组件的定义和优势
- 🔖2. 组件化设计的实现方法
- 📘(三)模块化 JavaScript
- 🔖1. 模块化的好处
- 🔖2. 模块化的实现方法
- 📚五、JavaScript 网页设计性能优化
- 📘(一)代码分割
- 📘(二)懒加载
- 📘(三)减少重绘与重排
- 📚六、JavaScript 网页设计的可访问性原则
- 📘(一)文字解释与结构语义
- 📘(二)键盘辅助功能
- 📘(三)对闪烁内容或时间限制敏感的用户
- 📘(四)利用辅助工具提升可访问性
- 📘(五)最佳实践与注意事项
📚📗📕📘📖🕮💡📝🗂️✍️🛠️💻🚀🎉🏗️🌐🖼️🔗📊👉🔖⚠️🌟🔐⬇️·正文开始
⬇️·🎥😊🎓📩😺🌈🤝🤖📜📋🔍✅🧰❓📄📢📈 🙋0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣🔟🆗*️⃣#️⃣
【热门主题】000028 JavaScript 网页设计案例:创新与实践
📚 一、JavaScript 在网页设计中的重要性
JavaScript 在现代网页设计中占据着至关重要的地位,它为网页带来了无限的可能性,极大地提升了用户体验和交互性。
📘(一)增强用户体验
JavaScript 能够通过各种方式增强用户体验。例如,动态下拉菜单可以让用户更方便地浏览网站内容。当用户鼠标悬停在菜单上时,子菜单会自动显示,这种交互方式使得用户操作更加便捷。此外,图片放大镜效果可以让用户更好地查看图片细节,尤其在电商网站或图片展示平台上,能够提升用户的购物体验。还有,动态图片轮播可以展示多个图片,吸引用户的注意力,增加网页的视觉吸引力。
据统计,使用了动态效果和交互功能的网页,用户停留时间平均增加了 30%。这说明 JavaScript 能够有效地提升用户在网页上的体验,让用户更愿意在网站上停留和探索。
📘(二)提升交互性
JavaScript 在实现网页与用户互动方面发挥着重要作用。表单验证就是一个很好的例子,通过 JavaScript 可以在用户提交表单之前进行前端验证,确保用户输入的数据有效。这样不仅可以减少服务器负担,还能及时给用户反馈,提高用户的操作效率。
另外,拖拽界面也是一种常见的交互方式。用户可以通过拖拽操作直观地移动界面元素,增强了用户对网页的控制感。例如,用户可以拖拽图片进行排序或者调整布局,这种交互方式让用户更加自由地定制自己的浏览体验。
总之,JavaScript 在网页设计中不可或缺,它通过增强用户体验和提升交互性,为用户带来了更加丰富和便捷的网页浏览体验。
📚二、JavaScript 网页设计基础
📘(一)JavaScript 基础特性
JavaScript 是一种解释型的脚本语言,可在程序的运行过程中逐行进行解释。它基于对象,不仅可以创建对象,也能使用现有的对象。设计简单紧凑,容易学习。具有动态性,可采用事件驱动,不需要经过 Web 服务器就能对用户的输入做出响应。同时,JavaScript 具有跨平台性,不依赖于操作系统,仅需要浏览器的支持,一个 JavaScript 脚本在编写后可以带到任意机器上使用,前提是机器上的浏览器支持 JavaScript 脚本语言。JavaScript 在网页设计中的应用范围广泛,从简单的表单验证到复杂的数据可视化,从创建动态效果到实现交互功能,都离不开 JavaScript。例如,可以用 JavaScript 实现网页上的动画效果、响应式布局、实时数据更新等。
📘(二)常用设计模式
模块模式:封装局部变量和函数,避免全局污染。在网页设计中,模块模式可以将特定功能的代码封装起来,使得代码结构更加清晰,易于维护。例如,可以将一个网页的导航栏功能封装成一个模块,只暴露必要的接口供其他部分调用。
工厂模式:创建对象的机制,隐藏创建逻辑。在网页设计中,工厂模式可以根据不同的需求创建不同类型的对象。比如,在创建网页中的图表时,可以使用工厂模式根据用户选择的图表类型创建相应的图表对象。抽象工厂模式创建具有相同主题的对象,如创建亮色和暗色控件的工厂。工厂方法定义创建对象的接口,让子类决定实例化哪个类,可扩展性强,适用于管理、维护或操作不同但具有共同特征的对象集合。
单例模式:确保一个类只有一个实例,并提供一个访问它的全局访问点。在网页设计中,单例模式有很多应用场景,如登录浮窗、全局缓存、浏览器中的某些全局对象等。单例模式可以减少不必要的对象创建,节约内存空间,同时保证访问对象的唯一性,方便控制共享对象。例如,网页中的全局 loading 遮罩框可以使用单例模式实现,确保在整个网页中只有一个 loading 遮罩框实例。
📚三、JavaScript 网页设计案例展示
📘(一)响应式导航栏
设计目标:创建一个能够适配不同屏幕尺寸的响应式导航栏,为用户提供良好的浏览体验,无论在桌面设备还是移动设备上都能轻松访问网站的各个页面。
实现步骤:
设计基础 HTML 结构,通常包括一个导航容器和多个导航链接。
使用 CSS 实现样式,设置不同屏幕尺寸下的显示效果,如在小屏幕上隐藏部分导航链接,通过特定图标触发显示。
使用 JavaScript 添加响应式行为,监听窗口大小变化事件,根据屏幕尺寸动态调整导航栏的显示方式。
代码解析:
<nav id="navbar"><ul><li><a href="#home">Home</a></li><li><a href="#services">Services</a></li><li><a href="#about">About</a></li><li><a href="#contact">Contact</a></li></ul></nav>
CSS:#navbar ul{list-style-type: none;margin: 0;padding: 0;overflow: hidden;background-color: #333;}#navbar li{float: left;}#navbar a{display: block;color: white;text-align: center;padding: 14px 16px;text-decoration: none;}/* 响应式设计 */@media screen and (max-width: 600px){#navbar li{float: none;}}
JavaScript:document.addEventListener('DOMContentLoaded',function(){var nav = document.getElementById('navbar');var navUl = nav.getElementsByTagName('ul')[0];navUl.style.display ='block';// 默认展示所有菜单项});
📘(二)动态数据表格
设计目标:创建一个能够动态显示和排序数据的表格,方便用户查看和管理数据。
实现步骤:
设计基础 HTML 结构,包括表格的表头和空的表格主体。
使用 CSS 进行样式设计,使表格美观易读。
使用 JavaScript 动态生成表格内容,并添加排序功能。
代码解析:
<table id="data-table"><thead><tr><th onclick="sortTable(0)">Name</th><th onclick="sortTable(1)">Age</th><th onclick="sortTable(2)">Country</th></tr></thead><tbody><!-- 表格数据将通过 JavaScript 动态生成 --></tbody></table>
CSS:#data-table{width: 100%;border-collapse: collapse;}#data-table th, #data-table td{border: 1px solid #ddd;padding: 8px;text-align: left;}#data-table th{background-color: #f2f2f2;cursor: pointer;}
JavaScript:function sortTable(n){var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount =0;table = document.getElementById("data-table");switching =true;// 循环直到没有需要交换的行while(switching){switching =false;rows = table.rows;// 遍历所有行(除了标题行)for(i =1; i <(rows.length -1); i++){shouldSwitch =false;x = rows[i].getElementsByTagName("TD")[n];y = rows[i +1].getElementsByTagName("TD")[n];if(n ==0){// 字符串排序if(x.innerHTML.toLowerCase()> y.innerHTML.toLowerCase()){shouldSwitch=true;break;}}else{// 数字排序if(Number(x.innerHTML)>Number(y.innerHTML)){shouldSwitch =true;break;}}}if(shouldSwitch){rows[i].parentNode.insertBefore(rows[i +1], rows[i]);switching =true;switchcount ++;}else{if(switchcount ==0&& dir ==\"asc\"){dir =\"desc\";switching =true;}}}}
📘(三)待办事项列表
功能实现:待办事项列表通常包括添加、标记完成和删除待办事项等功能。
添加待办事项:用户通过输入框输入新任务,点击按钮提交,将任务信息添加到列表中。
标记完成:用户可以点击任务旁边的复选框,将任务标记为已完成,通常会以不同的样式显示已完成的任务。
删除待办事项:用户可以点击任务旁边的删除按钮,将特定任务从列表中移除。
代码示例:
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>待办事项列表</title><link rel="stylesheet" href="styles.css"></head><body><div id="todo-app"><input type="text" id="new-todo" placeholder="添加新任务..."/><button id="add-todo">添加</button></div><script src="app.js"></script></body></html>
CSS 和 JavaScript:在 CSS 中设置输入框、按钮和列表的样式,使其美观易用。在 JavaScript 中,使用事件监听器监听用户的输入和提交动作,验证用户输入的内容,将验证通过的任务信息添加到本地存储的数据结构中,并更新用户界面以显示新添加的任务。同时,实现标记完成和删除任务的功能逻辑。
📘(四)图片画廊
功能描述:图片画廊是一个展示图片的网页应用,通常具有点击放大图片的效果,以及导航按钮可以切换不同的图片。
代码示例:
<div id="imgBox"><h1>Snapshots</h1><ul id="gallery"><li><a href="./images/boat.jpg" title="A boat with a tiger.">Boat</a></li><li><a href="./images/cat.jpg" title="A cute cat.">Cat</a></li><li><a href="./images/violin.jpg" title="A pretty violin.">Violin</a></li><li><a href="./images/night.jpg" title="Beautiful night in la-la-land.">Night</a></li><li><a href="./images/spiderman.jpg" title="Spiderman!!!">Spiderman</a></li><li><a href="./images/Taylor.jpg" title="Pop-singer Taylor Swift.">Night</a></li></ul><img src="./images/gallery.png" id="placeholder"><p id="description">Choose an image.</p></div>
JavaScript:window.οnlοad=function(){prepareGallery();}function prepareGallery(){var gallery = document.getElementById("gallery");var links = gallery.getElementsByTagName("a");for(let j =0; j < links.length;++ j){links[j].οnclick=function(){showPic(this);return false;}}}function showPic(whichpic){var placeholder = document.getElementById("placeholder");// placeholder.src = whichpic.href;placeholder.setAttribute("src", whichpic.href);var description = document.getElementById("description");description.firstChild.nodeValue = whichpic.title;}
CSS:body{background-color: lightgray;}div#imgBox{width: 600px;margin:0 auto;}img#placeholder{height: 300px;}ul{margin: 0;padding: 0;list-style-type: none;}ul>li{float: left;}ul a{text-decoration: none;display: block;background-color:rgb(0, 0, 0);color: white;padding: 10px 21.7px;transition-property: background-color;transition-duration: 0.5s;}ul a:hover{background-color:rgb(90, 90, 90);}ul::after{content:"";clear: both;display: block;}div#imgBox p{font-weight: bold;}
📘(五)简易天气应用
功能和实现方法:简易天气应用通过 API 获取并显示实时天气数据,为用户提供当前位置或特定城市的天气信息。
功能包括显示城市名称、天气状况、温度、湿度等。
实现方法通常是使用 JavaScript 的 Fetch API 向天气 API 发送请求,获取数据后,使用 DOM 操作将数据渲染到网页上的特定元素中。
代码示例:
HTML:<!DOCTYPE html><html><head><title>天气应用</title></head><body><h1>天气应用</h1><form id="weatherForm"><label for="city">输入城市名称:</label><input type="text" id="city" required><button type="submit">查询天气</button></form><div id="weatherInfo"></div><script src="app.js"></script></body></html>
JavaScript:
document.getElementById('weatherForm').addEventListener('submit', function(event) {event.preventDefault(); // 阻止表单的默认提交行为const cityInput = document.getElementById('city');const city = cityInput.value.trim(); // 获取输入的城市名称并去除首尾空格if (city === '') {alert('请输入有效的城市名称!'); // 如果城市名称无效,则显示警告信息return;}// 查询天气信息fetch(https://api.openweathermap.org/data/2.5/weather?q= {data.name}天气: {data.main.temp}°C湿度:${data.main.humidity}%; // 更新天气信息的内容}).catch(error => {console.error('查询天气信息失败:', error); // 如果查询失败,则显示错误信息});});
📘(六)计算器应用
功能:简单计算器可以进行基本的数学运算,如加、减、乘、除等。
JavaScript 实现代码:
HTML:
<div id="calculator"><input type="text" id="display" readonly><button id="add">+</button><button id="subtract">-</button><button id="multiply">*</button><button id="divide">/</button><button id="equals">=</button><button id="clear">C</button></div>
JavaScript:
var display = document.getElementById('display');var num1 = '';var num2 = '';var operator = '';document.getElementById('add').addEventListener('click', function() {operator = '+';num1 = display.value;display.value = '';});document.getElementById('subtract').addEventListener('click', function() {operator = '-';num1 = display.value;display.value = '';});document.getElementById('multiply').addEventListener('click', function() {operator = '*';num1 = display.value;display.value = '';});document.getElementById('divide').addEventListener('click', function() {operator = '/';num1 = display.value;display.value = '';});document.getElementById('equals').addEventListener('click', function() {num2 = display.value;var result = 0;switch(operator) {case '+':result = parseFloat(num1) + parseFloat(num2);break;case '-':result = parseFloat(num1) - parseFloat(num2);break;case '*':result = parseFloat(num1) * parseFloat(num2);break;case '/':result = parseFloat(num1) / parseFloat(num2);break;}display.value = result;});document.getElementById('clear').addEventListener('click', function() {display.value = '';num1 = '';num2 = '';operator = '';});
📘(七)动态时钟
实现原理:动态时钟通过 JavaScript 定时更新页面上显示时间的元素,实现每秒更新时间的效果。
代码:
HTML:
JavaScript:function updateClock() {var now = new Date();var hours = now.getHours();var minutes = now.getMinutes();var seconds = now.getSeconds();hours = (hours < 10? “0” : “”) + hours;minutes = (minutes < 10? “0” : “”) + minutes;seconds = (seconds < 10? “0” : “”) + seconds;var timeString = hours + “:” + minutes + “:” + seconds;document.getElementById(‘clock’).innerHTML = timeString;setTimeout(updateClock, 1000);}updateClock();
📘(八)图片轮播
实现方式和代码:图片轮播通常使用 JavaScript 控制一组图片的显示和切换。用户可以点击按钮查看下一张或上一张图片。
HTML:
<div id="imageCarousel"><img src="./images/image1.jpg" alt="Image 1"><img src="./images/image2.jpg" alt="Image 2"><img src="./images/image3.jpg" alt="Image 3"><button id="prevButton">Previous</button><button id="nextButton">Next</button></div>
JavaScript:var images = document.querySelectorAll('#imageCarousel img');var currentImageIndex = 0;function showImage(index) {for (var i = 0; i < images.length; i++) {images[i].style.display = 'none';}images[index].style.display = 'block';}document.getElementById('prevButton').addEventListener('click', function() {currentImageIndex--;if (currentImageIndex < 0) {currentImageIndex = images.length - 1;}showImage(currentImageIndex);});document.getElementById('nextButton').addEventListener('click', function() {currentImageIndex++;if (currentImageIndex >= images.length) {currentImageIndex = 0;}showImage(currentImageIndex);});showImage(currentImageIndex);
📘(九)计数器应用
功能:计数器应用允许用户点击按钮增加、减少或重置计数值。
代码示例:
HTML:
<div id="counter"><button id="increase">+</button><span id="count">0</span><button id="decrease">-</button><button id="reset">Reset</button></div>
JavaScript:var count = 0;document.getElementById('increase').addEventListener('click', function() {count++;document.getElementById('count').innerHTML = count;});document.getElementById('decrease').addEventListener('click', function() {count--;document.getElementById('count').innerHTML = count;});document.getElementById('reset').addEventListener('click', function() {count = 0;document.getElementById('count').innerHTML = count;});
📘(十)简单表单验证
实现过程:表单验证确保用户输入数据格式符合要求,例如检查邮箱格式、密码长度等。
HTML:
<form id="myForm"><input type="email" id="emailInput" required><input type="password" id="passwordInput" required><button type="submit">Submit</button></form>
JavaScript:
document.getElementById('myForm').addEventListener('submit', function(event) {var emailInput = document.getElementById('emailInput');var passwordInput = document.getElementById('passwordInput');var emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;if (!emailRegex.test(emailInput.value)) {alert('Please enter a valid email address.');event.preventDefault();}if (passwordInput.value.length < 8) {alert('Password must be at least 8 characters long.');event.preventDefault();}});
📘(十一)模态框弹窗
功能和实现代码:模态框弹窗可以在用户点击按钮时弹出,显示特定的内容或表单。用户可以点击关闭按钮或背景来隐藏模态框。
HTML:
<button id="openModal">Open Modal</button><div id="modal" class="modal"><div class="modal-content"><span class="close">×</span><p>This is a modal window.</p></div></div>
JavaScript:
var modal = document.getElementById('modal');var openModalButton = document.getElementById('openModal');var closeButton = document.querySelector('.close');openModalButton.addEventListener('click', function() {modal.style.display = 'block';});closeButton.addEventListener('click', function() {modal.style.display = 'none';});window.addEventListener('click', function(event) {if (event.target == modal) {modal.style.display = 'none';}});
📘(十二)动态下拉菜单
效果和实现方法:动态下拉菜单在用户鼠标悬停或点击特定元素时显示,提供更多选项。提升网页导航体验,使页面更加简洁和易于使用。
HTML:
<div class="dropdown"><button class="dropbtn">Dropdown</button><div class="dropdown-content"><a href="#">Link 1</a><a href="#">Link 2</a><a href="#">Link 3</a></div></div>
JavaScript:
var dropdown = document.querySelector('.dropdown');var dropbtn = dropdown.querySelector('.dropbtn');var dropdownContent = dropdown.querySelector('.dropdown-content');dropbtn.addEventListener('click', function() {dropdownContent.style.display = dropdownContent.style.display === 'block'? 'none' : 'block';});dropdown.addEventListener('mouseleave', function() {dropdownContent.style.display = 'none';});
📘(十三)任务列表应用
功能:任务列表网页应用允许用户添加、删除、标记任务为完成,并可以清空已完成任务。
添加任务:用户输入任务描述,点击添加按钮将任务添加到列表中。
删除任务:用户可以点击任务旁边的删除按钮,将任务从列表中移除。
标记任务为完成:用户可以点击任务旁边的复选框,将任务标记为已完成,通常会以不同的样式显示已完成的任务。
清空已完成任务:用户可以点击一个按钮,清空所有已完成的任务。
代码示例:
HTML:
<div id="taskListApp"><input type="text" id="newTaskInput" placeholder="Add a new task..."><button id="addTaskButton">Add Task</button><ul id="taskList"></ul><button id="clearCompletedTasks">Clear Completed Tasks</button></div>
JavaScript:`
var taskList = document.getElementById('taskList');var newTaskInput = document.getElementById('newTaskInput');var addTaskButton = document.getElementById('addTaskButton');var clearCompletedTasks
📚四、JavaScript 网页设计高级技巧
📘(一)动画与过渡
CSS 过渡和 JavaScript 动画 API 为网页设计带来了生动的动画效果,极大地提升了用户体验。
🔖1. CSS 过渡
CSS 过渡可以在元素的属性发生变化时,实现平滑的过渡效果。例如,可以使用 CSS 过渡来实现按钮的悬停效果,当鼠标悬停在按钮上时,按钮的颜色、大小或阴影等属性可以逐渐变化,给用户一种自然的反馈。以下是一个简单的 CSS 过渡示例:
.button {
background-color: blue;
transition: background-color 0.5s ease;
}
.button:hover {
background-color: green;
}
在这个例子中,当鼠标悬停在按钮上时,按钮的背景颜色会在 0.5 秒内从蓝色平滑过渡到绿色。
🔖2. JavaScript 动画 API
JavaScript 动画 API 提供了更强大的动画控制能力。可以使用requestAnimationFrame函数来实现复杂的动画效果。例如,可以创建一个动画,使一个元素在页面上移动。以下是一个使用 JavaScript 动画 API 的示例:
const element = document.getElementById('animated-element');
let position = 0;
function animate() {
position++;
element.style.left = position + 'px';
requestAnimationFrame(animate);
}
requestAnimationFrame(animate);
在这个例子中,一个元素会不断地向右移动,直到页面被关闭或动画被停止。
📘(二)组件化设计
组件化设计是现代网页开发的重要理念之一,它将复杂的用户界面分解为可重用的组件,提高了代码的可维护性和可扩展性。
🔖1. 组件的定义和优势
组件是一个独立的、可重用的代码单元,它包含了特定的功能和样式。通过组件化设计,可以将网页拆分成多个小的组件,每个组件负责特定的任务,例如导航栏、侧边栏、内容区域等。这样做的好处有很多,例如:
提高代码复用性:可以在不同的页面或项目中重复使用相同的组件,减少了代码的重复编写。
易于维护:每个组件都是独立的,可以单独进行维护和修改,不会影响其他部分的代码。
提高开发效率:开发人员可以专注于单个组件的开发,提高了开发效率。
🔖2. 组件化设计的实现方法
在 JavaScript 中,可以使用面向对象编程的方法来实现组件化设计。例如,可以创建一个类来表示一个组件,然后在页面中实例化这个类,将组件添加到页面中。以下是一个简单的组件化设计示例:
class NavbarComponent {
constructor() {
this.element = document.createElement('nav');
this.element.innerHTML = '<ul><li>Home</li><li>About</li><li>Contact</li></ul>';
}
render() {
document.body.appendChild(this.element);
}
}
const navbar = new NavbarComponent();
navbar.render();
在这个例子中,创建了一个名为NavbarComponent的类来表示导航栏组件。这个组件包含了一个nav元素,其中包含了三个导航链接。在页面加载时,实例化这个组件,并将其添加到页面中。
📘(三)模块化 JavaScript
模块化 JavaScript 是一种将代码组织成独立模块的方法,它提高了代码的可读性、可维护性和可扩展性。
🔖1. 模块化的好处
提高代码的可读性:将代码分成独立的模块,每个模块负责特定的任务,使得代码结构更加清晰,易于理解。
提高代码的可维护性:每个模块都是独立的,可以单独进行维护和修改,不会影响其他部分的代码。
提高代码的可扩展性:可以方便地添加新的模块,扩展代码的功能。
🔖2. 模块化的实现方法
在 JavaScript 中,可以使用 ES6 模块或 CommonJS 模块来实现模块化。以下是一个使用 ES6 模块的示例:
// module.js
export const name = 'ChatAi';
export function sayHello() {
console.log(`Hello, ${name}!`);
}
// main.js
import { name, sayHello } from './module.js';
console.log(name);
sayHello();
在这个例子中,创建了一个名为module.js的模块,其中包含了一个变量name和一个函数sayHello。在另一个文件main.js中,使用import语句导入了这个模块,并使用其中的变量和函数。
📚五、JavaScript 网页设计性能优化
📘(一)代码分割
代码分割是一种优化网页性能的重要技术,它将代码拆分成较小的块,以便按需加载。这样可以显著减少初始页面加载时间,提高用户体验。
在 JavaScript 中,可以使用多种方式实现代码分割。例如,可以手动将代码拆分成多个模块,只在需要时导入特定的模块。以下是一个手动代码分割的示例:
// main.js
import { add } from './math';
console.log(add(5, 3));
// math.js
export const add = (a, b) => a + b;
export const subtract = (a, b) => a - b;
在这个例子中,main.js只导入了math.js中的add函数,避免了不必要的代码加载。
另一种实现代码分割的方法是使用动态导入。通过使用import()函数,可以在运行时动态加载模块,从而实现更灵活的代码分割。以下是一个使用动态导入的示例:
// main.js
document.getElementById('btn').addEventListener('click', () => {
import('./math').then((math) => {
console.log(math.add(5, 3));
});
});
在这个例子中,当按钮被点击时,才会动态加载math模块。
Webpack 是一个流行的前端构建工具,它也提供了强大的代码分割功能。可以通过配置optimization.splitChunks来实现静态和动态导入的代码分割。例如:
// webpack.config.js
module.exports = {
//...
optimization: {
splitChunks: {
chunks: 'all',
},
},
};
通过这种配置,Webpack 会自动将代码拆分成多个小块,根据需要进行加载。
代码分割的好处是显而易见的。它可以减少初始页面加载时间,因为只需要加载当前页面所需的代码。同时,它还可以提高缓存利用率,因为只有发生变化的模块才需要重新下载。
📘(二)懒加载
懒加载是一种延迟加载非关键资源的技术,直到这些资源即将被用到时才进行加载。在网页设计中,懒加载通常用于图片、视频等资源的加载,以提高页面的加载速度和性能。
根据滚动条高度显示图片
可以使用如下代码来实现:
<div id="image-container">
<img src="https://via.placeholder.com/500x400" alt="placeholder image">
</div>
window.addEventListener('scroll', function() {
var imageContainer = document.getElementById('image-container');
var scrollTop = window.pageYOffset || document.documentElement.scrollTop;
if (scrollTop > 200) {
imageContainer.style.display = 'block';
} else {
imageContainer.style.display = 'none';
}
});
上述代码监听了浏览器窗口的滚动事件,并根据滚动条的高度来控制图片是否显示。当滚动条的高度大于 200 时,显示图片,否则隐藏图片。可以根据实际需求自行调整滚动条高度的阈值和图片容器的 id。
根据定时器来实现懒加载图片
懒加载可以通过定时器来实现,具体实现步骤如下:
获取需要懒加载的元素,可以使用querySelectorAll等方法。
使用IntersectionObserver API监听元素是否出现在可视区域内,如果出现则加载内容。如果浏览器不支持IntersectionObserver,则可以通过定时器来模拟实现。
创建一个定时器,在定时器的回调函数中,判断需要懒加载的元素是否出现在可视区域内,如果是,则加载内容,否则继续等待下一次定时器回调。
下面是一个使用定时器实现懒加载的例子:
// 获取所有需要懒加载的图片元素
const images = document.querySelectorAll('img.lazyload');
// 定义一个函数,用来判断元素是否在可视区域内
function isInViewport(el) {
const rect = el.getBoundingClientRect();
return (rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth));
}
// 定义一个定时器,每 100ms 检查一次需要懒加载的图片是否在可视区域内
const timer = setInterval(() => {
images.forEach(img => {
if (isInViewport(img)) {
// 加载图片
img.src = img.dataset.src;
// 从需要懒加载的列表中移除该元素
images.delete(img);
}
});
// 如果所有图片都已经加载完毕,则取消定时器
if (images.length === 0) {
clearInterval(timer);
}
}, 100);
在上面的例子中,我们首先获取所有需要懒加载的图片元素,然后定义了一个isInViewport函数,用来判断元素是否在可视区域内。接着我们创建了一个定时器,每 100ms 检查一次需要懒加载的图片是否在可视区域内。如果图片在可视区域内,则加载该图片,然后从需要懒加载的元素列表中移除该图片。如果所有图片都已经加载完毕,则取消定时器。需要注意的是,该方法只是一种简单的实现方式,实际应用中还需要考虑各种情况,比如多次触发定时器可能会增加浏览器负担,需要根据具体情况来进行调优。
实现滑到屏幕底部进行懒加载
可以通过以下步骤实现滑到屏幕底部进行懒加载:
创建一个包含要懒加载的元素的列表或集合。
监听窗口的滚动事件。
在滚动事件处理程序中,检查滚动位置是否达到了屏幕底部。如果是,则加载下一批元素。
每次加载元素时,更新列表或集合中的元素,以保持追加元素的顺序。
以下是一个简单的实现:
// Step 1: 创建包含要懒加载的元素列表
const lazyElements = Array.from(document.querySelectorAll('.lazy'));
// Step 2: 监听滚动事件
window.addEventListener('scroll', () => {
// Step 3: 检查是否滚动到屏幕底部
if (window.innerHeight + window.scrollY >= document.body.offsetHeight) {
// Step 4: 加载下一批元素
const nextBatch = lazyElements.splice(0, 10); // 加载 10 个元素
nextBatch.forEach(element => {
element.src = element.dataset.src; // 设置元素的 src 属性,触发下载
element.classList.remove('lazy'); // 删除.lazy 类,避免重复加载
});
}
});
在这个示例中,我们使用了一个lazy类来标记要懒加载的元素,并将要加载的元素数量设置为 10。可以根据需要进行更改。另外,我们假设每个懒加载元素都有一个data-src属性,其中保存了实际要加载的图像的 URL。
📘(三)减少重绘与重排
在网页设计中,优化 DOM 操作以减少浏览器的重绘和重排次数是提高性能的关键。重排一定会产生重绘,重绘发生在元素的可见的外观被改变,但并没有影响到布局的时候。比如,仅修改 DOM 元素的字体颜色(只有 Repaint,因为不需要调整布局)。从根本上说,因为重排和重绘才实现了页面的状态改变。但重排和重绘是有代价的,作为开发工程师要做的事是尽可能小的代价实现页面 dom 的改变。
以下是一些减少重绘与重排的策略:
合并多次的 DOM 和样式的修改,并减少对 style 样式的请求。直接改变元素的 className,或者使用 csstext。
先设置元素为display:none;然后进行页面布局等操作;设置完成后将元素设置为display:block;这样的话就只引发两次重绘和重排。
缓存布局信息,不要经常访问浏览器的 flush 队列属性;如果一定要访问,可以利用缓存。将访问的值存储起来,接下来使用就不会再引发回流。例如:
var current = myElement.offsetLeft;
current++;
myElement.style.left = current + 'px';
myElement.style.top = current + 'px';
if (myElement.offsetLeft >= 500) {
stopAnimation();
}
使用cloneNode(true or false)和replaceChild技术,引发一次回流和重绘。
let old = document.querySelector('#mylist');
let clone = old.cloneNode(true);
appendNode(clone, data);
old.parentNode.replaceChild(clone, old);
将需要多次重排的元素,position属性设为absolute或fixed,元素脱离了文档流,它的变化不会影响到其他元素。
如果需要创建多个 DOM 节点,可以使用DocumentFragment创建完后一次性的加入 document。
var fragment = document.createDocumentFragment();
var li = document.createElement('li');
li.innerHTML = 'apple';
fragment.appendChild(li);
var li = document.createElement('li');
li.innerHTML = 'watermelon';
fragment.appendChild(li);
document.getElementById('fruit').appendChild(fragment);
尽量不要使用 table 布局。
使用现代化的框架,如 React 或 Snabbdom 等虚拟 dom 脚本库。
将 CSS 前置到 JS,以减少重绘和重排的发生。
📚六、JavaScript 网页设计的可访问性原则
确保网页内容对所有用户包括残障用户可访问,提升网页的包容性。
📘(一)文字解释与结构语义
JavaScript 的可访问性归结为三个核心原则之一是所有 JavaScript 功能都必须采用可解释为文本的形式。这意味着信息应表示为具有有意义结构的文本,且实体元素语义应作为所有交互内容的基础。例如,如果我们正在构建一个选项卡框,可以像以下这样使用各种语义标记:
<div class="box">
<section class="panel">
<h3 class="tab" tabindex="0">Section 1</h3>
<p class="content">This is the content for Section 1</p>
</section>
<section class="panel">
<h3 class="tab" tabindex="0">Section 2</h3>
<p class="content">This is the content for Section 2</p>
</section>
</div>
使信息以编程方式可访问也很重要,应使用标准 DOM 函数向页面添加新内容,而不是使用 document.write() 或 innerHTML。比如,可以通过以下函数来添加 HTML 内容:
function appendHTML(target, html) {
var fragment = document.createElement('div');
fragment.innerHTML = html;
while (fragment.hasChildNodes()) {
target.appendChild(fragment.firstChild);
}
return target;
}
📘(二)键盘辅助功能
使键盘可以访问交互式内容时,应坚持使用一组核心键:Tab、Enter、四个箭头键和 Escape。这些键应按原样使用,即不必按住 Shift 键或其他修饰键。如果确实需要使用其他键或修饰键击,则应向用户提供说明。例如,在下拉菜单中使用向上键和向下键时,为防止与页面滚动冲突,可以这样处理:
menu.addEventListener('keydown', function(e) {
if (/^(3[789]|40)$/.test(e.keyCode.toString())) {
switch (e.keyCode) {
case 37: //... handle left-arrow
break;
case 38: //... handle up-arrow
break;
case 39: //... handle right-arrow
break;
case 40: //... handle down-arrow
break;
}
e.preventDefault();
}, false);
同时,要确保不挡住 Tab 键,以免引起用户关注。另外,保持逻辑的内容顺序也很重要。例如,当使用丰富的工具提示时,必须将它们直接插入触发它们的元素之后,以便可以使用 Tab 键切换至它们,以便屏幕阅读器接下来可以阅读它们。比如:
<blockquote>
<p>Assistive technologies can derive information from their attributes and text; for example, a dynamic menu would be made using links organised into nested lists, in which the menu levels are denoted by the hierarchy, and by the use of <span id="context"><a href="http://www.maxdesign.com.au/2006/01/17/about-structural-labels/" title="descriptive headings used to indicate the main components of a web page, such as global site navigation, local navigation and footer information">structural labels</a></span> around each top-level link.</p>
</blockquote>
通过 span 提供插入目标,为工具提示的绝对位置提供相对上下文,并设置 CSS:
#context{
position:relative;
}
#context > span.tooltip{
position:absolute;
bottom:1.7em;
right:0;
}
#context > span.tooltip{
width:18em;
padding:6px 8px;
white-space:normal;
border:1px solid #555;
font:normal normal normal 0.85em/1.4 arial,sans-serif;
text-align:right;
background:#ffd;
box-shadow:1px 2px 3px -1px rgba(0,0,0,0.5);
}
#context > span.tooltip > em{
display:block;
padding:4px 4px 8px 4px;
text-align:left;
font-style:normal;
}
用 JavaScript 实现工具提示的显示:
var infotext, tooltip = null, context = document.getElementById('context'), trigger = context.getElementsByTagName('a').item(0);
{
if (tooltip === null) {
google.setAttribute('href', 'http://www.google.com/search?"),
}
}
📘(三)对闪烁内容或时间限制敏感的用户
最后一组是对闪烁内容敏感的人员,或者无法以预期方式响应实时事件的人员。就闪烁的内容而言,这会影响光敏性癫痫患者,以及患有认知障碍并且在周围视觉中移动时难以集中注意力的人。时间限制也可能会带来问题,因为朗读内容的时间要比朗读时间长得多,使用键盘导航也比使用鼠标花费更长的时间。因此,JavaScript 中基于时间的活动应该是用户可控制的。基于时间的活动的限制不是很具体,因为要考虑几种不同的用例。时间限制的一般原则是,只要必须在特定时间内完成某项活动,就会在时间限制即将到期时向用户发出警告,并提供延长时间的方式。
📘(四)利用辅助工具提升可访问性
无障碍开发者工具:无障碍开发者工具(Accessibility Developer Tools)是谷歌 Chrome 团队推出的一款强大库,旨在帮助开发者检查和修复网站的无障碍问题。这个开源项目不仅提供了一套审计规则,用于检测常见的无障碍问题,还提供了多种实用工具,如对比度计算、ARIA 属性验证以及可访问名称计算。
项目基于 JavaScript 编写,并兼容 npm,方便开发者轻松引入和更新。通过 axs_testing.js 文件,你可以直接在网页中包含这个库。为了进行本地开发和构建,项目依赖于 Node.js 和 Grunt。安装好依赖后,使用 grunt 命令即可执行构建过程。
项目还提供了命令行审计工具,利用 PhantomJS 在无头浏览器环境下运行,非常适合自动化测试。此外,还有与 Selenium WebDriver 的整合,允许在各种测试框架中运行无障碍审计。
无障碍开发者工具广泛应用于 Web 开发的各个阶段:开发过程中实时检查新添加的功能是否符合无障碍标准;测试阶段确保每次代码更改不会引入新的无障碍问题;维护阶段对现有网站进行定期扫描,找出需改进的地方;教育阶段为开发者提供无障碍编程的最佳实践。
Articulate.js:Articulate.js 是一款轻巧而强大的 jQuery 插件,它能够将任何网站上的文本转换成语音阅读。它简单到只需一行代码的整合,即可实现网页内容的朗读功能。无需依赖额外浏览器扩展或系统软件,仅通过内置的 JavaScript Speech Synthesis API,它就能将精心编写的长文、博客转化为类似播客的听觉体验,极大地提升了内容的可触及性。
巧妙地利用了 jQuery 的选择器能力,允许开发者精准指定希望被 “听化” 的页面区域。它的工作原理是克隆匹配的元素及其子元素,并依据预设规则决定哪些内容应被读出,哪些忽略,自动插入适当的停顿,以形成自然流畅的叙述效果。版本 1.1.0 新增的功能包括获取可用语音列表与基于名称或语言设置语音,提供了更灵活的定制性。
应用场景丰富多样,想象一下,教育网站上自动播放的教学材料,使得视觉受限的学习者也能无障碍学习;在线新闻平台,为读者提供边做家务边听新闻的便利;或是个人博客,让访客能在忙碌中选择听而非阅读每一篇文章。
Webkit 的访问性特性:Webkit 作为多个流行浏览器的核心渲染引擎,提供了一系列的访问性特性,以支持残障用户更好地浏览网页。
屏幕阅读器兼容性:Webkit 支持屏幕阅读器(Screen Readers),如 VoiceOver 和 NVDA,它们可以朗读网页内容给视觉障碍用户。
ARIA(Accessible Rich Internet Applications)属性:Webkit 支持 WAI-ARIA 规范,允许开发者为残障用户提供额外的辅助信息。
键盘可访问性:Webkit 确保所有的交互元素都可以通过键盘访问,这对于运动障碍用户至关重要。
高对比度模式:Webkit 支持高对比度模式,帮助视觉障碍用户更容易区分页面元素。
色彩和字体大小的可调节性:Webkit 允许用户通过操作系统设置调整网页的色彩和字体大小。
导航定时器控制:Webkit 提供了 API 来控制页面上自动播放的媒体和定时器,以避免对认知障碍用户造成困扰。
可访问性检查工具:Webkit 提供了开发者工具,帮助开发者检查和改进网页的访问性。
语音识别和合成:Webkit 支持 Web Speech API,允许用户通过语音与网页交互。
焦点管理和可视反馈:Webkit 提供了焦点管理和可视反馈机制,帮助用户了解当前操作的位置。
多语言支持:Webkit 支持多种语言,帮助不同语言背景的用户访问网页。
📘(五)最佳实践与注意事项
添加带有替代文字的图像:一幅图片可能价值一千个单词,但是对于盲人和视力低下者,图像却是无障碍获取障碍。他们通常不得不依靠辅助技术,例如屏幕阅读器和可刷新的盲文阅读器。因此,需要添加替代文字以向残障用户描述图像。确保尽可能清晰地描述图像,可以使用 alt 属性进行简短描述,并使用 “Longdesc 标签” 进行冗长的描述。
允许用户放大字体大小:视力低下的人通常看不到小的文字,因此需要提供一个备用样式表,该样式表可以放大字体大小而不破坏页面布局,使他们更容易阅读内容。另外,确保 CTA 按钮具有更大的字体,并使这些按钮对视力障碍的人可见。
保持对比敏感度:有视力障碍的人,例如色素性视网膜炎,青光眼,糖尿病性视网膜病和白内障,其颜色对比敏感度较低。设计网页时,确保前景和背景之间的对比度很高,例如黑色背景上的黄色字母。避免使用细字体,尽量避免使用任何 JavaScript 或 CSS 功能,以防止视力障碍的用户增加对比度。颜色对比度对于 CTA 也是至关重要的,可以组合使用黄色背景上的黑色文本和蓝色背景上的黄色文本等,但要避免使用诸如红色背景上的绿色文本之类的组合,因为它们难以阅读。
添加键盘导航:对于盲人和视障用户,导航是一个挑战。由于他们无法使用鼠标来浏览网站,因此必须将键盘导航合并到网站中。确保禁用的用户可以访问网站的所有交互式元素,包括网址、定位文字、下拉菜单、小部件、表单、CTAs、对话框等。另外,使用键盘可以访问 JavaScript 小部件。可以单独使用 HTML 链接,按钮和表单字段来确保网站的所有元素都可以通过键盘访问。
使视频和多媒体可访问:网站上的视频和其他多媒体元素在提高网站上的用户参与度方面起着至关重要的作用。盲人和视障用户看不到视觉效果,而聋人和听障用户则听不到声音。可以使用音频描述来描述仅视觉效果的部分,例如图像,手势和设置更改等。为聋哑或听力障碍的用户提供与视频和音频轨道同步的文本标题。确保使用正确的颜色对比度正确突出显示字幕。最后,使用可访问的多媒体播放器,HTML5 播放器为合并辅助功能提供了更好的机会。
使用描述性 URL:屏幕阅读器可以快速而准确地阅读描述性 URL,从而为盲人和视障用户提供一些上下文。有意义的描述还使您更容易跳到正确的内容。例如,避免在页面上的任何地方使用诸如 “” 或 “单击此处” 之类的锚文本。另外,请勿添加指向不支持替代文字的图像的链接。
使用 ARIA 角色:ARIA 代表可访问的富 Internet 应用程序。它可以帮助您使动态内容更易于访问。ARIA 角色和属性向屏幕阅读器和其他辅助工具提供有关网站元素的更多信息或上下文。可以使用 role =” < ROLE TYPE> ” 属性添加 ARIA 角色。ARIA 角色的六个最常见类别包括里程碑、文档结构、窗口小部件、摘要、窗口、实时区域。但只有有权访问源代码并具有 ARIA 和 HTML5 知识的人员才能并且应该进行这些更改。您应该与您的网站开发人员联系以获取更多详细信息。
避免在表单中使用占位符文本:在线表单通常使用占位符文本来描述各种元素以节省空间。但是,占位符文本通常为灰色,视力障碍的用户由于对比度低而无法阅读。它也是非标签文本,这意味着屏幕阅读器通常会跳过占位符文本。
到此这篇文章就介绍到这了,更多精彩内容请关注本人以前的文章或继续浏览下面的文章,创作不易,如果能帮助到大家,希望大家多多支持宝码香车~💕,若转载本文,一定注明本文链接。
更多专栏订阅推荐:
👍 html+css+js 绚丽效果
💕 vue
✈️ Electron
⭐️ js
📝 字符串
✍️ 时间对象(Date())操作