1. 什么是transition
属性,为什么需要用到他
一个标签的属性变化难免过于生硬,我们想通过放缓这个过程来达到美化的效果,
幸运的是,CSS为我们提供了transition
(过渡)属性,只需简单的提供需要变化的属性和动画时间即可
2. Playground
3. 个人的一些理解
为状态 A 变换到状态 B 提供过渡时,只需在原来的状态 A 上添加transition
属性,
就能得到过渡的效果,当状态恢复时,transition
已经默认提供了恢复时的过渡状态,不需要在 B 上再写transition
4. 使用transition
构造组件
4.1 switcher
Introduction
设计需求
状态A 开关未开启
- 白色小球在左侧
- 槽为灰色
状态B 开关开启后
- 白色小球在右侧
- 槽为蓝色
- 小球的移动要动画实现
- 再次点击开关,恢复到状态A
说明
- 开关组件中白色的小球的移动可以用
transform: translateX(move)
实现 transform
属性不会改变布局- 状态的改变可以通过绑定类来实现,改变类可以通过点击时间来实现
svg
的图标是我从iconfot.cn
下的
基本骨架
样式
整体样式
div.switcher:hover {
cursor: pointer;
}
div.switcher-slot {
width: 210px;
border-radius: 35px;
display: flex;
background-color: rgba(0, 0, 0, 0.1);
}
按钮样式
svg.icon {
fill: white;
width: 70px;
height: 70px;
}
div.button {
display: flex;
align-items: center;
border-radius: 35px;
}
点击过后
div.switcher .button {
transition: transform 0.5s;
}
div.switcher.active .button {
transform: translateX(140px);
}
div.switcher div.switcher-slot {
transition: background-color 0.3s;
background-color: rgba(0, 0, 0, 0.1);
}
div.switcher.active div.switcher-slot {
background-color: #1b9aee;
}
动作设计
export default {
props: {
active: {
type: Boolean,
default: false,
},
},
methods: {
toggle() {
this.$emit('toggle')
},
}p
}
在父组件Home.vue
中
DEMO
4.2 drawer
Introduction
ElementUI
这里我稍稍简化了一点(其实是很多,都魔改了),我打算把内容放在屏幕中间
设计需求
- 组件分为两部分,遮罩层和内容层。其实这整个组件就是一个遮罩层,当然你也可以另外再弄一个
- 遮罩层需要独立与文档流布局
- 点击除内容之外的空白,退出抽屉组件
- 显示抽屉时内容层需要从下往上慢慢划出,遮罩层不需要管
- 为内容层添加一层阴影
说明
- 当实现为整个组件设置
transform: translateY(100%)
时,组件布局在页面的下方,不可见 - 遮罩层是无色的,就像隔了一层玻璃一样,避免点到下面的组件
- 遮罩层默认覆盖整个界面
- 为内容层添加阴影是怕看不见这一层
- 可以通过点击时产生的
$event
来判断点到的元素,具体的话把这个$event
打印出来自己看看就好了 - 可以将内容层的
position
定位属性设置为relative
,这样可供子组件使用absoulte
定位时参照
基本框架
样式
整体框架
div.modal {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
z-index: 100;
}
div.modal-main {
box-shadow: 0 0 1000px black;
}
结构布局
div.modal {
display: flex;
align-items: center;
justify-content: center;
}
div.modal-main {
position: relative;
}
设置过渡
div.modal {
transform: translateY(100%);
transition: transform 0.5s;
}
div.modal.active {
transform: translateY(0);
}
动作设计
export default {
props: {
active: {
type: Boolean,
default: false,
},
bcolor: {
type: String,
default: 'white',
},
width: {
type: String,
default: "50%",
},
height: {
type: String,
default: "60%",
},
},
methods: {
styleOf(width, height, bcolor) {
return {
'width': width,
'height': height,
'background-color': bcolor
}
},
clickBlank(event) {
if(event.target.className == 'modal active') {
this.$emit('hide-modal')
}
},
},
}
在父组件Home.vue
中
DEMO