# FabButton
**Repository Path**: queling/fab-button
## Basic Information
- **Project Name**: FabButton
- **Description**: FabButton 悬浮按钮
- **Primary Language**: JavaScript
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2021-08-02
- **Last Updated**: 2021-11-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# FabBUtton
#### 项目介绍
组件基于SDK6版本开发;
1.悬浮按钮拖拽,手指松开贴边
2.点击悬浮按钮显示工具栏
3.工具栏可以根据参数以window为基准左中右对齐,也可以悬浮按钮为基准点,上下对齐
#### 演示效果


#### 安装教程
在自己的hml文件下引入fab组件
```
```
在自己的hml下的div.container下使用组件
```
```
参数使用请看使用说明
#### 使用说明
1. Fab悬浮按钮组件所在文件夹为 entry\src\main\js\default\common\component\fab
2. 使用时可自由传入参数,参数如下:
**fab-size:** 按钮字体大小,同时也是按钮宽高大小,穿入数字不要带单位;
**fab-background-image:** 悬浮按钮背景图片;路径只支持从common目录开始;
* 注意:fab-background-image和fab-background-color不可共存,如果同时存在,背景色会覆盖背景图片
**fab-background-color:** 悬浮按钮背景色;
* 注意:fab-background-image和fab-background-color不可共存,如果同时存在,背景色会覆盖背景图片
**fab-text:** 悬浮按钮文本字体内容,颜色默认白色,不可修改
**offset:** 工具栏位置;可取值 left, right, center, top,bottom,auto;
当取值为left, right, center时,工具栏以整个屏幕视图为基准靠齐;分别会显示在窗口的左(left)中(center)右(right)
当取值为top,bottom,auto时候,工具栏以悬浮为基准点,会随着悬浮按钮移动;
* 注意:当offset值为center,并且tool-bar-type值等于square或者round时,tool-bar-width和tool-bar-height传入值的会失效,tool-bar-width和tool-bar-height宽高会取屏幕宽度的一半;
**tool-bar-type:** 工具栏类型,可取值rectangle 矩形, square 方形, round 圆形 ;
* 注意: 赋值为square或者round时,offset的值必须赋为center;此时工具栏以悬浮按钮为基准点垂直居中,会随着悬浮按钮移动;并且最多只能存在6条数据,最少4条数据;当offset值为center,并且tool-bar-type值等于square或者round时,tool-bar-width和tool-bar-height传入值的会失效,宽高会取屏幕宽度的一半;
**toolbar-content:** 工具显示栏内容, 类型数组对象;如果某项不需要显示在页面上,赋值为空字符穿即可;
* 注意: 当tool-bar-type值为square或者round时,toolbar-content数据最大不能超过6条,最小不能少于4条;如果数据长度超过6条,只会截取前六条数据展示;
toolbar-content数据格式:
```
[
{
id:1,
text:"电话:",
image:"/common/icon/e1.png"
},
{
id:2,
text:"刷新:",
image:"/common/icon/e2.png"
},
{
id:3,
text:"爱心:",
image:"/common/icon/e3.png"
},
{
id:4,
text:"声音:",
image:"/common/icon/e6.png"
},
{
id:5,
text:"闹钟:",
image:"/common/icon/e7.png"
}
]
```
**tool-bar-width|tool-bar-height:** 工具栏宽高, number类型;
* 注意: 当offset值为center,并且tool-bar-type值等于square或者round时,
tool-bar-width和tool-bar-height传入值的会失效,宽高会取屏幕宽度的一半;
**tool-bar-list-direction:** 工具栏显示水平方向,可取值 column 垂直排列,row 水平排列;
当tool-bar-type赋值为square 方形 或者 round 圆形时,tool-bar-list-direction会失效
**tool-bar-background-color:** 工具栏背景色
**padding:** 工具栏内边距;
> 格式: 四个值,上右下左 , 三个值,上(左右)下 , 两个值,(上下)(左右) , 一个值(上下左右)
* 注意: padding对角值必须相等,否工具栏可能会出现偏移差距
**item-background-color:** 工具栏列表选项背景色
**item-color:** 工具栏列表选项文本颜色
**item-width:** 工具栏列表选项宽度,Number类型;宽高相等,不支持设置高度;
**item-radius:** 工具栏列表选项圆角大小;Number类型;
**checked-item:** [**事件**] 选中工具栏内容触发,返回选中数据
**click-fab:** [**事件**] 点击悬浮按钮触发,返回工具栏状态和悬浮按钮状态
> 返回格式如下:
```
{
isToolbar:布尔值, // true 工具栏显示,false工具栏隐藏
isFabBUttonShow:布尔值, // true 悬浮按钮显示,false悬浮按钮隐藏
}
```
**eave-end:** [**事件**] 离开悬浮按钮后触发,返回工具栏状态和悬浮按钮状态
> 返回格式如下:
```
{
isToolbar:布尔值, // true 工具栏显示,false工具栏隐藏
isFabBUttonShow:布尔值, // true 悬浮按钮显示,false悬浮按钮隐藏
}
```
#### 实现思路
主要功能:
1. 悬浮按钮拖拽,手指松开贴边
2. 点击悬浮按钮显示工具栏
3. 工具栏可以根据参数以window为基准左中右对齐,也可以悬浮按钮为基准点,上下对齐
主要用到JS的手指触摸事件,手指滑动事件,手指抬起事件
JS思路解析:
API版本需要升级到 API6
一定先要在css中给元素设置固定定位或者绝对定位,js动态设置left、top值
##### 1. 在手指触摸时候
###### 1.1. 需要获取到元素距离屏幕左侧(offsetLeft)&上侧的距离(offsetTop);
1.2. 获取到手指触摸元素的坐标点(x,y)
##### 2. 在手指滑动的时候
###### 2.1. 在滑动的时候,实时获取到滑动的坐标点(x,y);
###### 2.2. 计算元素的left值和top值,公式如下:
* left = 滑动时的x值 - (触摸时的x值-元素的offsetLeft)
* top = 滑动时的y值 - (触摸时的y值-元素的offsetTop)
##### 3. 最大最小边界值计算
###### 3. 最大边界值不能大于屏幕宽高;最小边界值不能小于0;
* 最left小边界值=left小于0;就让他等于0;
* 最小top边界值=top小于0;就让他等于0;
* 最大left边界值=屏幕宽度-元素自身宽度
* 最大top边界值=屏幕高度-元素自身高度
##### 4. 贴边吸附效果
* 贴边计算公式:(屏幕宽度-元素宽度) /2;
###### 4.1. 如果滑动的left值大于屏幕宽度的一半,就贴边到右侧;
* 此时left=屏幕宽度-元素宽度
###### 4.2. 如果滑动的left值小于于屏幕宽度的一半,就贴边到左侧;此时left赋值零;
* 注意:此处的left指的是2.2下的left
##### 5. 贴边后长时间不操作,使其透明化
5.1. 手指离两秒开后,使其透明化;当手指手指触摸时候,使其不透明化
##### 6. 工具栏
* 以window视图为基线,偏左,偏右,居中显示的时候, 始终垂直居中,计算公式:
* top = (window窗口高度 – 工具栏高-工具栏上下边距)/ 2
###### 6.1. 工具栏靠window左边显示(以window视图为基线)
* 偏左显示的时候,left直接设置为0即可
###### 6.2. 工具栏靠window右边显示(以window视图为基线)
* 偏右显示的时候,需要计算left的偏移量的值
* left计算公式:window窗口宽度 -工具栏宽度 - 工具栏左右边距
###### 6.3. 工具栏以window中心显示(以window视图为基线)
* 居中显示的时候,此时工具栏水平垂直居中
* 计算公式:(window窗口宽度 -工具栏宽度 - 工具栏左右边距)/ 2
###### 6.4. 工具栏显示在上方(以fab悬浮按钮为基线)
* 获取悬浮按钮的距离顶部距离 和 工具栏高度,用来判断悬浮按钮顶部偏移距离是否小于工具栏高度;
* 获取悬浮按钮的距离顶部距离 小于 悬浮按钮高度,悬浮按钮top偏移量就向下方挪动
* 悬浮按钮top偏移量计算公式:工具栏高度+20;
* 加了20 是让工具栏和悬浮按钮有距离
* 工具栏top偏移量计算公式:悬浮按钮顶部top – 工具栏高度
* 这个时候悬浮按钮顶部top值在 a 里面重新计算了
###### 6.5. 工具栏显示在下方(以fab悬浮按钮为基线)
* 获取悬浮按钮的距离底部距离 和 工具栏高度,用来判断悬浮按钮底部偏移距离是否小于工具栏高度;
* 判断条件:悬浮按钮距离底部偏移量 是否大于 window视图高度-工具栏高度
* 如果大于重新计算悬浮按钮偏移量 和 工具栏偏移量
* 悬浮按钮偏移量公式:window视图高度 – 工具栏高度 – 20
* 减了20 是让工具栏和悬浮按钮有距离
* 工具栏偏移量公式: window视图高度 – 工具栏高度
* 注意:
* 样式里面设置display=flex时候,页面中使用 show 属性不起作用