vue实现点击星星评分效果

本文详细介绍如何使用Vue和font-awesome库实现动态星星评分效果。通过定义变量和事件处理,实现鼠标悬停、离开和点击时星星状态的变化。

vue实现点击星星评分效果

首先通过引入bootcdn里的font-awesome获取星星素材
<link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/4.7.0/css/font-awesome.css" rel="stylesheet">
此时’fa-star’为实星,‘fa-star-o’为空星。
给它一个变量定义星星的个数count

   <style>
        .fa {
            color: coral;
        }
    </style>
 <div id="app">
        <i class="fa  fa-star" v-for="item in count" aria-hidden="true"></i>
        <i class="fa  fa-star-o" v-for="item in count" aria-hidden="true"></i>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        let zyy = new Vue({
            el: "#app",
            data() {
                return {
                    count: 10,

                }
            },

效果图如下:
在这里插入图片描述
1.此时想改变实心或空心的数量,通过:class来判断,定义一个变量tempScore代表实心数量。将item与tempScore比较,判断当item小于等于定义的实心数量tempScore时显示实星,否则为空星。:class="item<=tempScore?'fa-star':'fa-star-o'"

2.添加一个mouseenter事件,当鼠标移动到哪颗星就让实心数量等于当前的item。@mouseenter="tempScore=item"

3.添加一个mouseleave事件,当鼠标离开,此时的实星数量固定了,想让它回到原来的位置,就要再定义一个score让它与变量tempScore相等从而记录开始的位置。@mouseleave="tempScore=score"

4.想让实星点击到哪就显示多少时绑定一个click事件,将当前点击那个的item给到score记录当前位置@click="score=item"
最终代码如下:

 <style>
        .fa {
            color: coral;
        }
    </style>
 <div id="app">
        <i class="fa  fa-star" 
        v-for="item in count"
         :class="item<=tempScore?'fa-star':'fa-star-o'"
         @mouseenter="tempScore=item"
         @mouseleave="tempScore=score"
         @click="score=item"
         aria-hidden="true"></i>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        let zyy = new Vue({
            el: "#app",
            data() {
                return {
                    tempScore:1,
                    score:1,
                    count:10
                }
            },
            methods: {
             
            },
        })
    </script>

效果图如下:
在这里插入图片描述

Vue实现一个评分星星组件,尤其是支持半星评分的组件,需要结合数据驱动的方式和交互逻辑来完成。以下是一个完整的实现思路和代码示例。 ### 1. 数据定义与计算属性 组件的核心在于如何根据评分值来渲染星星的状态。可以通过一个 `score` 数据属性来表示当前评分,并通过计算属性将评分转换为每个星星的状态(全星、半星或未选中)。 ```javascript export default { data() { return { score: 0, // 当前评分,范围为 0 到 10(支持半星) }; }, computed: { starStates() { const states = []; const fullStars = Math.floor(this.score / 2); // 全星数量 const hasHalfStar = this.score % 2 >= 1; // 是否有半星 for (let i = 0; i < fullStars; i++) { states.push(2); // 2 表示全星 } if (hasHalfStar) { states.push(1); // 1 表示半星 } while (states.length < 5) { states.push(0); // 0 表示未选中 } return states; }, }, methods: { setScore(index) { // 点击星星设置评分 this.score = index * 2 + 1; // 默认点击后为半星 }, }, }; ``` ### 2. 模板部分 在模板中,根据 `starStates` 渲染对应的星星图标。可以使用 SVG 或图片来表示不同状态的星星。 ```vue <template> <div class="star-rating"> <div v-for="(state, index) in starStates" :key="index" class="star" @click="setScore(index)" > <span v-if="state === 2">⭐</span> <!-- 全星 --> <span v-else-if="state === 1">⭐½</span> <!-- 半星 --> <span v-else>☆</span> <!-- 未选中 --> </div> </div> </template> ``` ### 3. 样式部分 可以通过 CSS 来美化星星的显示效果,例如调整大小、颜色和间距。 ```css .star-rating { display: flex; justify-content: center; font-size: 2rem; color: #ccc; } .star { cursor: pointer; margin: 0 4px; transition: color 0.3s; } .star:hover { color: #f5a623; } ``` ### 4. 支持滑动评分(可选) 如果希望支持滑动评分功能,可以引入触摸事件来动态更新评分值。 ```javascript methods: { touchStart(evt) { if (evt && evt.touches.length === 1) { this.x0 = evt.touches[0].clientX; this.len = this.$refs.starContainer.offsetWidth; } }, touchMove(evt) { const deltaX = evt.touches[0].clientX - this.x0; const ratio = Math.min(Math.max(deltaX / this.len, 0), 1); this.score = Math.round(ratio * 10); // 评分范围 0-10 } } ``` 在模板中添加事件监听器: ```vue <div ref="starContainer" class="star-rating" @touchstart="touchStart" @touchmove="touchMove"> <!-- 星星渲染逻辑 --> </div> ``` ### 5. 提交评分 最后,可以添加一个提交按钮,将评分值发送到服务器。 ```vue <template> <div> <!-- 星星评分组件 --> <div class="star-rating" @touchstart="touchStart" @touchmove="touchMove"> <!-- 星星渲染逻辑 --> </div> <button @click="submitRating">提交评分</button> </div> </template> <script> export default { methods: { submitRating() { // 提交评分到服务器 console.log('提交的评分:', this.score); }, }, }; </script> ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值