mint-ui 中的 Palette Button

mint-ui 中的 Palette Button

这个还是相对简单的 一个组件

首先介绍三个事件(我之前竟然还不知道这三个事件。。。)

animation 事件   CSS3动画事件

animationstart  css3 开始动画

animationiteration  css3 动画重复播放时 触发

animationend  css3 动画结束 后触发


然后介绍一下执行的 步骤

1、通过 touchstart 事件 来 触发 toggle => 包含了 缩回、放出 两个函数

"touchstart": _vm.toggle

2、通过 toggle 函数 判断当前处于什么状态,

toggle : function ( event ) {
if ( ! this . transforming) {
if ( this . expanded) {
this . collapse( event)
} else {
this . expand( event)
}
}

3、执行 collapse  expand 函数

expand : function ( event ) {
this . expanded = true
this . transforming = true
this . $emit( ' expand ' , event)
},
collapse : function ( event ) { // 折叠
this . expanded = false
this . $emit( ' collapse ' , event)
}

4、执行了 这个之后 ,通过

class: {

    expand: _vm.expanded, 'mint-palette-button-active': _vm.transforming

},

vue :class 来动态 绑定 上面 两个  class

expand:


mint-palette-button-active

.mint-palette-button-active{

-webkit-animation: mint-zoom 0.5s ease-in-out;

animation: mint-zoom 0.5s ease-in-out;

}

可以看到在 执行 动画的时候那个一瞬间 出现了 mint-palette-button-active class ,执行完毕之后出现或消失了expand class


5、通过监听animationend  事件 触发

onMainAnimationEnd : function ( event ) {
this . transforming = false
this . $emit( ' expanded ')
},


那么接下来的事情就很简单了,就是看看怎样动态生成 expand 的 style 的

上代码

mounted () {
let that = this
this . slotChildren = []
for ( let i = 0 ; i < this . $slots . default . length ; i ++) {
if ( that . $slots . default[ i] . elm . nodeType !== 3) {
that . slotChildren . push( that . $slots . default[ i]) // 获得 那些 插入的 按钮
}
}

let css = ''
// 把 180 * (3 + 1) / 4 ==> top ?? 这里用了不知道什么 神算法,弄着弄着竟然还真的变成了正确的角度了 。。。
let direction_arc = Math . PI * ( 3 + Math . max([ ' lt ' , ' t ' , ' rt ' , ' r ' , ' rb ' , ' b ' , ' lb ' , ' l ']
. indexOf( this . direction) , 0)) / 4
for ( let i = 0 ; i < this . slotChildren . lenth ; i ++) {
let arc = ( Math . PI - that . offset * 2) / ( that . slotChildren . length - 1) * i +
that . offset + direction_arc
let x = ( Math . cos( arc) * that . radius) . toFixed( 2)
let y = ( Math . sin( arc) * that . radius) . toFixed( 2)
let item_css = ' .expand .palette-button- ' + that . _uid + ' -sub- ' + i +
' {transform:translate( ' + x + ' px ' + y + ' px) rotate(720deg);transition-delay: ' + 0.03 * i + ' s} '
css += item_css

that . slotChildren[ i] . elm . className += ( ' palette-button- ' + that . _uid + ' -sub- ' + i)
// _uid 每个 Vue 实例都会有一个递增的 id ,通过 this._uid 获取
}

this . styleNode = document . createElement( ' style ')
this . styleNode . type = ' text/css '
this . styleNode . rel = ' stylesheet '
this . styleNode . title = ' palette button style '
this . styleNode . appendChild( document . createTextNode( css))
document . getElementsByTagName( ' head ')[ 0] . appendChild( this . styleNode)
}


这样就 通过一种 难以理解的方式 把角度给计算出来了(目前智商不够,表示不能理解 黑人问号脸.jpg)

希望 高手能代为解答一下

你可能感兴趣的:(前端)