123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- /*
- * @Description: 构建弹窗
- * @Autor: kindring
- * @Date: 2021-10-12 17:16:30
- * @LastEditors: kindring
- * @LastEditTime: 2021-11-15 10:37:16
- * @LastDescript:
- */
- class CustomPop {
- constructor(option) {
- let defaultOption = {
- type: 'tip', //tip,custom,loading,text居中文本
- mask: false,
- centerDoms: null, //中间的所有dom元素,用于自定义提示,数组模式,字符串
- text: null,
- }
- // 小窗口弹窗,则默认只允许设置为body
- this.el = option.el || window.document.body;
- this.maskEl = null;
- this.parentEl = null;
- this.type = option.type || defaultOption.type;
- this.mask = option.mask;
- this.tipNum = 0;
- this.tipStep = 40;
- this.centerDoms = option.centerDoms
- if (this.type == 'tip') {
- this.el == window.document.body;
- } else if (this.type == 'custom') {
- // if(window.document.body)
- // this.maskEl = this.buildMask();
- this.create();
- }
- if (option.autoClose) {
- this.parentEl.addEventListener('click', (e) => {
- this.hide()
- })
- }
- this.option = option;
- this.nowCustomKey = null;
- this.bind();
- }
- // 绑定操作,将dom元素绑定到指定的dom元素中,指定dom元素自动添加 relative
- bind() {
- // console.log(this.el.style.position);
- if (!this.el.style.position) {
- this.el.style.position = 'relative'
- }
- }
- // 创建自定义的dom元素
- create() {
- let parentDom = document.createElement('div');
- // 设置dom元素样式
- this.setStyle(parentDom, {
- display: 'none',
- position: 'absolute',
- left: 0,
- top: 0,
- width: '100%',
- height: '100%',
- 'justify-center': 'center',
- 'alignItems': 'center'
- });
- if (this.mask) {
- let maskEl = document.createElement('div');
- this.setStyle(maskEl, {
- position: 'absolute',
- left: 0,
- top: 0,
- width: '100%',
- height: '100%',
- backgroundColor: 'rgba(0,0,0)',
- opacity: '0.3'
- })
- this.maskEl = maskEl;
- parentDom.appendChild(maskEl);
- }
- if (this.centerDoms) {
- this.centerDoms.forEach(item => {
- item.el.parentElement.removeChild(item.el)
- })
- }
- this.parentEl = parentDom;
- // 添加元素至dom元素中
- this.el.appendChild(parentDom);
- }
- // 显示界面,优先匹配中间内容
- show(text, theme) {
- // console.log(this.type);
- if (this.type == 'tip') {
- let _time = this.tipNum;
- _time = Math.min(10, _time);
- // 设置dom延时进行弹窗提示
- setTimeout(() => {
- // console.log(this.type);
- // 构建tip
- let tipDom = this.buildTip(theme);
- tipDom.innerHTML = text;
- //自动添加到body中去
- this.el.appendChild(tipDom);
- // 自动显示dom元素并且隐藏
- setTimeout(() => {
- this.setStyle(tipDom, {
- opacity: '1'
- })
- setTimeout(() => {
- this.setStyle(tipDom, {
- top: `${50+(_time * this.tipStep)}px`
- })
- }, 100);
- setTimeout(() => {
- this.setStyle(tipDom, {
- opacity: 0,
- top: `${200+(_time * this.tipStep)}px`
- })
- setTimeout(() => {
- this.setStyle(tipDom, {
- display: 'none',
- })
- this.tipNum--;
- this.el.removeChild(tipDom);
- }, 900);
- }, 2200);
- }, 1);
- }, this.tipNum * this.tipStep);
- this.tipNum++;
- return;
- } else if (this.type == 'custom') {
- let centerDom = null;
- if (text) {
- let doms;
- if (this.centerDoms) {
- doms = this.centerDoms.find(item => {
- if (item.key == text) {
- return item;
- }
- })
- }
- if (!doms) {
- doms = {
- el: document.createElement('span'),
- key: 'null'
- }
- doms.el.innerHTML = text;
- }
- centerDom = doms;
- } else if (this.option.centerDoms) {
- //默认选择第一个dom元素
- centerDom = this.option.centerDoms[0];
- } else {
- //如果没有字符串,并且也没有默认节点,则无视此窗口
- console.error('错误');
- }
- if (centerDom) {
- if (this.nowCustomKey == text) {
- // 直接显示dom元素
- } else {
- // 修改dom元素
- this.parentEl.innerHTML = '';
- if (this.mask) {
- this.parentEl.appendChild(this.maskEl)
- }
- centerDom.el.addEventListener('click', function(e) {
- e = e || window.event;
- e.preventDefault();
- });
- // 重新构建
- this.parentEl.appendChild(centerDom.el)
- }
- }
- this.nowCustomKey = text;
- this.setStyle(this.parentEl, {
- display: 'flex'
- })
- }
- };
- // hide隐藏界面
- hide() {
- if (this.type == 'custom') {
- this.setStyle(this.parentEl, {
- display: 'none'
- });
- } else {
- console.error('其他类型的元素正在制作中');
- }
- }
- buildMask() {
- return maskEl
- }
- /**
- * 构建提示元素
- * @param {'info'|'success'|'warn'|'error'} _theme 样式主题,
- */
- buildTip(_theme) {
- let el = document.createElement('div');
- _theme = _theme || 'default';
- this.setStyle(el, {
- 'transition': 'all 0.5s',
- position: 'absolute',
- top: '555px',
- left: '50%',
- transform: 'translate(-50%,0)',
- display: 'block',
- padding: '5px 25px',
- 'border-radius': '5px',
- opacity: 0,
- })
- if (_theme == 'error' || _theme == 'err') {
- this.setStyle(el, {
- color: '#D8000C',
- backgroundColor: '#FFBABA',
- border: '1px solid rgb(219 176 176)'
- })
- } else if (_theme == 'success' || _theme == 'ok') {
- this.setStyle(el, {
- color: '#4F8A10',
- backgroundColor: '#DFF2BF',
- border: '1px solid rgb(227 253 182)'
- })
- } else if (_theme == 'warn' || _theme == 'warning' || _theme == 'waring') {
- this.setStyle(el, {
- color: '#9F6000',
- backgroundColor: '#FEEFB3',
- border: '1px solid rgb(241 229 180)'
- })
- } else {
- this.setStyle(el, {
- color: '#31708f',
- backgroundColor: '#d9edf7',
- border: '1px solid #bce8f1'
- })
- }
- return el;
- }
- // 辅助函数,设置dom元素的样式
- setStyle(el, params) {
- Object.keys(params).forEach(key => {
- let strArr = key.split('-');
- let strKey = key;
- if (strArr.length >= 2) {
- strKey = strArr.reduce((acc, current, index) => {
- // console.log();
- // 第一位
- return index == 0 ? current : acc + (current.replace(current[0], current[0].toUpperCase()))
- }, '')
- } else {
- strKey = strArr[0]
- }
- el.style[strKey] = params[key];
- })
- return el;
- }
- // 确认的函数
- onOk() {
- }
- // 取消弹窗的函数
- onCancel() {
- }
- }
|