实现星星评分系统
使用HTML、CSS和JavaScript实现星星评分系统
本文将详细讲解如何使用 HTML、CSS 和 JavaScript 实现一个简单的星星评分系统。用户可以通过点击星星进行评分,并且还能够看到星星的悬浮效果和已选中状态。
1. HTML 结构
我们首先在 HTML 中定义了一个星星评分的结构,使用 <ul>
列表来包含五个星星,每颗星星通过 <li>
元素表示。每个星星都通过 data-value
属性来指定它代表的评分值(1 到 5)。
2. CSS 样式
在 CSS 中,我们对星星的样式进行了设置:
star-rating
:这个类设置了评分容器的字体大小和显示方式,字体大小设置为 30px,以确保星星显示的足够大。stars
:这个类去除了默认的列表样式,使星星排列成一行。star
:每颗星星的基本样式。我们将星星的颜色设置为灰色,并为其添加了过渡效果,让颜色变化更加平滑。cursor: pointer
使得星星可点击。star.hover
和star.selected
:这些类用于处理鼠标悬浮和点击选中的效果。当鼠标悬停或点击时,星星的颜色会变为金色。
3. JavaScript 交互逻辑
JavaScript 的核心作用是处理用户与星星评分系统的交互,包括鼠标悬浮、点击评分和更新显示状态。
-
stars.forEach()
:我们遍历所有的星星,并为每颗星星绑定三个事件监听器:mouseover
:当鼠标悬停在星星上时,调用updateStars
函数来更新星星的显示状态,使其呈现悬浮效果。mouseout
:当鼠标移出星星时,恢复为当前评分的显示状态。click
:当用户点击某颗星星时,更新当前评分,并更新星星显示状态。
-
updateStars(rating)
:这个函数用于根据当前评分(或悬浮的评分)更新星星的显示状态。它遍历所有星星并根据评分值添加或移除 CSS 类,从而控制星星的颜色变化。 -
submitRating()
:这个函数是用于将评分提交到服务器的示例代码(在实际应用中,可以根据需要修改 URL 和处理方法)。它通过fetch
方法将评分信息发送到服务器端。
4. 页面加载时的初始化
当页面加载时,我们假设评分是默认值 0,并通过 window.onload
初始化星星的显示状态。可以根据实际情况,从本地存储或服务器加载已保存的评分,并显示对应的星星。
总结
通过以上的代码和讲解,我们可以创建一个简单且互动的星星评分系统。用户可以通过鼠标悬停和点击进行评分,同时星星的显示效果也会即时更新。这个评分系统不仅是前端开发的一个良好示例,还可以在实际的应用中扩展,用于文件上传、商品评价等场景。
代码示例:
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>星星评分</title><!-- 引入CSS样式 --><style>.star-rating {font-size: 30px;display: inline-block;}.stars {list-style: none;padding: 0;margin: 0;display: flex;}.star {color: #ccc;/* 默认是空心星星的颜色 */cursor: pointer;transition: color 0.2s ease;/* 加入过渡效果,使得星星的颜色变化更加平滑 */}.star.hover,.star.selected {color: gold;/* 选中的星星为金色 */}</style></head><body><!-- 星星评分容器 --><div class="star-rating"><ul class="stars"><li data-value="1" class="star">★</li><li data-value="2" class="star">★</li><li data-value="3" class="star">★</li><li data-value="4" class="star">★</li><li data-value="5" class="star">★</li></ul></div><!-- 引入JavaScript脚本 --><script>// 获取所有星星元素let stars = document.querySelectorAll('.star');let currentRating = 0; // 当前评分,初始为0// 添加鼠标悬浮效果stars.forEach(star => {// 鼠标悬浮时更新星星状态star.addEventListener('mouseover', () => {let value = parseInt(star.getAttribute('data-value')); // 获取当前星星的值updateStars(value); // 更新所有星星的显示});// 鼠标移开时恢复当前的评分状态star.addEventListener('mouseout', () => {updateStars(currentRating);});// 点击星星时更新当前评分star.addEventListener('click', () => {currentRating = parseInt(star.getAttribute('data-value')); // 更新评分值updateStars(currentRating); // 更新星星显示状态});});// 更新星星状态的函数function updateStars(rating) {stars.forEach(star => {let value = parseInt(star.getAttribute('data-value'));if (value <= rating) {// 如果星星的值小于等于评分值,设置为已选中状态star.classList.add('selected');star.classList.remove('hover');} else {// 否则,移除已选中状态star.classList.remove('selected');// 如果星星值小于等于当前悬浮位置的值,添加悬浮效果if (value <= rating) {star.classList.add('hover');} else {star.classList.remove('hover');}}});}// 提交评分到后端(示例代码)function submitRating() {fetch('/submit-rating', {method: 'POST',headers: {'Content-Type': 'application/json',},body: JSON.stringify({rating: currentRating // 提交当前评分}),}).then(response => response.json()).then(data => console.log('评分已提交:', data)).catch(error => console.error('提交失败:', error));}// 页面加载时,初始化评分window.onload = function() {let savedRating = 0; // 假设页面加载时默认评分为0currentRating = savedRating;updateStars(savedRating); // 初始化星星状态};</script></body>
</html>