五星好評圖標

//html

<!DOCTYPE html>

<html lang="en">

<head>

? ? <meta charset="UTF-8">

? ? <meta name="viewport" content="width=device-width, initial-scale=1.0">

? ? <meta http-equiv="X-UA-Compatible" content="ie=edge">

? ? <title>Document</title>

</head>

<body>

? ? <script type="module">

? ? ? ? import Star from "./js/Star.js";

? ? ? ? document.addEventListener(Star.STAR_SELECTED_EVENT,starSelectedHandler);

? ? ? ? let? star=new Star("服務評價");

? ? ? ? star.position=2;

? ? ? ? star.bool=true;

? ? ? ? star.appendTo(document.body);

? ? ? ? let? star1=new Star("售后評價")

? ? ? ? star1.appendTo(document.body);

? ? ? ? function starSelectedHandler(e){

? ? ? ? ? ? console.log(e.position,e.content);

? ? ? ? }

? ? </script>

</body>

</html>

//start.js

import Utils from "./Utils.js";

export default class Star{

? ? static STAR_SELECTED_EVENT="star_selected_Event";

? ? constructor(content,bool){

? ? ? ? // this就是new出的對象

? ? ? ? this.arr=[];

? ? ? ? this.position=-1;

? ? ? ? this.bool=bool;

? ? ? ? this.elem=this.createElem(content);

? ? }

? ? createElem(content){

? ? ? ? if(this.elem) return this.elem;

? ? ? ? let div=Utils.ce("div",{

? ? ? ? ? ? height:"35px",

? ? ? ? ? ? position:"relative"

? ? ? ? });

? ? ? ? let label=Utils.ce("label",{

? ? ? ? ? ? fontSize:"16px",

? ? ? ? ? ? marginRight: "10px",

? ? ? ? ? ? display:"inline-block",

? ? ? ? ? ? marginTop: "18px",

? ? ? ? },{

? ? ? ? ? ? textContent:content

? ? ? ? });

? ? ? ? div.appendChild(label);

? ? ? ? for(let i=0;i<5;i++){

? ? ? ? ? ? let span=Utils.ce("span",{

? ? ? ? ? ? ? ? display: 'inline-block',

? ? ? ? ? ? ? ? width:"16px",

? ? ? ? ? ? ? ? height:"16px",

? ? ? ? ? ? ? ? marginTop: "18px",

? ? ? ? ? ? ? ? backgroundImage:"url(./img/commstar.png)"

? ? ? ? ? ? });

? ? ? ? ? ? this.arr.push(span);

? ? ? ? ? ? div.appendChild(span);

? ? ? ? }

? ? ? ? this.face=Utils.ce("span",{

? ? ? ? ? ? display:"none",

? ? ? ? ? ? position:"absolute",

? ? ? ? ? ? width:"16px",

? ? ? ? ? ? height:"16px",

? ? ? ? ? ? backgroundImage:"url(./img/face-red.png)",

? ? ? ? ? ? backgroundPositionX:"0px",

? ? ? ? ? ? top:"0px"

? ? ? ? });

? ? ? ? div.appendChild(this.face);

? ? ? ? // 原本事件函數(shù)中的this是被偵聽的對象,現(xiàn)在通過箭頭函數(shù),this重新指回當前實例化對象

? ? ? ? div.addEventListener("mouseover",e=>{

? ? ? ? ? ? this.mouseHandler(e);

? ? ? ? });

? ? ? ? div.addEventListener("mouseleave",e=>{

? ? ? ? ? ? this.mouseHandler(e);

? ? ? ? });

? ? ? ? div.addEventListener("click",e=>{

? ? ? ? ? ? this.clickHandler(e);

? ? ? ? })

? ? ? ? return div;

? ? }

? ? appendTo(parent){

? ? ? ? parent.appendChild(this.elem);

? ? }

? ? mouseHandler(e){

? ? ? ? if(this.bool) return;

? ? ? ? // e.currentTarget

? ? ? ? var num=this.arr.indexOf(e.target);

? ? ? ? if(e.type==="mouseover"){

? ? ? ? ? ? if(e.target.constructor!==HTMLSpanElement) return;

? ? ? ? ? ? this.setStar(index=>{

? ? ? ? ? ? ? ? return index<=num || index<=this.position;

? ? ? ? ? ? })

? ? ? ? ? ? Object.assign(this.face.style,{

? ? ? ? ? ? ? ? backgroundPositionX:-(this.arr.length-num-1)*20+"px",

? ? ? ? ? ? ? ? left:e.target.offsetLeft+"px",

? ? ? ? ? ? ? ? display:"block"

? ? ? ? ? ? })

? ? ? ? }else if(e.type==="mouseleave"){

? ? ? ? ? ? this.setStar(index=>{

? ? ? ? ? ? ? ? return index<=this.position;

? ? ? ? ? ? })

? ? ? ? ? ? this.face.style.display="none"

? ? ? ? }

? ? }

? ? clickHandler(e){

? ? ? ? if(this.bool) return;

? ? ? ? if(e.target.constructor!==HTMLSpanElement) return;

? ? ? ? this.position=this.arr.indexOf(e.target);

? ? ? ? // 當使用回調(diào)函數(shù)時,this被重新指向,因此我們需要使用箭頭函數(shù)重新將this指向?qū)嵗膶ο?/p>

? ? ? this.setStar(index=>{

? ? ? ? ? return index<=this.position;

? ? ? });

? ? ? let evt=new Event(Star.STAR_SELECTED_EVENT);

? ? ? evt.position=this.position;

? ? ? evt.content=this.elem.firstElementChild.textContent;

? ? ? document.dispatchEvent(evt);

? ? }

? ? setStar(fn){

? ? ? ? for(let i=0;i<this.arr.length;i++){

? ? ? ? ? ? if(fn(i)){

? ? ? ? ? ? ? ? this.arr[i].style.backgroundPositionY="-16px";

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? this.arr[i].style.backgroundPositionY="0px";

? ? ? ? ? ? }


? ? ? ? }

? ? }

}

