原生Javascript實現星星評分元件
前言
元件分兩種狀態
- 只讀
只負責接受資料然後顯示,使用者不可操作,精確到小數點後1位 - 可操作
按道理講,不接受資料,預設為0分,滑鼠移入進行預覽效果,滑鼠移出恢復預設值,滑鼠點選設定預設值
效果圖
程式碼
html
// 只讀狀態,不繫結事件
<div class="star-component" data-rate="9.2" readonly="true"></div>
// 可操作狀態,初始值為0,不應該傳data-rate值
<div class="star-component"></div>
<script>
const rate = new StarRate('.star-component');
</script>
css
.star-component {
position: relative;
display: inline-block;
}
.star-component .star-item {
display: inline-block;
width: 30px;
height: 30px;
cursor: pointer;
padding-right: 5px;
transition: all .1s ease-in;
}
.star-component:not(.star-readonly) .star-item:hover {
transform: scale(1.2);
}
.star-component:not(.star-readonly) .star-item:active {
transform: scale(1.3);
}
.star-component .star-item.star-on {
background: url('star-on.png') no-repeat center / 30px;
}
.star-component .star-item.star-off {
background: url('star-off.png') no-repeat center / 30px;
}
// 只讀狀態的星星層,定位覆蓋背景層,然後動態設定寬度
.star-component.star-readonly .star {
position: absolute;
top: 0;
left: 0;
white-space: nowrap;
overflow: hidden;
}
.star-component.star-readonly .star-item {
cursor: not-allowed;
}
javascript
/// StarRate類,如果用jquery寫程式碼會少很多
class StarRate {
constructor(el, options) {
this.el = document.querySelectorAll(el); // 元件節點類名
this.options = options || {}; // 引數
this.init(); // 當例項化物件之後立刻初始化該元件,而不用使用者自己rate.init();
}
insertTemplate() {
this.el.forEach(item => {
let readonly = item.classList.contains('star-readonly'); // contains方法可以判斷該節點是否存在指定類名,返回true或者false
let rate = readonly ? Number(item.getAttribute('data-rate')) : 0; // 評分值
if (rate > 10 || rate < 0) throw new Error('data-rate的值應為0-10之間'); // 丟擲錯誤警告
readonly ? this.insertForReadonly(item, rate) : this.insertForUser(item, rate); // 分發
})
}
insertForReadonly(el, rate) {
// 背景層
let bgElement = document.createElement('div');
bgElement.className = 'background';
// 星星層
let starElement = document.createElement('div');
starElement.className = 'star';
starElement.style.width = rate * 10 + '%'; // 動態設定寬度
// 插入模板
for (let i = 0; i < 5; i++) {
bgElement.innerHTML += '<div class="star-item star-off"></div>';
starElement.innerHTML += '<div class="star-item star-on"></div>';
}
el.appendChild(bgElement);
el.appendChild(starElement);
}
insertForUser(el, rate) {
// 插入模板
let template = '';
for (let i = 0; i < 5; i++) {
template += `<div class="star-item star-off" data-index="${i}"></div>`
}
el.innerHTML = template;
this.bindEvent(el, rate); // 只為可操作的元件繫結事件
}
bindEvent(el, rate) {
var star = el.querySelectorAll('.star-item');
star.forEach((item, index) => {
item.addEventListener('mouseenter', () => {
// 滑鼠移入預覽
this.lightOn(el, index + 1);
});
item.addEventListener('mouseleave', () => {
// 滑鼠移開回到預設值
this.lightOn(el, rate);
});
item.addEventListener('click', () => {
// 滑鼠點選設定預設值
rate = index + 1;
item.parentNode.setAttribute('data-rate', (rate * 2)); // 設定data-rate屬性到元件,方便拿
this.lightOn(el, index + 1);
});
})
}
lightOn(el, rate) {
el.querySelectorAll('.star-item').forEach((item, index) => {
if (index < rate) {
item.classList.add('star-on');
item.classList.remove('star-off');
} else {
item.classList.add('star-off');
item.classList.remove('star-on');
}
})
}
init() {
this.insertTemplate();
}
}
如果您喜歡這篇文章,那麼記得動動你們的?,給個like或者關注我哦?。
相關文章
- 微信小程式實現星星評分效果微信小程式
- Swift 星星評價控制元件Swift控制元件
- JavaScript 原生實現進度條元件.mdJavaScript元件
- 原生javascript實現的選取搜尋元件JavaScript元件
- 原生Javascript實現BindJavaScript
- Qml 實現星級評分元件 已釋出元件
- VUE實現評分效果和不同型別分數展示效果元件Vue型別元件
- 使用原生javascript實現jquery的$(function(){ })JavaScriptjQueryFunction
- JavaScript原生實現樓梯外掛JavaScript
- 原生JavaScript實現造日曆輪子JavaScript
- 原生 JavaScript 實現 state 狀態管理系統JavaScript
- 用純css實現打星星效果(三)CSS
- Flutter 實現webview與原生元件組合滑動FlutterWebView元件
- 原生JavaScript實現頁面回到頂部的功能JavaScript
- JavaScript new 關鍵詞解析及原生實現 newJavaScript
- 【實戰】用原生的 JavaScript Intersection Observer API 實現 Lazy LoadingJavaScriptServerAPI
- [WPF]原生TabControl控制元件實現拖拽排序功能控制元件排序
- 根據JavaScript中原生的XMLHttpRequest實現jQuery的AjaxJavaScriptXMLHTTPjQuery
- 原生JavaScript實現的SPA單頁應用(hash路由)JavaScript路由
- 從零開始實現一個顏色選擇器(原生JavaScript實現)JavaScript
- MAUI中構建跨平臺原生控制元件實現UI控制元件
- Vue結合原生js實現自定義元件自動生成VueJS元件
- swift4.0 星星評分starView封裝,xib和純程式碼使用方便簡單SwiftView封裝
- 基於規則評分的密碼強度檢測演算法分析及實現(JavaScript)密碼演算法JavaScript
- JQuery raty.js書寫星星評價步驟jQueryJS
- 原生 JS實現一個簡單分頁外掛JS
- 原生js實現一個側滑刪除取消元件(item slide)JS元件IDE
- 三種方式使用純 CSS 實現星級評分CSS
- 【新特性速遞】評分,評分,評分
- 使用Chrome開發者工具研究JavaScript裡函式的原生實現ChromeJavaScript函式
- 比Django官方實現更好的分頁元件+Bootstrap整合Django元件boot
- 原生 js 實現瀑布流佈局、React 版本的瀑布流佈局元件JSReact元件
- JavaScript Sanitizer API:原生WEB安全API出現啦JavaScriptAPIWeb
- 100行程式碼實現一個vue分頁元件行程Vue元件
- 【Android View】寫一個蛛網評分控制元件AndroidView控制元件
- 數星星
- JavaScript實現垃圾分類小遊戲教程,附原始碼!JavaScript遊戲原始碼
- Select 元件實現元件