微信小程序实现星星评分-整颗星星评分、半颗星星评分、任意颗星星展示

一、实现整颗星星评分(默认一颗星)

1.效果图
在这里插入图片描述
2.准备图片
在这里插入图片描述

3.remark.wxml

<view class="stars">
   <view wx:for="{{stars}}" wx:key="index" data-index="{{index}}" bindtap='score'>
     <image src="{{index > 0 && item.flag == 1 ? item.bgImg : item.bgfImg}}"></image>
   </view>
 </view>

4.remark.wxss

.stars {
  display: flex;
}

.stars view {
  width: 50rpx;
  height: 50rpx;
  margin-right: 20rpx;
}

.stars view image {
  width: 100%;
  height: 100%;
}

5.remark.js

  data: {
    // 星星列表
    stars: [
      {
        flag: 1,
        bgImg: "/img/farmers/icon_bsta_no.png",
        bgfImg: "/img/farmers/icon_bstar1.png"
      },
      {
        flag: 1,
        bgImg: "/img/farmers/icon_bsta_no.png",
        bgfImg: "/img/farmers/icon_bstar2.png"
      },
      {
        flag: 1,
        bgImg: "/img/farmers/icon_bsta_no.png",
        bgfImg: "/img/farmers/icon_bstar3.png"
      },
      {
        flag: 1,
        bgImg: "/img/farmers/icon_bsta_no.png",
        bgfImg: "/img/farmers/icon_bstar4.png"
      },
      {
        flag: 1,
        bgImg: "/img/farmers/icon_bsta_no.png",
        bgfImg: "/img/farmers/icon_bstar5.png"
      }
    ],
    star_num: 1,  // 默认1分
  },

  // 选择范围
  score: function (e) {
    var _this = this;
    for (var i = 0; i < _this.data.stars.length; i++) {
      var allItem = 'stars[' + i + '].flag';
      // 全部变为未选中状态
      _this.setData({
        [allItem]: 1
      })
    }
    var index = e.currentTarget.dataset.index;
    for (var i = 0; i <= index; i++) {
      var item = 'stars[' + i + '].flag';
      // 选中项及以前,变为选中状态
      _this.setData({
        [item]: 2,
      })
    }
    // 评分
    _this.setData({
      star_num: index + 1 // 评分
    })
  },

二、实现半颗星星评分(默认半颗星)

1.效果图
在这里插入图片描述
2.准备图片
在这里插入图片描述

3.remark1.wxml

<view class="stars">
  <view wx:for="{{stars}}" wx:key="index">
    <image src="{{index > 0 && item.flag1 == 1 ? item.bgImgL : item.bgfImgL}}" data-index="{{index}}" bindtap='scoreL'>
    </image>
    <image src="{{item.flag2 == 1 ? item.bgImgR : item.bgfImgR}}" data-index="{{index}}" bindtap='scoreR'></image>
  </view>
</view>

4.remark1.wxss

.stars {
  display: flex;
  margin: 200rpx 0;
}

.stars view {
  position: relative;
  width: 50rpx;
  height: 50rpx;
  margin-right: 20rpx;
}

.stars view image:nth-of-type(1) {
  width: 50%;
  height: 100%;
  margin-right: -2rpx;
}
.stars view image:nth-of-type(2) {
  width: 50%;
  height: 100%;
  margin-left: -1rpx;
}

