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)

希望 高手能代为解答一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值