3,389
个编辑
MCBBS Wiki欢迎您共同参与编辑!在参与编辑之前请先阅读Wiki方针。
如果在编辑的过程中遇到了什么问题,可以去讨论板提问。
为了您能够无阻碍地参与编辑 未验证/绑定过邮箱的用户,请尽快绑定/验证。
MCBBS Wiki GitHub群组已上线!
您可以在回声洞中发表吐槽!
服务器状态监控。点击进入
本站由MCBBS用户自行搭建,与MCBBS及东银河系漫游指南(北京)科技有限公司没有从属关系。点此了解 MCBBS Wiki 不是什么>>
Salt lovely(留言 | 贡献) 小 (编辑“微件:SaltVoteContainer” // 维基盐编辑器) |
Salt lovely(留言 | 贡献) 小 (编辑“微件:SaltVoteContainer” // 维基盐编辑器) |
||
| 第1行: | 第1行: | ||
<noinclude>用于展示投票箱</noinclude><includeonly><script> | <noinclude>用于展示投票箱</noinclude><includeonly><script> | ||
/** | /** | ||
* | * | ||
| 第16行: | 第15行: | ||
document.body.querySelectorAll("div.salt-vote-container.not-init") | document.body.querySelectorAll("div.salt-vote-container.not-init") | ||
); | ); | ||
const at = (arr, index) => { | const at = (arr, index) => { | ||
| 第29行: | 第27行: | ||
}; | }; | ||
/** 渲染条状图内容 @type {(collect: {name: string, set: string[]}[], color: string[]) => string} */ | /** 渲染条状图内容 @type {(collect: {name: string, set: string[], li: HTMLElement, count: HTMLElement}[], color: string[], hasBar: boolean) => { barHTML: string }} */ | ||
const | const renderPercent = (collect, color, hasBar) => { | ||
const countAll = collect.reduce((prev, curr) => { | const countAll = collect.reduce((prev, curr) => { | ||
return prev + curr.set.length; | return prev + curr.set.length; | ||
}, 0); | }, 0); | ||
const divList = collect.map( | // 计算百分比 | ||
const percent = collect.map(({ set, li, count }) => { | |||
const res = Number(((set.length * 100) / countAll).toFixed(2)); | |||
li.style.setProperty("--vote-percent", `${res}%`); // 顺便把百分比记录上去 | |||
count.textContent = `${set.length} (${res}%)`; | |||
return res; | |||
}); | |||
const divList = hasBar | |||
? collect.map( | |||
return divList.join(""); | ({ name, set }, i) => | ||
`<div class="salt-vote-bar-item" title="${name.replace( | |||
/"/g, | |||
"'" | |||
)}" style="--vote-color:${at(color, i)};width:${ | |||
set.length ? percent[i] : 0 | |||
}%">${Number(percent[i])}%</div>` | |||
) | |||
: []; | |||
return { barHTML: divList.join("") }; | |||
}; | }; | ||
| 第56行: | 第63行: | ||
const descUl = el.querySelector(".salt-vote-describe"); | const descUl = el.querySelector(".salt-vote-describe"); | ||
const descLi = descUl && descUl.querySelectorAll("li"); | const descLi = descUl && descUl.querySelectorAll("li"); | ||
/** 收集的投票信息 @type {{name: string, set: string[], li: HTMLElement, desc?: HTMLElement}[]} */ | /** 收集的投票信息 @type {{name: string, set: string[], li: HTMLElement, count: HTMLElement, desc?: HTMLElement}[]} */ | ||
const collect = []; | const collect = []; | ||
/** 收集的投票信息 @type {{name: string, desc: HTMLElement}[]} */ | /** 收集的投票信息 @type {{name: string, desc: HTMLElement}[]} */ | ||
| 第96行: | 第103行: | ||
const title = option.textContent || ""; | const title = option.textContent || ""; | ||
const voters = Array.from(voter.querySelectorAll("a")); | const voters = Array.from(voter.querySelectorAll("a")); | ||
const count = document.createElement("div"); | |||
const thisCollect = { name: title, set: [], li: li }; | const thisCollect = { name: title, set: [], li: li, count }; | ||
voters.forEach((v) => { | voters.forEach((v) => { | ||
const res = v.title | const res = v.title | ||
| 第116行: | 第123行: | ||
}); | }); | ||
collect.push(thisCollect); | collect.push(thisCollect); | ||
// | // 外观 | ||
li.style.setProperty("--vote-color", at(color, liIndex)); | li.appendChild(count); | ||
count.className = "salt-vote-option-count"; | |||
li.style.setProperty("--vote-color", at(color, liIndex)); // 配色 | |||
li.style.setProperty("--vote-count", `${thisCollect.set.length}`); | |||
// 点击展开选项描述 | // 点击展开选项描述 | ||
const desc = descCollect.find(({ name }) => name === title); | const desc = descCollect.find(({ name }) => name === title); | ||
| 第139行: | 第149行: | ||
}); | }); | ||
// 绘制图形 | // 绘制图形 | ||
const { barHTML } = renderPercent(collect, color, !!barEl); | |||
if (barEl) barEl.innerHTML = barHTML; | |||
}; | }; | ||