commit
c030abbe9a
15 changed files with 1151 additions and 17 deletions
@ -0,0 +1,13 @@ |
|||||||
|
{ |
||||||
|
"name": "hello-uniapp", |
||||||
|
"version": "3.4.4", |
||||||
|
"lockfileVersion": 1, |
||||||
|
"requires": true, |
||||||
|
"dependencies": { |
||||||
|
"uview-ui": { |
||||||
|
"version": "2.0.36", |
||||||
|
"resolved": "https://registry.npmmirror.com/uview-ui/-/uview-ui-2.0.36.tgz", |
||||||
|
"integrity": "sha512-ASSZT6M8w3GTO1eFPbsgEFV0U5UujK+8pTNr+MSUbRNcRMC1u63DDTLJVeArV91kWM0bfAexK3SK9pnTqF9TtA==" |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,260 @@ |
|||||||
|
<template> |
||||||
|
<view class="process_more"> |
||||||
|
<view class="com_box"> |
||||||
|
<view class="com_txt"> |
||||||
|
顺丰快递 |
||||||
|
</view> |
||||||
|
<view class="com_num"> |
||||||
|
SH189165496411 |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<!-- 步骤条 --> |
||||||
|
<view class="pro_box"> |
||||||
|
<view class="set-2" :key="index" v-for="(item,index) in options"> |
||||||
|
<view class="img-border"> |
||||||
|
<view class="left_img"></view> |
||||||
|
</view> |
||||||
|
<view v-if='index!=0' class="left_line_up"></view> |
||||||
|
<view v-if='index!=options.length-1' class="left_line_down"></view> |
||||||
|
<view class="set-view"> |
||||||
|
<view :class="index == 0 ? 'active' : ''" class="set-view-test3">{{item.status}}</view> |
||||||
|
<view :class="index == 0 ? 'active' : ''" class="set-view-test4">{{item.context}}</view> |
||||||
|
<view class="set-view-test"> |
||||||
|
<view class="set-view-test2">{{item.time}}</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
export default { |
||||||
|
data() { |
||||||
|
return { |
||||||
|
options: [{ |
||||||
|
status: '投柜或驿站', |
||||||
|
context: '【青岛市】 快件已被 菜鸟的【青岛康泰源惠客友超市店】代收,【取件地址:青岛康泰源惠客友超市店】,请及时取件。如有疑问请联系:15805321109,投诉电话:0532-88985563', |
||||||
|
time: '2023-08-18 10:33:33' |
||||||
|
}, |
||||||
|
{ |
||||||
|
status: '派件', |
||||||
|
context: '【青岛市】青岛市中五二部(0532-88985563)业务员【杨金梅,19106394524】正在为您派件(95720为中通快递员外呼专属号码,请放心接听,如有问题可联系投诉电话:0532-88985563)', |
||||||
|
time: '2023-08-18 08:08:38' |
||||||
|
}, |
||||||
|
{ |
||||||
|
status: '在途', |
||||||
|
context: '【青岛市】 快件已到达 青岛市中五二部', |
||||||
|
time: '2023-08-18 08:08:33' |
||||||
|
}, |
||||||
|
{ |
||||||
|
status: '在途', |
||||||
|
context: '【青岛市】 快件已发往 青岛市中五二部', |
||||||
|
time: '2023-08-18 04:36:56' |
||||||
|
}, |
||||||
|
{ |
||||||
|
status: '在途', |
||||||
|
context: '【青岛市】 快件已到达 青岛中转部', |
||||||
|
time: '2023-08-18 01:04:40' |
||||||
|
}, |
||||||
|
{ |
||||||
|
status: '在途', |
||||||
|
context: '【昆明市】 快件已发往 青岛中转部', |
||||||
|
time: '2023-08-16 00:51:30' |
||||||
|
}, |
||||||
|
{ |
||||||
|
status: '在途', |
||||||
|
context: '【昆明市】 快件已到达 昆明中转', |
||||||
|
time: '2023-08-15 15:30:16' |
||||||
|
}, { |
||||||
|
status: '在途', |
||||||
|
context: '【丽江市】 快件已发往 昆明中转', |
||||||
|
time: '2023-08-14 19:02:02' |
||||||
|
}, { |
||||||
|
status: '揽收', |
||||||
|
context: '【丽江市】 【丽江华坪县】(0888-8834031) 的 P1陈平(15108866686) 已揽收', |
||||||
|
time: '2023-08-14 19:01:18' |
||||||
|
} |
||||||
|
] |
||||||
|
} |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss"> |
||||||
|
.process_more { |
||||||
|
height: 100%; |
||||||
|
overflow-y: hidden; |
||||||
|
|
||||||
|
.com_box { |
||||||
|
width: 690rpx; |
||||||
|
height: 90rpx; |
||||||
|
margin: 0 auto; |
||||||
|
margin-top: 30rpx; |
||||||
|
background: #FFFFFF; |
||||||
|
border-radius: 30rpx 30rpx 30rpx 30rpx; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
|
||||||
|
.com_txt { |
||||||
|
margin-left: 38rpx; |
||||||
|
margin-right: 20rpx; |
||||||
|
font-size: 26rpx; |
||||||
|
color: #333; |
||||||
|
} |
||||||
|
|
||||||
|
.com_num { |
||||||
|
font-size: 26rpx; |
||||||
|
color: #333; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.pro_box { |
||||||
|
width: 690rpx; |
||||||
|
height: 75%; |
||||||
|
overflow-y: auto; |
||||||
|
overflow-x: hidden; |
||||||
|
background: #FFFFFF; |
||||||
|
border-radius: 30rpx 30rpx 30rpx 30rpx; |
||||||
|
margin: 0 auto; |
||||||
|
margin-top: 30rpx; |
||||||
|
padding: 30rpx 0; |
||||||
|
|
||||||
|
.process_text { |
||||||
|
position: relative; |
||||||
|
|
||||||
|
.process_left { |
||||||
|
position: absolute; |
||||||
|
top: 200rpx; |
||||||
|
left: 40rpx; |
||||||
|
|
||||||
|
image { |
||||||
|
width: 44rpx; |
||||||
|
height: 44rpx; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.set-2:last-child::after { |
||||||
|
display: none; |
||||||
|
} |
||||||
|
|
||||||
|
.set-2 { |
||||||
|
border-radius: 10rpx; |
||||||
|
width: 600rpx; |
||||||
|
margin-left: 100rpx; |
||||||
|
margin-top: 60rpx; |
||||||
|
position: relative; |
||||||
|
|
||||||
|
.set-view { |
||||||
|
width: 493rpx; |
||||||
|
|
||||||
|
.set-view-test { |
||||||
|
margin: 0 auto; |
||||||
|
// padding-top: 20rpx; |
||||||
|
padding-bottom: 20rpx; |
||||||
|
|
||||||
|
.set-view-test2 { |
||||||
|
width: 100%; |
||||||
|
height: 26rpx; |
||||||
|
font-family: Gibson; |
||||||
|
font-size: 20rpx; |
||||||
|
color: #999; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.set-view-test3 { |
||||||
|
margin: 0 auto; |
||||||
|
font-size: 26rpx; |
||||||
|
color: #666; |
||||||
|
|
||||||
|
&.active { |
||||||
|
color: #333; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.set-view-test4 { |
||||||
|
margin: 20rpx auto; |
||||||
|
font-size: 22rpx; |
||||||
|
color: #999; |
||||||
|
|
||||||
|
&.active { |
||||||
|
color: #333; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* 普通 */ |
||||||
|
.set-2 .img-border { |
||||||
|
width: 18rpx; |
||||||
|
height: 17rpx; |
||||||
|
background: gray; |
||||||
|
border-radius: 50%; |
||||||
|
position: absolute; |
||||||
|
top: 6%; |
||||||
|
margin-top: -1rpx; |
||||||
|
left: -58rpx; |
||||||
|
z-index: 100; |
||||||
|
} |
||||||
|
|
||||||
|
/* 特殊 */ |
||||||
|
.set-2:nth-of-type(1)>.img-border { |
||||||
|
width: 38rpx; |
||||||
|
height: 38rpx; |
||||||
|
background: #FFCCD8; |
||||||
|
border-radius: 50%; |
||||||
|
position: absolute; |
||||||
|
top: 0%; |
||||||
|
margin-top: -3rpx; |
||||||
|
left: -68rpx; |
||||||
|
z-index: 100; |
||||||
|
} |
||||||
|
|
||||||
|
.set-2:nth-of-type(1) .left_img { |
||||||
|
border-radius: 50%; |
||||||
|
width: 16rpx; |
||||||
|
height: 16rpx; |
||||||
|
background: #FE3666; |
||||||
|
top: 50%; |
||||||
|
margin-top: 13rpx; |
||||||
|
margin-left: 10rpx; |
||||||
|
} |
||||||
|
|
||||||
|
.left_line_up { |
||||||
|
position: absolute; |
||||||
|
top: 0; |
||||||
|
left: -52upx; |
||||||
|
height: 70%; |
||||||
|
margin-top: -22rpx; |
||||||
|
border-style: solid; |
||||||
|
border-left: 1rpx; |
||||||
|
border-color: #ccc; |
||||||
|
} |
||||||
|
|
||||||
|
.left_line_down { |
||||||
|
position: absolute; |
||||||
|
top: 50%; |
||||||
|
left: -52upx; |
||||||
|
height: 60%; |
||||||
|
margin-top: 22rpx; |
||||||
|
border-style: solid; |
||||||
|
border-left: 1rpx; |
||||||
|
border-color: #ccc; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
.set-2:nth-of-type(1) .left_line_down { |
||||||
|
top: 0; |
||||||
|
height: 105%; |
||||||
|
} |
||||||
|
|
||||||
|
.set-2:last-of-type .left_line_up { |
||||||
|
height: 10%; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</style> |
||||||
|
After Width: | Height: | Size: 569 B |
|
After Width: | Height: | Size: 1.6 KiB |
@ -0,0 +1,20 @@ |
|||||||
|
## 1.3.1(2021-11-23) |
||||||
|
- 修复 init 方法初始化问题 |
||||||
|
## 1.3.0(2021-11-19) |
||||||
|
- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) |
||||||
|
- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-transition](https://uniapp.dcloud.io/component/uniui/uni-transition) |
||||||
|
## 1.2.1(2021-09-27) |
||||||
|
- 修复 init 方法不生效的 Bug |
||||||
|
## 1.2.0(2021-07-30) |
||||||
|
- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) |
||||||
|
## 1.1.1(2021-05-12) |
||||||
|
- 新增 示例地址 |
||||||
|
- 修复 示例项目缺少组件的 Bug |
||||||
|
## 1.1.0(2021-04-22) |
||||||
|
- 新增 通过方法自定义动画 |
||||||
|
- 新增 custom-class 非 NVUE 平台支持自定义 class 定制样式 |
||||||
|
- 优化 动画触发逻辑,使动画更流畅 |
||||||
|
- 优化 支持单独的动画类型 |
||||||
|
- 优化 文档示例 |
||||||
|
## 1.0.2(2021-02-05) |
||||||
|
- 调整为 uni_modules 目录规范 |
||||||
@ -0,0 +1,128 @@ |
|||||||
|
// const defaultOption = {
|
||||||
|
// duration: 300,
|
||||||
|
// timingFunction: 'linear',
|
||||||
|
// delay: 0,
|
||||||
|
// transformOrigin: '50% 50% 0'
|
||||||
|
// }
|
||||||
|
// #ifdef APP-NVUE
|
||||||
|
const nvueAnimation = uni.requireNativePlugin('animation') |
||||||
|
// #endif
|
||||||
|
class MPAnimation { |
||||||
|
constructor(options, _this) { |
||||||
|
this.options = options |
||||||
|
this.animation = uni.createAnimation(options) |
||||||
|
this.currentStepAnimates = {} |
||||||
|
this.next = 0 |
||||||
|
this.$ = _this |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
_nvuePushAnimates(type, args) { |
||||||
|
let aniObj = this.currentStepAnimates[this.next] |
||||||
|
let styles = {} |
||||||
|
if (!aniObj) { |
||||||
|
styles = { |
||||||
|
styles: {}, |
||||||
|
config: {} |
||||||
|
} |
||||||
|
} else { |
||||||
|
styles = aniObj |
||||||
|
} |
||||||
|
if (animateTypes1.includes(type)) { |
||||||
|
if (!styles.styles.transform) { |
||||||
|
styles.styles.transform = '' |
||||||
|
} |
||||||
|
let unit = '' |
||||||
|
if(type === 'rotate'){ |
||||||
|
unit = 'deg' |
||||||
|
} |
||||||
|
styles.styles.transform += `${type}(${args+unit}) ` |
||||||
|
} else { |
||||||
|
styles.styles[type] = `${args}` |
||||||
|
} |
||||||
|
this.currentStepAnimates[this.next] = styles |
||||||
|
} |
||||||
|
_animateRun(styles = {}, config = {}) { |
||||||
|
let ref = this.$.$refs['ani'].ref |
||||||
|
if (!ref) return |
||||||
|
return new Promise((resolve, reject) => { |
||||||
|
nvueAnimation.transition(ref, { |
||||||
|
styles, |
||||||
|
...config |
||||||
|
}, res => { |
||||||
|
resolve() |
||||||
|
}) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
_nvueNextAnimate(animates, step = 0, fn) { |
||||||
|
let obj = animates[step] |
||||||
|
if (obj) { |
||||||
|
let { |
||||||
|
styles, |
||||||
|
config |
||||||
|
} = obj |
||||||
|
this._animateRun(styles, config).then(() => { |
||||||
|
step += 1 |
||||||
|
this._nvueNextAnimate(animates, step, fn) |
||||||
|
}) |
||||||
|
} else { |
||||||
|
this.currentStepAnimates = {} |
||||||
|
typeof fn === 'function' && fn() |
||||||
|
this.isEnd = true |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
step(config = {}) { |
||||||
|
// #ifndef APP-NVUE
|
||||||
|
this.animation.step(config) |
||||||
|
// #endif
|
||||||
|
// #ifdef APP-NVUE
|
||||||
|
this.currentStepAnimates[this.next].config = Object.assign({}, this.options, config) |
||||||
|
this.currentStepAnimates[this.next].styles.transformOrigin = this.currentStepAnimates[this.next].config.transformOrigin |
||||||
|
this.next++ |
||||||
|
// #endif
|
||||||
|
return this |
||||||
|
} |
||||||
|
|
||||||
|
run(fn) { |
||||||
|
// #ifndef APP-NVUE
|
||||||
|
this.$.animationData = this.animation.export() |
||||||
|
this.$.timer = setTimeout(() => { |
||||||
|
typeof fn === 'function' && fn() |
||||||
|
}, this.$.durationTime) |
||||||
|
// #endif
|
||||||
|
// #ifdef APP-NVUE
|
||||||
|
this.isEnd = false |
||||||
|
let ref = this.$.$refs['ani'] && this.$.$refs['ani'].ref |
||||||
|
if(!ref) return |
||||||
|
this._nvueNextAnimate(this.currentStepAnimates, 0, fn) |
||||||
|
this.next = 0 |
||||||
|
// #endif
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
const animateTypes1 = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d', |
||||||
|
'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY', |
||||||
|
'translateZ' |
||||||
|
] |
||||||
|
const animateTypes2 = ['opacity', 'backgroundColor'] |
||||||
|
const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom'] |
||||||
|
animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => { |
||||||
|
MPAnimation.prototype[type] = function(...args) { |
||||||
|
// #ifndef APP-NVUE
|
||||||
|
this.animation[type](...args) |
||||||
|
// #endif
|
||||||
|
// #ifdef APP-NVUE
|
||||||
|
this._nvuePushAnimates(type, args) |
||||||
|
// #endif
|
||||||
|
return this |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
export function createAnimation(option, _this) { |
||||||
|
if(!_this) return |
||||||
|
clearTimeout(_this.timer) |
||||||
|
return new MPAnimation(option, _this) |
||||||
|
} |
||||||
@ -0,0 +1,277 @@ |
|||||||
|
<template> |
||||||
|
<view v-if="isShow" ref="ani" :animation="animationData" :class="customClass" :style="transformStyles" @click="onClick"><slot></slot></view> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { createAnimation } from './createAnimation' |
||||||
|
|
||||||
|
/** |
||||||
|
* Transition 过渡动画 |
||||||
|
* @description 简单过渡动画组件 |
||||||
|
* @tutorial https://ext.dcloud.net.cn/plugin?id=985 |
||||||
|
* @property {Boolean} show = [false|true] 控制组件显示或隐藏 |
||||||
|
* @property {Array|String} modeClass = [fade|slide-top|slide-right|slide-bottom|slide-left|zoom-in|zoom-out] 过渡动画类型 |
||||||
|
* @value fade 渐隐渐出过渡 |
||||||
|
* @value slide-top 由上至下过渡 |
||||||
|
* @value slide-right 由右至左过渡 |
||||||
|
* @value slide-bottom 由下至上过渡 |
||||||
|
* @value slide-left 由左至右过渡 |
||||||
|
* @value zoom-in 由小到大过渡 |
||||||
|
* @value zoom-out 由大到小过渡 |
||||||
|
* @property {Number} duration 过渡动画持续时间 |
||||||
|
* @property {Object} styles 组件样式,同 css 样式,注意带’-‘连接符的属性需要使用小驼峰写法如:`backgroundColor:red` |
||||||
|
*/ |
||||||
|
export default { |
||||||
|
name: 'uniTransition', |
||||||
|
emits:['click','change'], |
||||||
|
props: { |
||||||
|
show: { |
||||||
|
type: Boolean, |
||||||
|
default: false |
||||||
|
}, |
||||||
|
modeClass: { |
||||||
|
type: [Array, String], |
||||||
|
default() { |
||||||
|
return 'fade' |
||||||
|
} |
||||||
|
}, |
||||||
|
duration: { |
||||||
|
type: Number, |
||||||
|
default: 300 |
||||||
|
}, |
||||||
|
styles: { |
||||||
|
type: Object, |
||||||
|
default() { |
||||||
|
return {} |
||||||
|
} |
||||||
|
}, |
||||||
|
customClass:{ |
||||||
|
type: String, |
||||||
|
default: '' |
||||||
|
} |
||||||
|
}, |
||||||
|
data() { |
||||||
|
return { |
||||||
|
isShow: false, |
||||||
|
transform: '', |
||||||
|
opacity: 1, |
||||||
|
animationData: {}, |
||||||
|
durationTime: 300, |
||||||
|
config: {} |
||||||
|
} |
||||||
|
}, |
||||||
|
watch: { |
||||||
|
show: { |
||||||
|
handler(newVal) { |
||||||
|
if (newVal) { |
||||||
|
this.open() |
||||||
|
} else { |
||||||
|
// 避免上来就执行 close,导致动画错乱 |
||||||
|
if (this.isShow) { |
||||||
|
this.close() |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
immediate: true |
||||||
|
} |
||||||
|
}, |
||||||
|
computed: { |
||||||
|
// 生成样式数据 |
||||||
|
stylesObject() { |
||||||
|
let styles = { |
||||||
|
...this.styles, |
||||||
|
'transition-duration': this.duration / 1000 + 's' |
||||||
|
} |
||||||
|
let transform = '' |
||||||
|
for (let i in styles) { |
||||||
|
let line = this.toLine(i) |
||||||
|
transform += line + ':' + styles[i] + ';' |
||||||
|
} |
||||||
|
return transform |
||||||
|
}, |
||||||
|
// 初始化动画条件 |
||||||
|
transformStyles() { |
||||||
|
return 'transform:' + this.transform + ';' + 'opacity:' + this.opacity + ';' + this.stylesObject |
||||||
|
} |
||||||
|
}, |
||||||
|
created() { |
||||||
|
// 动画默认配置 |
||||||
|
this.config = { |
||||||
|
duration: this.duration, |
||||||
|
timingFunction: 'ease', |
||||||
|
transformOrigin: '50% 50%', |
||||||
|
delay: 0 |
||||||
|
} |
||||||
|
this.durationTime = this.duration |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
/** |
||||||
|
* ref 触发 初始化动画 |
||||||
|
*/ |
||||||
|
init(obj = {}) { |
||||||
|
if (obj.duration) { |
||||||
|
this.durationTime = obj.duration |
||||||
|
} |
||||||
|
this.animation = createAnimation(Object.assign(this.config, obj),this) |
||||||
|
}, |
||||||
|
/** |
||||||
|
* 点击组件触发回调 |
||||||
|
*/ |
||||||
|
onClick() { |
||||||
|
this.$emit('click', { |
||||||
|
detail: this.isShow |
||||||
|
}) |
||||||
|
}, |
||||||
|
/** |
||||||
|
* ref 触发 动画分组 |
||||||
|
* @param {Object} obj |
||||||
|
*/ |
||||||
|
step(obj, config = {}) { |
||||||
|
if (!this.animation) return |
||||||
|
for (let i in obj) { |
||||||
|
try { |
||||||
|
if(typeof obj[i] === 'object'){ |
||||||
|
this.animation[i](...obj[i]) |
||||||
|
}else{ |
||||||
|
this.animation[i](obj[i]) |
||||||
|
} |
||||||
|
} catch (e) { |
||||||
|
console.error(`方法 ${i} 不存在`) |
||||||
|
} |
||||||
|
} |
||||||
|
this.animation.step(config) |
||||||
|
return this |
||||||
|
}, |
||||||
|
/** |
||||||
|
* ref 触发 执行动画 |
||||||
|
*/ |
||||||
|
run(fn) { |
||||||
|
if (!this.animation) return |
||||||
|
this.animation.run(fn) |
||||||
|
}, |
||||||
|
// 开始过度动画 |
||||||
|
open() { |
||||||
|
clearTimeout(this.timer) |
||||||
|
this.transform = '' |
||||||
|
this.isShow = true |
||||||
|
let { opacity, transform } = this.styleInit(false) |
||||||
|
if (typeof opacity !== 'undefined') { |
||||||
|
this.opacity = opacity |
||||||
|
} |
||||||
|
this.transform = transform |
||||||
|
// 确保动态样式已经生效后,执行动画,如果不加 nextTick ,会导致 wx 动画执行异常 |
||||||
|
this.$nextTick(() => { |
||||||
|
// TODO 定时器保证动画完全执行,目前有些问题,后面会取消定时器 |
||||||
|
this.timer = setTimeout(() => { |
||||||
|
this.animation = createAnimation(this.config, this) |
||||||
|
this.tranfromInit(false).step() |
||||||
|
this.animation.run() |
||||||
|
this.$emit('change', { |
||||||
|
detail: this.isShow |
||||||
|
}) |
||||||
|
}, 20) |
||||||
|
}) |
||||||
|
}, |
||||||
|
// 关闭过度动画 |
||||||
|
close(type) { |
||||||
|
if (!this.animation) return |
||||||
|
this.tranfromInit(true) |
||||||
|
.step() |
||||||
|
.run(() => { |
||||||
|
this.isShow = false |
||||||
|
this.animationData = null |
||||||
|
this.animation = null |
||||||
|
let { opacity, transform } = this.styleInit(false) |
||||||
|
this.opacity = opacity || 1 |
||||||
|
this.transform = transform |
||||||
|
this.$emit('change', { |
||||||
|
detail: this.isShow |
||||||
|
}) |
||||||
|
}) |
||||||
|
}, |
||||||
|
// 处理动画开始前的默认样式 |
||||||
|
styleInit(type) { |
||||||
|
let styles = { |
||||||
|
transform: '' |
||||||
|
} |
||||||
|
let buildStyle = (type, mode) => { |
||||||
|
if (mode === 'fade') { |
||||||
|
styles.opacity = this.animationType(type)[mode] |
||||||
|
} else { |
||||||
|
styles.transform += this.animationType(type)[mode] + ' ' |
||||||
|
} |
||||||
|
} |
||||||
|
if (typeof this.modeClass === 'string') { |
||||||
|
buildStyle(type, this.modeClass) |
||||||
|
} else { |
||||||
|
this.modeClass.forEach(mode => { |
||||||
|
buildStyle(type, mode) |
||||||
|
}) |
||||||
|
} |
||||||
|
return styles |
||||||
|
}, |
||||||
|
// 处理内置组合动画 |
||||||
|
tranfromInit(type) { |
||||||
|
let buildTranfrom = (type, mode) => { |
||||||
|
let aniNum = null |
||||||
|
if (mode === 'fade') { |
||||||
|
aniNum = type ? 0 : 1 |
||||||
|
} else { |
||||||
|
aniNum = type ? '-100%' : '0' |
||||||
|
if (mode === 'zoom-in') { |
||||||
|
aniNum = type ? 0.8 : 1 |
||||||
|
} |
||||||
|
if (mode === 'zoom-out') { |
||||||
|
aniNum = type ? 1.2 : 1 |
||||||
|
} |
||||||
|
if (mode === 'slide-right') { |
||||||
|
aniNum = type ? '100%' : '0' |
||||||
|
} |
||||||
|
if (mode === 'slide-bottom') { |
||||||
|
aniNum = type ? '100%' : '0' |
||||||
|
} |
||||||
|
} |
||||||
|
this.animation[this.animationMode()[mode]](aniNum) |
||||||
|
} |
||||||
|
if (typeof this.modeClass === 'string') { |
||||||
|
buildTranfrom(type, this.modeClass) |
||||||
|
} else { |
||||||
|
this.modeClass.forEach(mode => { |
||||||
|
buildTranfrom(type, mode) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
return this.animation |
||||||
|
}, |
||||||
|
animationType(type) { |
||||||
|
return { |
||||||
|
fade: type ? 1 : 0, |
||||||
|
'slide-top': `translateY(${type ? '0' : '-100%'})`, |
||||||
|
'slide-right': `translateX(${type ? '0' : '100%'})`, |
||||||
|
'slide-bottom': `translateY(${type ? '0' : '100%'})`, |
||||||
|
'slide-left': `translateX(${type ? '0' : '-100%'})`, |
||||||
|
'zoom-in': `scaleX(${type ? 1 : 0.8}) scaleY(${type ? 1 : 0.8})`, |
||||||
|
'zoom-out': `scaleX(${type ? 1 : 1.2}) scaleY(${type ? 1 : 1.2})` |
||||||
|
} |
||||||
|
}, |
||||||
|
// 内置动画类型与实际动画对应字典 |
||||||
|
animationMode() { |
||||||
|
return { |
||||||
|
fade: 'opacity', |
||||||
|
'slide-top': 'translateY', |
||||||
|
'slide-right': 'translateX', |
||||||
|
'slide-bottom': 'translateY', |
||||||
|
'slide-left': 'translateX', |
||||||
|
'zoom-in': 'scale', |
||||||
|
'zoom-out': 'scale' |
||||||
|
} |
||||||
|
}, |
||||||
|
// 驼峰转中横线 |
||||||
|
toLine(name) { |
||||||
|
return name.replace(/([A-Z])/g, '-$1').toLowerCase() |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style></style> |
||||||
@ -0,0 +1,87 @@ |
|||||||
|
{ |
||||||
|
"id": "uni-transition", |
||||||
|
"displayName": "uni-transition 过渡动画", |
||||||
|
"version": "1.3.1", |
||||||
|
"description": "元素的简单过渡动画", |
||||||
|
"keywords": [ |
||||||
|
"uni-ui", |
||||||
|
"uniui", |
||||||
|
"动画", |
||||||
|
"过渡", |
||||||
|
"过渡动画" |
||||||
|
], |
||||||
|
"repository": "https://github.com/dcloudio/uni-ui", |
||||||
|
"engines": { |
||||||
|
"HBuilderX": "" |
||||||
|
}, |
||||||
|
"directories": { |
||||||
|
"example": "../../temps/example_temps" |
||||||
|
}, |
||||||
|
"dcloudext": { |
||||||
|
"category": [ |
||||||
|
"前端组件", |
||||||
|
"通用组件" |
||||||
|
], |
||||||
|
"sale": { |
||||||
|
"regular": { |
||||||
|
"price": "0.00" |
||||||
|
}, |
||||||
|
"sourcecode": { |
||||||
|
"price": "0.00" |
||||||
|
} |
||||||
|
}, |
||||||
|
"contact": { |
||||||
|
"qq": "" |
||||||
|
}, |
||||||
|
"declaration": { |
||||||
|
"ads": "无", |
||||||
|
"data": "无", |
||||||
|
"permissions": "无" |
||||||
|
}, |
||||||
|
"npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" |
||||||
|
}, |
||||||
|
"uni_modules": { |
||||||
|
"dependencies": ["uni-scss"], |
||||||
|
"encrypt": [], |
||||||
|
"platforms": { |
||||||
|
"cloud": { |
||||||
|
"tcb": "y", |
||||||
|
"aliyun": "y" |
||||||
|
}, |
||||||
|
"client": { |
||||||
|
"App": { |
||||||
|
"app-vue": "y", |
||||||
|
"app-nvue": "y" |
||||||
|
}, |
||||||
|
"H5-mobile": { |
||||||
|
"Safari": "y", |
||||||
|
"Android Browser": "y", |
||||||
|
"微信浏览器(Android)": "y", |
||||||
|
"QQ浏览器(Android)": "y" |
||||||
|
}, |
||||||
|
"H5-pc": { |
||||||
|
"Chrome": "y", |
||||||
|
"IE": "y", |
||||||
|
"Edge": "y", |
||||||
|
"Firefox": "y", |
||||||
|
"Safari": "y" |
||||||
|
}, |
||||||
|
"小程序": { |
||||||
|
"微信": "y", |
||||||
|
"阿里": "y", |
||||||
|
"百度": "y", |
||||||
|
"字节跳动": "y", |
||||||
|
"QQ": "y" |
||||||
|
}, |
||||||
|
"快应用": { |
||||||
|
"华为": "u", |
||||||
|
"联盟": "u" |
||||||
|
}, |
||||||
|
"Vue": { |
||||||
|
"vue2": "y", |
||||||
|
"vue3": "y" |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,11 @@ |
|||||||
|
|
||||||
|
|
||||||
|
## Transition 过渡动画 |
||||||
|
> **组件名:uni-transition** |
||||||
|
> 代码块: `uTransition` |
||||||
|
|
||||||
|
|
||||||
|
元素过渡动画 |
||||||
|
|
||||||
|
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-transition) |
||||||
|
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 |
||||||
Loading…
Reference in new issue