/* * @Author: Patrick-Jun * @Date: 2020-08-03 11:21:42 * @Last Modified by: Patrick-Jun * @Last Modified time: 2020-11-03 23:49:34 * @Git: https://github.com/Patrick-Jun/jQuery.rollNumber.git */ (function($) { $.fn.rollNumber = function(options) { let $self = this; if (options.number === undefined) return; let number = options.number, speed = options.speed || 500, interval = options.interval || 100, fontStyle = options.fontStyle, rooms = options.rooms || String(options.number).split('').length, _fillZero = !!options.rooms; fontStyle.color = fontStyle.color || '#000'; fontStyle['font-size'] = fontStyle['font-size'] || 14; // 计算单个数字宽度 $self.css({ display: 'flex', 'justify-content': 'center', 'align-items': 'center', 'font-size': fontStyle['font-size'], color: 'rgba(0,0,0,0)' }).text(number); let _height = $self.height(); let space = options.space || _height/2; $self.empty(options); // 添加滚动元素 let numberHtml = ''; for (let i = 0; i < 10; i++) numberHtml += `${ i }`; numberHtml = `
${ numberHtml }
` // 处理数字 let numArr = String(number).split(''); if (_fillZero) { // 前置补0 // 当含有小数时,补0位数应该+1 if (String(number).indexOf('.') !== -1) rooms++; for (let i = numArr.length; i < rooms; i++) { numArr.unshift(0); } number = numArr.join(''); } if (!!options.symbol) { // 含千分位 let appendHtml = []; let symbolHtml = `${ options.symbol }`; let dotHtml = `.`; symbolHtml = `
${ symbolHtml }
`; dotHtml = `
${ dotHtml }
`; let numarr = String(number).split('.'); const re = /(-?\d+)(\d{3})/; while (re.test(numarr[0])) { numarr[0] = numarr[0].replace(re, '$1,$2'); } numArr = (numarr.length > 1 ? numarr[0] + '.' + numarr[1] : numarr[0]).split(''); for (let i = 0; i < numArr.length; i++) { if (isNaN(Number(numArr[i]))) { // 判断是否是符号 if (numArr[i] === '.') { // 判断小数 appendHtml.push(dotHtml); } else { appendHtml.push(symbolHtml); } } else { appendHtml.push(numberHtml); } } $self.append(appendHtml.join('')).css(fontStyle); }else { $self.append(numberHtml.repeat(rooms)).css(fontStyle); // 处理小数符号 if (String(number).indexOf('.') !== -1) { $($self.find('._number')[String(number).indexOf('.')]).find('span')[0].innerHTML = '.'; } } let domArr = $self.find('._number'); for (let i = 0; i < domArr.length; i++) { setTimeout(function(dom, n) { $(dom.children[0].children[0]).animate({ 'top': -_height * n + 'px' // 千分位*number = NaN px }, speed); }, interval*(domArr.length - i), domArr[i], numArr[i]); } } })(jQuery);