This repository has been archived on 2023-08-30. You can view files and clone it, but cannot push or open issues/pull-requests.
bytedo
/
wcui
Archived
1
0
Fork 0

完成layer的移植

old
宇天 2018-05-16 17:16:57 +08:00
parent 72b67f455e
commit ddd07ecca3
2 changed files with 105 additions and 132 deletions

View File

@ -39,9 +39,9 @@ const close = function(id) {
if (typeof id !== 'string' && typeof id !== 'number') { if (typeof id !== 'string' && typeof id !== 'number') {
return Anot.error('要关闭的layer实例不存在') return Anot.error('要关闭的layer实例不存在')
} }
if (/^\$wrap\-/.test(id) || layerObj['$wrap-' + id]) { if (/^layerwrap\-/.test(id) || layerObj['layerwrap-' + id]) {
try { try {
id = (layerObj['$wrap-' + id] ? '$wrap-' : '') + id id = (layerObj['layerwrap-' + id] ? 'layerwrap-' : '') + id
//未显示过,忽略 //未显示过,忽略
if (!layerObj[id].show) { if (!layerObj[id].show) {
return return
@ -134,6 +134,7 @@ class __layer__ {
skip: [ skip: [
'area', 'area',
'shift', 'shift',
'offset',
'skin', 'skin',
'mask', 'mask',
'maskClose', 'maskClose',
@ -141,12 +142,15 @@ class __layer__ {
'follow' 'follow'
], ],
methods: { methods: {
onMaskClick: function() { shake() {
if (this.type < 4 && !this.maskClose) {
this.$refs.layer.classList.add('scale') this.$refs.layer.classList.add('scale')
setTimeout(() => { setTimeout(() => {
this.$refs.layer.classList.remove('scale') this.$refs.layer.classList.remove('scale')
}, 100) }, 100)
},
onMaskClick: function() {
if (this.type < 4 && !this.maskClose) {
this.shake()
} else { } else {
this.maskClose && this.close() this.maskClose && this.close()
} }
@ -154,7 +158,7 @@ class __layer__ {
handleConfirm: function() { handleConfirm: function() {
if (this.type === 3) { if (this.type === 3) {
if (!this.prompt) { if (!this.prompt) {
return return this.shake()
} }
} }
if (typeof this.props.yes === 'function') { if (typeof this.props.yes === 'function') {
@ -216,10 +220,6 @@ class __layer__ {
} }
} }
if (state.type === 5) {
layBox.classList.add('active')
}
if (state.toast) { if (state.toast) {
layBox.classList.add('type-toast') layBox.classList.add('type-toast')
} else { } else {
@ -248,9 +248,7 @@ class __layer__ {
} }
let arrow = '' let arrow = ''
if (state.type === 5) { if (state.type === 5) {
arrow += `<i class="arrow" style="border-top-color: ${ arrow += `<i class="arrow"></i>`
state.background
};"></i>`
} }
layBox.innerHTML = ` layBox.innerHTML = `
@ -334,12 +332,14 @@ class __layer__ {
} }
append() { append() {
let { state, $id, container } = this.init let { state, $id } = this.init
let container = state.container
if (state.type < 4) {
// 如果有已经打开的弹窗,则关闭 // 如果有已经打开的弹窗,则关闭
if (unique) { if (unique) {
close(unique) close(unique)
} }
if (state.type < 4) {
unique = $id unique = $id
} }
@ -358,7 +358,8 @@ class __layer__ {
} }
show() { show() {
let { state, $id, follow } = this.init let { state, $id } = this.init
let container = state.container
setTimeout(function() { setTimeout(function() {
let style = { background: state.background } let style = { background: state.background }
@ -368,16 +369,45 @@ class __layer__ {
if (state.type === 5) { if (state.type === 5) {
// only type[tips] can define `color` // only type[tips] can define `color`
style.color = state.color style.color = state.color
let $follow = Anot(follow)
let ew = $follow.innerWidth()
let ol = $follow.offset().left - document.body.scrollLeft
let ot = $follow.offset().top - document.body.scrollTop
style.left = ol + ew * 0.7
style.top = ot - parseInt(css.height) - 8
style.opacity = 1 style.opacity = 1
let $container = Anot(container)
let $arrow = $container[0].querySelector('.arrow')
let cw = $container.innerWidth()
let ch = $container.innerHeight()
let ol = $container.offset().left - document.body.scrollLeft
let ot = $container.offset().top - document.body.scrollTop
let layw = parseInt(css.width)
let layh = parseInt(css.height)
let arrowOffset = ['top']
if (ot + 18 < layh) {
arrowOffset[0] = 'bottom'
$arrow.style.borderBottomColor = state.background
style.top = ot + ch + 8
} else {
$arrow.style.borderTopColor = state.background
style.top = ot - layh - 8
}
if (ol + cw * 0.7 + layw > window.innerWidth) {
style.left = ol + cw * 0.3 - layw
arrowOffset[1] = 'left'
} else {
style.left = ol + cw * 0.7
}
$arrow.classList.add('offset-' + arrowOffset.join('-'))
Anot(layerDom[$id][1]).css(style) Anot(layerDom[$id][1]).css(style)
$container.bind('mouseenter', ev => {
layerDom[$id][1].style.visibility = 'visible'
})
$container.bind('mouseleave', () => {
setTimeout(() => {
layerDom[$id][1].style.visibility = 'hidden'
}, 100)
})
} else { } else {
let offsetStyle = { opacity: 1 } let offsetStyle = { opacity: 1 }
if (state.offset) { if (state.offset) {
@ -537,11 +567,9 @@ const _layer = {
}, },
tips: function(content, container, opt = {}) { tips: function(content, container, opt = {}) {
if (!(container instanceof HTMLElement)) { if (!(container instanceof HTMLElement)) {
return Anot.error('tips类型必须指定一个目标容器') return Anot.error('layer "tips" require a DOM object')
}
if (!opt.hasOwnProperty('timeout')) {
opt.timeout = 2500
} }
if (!opt.background) { if (!opt.background) {
opt.background = 'rgba(0,0,0,.5)' opt.background = 'rgba(0,0,0,.5)'
} }
@ -554,7 +582,8 @@ const _layer = {
type: 5, type: 5,
fixed: true, fixed: true,
mask: false, mask: false,
menubar: false menubar: false,
timeout: 0
}) })
return _layer.open(opt) return _layer.open(opt)
}, },
@ -570,21 +599,16 @@ const _layer = {
type: 3, type: 3,
prompt: '', prompt: '',
title, title,
content: content: `<input class="prompt-value" data-duplex-focus :class="{alert: !prompt}" :duplex="prompt" />`,
'<input class="prompt-value" data-duplex-focus :class="{alert: !prompt}" :duplex="prompt" />',
fixed: true, fixed: true,
yes: yescb yes: yescb
} }
return _layer.open(opt) return _layer.open(opt)
}, },
use: function(skin, callback) {
require(['css!./skin/' + skin], callback)
},
close: close, close: close,
open: function(opt) { open: function(opt) {
console.log(opt)
if (typeof opt === 'string') { if (typeof opt === 'string') {
/*opt = '$wrap-' + opt opt = 'layerwrap-' + opt
if (!layerObj[opt]) { if (!layerObj[opt]) {
throw new Error('layer实例不存在') throw new Error('layer实例不存在')
} else { } else {
@ -594,19 +618,18 @@ const _layer = {
} }
layerObj[opt].show = true layerObj[opt].show = true
layerObj[opt].parentElem.appendChild(layerDom[opt][0])
layerDom[opt][0]
.querySelector('.layer-content')
.appendChild(layerObj[opt].wrap)
layerObj[opt].wrap.style.display = ''
if (!Anot.vmodels[opt]) { if (!Anot.vmodels[opt]) {
Anot(layerObj[opt].obj.init) Anot(layerObj[opt].obj.init)
} }
layerObj[opt].parentElem.appendChild(layerDom[opt][1])
layerDom[opt][1]
.querySelector('.detail')
.appendChild(layerObj[opt].wrap)
layerObj[opt].wrap.style.display = ''
// Anot.scan(layerDom[opt][1])
layerObj[opt].obj.show() layerObj[opt].obj.show()
return opt return opt
}*/ }
} else { } else {
return new __layer__(opt).init.$id return new __layer__(opt).init.$id
} }
@ -617,49 +640,42 @@ const _layer = {
Anot.directive('layer', { Anot.directive('layer', {
priority: 1400, priority: 1400,
init: function(binding) { init: function(binding) {
if (!binding.param || binding.param !== 'tips') {
binding.param = '' //去掉param,保证之后的逻辑处理正常
// 去掉:layer属性,避免二次扫描 // 去掉:layer属性,避免二次扫描
binding.element.removeAttribute(binding.name) binding.element.removeAttribute(binding.name)
if (!binding.param || binding.param !== 'tips') {
binding.param = '' // 去掉param,保证之后的逻辑处理正常
binding.element.style.display = 'none' binding.element.style.display = 'none'
} }
}, },
update: function(val) { update: function(val) {
if (!val) { if (!val) {
return Anot.error( return console.error(
':layer指令格式不正确或无效属性. [' + `SyntaxError: Unexpected [${this.name}=${this.expr}]`
this.name +
'="' +
this.expr +
'"]'
) )
} }
var _this = this,
init = Object.assign({}, this.element.dataset)
if (init.hasOwnProperty('area')) {
init.area = init.area.split(',')
}
if (init.hasOwnProperty('offset')) {
init.offset = init.offset.split(',')
}
if (init.hasOwnProperty('btns')) {
init.btns = init.btns.split(',')
}
if (!this.param) { if (!this.param) {
init.wrap = true let state = Object.assign({ type: 7, wrap: true }, this.element.dataset)
init.type = 7 let init = { $id: 'layerwrap-' + val, state, props: {} }
init.$id = '$wrap-' + val
if (!init.hasOwnProperty('menubar')) { if (state.hasOwnProperty('area')) {
init.menubar = false state.area = state.area.split(',')
}
if (state.hasOwnProperty('offset')) {
state.offset = state.offset.split(',')
}
if (state.hasOwnProperty('btns')) {
state.btns = state.btns.split(',')
} }
var tmp = new __layer__().construct(init) if (!state.hasOwnProperty('menubar')) {
state.menubar = false
}
let tmp = new __layer__().__init__(init)
//去掉data-*属性 //去掉data-*属性
for (var i in this.element.dataset) { for (let i in this.element.dataset) {
delete this.element.dataset[i] delete this.element.dataset[i]
} }
@ -671,54 +687,7 @@ Anot.directive('layer', {
} }
layerDom[tmp.init.$id] = tmp.create() layerDom[tmp.init.$id] = tmp.create()
} else if (this.param === 'tips') { } else if (this.param === 'tips') {
var $elem = Anot(this.element), _layer.tips(val, this.element)
ew = $elem.innerWidth(),
ol = $elem.offset().left - document.body.scrollLeft,
ot = $elem.offset().top - document.body.scrollTop,
tipsBox = document.createElement('div'),
tipsArrow = document.createElement('i'),
tipsCont = document.createElement('div')
tipsBox.className = 'do-layer skin-' + (init.skin || 'def') + ' type-5'
tipsBox.style.left = ol + ew * 0.7 + 'px'
if (init.background) {
tipsBox.style.background = init.background
tipsArrow.style.borderTopColor = init.background
}
if (init.color) {
tipsBox.style.color = init.color
}
tipsCont.className = 'layer-content'
tipsCont.textContent = val
tipsArrow.className = 'arrow'
tipsBox.appendChild(tipsCont)
tipsBox.appendChild(tipsArrow)
Anot(document).bind('scroll', function() {
ol = $elem.offset().left - document.body.scrollLeft
ot = $elem.offset().top - document.body.scrollTop
tipsBox.style.left = ol + ew * 0.7 + 'px'
tipsBox.style.top = ot - tipsBox.offsetHeight - 8 + 'px'
})
$elem.bind('mouseenter', function(ev) {
_this.element.parentNode.appendChild(tipsBox)
clearTimeout(_this.showTime)
clearTimeout(_this.hideTime)
_this.showTime = setTimeout(function() {
tipsBox.style.top = ot - tipsBox.offsetHeight - 8 + 'px'
tipsBox.classList.add('active')
}, 4)
})
$elem.bind('mouseleave', function() {
_this.hideTime = setTimeout(function() {
clearTimeout(_this.hideTime)
try {
_this.element.parentNode.removeChild(tipsBox)
} catch (err) {}
}, 150)
})
} }
} }
}) })

View File

@ -75,17 +75,21 @@
/* tips类弹层(type 5) */ /* tips类弹层(type 5) */
&.type-5 {visibility:hidden;min-width:75px;max-width:600px;line-height:1.5;color:#fff;background:rgba(0,0,0,.5);opacity:0;box-shadow:none;-webkit-transition:opacity .3s ease-in-out;-moz-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out; &.type-5 {visibility:hidden;z-index:65534;min-width:75px;max-width:600px;line-height:1.5;color:#fff;background:rgba(0,0,0,.5);opacity:0;box-shadow:none;-webkit-transition:opacity .3s ease-in-out;-moz-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out;
&.active {visibility:visible;opacity:1;} // &.active {visibility:visible;opacity:1;}
i.arrow {position:absolute;left:5px;bottom:-14px;width:0;height:0;border:6px solid transparent;border-top:8px solid rgba(0,0,0,.5);content: ""} i.arrow {position:absolute;width:0;height:0;border:6px solid transparent;content: ""}
i.offset-top {left:5px;bottom:-14px;border-top:8px solid rgba(0,0,0,.5);}
i.offset-bottom {left:5px;top:-14px;border-bottom:8px solid rgba(0,0,0,.5);}
i.offset-top-left {right:5px;bottom:-14px;border-top:8px solid rgba(0,0,0,.5);}
i.offset-bottom-left {right:5px;top:-14px;border-bottom:8px solid rgba(0,0,0,.5);}
.layer-content {margin:0;padding:0} .layer-content {min-height:20px;margin:0;padding:0}
} }
/* loading类弹层 */ /* loading类弹层 */
&.type-6 {box-shadow:none;background:transparent;} &.type-6 {z-index:65539;box-shadow:none;background:transparent;}
/* 特殊类弹层(toast弹层) */ /* 特殊类弹层(toast弹层) */
@ -119,10 +123,10 @@
} }
&.style-1 { &.style-1 {
.dot-box {animation: circle 1.3s infinite linear;} .dot-box {animation: circle .8s infinite linear;}
} }
&.style-2 { &.style-2 {
.dot-box {animation: round 1s infinite linear;} .dot-box {animation: round .6s infinite linear;}
} }
/* 频谱波动 */ /* 频谱波动 */