//Utils.js

export default class Utils {

? ? static IMG_LOAD_FINISH = "img_load_finish";

? ? constructor() {

? ? }

? ? static ce(type, style, prop) {

? ? ? ? let elem = document.createElement(type);

? ? ? ? if (style) Object.assign(elem.style, style);

? ? ? ? if (prop) Object.assign(elem, prop);

? ? ? ? return elem;

? ? }

? ? static randomColor() {

? ? ? ? let c = "#";

? ? ? ? for (let i = 0; i < 6; i++) {

? ? ? ? ? ? c += Math.floor(Math.random() * 16).toString(16);

? ? ? ? }

? ? ? ? return c;

? ? }

? ? static random(min, max) {

? ? ? ? return Math.floor(Math.random() * (max - min) + min);

? ? }

? ? static loadImgs(imgList, baseUrl, handler, type) {

? ? ? ? let img = new Image();

? ? ? ? img.addEventListener("load", Utils.loadHandler);

? ? ? ? let url = Utils.getImgUrl(imgList[0], baseUrl, type);

? ? ? ? img.src = url;

? ? ? ? img.imgList = imgList;

? ? ? ? img.baseUrl = baseUrl;

? ? ? ? img.handler = handler;

? ? ? ? img.type = type;

? ? ? ? img.list = [];

? ? ? ? img.num = 0;

? ? }

? ? static loadHandler(e) {

? ? ? ? let img = this.cloneNode(false);

? ? ? ? this.list.push(img);

? ? ? ? this.num++;

? ? ? ? if (this.num > this.imgList.length - 1) {

? ? ? ? ? ? this.removeEventListener("load", Utils.loadHandler);

? ? ? ? ? ? if (this.handler) {

? ? ? ? ? ? ? ? this.handler(this.list);

? ? ? ? ? ? ? ? return;

? ? ? ? ? ? }

? ? ? ? ? ? let evt = new Event(Utils.IMG_LOAD_FINISH);

? ? ? ? ? ? evt.list = this.list;

? ? ? ? ? ? document.dispatchEvent(evt);

? ? ? ? ? ? return;

? ? ? ? }

? ? ? ? this.src = Utils.getImgUrl(this.imgList[this.num], this.baseUrl, this.type);

? ? }

? ? static getImgUrl(name, baseUrl, type) {

? ? ? ? let url = "";

? ? ? ? if (baseUrl) url += baseUrl;

? ? ? ? if (type) {

? ? ? ? ? ? if (name.indexOf(".") < 0) name += "." + type;

? ? ? ? ? ? else name = name.replace(/\.\w+$/, "." + type);

? ? ? ? }

? ? ? ? url += name;

? ? ? ? return url

? ? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咨察,一起剝皮案震驚了整個濱河市补胚,隨后出現(xiàn)的幾起案子经磅,更是在濱河造成了極大的恐慌衣撬,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件须教,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機病袄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迟赃,“玉大人陪拘,你說我怎么就攤上這事∠吮冢” “怎么了左刽?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長酌媒。 經(jīng)常有香客問我欠痴,道長,這世上最難降的妖魔是什么秒咨? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任喇辽,我火速辦了婚禮晾捏,結(jié)果婚禮上枯冈,老公的妹妹穿的比我還像新娘嚎卫。我一直安慰自己评姨,他們只是感情好补履,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著播瞳,像睡著了一般理肺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上云茸,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天是目,我揣著相機與錄音,去河邊找鬼标捺。 笑死懊纳,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的亡容。 我是一名探鬼主播嗤疯,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼闺兢!你這毒婦竟也來了身弊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤列敲,失蹤者是張志新(化名)和其女友劉穎阱佛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戴而,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡凑术,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了所意。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淮逊。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扶踊,靈堂內(nèi)的尸體忽然破棺而出泄鹏,到底是詐尸還是另有隱情,我是刑警寧澤秧耗,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布备籽,位于F島的核電站,受9級特大地震影響分井,放射性物質(zhì)發(fā)生泄漏车猬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一尺锚、第九天 我趴在偏房一處隱蔽的房頂上張望珠闰。 院中可真熱鬧,春花似錦瘫辩、人聲如沸伏嗜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽承绸。三九已至吹散,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間八酒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工刃唐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留羞迷,地道東北人。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓画饥,卻偏偏與公主長得像衔瓮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抖甘,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361