mdui
Version:
a CSS Framework based on material design
188 lines (157 loc) • 5.12 kB
text/typescript
import $ from 'mdui.jq/es/$';
import { JQ } from 'mdui.jq/es/JQ';
import 'mdui.jq/es/methods/addClass';
import 'mdui.jq/es/methods/append';
import 'mdui.jq/es/methods/attr';
import 'mdui.jq/es/methods/css';
import 'mdui.jq/es/methods/data';
import 'mdui.jq/es/methods/each';
import 'mdui.jq/es/methods/empty';
import 'mdui.jq/es/methods/find';
import 'mdui.jq/es/methods/hasClass';
import 'mdui.jq/es/methods/on';
import 'mdui.jq/es/methods/parent';
import 'mdui.jq/es/methods/remove';
import 'mdui.jq/es/methods/removeClass';
import 'mdui.jq/es/methods/text';
import 'mdui.jq/es/methods/val';
import 'mdui.jq/es/methods/width';
import Selector from 'mdui.jq/es/types/Selector';
import { isUndefined } from 'mdui.jq/es/utils';
import mdui from '../../mdui';
import { $document } from '../../utils/dom';
import {
endEvent,
isAllow,
register,
startEvent,
unlockEvent,
} from '../../utils/touchHandler';
declare module '../../interfaces/MduiStatic' {
interface MduiStatic {
/**
* 动态修改了滑块后,需要调用该方法重新初始化滑块
*
* 若传入了参数,则只初始化该参数对应的滑块。若没有传入参数,则重新初始化所有滑块。
* @param selector CSS 选择器、或 DOM 元素、或 DOM 元素组成的数组、或 JQ 对象
*/
updateSliders(
selector?: Selector | HTMLElement | ArrayLike<HTMLElement>,
): void;
}
}
/**
* 滑块的值改变后修改滑块样式
* @param $slider
*/
function updateValueStyle($slider: JQ): void {
const data = $slider.data();
const $track = data._slider_$track;
const $fill = data._slider_$fill;
const $thumb = data._slider_$thumb;
const $input = data._slider_$input;
const min = data._slider_min;
const max = data._slider_max;
const isDisabled = data._slider_disabled;
const isDiscrete = data._slider_discrete;
const $thumbText = data._slider_$thumbText;
const value = $input.val();
const percent = ((value - min) / (max - min)) * 100;
$fill.width(`${percent}%`);
$track.width(`${100 - percent}%`);
if (isDisabled) {
$fill.css('padding-right', '6px');
$track.css('padding-left', '6px');
}
$thumb.css('left', `${percent}%`);
if (isDiscrete) {
$thumbText.text(value);
}
percent === 0
? $slider.addClass('mdui-slider-zero')
: $slider.removeClass('mdui-slider-zero');
}
/**
* 重新初始化滑块
* @param $slider
*/
function reInit($slider: JQ): void {
const $track = $('<div class="mdui-slider-track"></div>');
const $fill = $('<div class="mdui-slider-fill"></div>');
const $thumb = $('<div class="mdui-slider-thumb"></div>');
const $input = $slider.find('input[type="range"]') as JQ<HTMLInputElement>;
const isDisabled = $input[0].disabled;
const isDiscrete = $slider.hasClass('mdui-slider-discrete');
// 禁用状态
isDisabled
? $slider.addClass('mdui-slider-disabled')
: $slider.removeClass('mdui-slider-disabled');
// 重新填充 HTML
$slider.find('.mdui-slider-track').remove();
$slider.find('.mdui-slider-fill').remove();
$slider.find('.mdui-slider-thumb').remove();
$slider.append($track).append($fill).append($thumb);
// 间续型滑块
let $thumbText = $();
if (isDiscrete) {
$thumbText = $('<span></span>');
$thumb.empty().append($thumbText);
}
$slider.data('_slider_$track', $track);
$slider.data('_slider_$fill', $fill);
$slider.data('_slider_$thumb', $thumb);
$slider.data('_slider_$input', $input);
$slider.data('_slider_min', $input.attr('min'));
$slider.data('_slider_max', $input.attr('max'));
$slider.data('_slider_disabled', isDisabled);
$slider.data('_slider_discrete', isDiscrete);
$slider.data('_slider_$thumbText', $thumbText);
// 设置默认值
updateValueStyle($slider);
}
const rangeSelector = '.mdui-slider input[type="range"]';
$(() => {
// 滑块滑动事件
$document.on('input change', rangeSelector, function () {
const $slider = $(this).parent() as JQ<HTMLElement>;
updateValueStyle($slider);
});
// 开始触摸滑块事件
$document.on(startEvent, rangeSelector, function (event: Event) {
if (!isAllow(event)) {
return;
}
register(event);
if ((this as HTMLInputElement).disabled) {
return;
}
const $slider = $(this).parent() as JQ<HTMLElement>;
$slider.addClass('mdui-slider-focus');
});
// 结束触摸滑块事件
$document.on(endEvent, rangeSelector, function (event: Event) {
if (!isAllow(event)) {
return;
}
if ((this as HTMLInputElement).disabled) {
return;
}
const $slider = $(this).parent() as JQ<HTMLElement>;
$slider.removeClass('mdui-slider-focus');
});
$document.on(unlockEvent, rangeSelector, register);
/**
* 初始化滑块
*/
mdui.mutation('.mdui-slider', function () {
reInit($(this));
});
});
mdui.updateSliders = function (
selector?: Selector | HTMLElement | ArrayLike<HTMLElement>,
): void {
const $elements = isUndefined(selector) ? $('.mdui-slider') : $(selector);
$elements.each((_, element) => {
reInit($(element));
});
};