vue框架实现星星打分组件(可以打半星)

这个组件就是根据点击第几颗星星算出分数,并且对星星的样式做出对应的改变,支持打半颗星。

实现效果如下 

 开始的时候,我想如何能够实现星星两边颜色不同的效果,我使用的是iconfont,直接设置color颜色,但是color没有一半的设定,所以我搜索了一下发现通过背景颜色设定比较合适

对于样式最主要的是下面三句

第一句:background: linear-gradient(to right, #FFA940 50%, #E4E4E4 0) (实现背景色一半一半的效果)

第二句:-webkit-background-clip: text;(规定背景的绘制区域为文字部分。)

之前接触过的background-clip有下面几种取值:

background-clip: border-box(默认)|padding-box|content-box;

意思分别是,背景被裁剪到边框盒 | 背景被裁剪到内边距框|背景被裁剪到内容框。

第三句:-webkit-text-fill-color: transparent;(文字填充颜色)

*这里注意一定要定义为transparent,否则会覆盖底部的背景色。

这里使用了-webkit-前缀,Chrome和Safari能够正常使用,如果有兼容性需求,需要谨慎使用

接下来就比较简单了通过offsetX定位来判断点击位置在星星中线的左侧还是右侧

我这里使用的icon是16px宽度,所以下面用8来算,具体可以根据自己使用的图标来决定

直接上代码

2023.6.26更新

这个方法果然有兼容问题,因为offestx在谷歌中是拿的整串星星的长度,在火狐中拿的是单个星星的,所以方法改动

<template>

    <div class="starScore">

        <span v-for="(item, index) of star" :key="index" @click="changeScore(index)">

            <i class="iconfont icon-star" :class="{'active':starIndex > index, 'half':starIndex === index + 0.5}"></i>

        </span>

        <span class="starScore-key">{{score}}分</span>

    </div>

</template>

<script>

export default {

    name: 'starScore',

    data() {

        return {

            score: 0,

            starIndex: -1,

            star: [0, 1, 2, 3, 4] // 分数

        };

    },

    methods: {

        changeScore(index) {

            let offsetX = window.event.offsetX;

            offsetX = offsetX > 22 ? offsetX % 22 : offsetX;

            this.starIndex = index + (offsetX < 11 ? 0.5 : 1);

            this.score = (this.starIndex) * 2;

        }

    }

};

</script>

<style lang="scss" scoped>

.starScore {

    .icon-star {

        cursor: pointer;

        color: #E4E4E4;       

        padding: 0 3px;

        &.half {

            background: linear-gradient(to right, #FFA940 50%, #E4E4E4 0);

            background-clip: text;

            -webkit-background-clip: text;

            -webkit-text-fill-color: transparent;

        }

        &.active {

            color: #FFA940;

        }

    }

    .starScore-key {

        color: #FFA940;

        padding-left: 5px;

    }

}

</style>

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
uView DateTimePicker选择器是一个用于选择日期和时间的组件。根据引用[1],uView的2.0版本相比1.0版本可能更好用。关于年份选项的显示,该组件默认是从小到大的顺序显示年份。 根据引用和,在使用uView DateTimePicker选择器时,可能会遇到v-model不生效的问题。一种解决方案是使用ref属性和事件处理函数来实现对选择器的控制。通过设置初始值和自定义formatter函数,可以解决初始值渲染和以时间戳模式渲染的问题。 具体代码实现示例如下: ``` <template> <u-datetime-picker ref="datetimePicker" v-model="selectedDate" :formatter="formatter" :show="show" mode="year-month" @confirm="confirm" @cancel="close"></u-datetime-picker> </template> <script> export default { data() { return { show: false, selectedDate: '2018-01-01' }; }, methods: { formatter(date) { // 自定义日期格式化函数 // 可根据需要返回不同的格式 return date.getFullYear() + '-' + (date.getMonth() + 1); }, confirm(date) { // 点击确认按钮后的事件处理函数 this.selectedDate = date; this.close(); }, close() { // 关闭选择器 this.show = false; } } }; </script> ``` 通过以上实现,你可以在uView的DateTimePicker选择器中选择日期和时间,并解决了v-model不生效的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [uView中的DatetimePicker时间选择器年份排序](https://blog.csdn.net/zcc_520/article/details/123702297)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [uview - DatetimePicker 时间选择器 /时间戳转化](https://blog.csdn.net/shenle_v/article/details/125909654)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值