2021-06-27 五星好评的实现

实现效果
鼠标移入到对应的选项li,当前li以及之前的星星显示高亮,下方出现对应等级的评价,移出时恢复原样;
点击星星评价时,下方评价固定到右边(下方的消失,右边的出现)
思路
0.设置解释语
1.点击:<p>隐藏,取出解释语并赋给<span>的文本内容,保存点击分数,调用打分
2.移入:<p>显示,取出解释语并赋给<p>的文本内容,设置p标签的位置,调用打分
3.移出:<p>隐藏,调用打分
4.打分:小于当前索引的就添加
代码
html
<div id="star">
    <span>点击星星就能打分</span>
    <ul>
        <li><a href="">1</a></li>
        <li><a href="">2</a></li>
        <li><a href="">3</a></li>
        <li><a href="">4</a></li>
        <li><a href="">5</a></li>
    </ul>
    <span></span>
    <p>选择解释</p>
</div>
css
body {color: #666;font: 12px/2 Arial;}
#star {margin: 10px auto;width: 800px;position: relative;/*设置定位给p标签参考*/}
ul {list-style-type: none;margin: 0px 10px;/*必须设置外边距才能上去*/}
ul,span {float: left;}
ul li {float: left;background: url('./star.png') no-repeat;text-indent: -9999px;width: 24px;margin: 0px;}
#star li.on {background-position: 0 -28px;}
/*后面要根据鼠标变动,更改p,所以要设置定位*/
p {position: absolute;top: 20px;width: 200px;display: none;}
p em {color: #f60;}
strong {color: #f60;padding-left: 20px;}
js
class Star {
    msg = [
        "很不满意|差得太离谱,与卖家描述的严重不符,非常不满",
        "不满意|部分有破损,与卖家描述的不符,不满意",
        "一般|质量一般,没有卖家描述的那么好",
        "满意|质量不错,与卖家描述的基本一致,还是挺满意的",
        "非常满意|质量非常好,与卖家描述的完全一致,非常满意"
    ];
    //保存打分
    setScore = 0;
    constructor() {
            //获取节点
            this.ulObj = this.getEle("ul");
            this.lisObj = this.ulObj.children;
            this.spanObj = this.ulObj.nextElementSibling;
            this.pObj = this.getEle("p");
            //给li绑定事件
            this.bingEve();
        }
        //给li绑定事件
    bingEve() {
            Array.from(this.lisObj).forEach((ele, k) => {//伪数组lisObj转化为真数组
                ele.addEventListener("click", this.clickFn.bind(this, k));
                ele.addEventListener("mouseout", this.outFn.bind(this, k));
                ele.addEventListener("mouseover", this.overFn.bind(this, k));
            });
        }
        //点击事件的回调函数
    clickFn(key) {
            //隐藏p标签
            this.pObj.style.display = "none";
            //取出解释语
            let msg = this.msg[key].split("|");
            //显示解释语到span标签中
            this.spanObj.innerHTML = "<strong>" + msg[0] + "</strong>" + msg[1];
            //保存点击的分数
            this.setScore = key + 1;
            //调用打分:高亮lightStar
            this.lightStar(this.setScore);
        }
        //移入事件的回调函数
    overFn(key) { //key是li对应的索引
            //取出解释语,将字符串转化为数组
            let msg = this.msg[key].split("|");
            //显示p
            this.pObj.style.display = "block";
            this.pObj.innerHTML = "<em><strong>" + msg[0] + "</strong></em>" + msg[1];
            //设置p的基础位置和实时移动位置
            let ulW = this.ulObj.offsetLeft;
            let liW = this.lisObj[0].offsetWidth;
            //p的left=li的宽度*li的索引+ul的offsetLeft
            this.pObj.style.left = liW * key + ulW + 'px';
            // 调用打分
            this.lightStar(key + 1);

        }
        //移出事件的回调函数
    outFn(key) {
            //高亮消失
            this.lightStar(this.setScore);
            // p标签消失
            this.pObj.style.display = "none";
        }
        //星星设置高亮显示:小于当前索引值的都高亮显示
    lightStar(index) {
            Array.from(this.lisObj).forEach((v, k) => {
                //小于当前索引的添加
                k < index && (v.className = "on");
                k >= index && (v.className = "");
            })
        }
        //获取节点的方法
    getEle(tag, one = true) {
        //单个节点对象
        if (one) return document.querySelector(tag);
        //多个节点对象
        return document.querySelectorAll(tag);
    }
}
new Star();
效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

文件

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端OnTheRun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值