5.remark1.js

  data: {
    // 星星列表
    stars: [
      {
        flag1: 1,
        flag2: 1,
        bgImgL: "/img/farmers/icon_star_1.png",
        bgfImgL: "/img/farmers/icon_star_active1.png",
        bgImgR: "/img/farmers/icon_star_2.png",
        bgfImgR: "/img/farmers/icon_star_active2.png",
      },
      {
        flag1: 1,
        flag2: 1,
        bgImgL: "/img/farmers/icon_star_1.png",
        bgfImgL: "/img/farmers/icon_star_active1.png",
        bgImgR: "/img/farmers/icon_star_2.png",
        bgfImgR: "/img/farmers/icon_star_active2.png",
      },
      {
        flag1: 1,
        flag2: 1,
        bgImgL: "/img/farmers/icon_star_1.png",
        bgfImgL: "/img/farmers/icon_star_active1.png",
        bgImgR: "/img/farmers/icon_star_2.png",
        bgfImgR: "/img/farmers/icon_star_active2.png",
      },
      {
        flag1: 1,
        flag2: 1,
        bgImgL: "/img/farmers/icon_star_1.png",
        bgfImgL: "/img/farmers/icon_star_active1.png",
        bgImgR: "/img/farmers/icon_star_2.png",
        bgfImgR: "/img/farmers/icon_star_active2.png",
      },
      {
        flag1: 1,
        flag2: 1,
        bgImgL: "/img/farmers/icon_star_1.png",
        bgfImgL: "/img/farmers/icon_star_active1.png",
        bgImgR: "/img/farmers/icon_star_2.png",
        bgfImgR: "/img/farmers/icon_star_active2.png",
      },
    ],
    star_num: 0.5,  // 默认0.5分
  },

  // 点击星星左边-半颗星
  scoreL: function (e) {
    var _this = this;
    // 全部变为未选中状态
    for (var i = 0; i < _this.data.stars.length; i++) {
      var allItem1 = 'stars[' + i + '].flag1';
      var allItem2 = 'stars[' + i + '].flag2';
      _this.setData({
        [allItem1]: 1,
        [allItem2]: 1,
      })
    }
    var index = e.currentTarget.dataset.index;
    // 选中项以前,变为选中状态
    for (var i = 0; i < index; i++) {
      var item1 = 'stars[' + i + '].flag1';
      var item2 = 'stars[' + i + '].flag2';
      _this.setData({
        [item1]: 2,
        [item2]: 2,
      })
    }
    // 选中项左边,变为选中状态
    _this.setData({
      ['stars[' + index + '].flag1']: 2,
      star_num: index + 0.5 // 评分
    })
  },
  // 点击星星右边-整颗星
  scoreR: function (e) {
    var _this = this;
    // 全部变为未选中状态
    for (var i = 0; i < _this.data.stars.length; i++) {
      var allItem1 = 'stars[' + i + '].flag1';
      var allItem2 = 'stars[' + i + '].flag2';
      _this.setData({
        [allItem1]: 1,
        [allItem2]: 1,
      })
    }
    var index = e.currentTarget.dataset.index;
    // 选中项及以前,变为选中状态
    for (var i = 0; i <= index; i++) {
      var item1 = 'stars[' + i + '].flag1';
      var item2 = 'stars[' + i + '].flag2';
      _this.setData({
        [item1]: 2,
        [item2]: 2,
      })
    }
    // 评分
    _this.setData({
      star_num: index + 1 // 评分
    })
  },

三、实现任意颗星星的展示

1.效果图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.准备图片
在这里插入图片描述

3.remark2.wxml

<view class="stars">
  <view class="star" wx:for="{{stars}}" wx:key="index">
    <!-- 整颗星星显示个数 -->
    <view class="icon_red" wx:if="{{index < int}}" style="width: 100%;">
      <image src="{{item.bgfImg}}">
      </image>
    </view>
    <!-- 非整颗星星显示个数 -->
    <view class="icon_red" wx:if="{{index == int}}" style="width: {{percent}}%;">
      <image src="{{item.bgfImg}}">
      </image>
    </view>
    <!-- 灰色星星背景 -->
    <view class="icon_grey">
      <image src="{{item.bgImg}}"></image>
    </view>
  </view>
  <!-- 评分 -->
  <view>{{remark_num}}</view>
</view>

4.remark2.wxss

.stars {
  display: flex;
  margin: 200rpx 0;
}
.star {
  position: relative;
  width: 50rpx;
  height: 50rpx;
  margin-right: 20rpx;
}
/* 红色星星 */
.star view.icon_red {
  position: absolute;
  left: 0;
  top: 0;
  z-index: 99;
  height: 50rpx;
  overflow: hidden;
}
/* 灰色星星背景 */
.star view.icon_grey {
  position: absolute;
  left: 0;
  top: 0;
  width: 50rpx;
  height: 50rpx;
}

.star view image {
  width: 50rpx;
  height: 50rpx;
  display: block;
}

5.remark2.js

  data: {
    // 星星列表
    stars: [
      {
        bgImg: "/img/farmers/icon_bsta_no.png",
        bgfImg: "/img/farmers/icon_bstar1.png",
      },
      {
        bgImg: "/img/farmers/icon_bsta_no.png",
        bgfImg: "/img/farmers/icon_bstar2.png",
      },
      {
        bgImg: "/img/farmers/icon_bsta_no.png",
        bgfImg: "/img/farmers/icon_bstar3.png",
      },
      {
        bgImg: "/img/farmers/icon_bsta_no.png",
        bgfImg: "/img/farmers/icon_bstar4.png",
      },
      {
        bgImg: "/img/farmers/icon_bsta_no.png",
        bgfImg: "/img/farmers/icon_bstar5.png",
      },
    ],
    // 要展示的评分
    remark_num: 2.3,
    // 整颗星的个数
    int: "",
    // 非整颗星的百分比
    percent: "",
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    var _this = this;
    var int = Math.floor(_this.data.remark_num);  // 向下取整-得到整颗星的个数
    var percent = (_this.data.remark_num - int) * 100;  // 非整颗星的百分比
    _this.setData({
      int: int,
      percent: percent,
    })
  },
  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值