zoukankan      html  css  js  c++  java
  • 星级评分js

    /**
    * 创建一个星星评分的区域
    * @param {*} config
    */
    function createStar(config) {
    //1. 将各种配置保存到变量中,没有传递的,设置默认值
    var dom = config.dom;
    var maxNumber = config.maxNumber || 5; // 默认5颗星
    var value = config.value || 0; // 默认值 0
    var text = config.text || ["无评分", "很差", "较差", "还行", "推荐", "力荐"];

    var divStarContainer, divStars, label;
    var spans = []; // 存放星星元素的数组
    //2. 编写初始化函数,按照配置设置元素结构
    /**
    * 初始化元素结构,不涉及变化的内容
    */
    function init() {
    divStarContainer = _createElement("div", "star-container", dom);
    divStars = _createElement("div", "stars", divStarContainer);
    label = _createElement("label", "", divStarContainer);
    for (var i = 0; i < maxNumber; i++) {
    var span = _createElement("span", "", divStars);
    spans.push(span);
    }
    }

    /**
    * 辅助函数,帮忙创建元素
    * @param {*} tagName 元素名称
    * @param {*} className 类名
    * @param {*} parent 元素的父元素
    */
    function _createElement(tagName, className, parent) {
    var tag = document.createElement(tagName);
    tag.className = className;
    parent.appendChild(tag);
    return tag;
    }

    init();

    //3. 编写辅助函数,用于根据某个值设置当前的评分样式
    /**
    * 根据指定的值,设置整个星星区域的样式
    * @param {*} value
    */
    function setStars(value) {
    // 控制一下边界
    if (value < 0) {
    value = 0;
    }
    if (value > maxNumber) {
    value = maxNumber;
    }
    // 设置span的样式
    for (var i = 0; i < spans.length; i++) {
    if (i < value) {
    spans[i].className = "fill";
    } else {
    spans[i].className = "hollow";
    }
    }
    // 设置文字
    label.innerText = text[value];
    }

    setStars(value);
    //4. 完成各种事件的注册
    divStars.onmousemove = function (e) {
    var val = _getTempValue(e);
    // 重新设置星星的数量
    setStars(val);
    };

    divStars.onmouseleave = function () {
    // 当鼠标移出的时候,需要还原value值
    setStars(value);
    };

    divStars.onclick = function (e) {
    value = _getTempValue(e);
    };

    // 根据鼠标事件参数e,得到临时的value值
    function _getTempValue(e) {
    var width = divStars.clientWidth; // 获取所有星星的整个宽度
    // e.clientX 获取的是鼠标到视口左边的距离
    // divStars.getClientRects()[0].left 获取的是divStars到视口左边的距离
    var left = e.clientX - divStars.getClientRects()[0].left;
    var val = (left / width) * maxNumber; // 要计算的值
    val = Math.ceil(val);
    console.log(val);
    return val;
    }
    }

  • 相关阅读:
    HDU 3681 Prison Break 越狱(状压DP,变形)
    POJ 2411 Mondriaan's Dream (状压DP,骨牌覆盖,经典)
    ZOJ 3471 Most Powerful (状压DP,经典)
    POJ 2288 Islands and Bridges (状压DP,变形)
    HDU 3001 Travelling (状压DP,3进制)
    POJ 3311 Hie with the Pie (状压DP)
    POJ 1185 炮兵阵地 (状压DP,轮廓线DP)
    FZU 2204 7
    POJ 3254 Corn Fields (状压DP,轮廓线DP)
    ZOJ 3494 BCD Code (数位DP,AC自动机)
  • 原文地址:https://www.cnblogs.com/weixin2623670713/p/13280956.html
Copyright © 2011-2022 走看看