• 如何用纯代码实现评分星级显示?


    由于做的一个页面需要根据用户评分的不同,显示对应的star。如果评分是带有小数部分的的话,star除了显示对应整数个star,还需要用star部分“亮起”来显示小数部分(如下图)。本来页面是基于BootStrap做的,里面有star icon,可以整个显示,无论用元素遮蔽还是其他方法,都不能很好的满足需求。而网络上现有实现方式使用的是雪碧图,也就是半颗星亮起时是用图片展示的。经过思考,就想起了HTML5中的Canvas,使用Canvas画出star,然后在填充颜色时使用渐变色,应该就可以实现star部分点亮了。

    下面就是具体的实现方式,已经把实现封装成了一个函数,使用时直接传参调用就行啦。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="author" content="Jeri qcloud.js@gmail.com" />
        <title>showRatingStars</title>
    </head>
    <body> 
        <canvas width="250" height="40" id="myCanvas"></canvas>  
    
        <script>  
            /**
             * showRatingStars 显示评分星级
             * @param  {Object} myCanvas 画布对象
             * @param  {Number} rating   评分
             * @param  {Number} counts   star个数
             * @param  {Number} size     star大小
             * @param  {Object} style    star样式
             *           Example: style = {
             *                          borderColor:"#21DEEF",
             *                          fillColor:"#21DEEF",
             *                        spaceColor:"#FFFFFF"
             *                      }
             * @return none 
             */
            function showRatingStars(myCanvas, rating, counts, size, style) {
    
                // 检测rating与star数目是否合适
                if (rating > counts) {
    
                    alert("Please set suitable rating and counts!");
                    return;
                }
    
                // 检测大小设置是否合适
                if (myCanvas.offsetWidth < size * counts || myCanvas.offsetHeight < size) {
    
                    alert("Please set suitable size and myCanvas' size!");
                    return;
                }
    
                var context = myCanvas.getContext('2d');
                var xStart = rating * size;
                var yStart = 0;
                var xEnd = (Math.ceil(rating) + 1) * size;
                var yEnd = 0;
                var radius = size / 2;
    
                // 线性渐变,由左至右
                var linear = context.createLinearGradient(xStart, yStart, xEnd, yEnd);
                linear.addColorStop(0, style.fillColor);
                linear.addColorStop(0.01, style.spaceColor);
                linear.addColorStop(1, style.spaceColor);
                context.fillStyle = linear;
    
                // star边框颜色设置
                context.strokeStyle = style.borderColor;
                context.lineWidth = 1;
    
                // 绘制star的顶点坐标   
                var x = radius,
                    y = 0;
    
                for (var i = 0; i < counts; i++) {
    
                    // star绘制
                    context.beginPath();
                    var x1 = size * Math.sin(Math.PI / 10);
                    var h1 = size * Math.cos(Math.PI / 10);
                    var x2 = radius;
                    var h2 = radius * Math.tan(Math.PI / 5);
                    context.lineTo(x + x1, y + h1);
                    context.lineTo(x - radius, y + h2);
                    context.lineTo(x + radius, y + h2);
                    context.lineTo(x - x1, y + h1);
                    context.lineTo(x - x1, y + h1);
                    context.lineTo(x, y);
                    context.closePath();
                    context.stroke();
                    context.fill();
                    x = (i + 1.5) * size;
                    y = 0;
                    context.moveTo(x, y);
                }
            }
    
            // 参数设置与函数调用
            var size = 25;
            var rating = 4.57;
            var counts = 10;
            var style = {
                borderColor: "#21DEEF",
                fillColor: "#21DEEF",
                spaceColor: "#FFFFFF"
            };
            var myCanvas = document.getElementById("myCanvas");
    
            showRatingStars(myCanvas, rating, counts, size, style);
        </script>  
    </body>  
    </html>

     运行结果如图:

    注:示例已经进行了简单测试,是可以正常运行的。但不敢保证是否还有bug,仅供参考与交流!

  • 相关阅读:
    探寻京东云核心竞争力的源泉
    在线公开课 | 教你如何自行搭建一个威胁感知大脑?
    推迟学习系统调用
    linux中未实现的系统调用
    man(2) V
    man(2) W
    图像叠加
    man(2) readv writev
    qt 视频播放
    ffmpeg参数
  • 原文地址:https://www.cnblogs.com/syfwhu/p/5242439.html
Copyright © 2020-2023  润新知