Merge branch 'develop' of https://gitee.com/layui-vue/layui-vue into develop
This commit is contained in:
commit
064a436451
@ -1,3 +1,6 @@
|
|||||||
{
|
{
|
||||||
|
"semi": true,
|
||||||
|
"singleQuote": false,
|
||||||
|
"tabWidth": 2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="http://www.layui.com">
|
<a href="http://www.layui.com">
|
||||||
<img src="https://images.gitee.com/uploads/images/2021/1213/173638_d6911839_4835367.png" alt="layui" width="360">
|
<img src="https://images.gitee.com/uploads/images/2022/0104/135039_3f41c467_4835367.png" alt="layui" width="360">
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@ -74,14 +74,15 @@ createApp(App).use(Layui).mount('#app')
|
|||||||
|
|
||||||
### 贡献代码
|
### 贡献代码
|
||||||
|
|
||||||
> 大概是因为 layui - vue 让开发者变得更懒,所以贡献者才这么少?
|
> 在人的尺度里,世界既无始也无终,唯一的信仰是,总有人认得你站在暴风雪里的样子。
|
||||||
> 好的,姑且就这样认为吧。
|
|
||||||
|
|
||||||
[](https://giteye.net/chart/DBC9Z6HQ)
|
[](https://giteye.net/chart/DBC9Z6HQ)
|
||||||
|
|
||||||
## 交流群
|
## 交流群
|
||||||
|
|
||||||

|
| QQ | 微信 |
|
||||||
|
|----|----|
|
||||||
|
| <img src="https://images.gitee.com/uploads/images/2021/1008/090410_8b349271_4835367.png" width="180px" /> | <img src="https://images.gitee.com/uploads/images/2022/0103/195713_7e626723_4835367.png" width="180px" /> |
|
||||||
|
|
||||||
## 相关
|
## 相关
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
|
|
||||||
###### 回到顶部组件的默认样式,<code>lay-backtop</code> 会自动寻找最近的可滚动祖先元素,也可以使用 `target` 属性指定触发滚动事件的元素,通过滑动来查看页面右下角的正方形按钮。
|
###### 回到顶部组件的默认样式,<code>lay-backtop</code> 会自动寻找最近的可滚动祖先元素,也可以使用 `target` 属性指定触发滚动事件的元素,通过滑动来查看页面右下角的正方形按钮。
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 主色调
|
::: title 主色调
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 普通容器
|
::: title 普通容器
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,9 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
|
::: title 基础使用
|
||||||
|
:::
|
||||||
|
|
||||||
::: demo
|
::: demo
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,9 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
|
::: title 基础使用
|
||||||
|
:::
|
||||||
|
|
||||||
::: demo
|
::: demo
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
@ -9,9 +12,13 @@
|
|||||||
<lay-menu-item title="用户" id="2"></lay-menu-item>
|
<lay-menu-item title="用户" id="2"></lay-menu-item>
|
||||||
<lay-menu-item title="角色" id="3"></lay-menu-item>
|
<lay-menu-item title="角色" id="3"></lay-menu-item>
|
||||||
<lay-menu-item title="目录" id="7">
|
<lay-menu-item title="目录" id="7">
|
||||||
<lay-menu-child-item title="菜单一" id="4"></lay-menu-child-item>
|
<lay-menu-item title="菜单一" id="8"></lay-menu-item>
|
||||||
<lay-menu-child-item title="菜单二" id="5"></lay-menu-child-item>
|
<lay-menu-item title="菜单二" id="9"></lay-menu-item>
|
||||||
<lay-menu-child-item title="菜单三" id="6"></lay-menu-child-item>
|
<lay-menu-item title="菜单三" id="10">
|
||||||
|
<lay-menu-item title="菜单一" id="11"></lay-menu-item>
|
||||||
|
<lay-menu-item title="菜单二" id="12"></lay-menu-item>
|
||||||
|
<lay-menu-item title="菜单三" id="13"></lay-menu-item>
|
||||||
|
</lay-menu-item>
|
||||||
</lay-menu-item>
|
</lay-menu-item>
|
||||||
</lay-menu>
|
</lay-menu>
|
||||||
</template>
|
</template>
|
||||||
@ -49,9 +56,13 @@ export default {
|
|||||||
<lay-menu-item title="用户" id="2"></lay-menu-item>
|
<lay-menu-item title="用户" id="2"></lay-menu-item>
|
||||||
<lay-menu-item title="角色" id="3"></lay-menu-item>
|
<lay-menu-item title="角色" id="3"></lay-menu-item>
|
||||||
<lay-menu-item title="目录" id="7">
|
<lay-menu-item title="目录" id="7">
|
||||||
<lay-menu-child-item title="菜单一" id="4"></lay-menu-child-item>
|
<lay-menu-item title="菜单一" id="8"></lay-menu-item>
|
||||||
<lay-menu-child-item title="菜单二" id="5"></lay-menu-child-item>
|
<lay-menu-item title="菜单二" id="9"></lay-menu-item>
|
||||||
<lay-menu-child-item title="菜单三" id="6"></lay-menu-child-item>
|
<lay-menu-item title="菜单三" id="10">
|
||||||
|
<lay-menu-item title="菜单一" id="11"></lay-menu-item>
|
||||||
|
<lay-menu-item title="菜单二" id="12"></lay-menu-item>
|
||||||
|
<lay-menu-item title="菜单三" id="13"></lay-menu-item>
|
||||||
|
</lay-menu-item>
|
||||||
</lay-menu-item>
|
</lay-menu-item>
|
||||||
</lay-menu>
|
</lay-menu>
|
||||||
</template>
|
</template>
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基本使用
|
::: title 基本使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
@ -5,9 +8,9 @@
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<lay-button @click="changeVisible1" type="primary">基础使用</lay-button>
|
<lay-button @click="changeVisible1" type="primary">基础使用</lay-button>
|
||||||
<lay-modal title="基础使用" v-model="visible1">
|
<lay-layer title="基础使用" v-model="visible1">
|
||||||
内容
|
内容
|
||||||
</lay-modal>
|
</lay-layer>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@ -38,9 +41,9 @@ export default {
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<lay-button @click="changeVisible2" type="primary">允许拖动</lay-button>
|
<lay-button @click="changeVisible2" type="primary">允许拖动</lay-button>
|
||||||
<lay-modal title="允许拖动" v-model="visible2">
|
<lay-layer title="允许拖动" v-model="visible2">
|
||||||
内容
|
内容
|
||||||
</lay-modal>
|
</lay-layer>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@ -71,9 +74,9 @@ export default {
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<lay-button @click="changeVisible3" type="primary">放大缩小</lay-button>
|
<lay-button @click="changeVisible3" type="primary">放大缩小</lay-button>
|
||||||
<lay-modal title="放大缩小" v-model="visible3" move="true" maxmin="true">
|
<lay-layer title="放大缩小" v-model="visible3" move="true" maxmin="true">
|
||||||
内容
|
内容
|
||||||
</lay-modal>
|
</lay-layer>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@ -104,9 +107,9 @@ export default {
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<lay-button @click="changeVisible4" type="primary">指定位置</lay-button>
|
<lay-button @click="changeVisible4" type="primary">指定位置</lay-button>
|
||||||
<lay-modal title="指定位置" v-model="visible4" move="true" :offset="['100px','100px']">
|
<lay-layer title="指定位置" v-model="visible4" move="true" :offset="['100px','100px']">
|
||||||
内容
|
内容
|
||||||
</lay-modal>
|
</lay-layer>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@ -137,9 +140,9 @@ export default {
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<lay-button @click="changeVisible8" type="primary">尺寸拉伸</lay-button>
|
<lay-button @click="changeVisible8" type="primary">尺寸拉伸</lay-button>
|
||||||
<lay-modal title="拉伸尺寸" resize="true" v-model="visible8" move="true">
|
<lay-layer title="拉伸尺寸" resize="true" v-model="visible8" move="true">
|
||||||
内容
|
内容
|
||||||
</lay-modal>
|
</lay-layer>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@ -170,7 +173,7 @@ export default {
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<lay-button @click="changeVisible5" type="primary">远程窗体</lay-button>
|
<lay-button @click="changeVisible5" type="primary">远程窗体</lay-button>
|
||||||
<lay-modal title="加载 Iframe 内容" width="500px" height="400px" maxmin="true" v-model="visible5" move="true" :type="type5" content="http://www.pearadmin.com"></lay-modal>
|
<lay-layer title="加载 Iframe 内容" width="500px" height="400px" maxmin="true" v-model="visible5" move="true" :type="type5" content="http://www.pearadmin.com"></lay-layer>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@ -203,9 +206,9 @@ export default {
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<lay-button @click="changeVisible6" type="primary">定义操作</lay-button>
|
<lay-button @click="changeVisible6" type="primary">定义操作</lay-button>
|
||||||
<lay-modal title="定义操作" v-model="visible6" move="true" :btn="btn6">
|
<lay-layer title="定义操作" v-model="visible6" move="true" :btn="btn6">
|
||||||
内容
|
内容
|
||||||
</lay-modal>
|
</lay-layer>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@ -241,9 +244,9 @@ export default {
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<lay-button @click="changeVisible7" type="primary">开启遮盖</lay-button>
|
<lay-button @click="changeVisible7" type="primary">开启遮盖</lay-button>
|
||||||
<lay-modal title="开启遮盖" move="true" shade="false" v-model="visible7">
|
<lay-layer title="开启遮盖" move="true" shade="false" v-model="visible7">
|
||||||
内容
|
内容
|
||||||
</lay-modal>
|
</lay-layer>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@ -326,6 +329,7 @@ export default {
|
|||||||
| content | 内容 | -- |
|
| content | 内容 | -- |
|
||||||
| shade | 开启遮盖 | -- |
|
| shade | 开启遮盖 | -- |
|
||||||
| shadeClose | 遮盖点击关闭 | -- |
|
| shadeClose | 遮盖点击关闭 | -- |
|
||||||
|
| shadeOpacity | 遮盖层透明度 | `0.1` |
|
||||||
| zIndex | 自定义层级 | -- |
|
| zIndex | 自定义层级 | -- |
|
||||||
| type | 类型 | `1: component` `2: iframe` |
|
| type | 类型 | `1: component` `2: iframe` |
|
||||||
| closeBtn | 显示关闭 | true |
|
| closeBtn | 显示关闭 | true |
|
||||||
@ -333,6 +337,8 @@ export default {
|
|||||||
| btnAlign | 按钮布局 | `l` `r` `c` |
|
| btnAlign | 按钮布局 | `l` `r` `c` |
|
||||||
| anim | 入场动画 | `0` `-` `6` |
|
| anim | 入场动画 | `0` `-` `6` |
|
||||||
| isOutAnim | 关闭动画 | `true` `false` |
|
| isOutAnim | 关闭动画 | `true` `false` |
|
||||||
|
| success | 显示回调 | -- |
|
||||||
|
| end | 关闭回调 | -- |
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
112
example/docs/zh-CN/components/skeleton.md
Normal file
112
example/docs/zh-CN/components/skeleton.md
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
|
::: title 基础使用
|
||||||
|
:::
|
||||||
|
|
||||||
|
|
||||||
|
::: demo
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<div style="margin-bottom: 10px">
|
||||||
|
<lay-switch v-model="loading" active-text="加载" inactive-text="关闭"></lay-switch>
|
||||||
|
</div>
|
||||||
|
<lay-skeleton :rows="4" :loading="loading" animated>
|
||||||
|
<p style="margin-bottom: 18px">1 layui-vue , 基 于 vue 3.0 的 桌 面 端 组 件 库 , layui 的 另 一 种 呈 现 方 式</p>
|
||||||
|
<p style="margin-bottom: 18px">2 layui-vue , 基 于 vue 3.0 的 桌 面 端 组 件 库 , layui 的 另 一 种 呈 现 方 式</p>
|
||||||
|
<p style="margin-bottom: 18px">3 layui-vue , 基 于 vue 3.0 的 桌 面 端 组 件 库 , layui 的 另 一 种 呈 现 方 式</p>
|
||||||
|
<p style="margin-bottom: 18px">4 layui-vue , 基 于 vue 3.0 的 桌 面 端 组 件 库 , layui 的 另 一 种 呈 现 方 式</p>
|
||||||
|
</lay-skeleton>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { ref } from 'vue';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
setup() {
|
||||||
|
const loading = ref(true);
|
||||||
|
return {
|
||||||
|
loading,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
::: title 图片
|
||||||
|
:::
|
||||||
|
|
||||||
|
|
||||||
|
::: demo
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<div style="margin-bottom: 10px">
|
||||||
|
<lay-switch v-model="loading" active-text="加载" inactive-text="关闭"></lay-switch>
|
||||||
|
</div>
|
||||||
|
<lay-skeleton :loading="loading" animated>
|
||||||
|
<template #skeleton>
|
||||||
|
<lay-skeleton-item type="image"/>
|
||||||
|
<lay-skeleton-item type="p" style="width: 240px"/>
|
||||||
|
</template>
|
||||||
|
<div class="img-content">
|
||||||
|
<img src="https://portrait.gitee.com/uploads/avatars/user/2813/8441097_shaynas_1610801433.png" />
|
||||||
|
<p style="margin-top: 18px">layui-vue 发展史....</p>
|
||||||
|
</div>
|
||||||
|
</lay-skeleton>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { ref } from 'vue';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
setup() {
|
||||||
|
const loading = ref(true);
|
||||||
|
return {
|
||||||
|
loading,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.img-content {
|
||||||
|
width: 240px;
|
||||||
|
height: 240px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
::: title 骨架屏属性
|
||||||
|
:::
|
||||||
|
|
||||||
|
::: table
|
||||||
|
|
||||||
|
| 属性 | 描述 | 可选值 |
|
||||||
|
| ----- | ---- | ------ |
|
||||||
|
| loading | 是否显示 | `true` `false` |
|
||||||
|
| rows | 显示行数 | -- |
|
||||||
|
| animated | 是否动画 | `true` `false` |
|
||||||
|
| type | 展示类型 | `p` `image` |
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
::: title 骨架屏插槽
|
||||||
|
:::
|
||||||
|
|
||||||
|
::: table
|
||||||
|
|
||||||
|
| 插槽 | 描述 | 可选值 |
|
||||||
|
| ------ | -------- | ------ |
|
||||||
|
| default| 默认插槽 | -- |
|
||||||
|
| skeleton | 自定义插槽 | -- |
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
::: comment
|
||||||
|
:::
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 横向
|
::: title 横向
|
||||||
:::
|
:::
|
||||||
|
|
||||||
@ -69,5 +72,27 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
::: title 纵向区间
|
||||||
|
:::
|
||||||
|
|
||||||
|
::: demo
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<lay-slider v-model="value3" :range="true" :vertical="true"></lay-slider>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { ref } from 'vue'
|
||||||
|
export default {
|
||||||
|
setup() {
|
||||||
|
const value4 = ref([20,50])
|
||||||
|
return {
|
||||||
|
value4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
:::
|
||||||
|
|
||||||
::: comment
|
::: comment
|
||||||
:::
|
:::
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
::: anchor
|
||||||
|
:::
|
||||||
|
|
||||||
::: demo
|
::: demo
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
@ -11,7 +11,22 @@
|
|||||||
<template>
|
<template>
|
||||||
<lay-timeline>
|
<lay-timeline>
|
||||||
<lay-timeline-item title="0.3.x">
|
<lay-timeline-item title="0.3.x">
|
||||||
<ul>
|
<ul>
|
||||||
|
<a name="0-3-2"> </a>
|
||||||
|
<li>
|
||||||
|
<h3>0.3.2 <span class="layui-badge-rim">2022-01-03</span></h3>
|
||||||
|
<ul>
|
||||||
|
<li>[新增] skeleton 骨架屏组件。</li>
|
||||||
|
<li>[重构] tooltip 内部 popper 组件,支持移动到 tooltip 内部。</li>
|
||||||
|
<li>[增强] layer 部分函数 msg open confirm 等, content 支持 VNode 类型。</li>
|
||||||
|
<li>[增强] menu 菜单组件, 初步支持无限级嵌套。</li>
|
||||||
|
<li>[修复] layer.close layer.closeAll 函数无法触发 OutAnim 过度动画问题。</li>
|
||||||
|
<li>[废弃] menu-child-item 组件, 使用 menu-item 替代。</li>
|
||||||
|
<li>[升级] layer-vue 1.2.4。</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul>
|
||||||
<a name="0-3-1"> </a>
|
<a name="0-3-1"> </a>
|
||||||
<li>
|
<li>
|
||||||
<h3>0.3.1 <span class="layui-badge-rim">2021-12-28</span></h3>
|
<h3>0.3.1 <span class="layui-badge-rim">2021-12-28</span></h3>
|
||||||
|
@ -9,14 +9,11 @@
|
|||||||
<lay-col md="2">
|
<lay-col md="2">
|
||||||
就眠仪式
|
就眠仪式
|
||||||
</lay-col>
|
</lay-col>
|
||||||
<lay-col md="6">
|
<lay-col md="10">
|
||||||
焦点:layui-vue
|
焦点:layui-vue
|
||||||
</lay-col>
|
</lay-col>
|
||||||
<lay-col md="4">
|
<lay-col md="4">
|
||||||
地点:China Beijing
|
地点:中国 北京
|
||||||
</lay-col>
|
|
||||||
<lay-col md="5">
|
|
||||||
生态:Pear Admin
|
|
||||||
</lay-col>
|
</lay-col>
|
||||||
<lay-col md="6">
|
<lay-col md="6">
|
||||||
其他:Gitee Github
|
其他:Gitee Github
|
||||||
@ -31,14 +28,11 @@
|
|||||||
<lay-col md="2">
|
<lay-col md="2">
|
||||||
落小梅
|
落小梅
|
||||||
</lay-col>
|
</lay-col>
|
||||||
<lay-col md="6">
|
<lay-col md="10">
|
||||||
焦点:tree table
|
焦点:tree table
|
||||||
</lay-col>
|
</lay-col>
|
||||||
<lay-col md="4">
|
<lay-col md="4">
|
||||||
地点:China Hunan
|
地点:中国 湖南
|
||||||
</lay-col>
|
|
||||||
<lay-col md="5">
|
|
||||||
生态:Pear Admin
|
|
||||||
</lay-col>
|
</lay-col>
|
||||||
<lay-col md="6">
|
<lay-col md="6">
|
||||||
其他:Gitee Github
|
其他:Gitee Github
|
||||||
@ -54,14 +48,11 @@
|
|||||||
<lay-col md="2">
|
<lay-col md="2">
|
||||||
halo
|
halo
|
||||||
</lay-col>
|
</lay-col>
|
||||||
<lay-col md="6">
|
<lay-col md="10">
|
||||||
焦点:slider
|
焦点:slider
|
||||||
</lay-col>
|
</lay-col>
|
||||||
<lay-col md="4">
|
<lay-col md="4">
|
||||||
地点:China Beijing
|
地点:中国 北京
|
||||||
</lay-col>
|
|
||||||
<lay-col md="5">
|
|
||||||
生态:暂无
|
|
||||||
</lay-col>
|
</lay-col>
|
||||||
<lay-col md="6">
|
<lay-col md="6">
|
||||||
其他:Gitee Github
|
其他:Gitee Github
|
||||||
@ -77,17 +68,14 @@
|
|||||||
<lay-col md="2">
|
<lay-col md="2">
|
||||||
须弥
|
须弥
|
||||||
</lay-col>
|
</lay-col>
|
||||||
<lay-col md="6">
|
<lay-col md="10">
|
||||||
焦点:layui-vue
|
焦点:layui-vue
|
||||||
</lay-col>
|
</lay-col>
|
||||||
<lay-col md="4">
|
<lay-col md="4">
|
||||||
地点:未知
|
地点:中国 广州
|
||||||
</lay-col>
|
|
||||||
<lay-col md="5">
|
|
||||||
生态:暂无
|
|
||||||
</lay-col>
|
</lay-col>
|
||||||
<lay-col md="6">
|
<lay-col md="6">
|
||||||
其他:Gitee Github
|
其他:<a href="https://gitee.com/xumisky">Gitee</a> <a href="https://github.com/xumiSky">Github</a>
|
||||||
</lay-col>
|
</lay-col>
|
||||||
</lay-row>
|
</lay-row>
|
||||||
</lay-card>
|
</lay-card>
|
||||||
@ -100,14 +88,11 @@
|
|||||||
<lay-col md="2">
|
<lay-col md="2">
|
||||||
Sight
|
Sight
|
||||||
</lay-col>
|
</lay-col>
|
||||||
<lay-col md="6">
|
<lay-col md="10">
|
||||||
焦点:count-up backtop
|
焦点:count-up backtop
|
||||||
</lay-col>
|
</lay-col>
|
||||||
<lay-col md="4">
|
<lay-col md="4">
|
||||||
地点:未知
|
地点:中国 未知
|
||||||
</lay-col>
|
|
||||||
<lay-col md="5">
|
|
||||||
生态:暂无
|
|
||||||
</lay-col>
|
</lay-col>
|
||||||
<lay-col md="6">
|
<lay-col md="6">
|
||||||
其他:Gitee Github
|
其他:Gitee Github
|
||||||
@ -123,14 +108,31 @@
|
|||||||
<lay-col md="2">
|
<lay-col md="2">
|
||||||
finalsummer
|
finalsummer
|
||||||
</lay-col>
|
</lay-col>
|
||||||
<lay-col md="6">
|
<lay-col md="10">
|
||||||
焦点:layer-vue
|
焦点:layer-vue
|
||||||
</lay-col>
|
</lay-col>
|
||||||
<lay-col md="4">
|
<lay-col md="4">
|
||||||
地点:未知
|
地点:中国 未知
|
||||||
</lay-col>
|
</lay-col>
|
||||||
<lay-col md="5">
|
<lay-col md="6">
|
||||||
生态:暂无
|
其他:Gitee Github
|
||||||
|
</lay-col>
|
||||||
|
</lay-row>
|
||||||
|
</lay-card>
|
||||||
|
|
||||||
|
<lay-card>
|
||||||
|
<lay-row>
|
||||||
|
<lay-col md="1">
|
||||||
|
<lay-avatar src="http://mms0.baidu.com/it/u=1690972933,1482111264&fm=253&app=138&f=JPEG&fmt=auto&q=75?w=500&h=500"></lay-avatar>
|
||||||
|
</lay-col>
|
||||||
|
<lay-col md="2">
|
||||||
|
莫名点
|
||||||
|
</lay-col>
|
||||||
|
<lay-col md="10">
|
||||||
|
焦点:skeleton
|
||||||
|
</lay-col>
|
||||||
|
<lay-col md="4">
|
||||||
|
地点:中国 未知
|
||||||
</lay-col>
|
</lay-col>
|
||||||
<lay-col md="6">
|
<lay-col md="6">
|
||||||
其他:Gitee Github
|
其他:Gitee Github
|
||||||
|
281
example/src/components/LayAnchor.vue
Normal file
281
example/src/components/LayAnchor.vue
Normal file
@ -0,0 +1,281 @@
|
|||||||
|
<template>
|
||||||
|
<aside :class="classAside">
|
||||||
|
<div class="lay-aside-top">
|
||||||
|
<lay-button
|
||||||
|
type="primary"
|
||||||
|
size="xs"
|
||||||
|
:class="classAsideBtn"
|
||||||
|
@click="handlerBtnClick()"
|
||||||
|
>
|
||||||
|
<lay-icon :type="iconType" size="40"> </lay-icon>
|
||||||
|
</lay-button>
|
||||||
|
</div>
|
||||||
|
<lay-scroll
|
||||||
|
class="layui-side-scroll-bar layui-side-scroll::-webkit-scrollbar"
|
||||||
|
>
|
||||||
|
<ul>
|
||||||
|
<li
|
||||||
|
v-for="(anchor, index) in anchorList"
|
||||||
|
:key="index"
|
||||||
|
class="lay-aside-list"
|
||||||
|
:class="{ active: index === activeIndex }"
|
||||||
|
@click.prevent="handlerListItemClick(index, anchor)"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
:href="`#${anchor}`"
|
||||||
|
class="lay-aside-link"
|
||||||
|
:class="{ active: index === activeIndex }"
|
||||||
|
>{{ anchor }}</a
|
||||||
|
>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</lay-scroll>
|
||||||
|
</aside>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { computed, onMounted, ref, shallowRef, watch } from "vue";
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
anchors?: Array<string> | string;
|
||||||
|
currIndex: number;
|
||||||
|
show: boolean;
|
||||||
|
}>();
|
||||||
|
|
||||||
|
let activeIndex = ref<number>(0);
|
||||||
|
const show = ref<boolean>(props.show);
|
||||||
|
const iconType = ref<string>("layui-icon-right");
|
||||||
|
const anchors: string | string[] | undefined = props.anchors;
|
||||||
|
/**滚动条高度 */
|
||||||
|
const scrollTop = ref<number>(0);
|
||||||
|
/**要监听的滚动元素 */
|
||||||
|
const scrollRefEl = shallowRef<HTMLElement | undefined>(undefined);
|
||||||
|
/**折叠动画 */
|
||||||
|
let enableAnimation = false;
|
||||||
|
|
||||||
|
const anchorList = computed(() => {
|
||||||
|
return typeof anchors === "string" ? anchors?.split(",") : anchors;
|
||||||
|
});
|
||||||
|
|
||||||
|
const classAside = computed(() => [
|
||||||
|
"lay-aside",
|
||||||
|
{ "lay-aside-animation": enableAnimation },
|
||||||
|
{ "lay-aside-collapse": !show.value },
|
||||||
|
]);
|
||||||
|
|
||||||
|
const classAsideBtn = computed(() => {
|
||||||
|
let classBtn = [];
|
||||||
|
if (enableAnimation) {
|
||||||
|
classBtn = [
|
||||||
|
"lay-aside-collapse-btn",
|
||||||
|
"lay-aside-animation",
|
||||||
|
{ "lay-aside-collapse-btn-collapse": !show.value }
|
||||||
|
];
|
||||||
|
} else {
|
||||||
|
classBtn = [
|
||||||
|
"lay-aside-collapse-btn",
|
||||||
|
{ "lay-aside-collapse-btn-collapse": !show.value }
|
||||||
|
];
|
||||||
|
|
||||||
|
enableAnimation = true;
|
||||||
|
}
|
||||||
|
return classBtn;
|
||||||
|
});
|
||||||
|
|
||||||
|
const handlerBtnClick = () => {
|
||||||
|
show.value = !show.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
const handlerListItemClick = (index: number, id: string) => {
|
||||||
|
activeIndex.value = index;
|
||||||
|
scrollToTitle(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**锚点标签跟随滚动高亮 */
|
||||||
|
const handlerScroll = () => {
|
||||||
|
// 距离顶部 90 改变 activeIndex
|
||||||
|
scrollTop.value = getScrollTop(scrollRefEl.value) + 90;
|
||||||
|
anchorList.value?.forEach((item, index) => {
|
||||||
|
const elOffsetTop = document.getElementById(item)?.offsetTop;
|
||||||
|
if (elOffsetTop) {
|
||||||
|
if (index === 0 && scrollTop.value < elOffsetTop) {
|
||||||
|
activeIndex.value = 0;
|
||||||
|
} else if (scrollTop.value >= elOffsetTop) {
|
||||||
|
activeIndex.value = index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const handlerCollapse = () => {
|
||||||
|
iconType.value = show.value ? "layui-icon-right" : "layui-icon-left";
|
||||||
|
// @ts-ignore
|
||||||
|
scrollRefEl.value!.firstElementChild!.style.marginRight = show.value
|
||||||
|
? "180px"
|
||||||
|
: "0px";
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(show, () => {
|
||||||
|
handlerCollapse();
|
||||||
|
});
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
// @ts-ignore TODO 封装 hooks
|
||||||
|
scrollRefEl.value = document.querySelector(".layui-body");
|
||||||
|
if (!scrollRefEl.value) {
|
||||||
|
throw new Error(`scroll element is not existed: ".layui-body"`);
|
||||||
|
}
|
||||||
|
scrollRefEl.value.scrollTop = 0;
|
||||||
|
scrollRefEl.value?.addEventListener("scroll", throttle(handlerScroll, 500));
|
||||||
|
// 如果已折叠,关闭组件初始渲染时的动画,然后自动开启
|
||||||
|
// @ts-ignore
|
||||||
|
show.value = scrollRefEl.value!.firstElementChild!.style.marginRight !== "0px";
|
||||||
|
enableAnimation = show.value;
|
||||||
|
});
|
||||||
|
|
||||||
|
/**获取滚动高度 */
|
||||||
|
const getScrollTop = (el: HTMLElement | undefined): number => {
|
||||||
|
return el
|
||||||
|
? el.scrollTop
|
||||||
|
: window.pageYOffset ||
|
||||||
|
document.documentElement.scrollTop ||
|
||||||
|
document.body.scrollTop ||
|
||||||
|
0;
|
||||||
|
}
|
||||||
|
/**平滑滚动 */
|
||||||
|
const scrollToTitle = (id: string): void => {
|
||||||
|
document.getElementById(id)?.scrollIntoView({
|
||||||
|
behavior: "smooth",
|
||||||
|
block: "start",
|
||||||
|
inline: "nearest",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const throttle = (func: Function, wait: number) => {
|
||||||
|
var timer: any = null;
|
||||||
|
return (...args: any) => {
|
||||||
|
if (!timer) {
|
||||||
|
timer = setTimeout(() => {
|
||||||
|
timer = null;
|
||||||
|
func.apply(this, args);
|
||||||
|
}, wait);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.layui-side-scroll-bar {
|
||||||
|
overflow-y: scroll;
|
||||||
|
max-width: 156px;
|
||||||
|
}
|
||||||
|
.layui-side-scroll::-webkit-scrollbar {
|
||||||
|
width: 0;
|
||||||
|
}
|
||||||
|
.lay-aside {
|
||||||
|
position: fixed;
|
||||||
|
top: 65px;
|
||||||
|
right: 17px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
width: 180px;
|
||||||
|
padding: 0 25px;
|
||||||
|
background-color: #ffffff;
|
||||||
|
border-left: 1px solid rgb(229 230 235);
|
||||||
|
transition: none;
|
||||||
|
-webkit-transition: none;
|
||||||
|
height: calc(100% - 60px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.lay-aside-collapse {
|
||||||
|
right: -180px;
|
||||||
|
opacity: 0.7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lay-aside-top {
|
||||||
|
height: 29px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lay-aside-link {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 1px 4px;
|
||||||
|
color: grey;
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 2;
|
||||||
|
max-width: 140px;
|
||||||
|
min-width: 68px;
|
||||||
|
text-decoration: none;
|
||||||
|
background-color: transparent;
|
||||||
|
border-radius: 2px;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.1s cubic-bezier(0, 0, 1, 1);
|
||||||
|
}
|
||||||
|
.lay-aside-list {
|
||||||
|
position: relative;
|
||||||
|
margin: 5px 0px 0px 4px;
|
||||||
|
padding-left: 2px;
|
||||||
|
max-width: 140px;
|
||||||
|
border-radius: 2px;
|
||||||
|
list-style: none;
|
||||||
|
&:hover {
|
||||||
|
background-color: #f6f6f6 !important;
|
||||||
|
color: #5fb878;
|
||||||
|
}
|
||||||
|
&:active {
|
||||||
|
background-color: #f6f6f6 !important;
|
||||||
|
color: #89d89f;
|
||||||
|
}
|
||||||
|
&.active {
|
||||||
|
background-color: #f6f6f6 !important;
|
||||||
|
* {
|
||||||
|
color: #5fb878 !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.lay-aside-collapse-btn {
|
||||||
|
position: fixed;
|
||||||
|
right: 197px;
|
||||||
|
top: calc(50% - 20px);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 18px;
|
||||||
|
height: 40px;
|
||||||
|
background-color: #f6f6f6;
|
||||||
|
border-radius: 0px;
|
||||||
|
border-top-left-radius: 4px;
|
||||||
|
border-bottom-left-radius: 4px;
|
||||||
|
border: rgb(229 230 235) 1px solid;
|
||||||
|
border-right: none;
|
||||||
|
box-shadow: 2px 0 8px 0 rgb(29 35 41 / 5%);
|
||||||
|
transition: none;
|
||||||
|
-webkit-transition: none;
|
||||||
|
&:hover {
|
||||||
|
background-color: #e2e2e2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.lay-aside-collapse-btn-collapse {
|
||||||
|
right: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lay-aside-animation {
|
||||||
|
transition: right 200ms;
|
||||||
|
-webkit-transition: right 200ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 768px) {
|
||||||
|
.lay-aside {
|
||||||
|
width: 100px !important;
|
||||||
|
}
|
||||||
|
.lay-aside-collapse-btn {
|
||||||
|
right: 98px;
|
||||||
|
}
|
||||||
|
.lay-aside-collapse-btn-collapse {
|
||||||
|
right: 15px;
|
||||||
|
}
|
||||||
|
.lay-aside-list {
|
||||||
|
max-width: 68px;
|
||||||
|
}
|
||||||
|
.layui-side-scroll-bar {
|
||||||
|
max-width: 68px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@ -5,9 +5,9 @@
|
|||||||
</template>
|
</template>
|
||||||
<style>
|
<style>
|
||||||
.lay-table-box table {
|
.lay-table-box table {
|
||||||
width: 100%; /*表格宽度*/
|
width: 100%;
|
||||||
border-collapse: collapse; /*使用单一线条的边框*/
|
border-collapse: collapse;
|
||||||
empty-cells: show; /*单元格无内容依旧绘制边框*/
|
empty-cells: show;
|
||||||
border-right: 1px solid whitesmoke;
|
border-right: 1px solid whitesmoke;
|
||||||
border-left: 1px solid whitesmoke;
|
border-left: 1px solid whitesmoke;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
@ -18,8 +18,8 @@
|
|||||||
.lay-table-box table th,
|
.lay-table-box table th,
|
||||||
.lay-table-box table td {
|
.lay-table-box table td {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
width: 160px;
|
width: 50px;
|
||||||
max-width: 160px;
|
max-width: 180px;
|
||||||
height: 50px; /*统一每一行的默认高度*/
|
height: 50px; /*统一每一行的默认高度*/
|
||||||
border-top: 1px solid whitesmoke; /*内部边框样式*/
|
border-top: 1px solid whitesmoke; /*内部边框样式*/
|
||||||
padding: 0 10px; /*内边距*/
|
padding: 0 10px; /*内边距*/
|
||||||
|
@ -43,7 +43,7 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="layui-nav-item">
|
<li class="layui-nav-item">
|
||||||
<a href="javascript:void(0)"> 0.3.1 </a>
|
<a href="javascript:void(0)"> 0.3.2 </a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</lay-header>
|
</lay-header>
|
||||||
|
@ -7,6 +7,7 @@ import LayCode from './components/LayCode.vue'
|
|||||||
import LaySearch from './components/LaySearch.vue'
|
import LaySearch from './components/LaySearch.vue'
|
||||||
import LayTableBox from './components/LayTableBox.vue'
|
import LayTableBox from './components/LayTableBox.vue'
|
||||||
import LayComment from './components/LayComment.vue'
|
import LayComment from './components/LayComment.vue'
|
||||||
|
import LayAnchor from './components/LayAnchor.vue'
|
||||||
import './assets/css/index.css'
|
import './assets/css/index.css'
|
||||||
|
|
||||||
export function createApp(): {
|
export function createApp(): {
|
||||||
@ -23,6 +24,7 @@ export function createApp(): {
|
|||||||
.component('LaySearch', LaySearch)
|
.component('LaySearch', LaySearch)
|
||||||
.component('LayTableBox', LayTableBox)
|
.component('LayTableBox', LayTableBox)
|
||||||
.component('LayComment', LayComment)
|
.component('LayComment', LayComment)
|
||||||
|
.component('LayAnchor',LayAnchor)
|
||||||
.use(Layui)
|
.use(Layui)
|
||||||
|
|
||||||
return { app, router }
|
return { app, router }
|
||||||
|
@ -9,6 +9,7 @@ import createBlock from './create-block'
|
|||||||
import createDescribe from './create-describe'
|
import createDescribe from './create-describe'
|
||||||
import createTable from './create-table'
|
import createTable from './create-table'
|
||||||
import createComment from './create-comment'
|
import createComment from './create-comment'
|
||||||
|
import createAnchor from './create-anchor'
|
||||||
import preWrapper from './pre-wrapper'
|
import preWrapper from './pre-wrapper'
|
||||||
|
|
||||||
const plugins = [
|
const plugins = [
|
||||||
@ -31,6 +32,7 @@ const plugins = [
|
|||||||
.use(...createTitle('title', ''))
|
.use(...createTitle('title', ''))
|
||||||
.use(...createDescribe('describe', ''))
|
.use(...createDescribe('describe', ''))
|
||||||
.use(...createComment('comment', ''))
|
.use(...createComment('comment', ''))
|
||||||
|
.use(...createAnchor('anchor', ''))
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
] as any
|
] as any
|
||||||
|
35
example/src/plugin/create-anchor.ts
Normal file
35
example/src/plugin/create-anchor.ts
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
import container from "markdown-it-container";
|
||||||
|
import type Token from "markdown-it/lib/token";
|
||||||
|
|
||||||
|
type ContainerArgs = [
|
||||||
|
typeof container, string,
|
||||||
|
{ render(tokens: Token[], idx: number): string }
|
||||||
|
]
|
||||||
|
|
||||||
|
export default function createContainer(
|
||||||
|
klass: string,
|
||||||
|
defaultTitle: string
|
||||||
|
): ContainerArgs {
|
||||||
|
return [
|
||||||
|
container,
|
||||||
|
klass,
|
||||||
|
{
|
||||||
|
render(tokens, idx) {
|
||||||
|
const token = tokens[idx];
|
||||||
|
if (token.nesting === 1) {
|
||||||
|
const anchors = [];
|
||||||
|
for (const token of tokens) {
|
||||||
|
if (token.nesting === 1 && token.info.includes("title")) {
|
||||||
|
const info = token.info.trim().slice(klass.length).trim();
|
||||||
|
anchors.push(info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 此处仅支持 string | number | boolean 类型
|
||||||
|
return `<lay-anchor anchors="${anchors}" :currIndex="-1" :show="true">`;
|
||||||
|
} else {
|
||||||
|
return "</lay-anchor>\n";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
@ -2,11 +2,8 @@ import container from 'markdown-it-container'
|
|||||||
import type Token from 'markdown-it/lib/token'
|
import type Token from 'markdown-it/lib/token'
|
||||||
|
|
||||||
type ContainerArgs = [
|
type ContainerArgs = [
|
||||||
typeof container,
|
typeof container, string,
|
||||||
string,
|
{ render(tokens: Token[], idx: number): string }
|
||||||
{
|
|
||||||
render(tokens: Token[], idx: number): string
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
|
|
||||||
export default function createContainer(
|
export default function createContainer(
|
||||||
|
@ -2,11 +2,8 @@ import container from 'markdown-it-container'
|
|||||||
import type Token from 'markdown-it/lib/token'
|
import type Token from 'markdown-it/lib/token'
|
||||||
|
|
||||||
type ContainerArgs = [
|
type ContainerArgs = [
|
||||||
typeof container,
|
typeof container, string,
|
||||||
string,
|
{ render(tokens: Token[], idx: number): string }
|
||||||
{
|
|
||||||
render(tokens: Token[], idx: number): string
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
|
|
||||||
export default function createContainer(
|
export default function createContainer(
|
||||||
|
@ -2,11 +2,8 @@ import container from 'markdown-it-container'
|
|||||||
import type Token from 'markdown-it/lib/token'
|
import type Token from 'markdown-it/lib/token'
|
||||||
|
|
||||||
type ContainerArgs = [
|
type ContainerArgs = [
|
||||||
typeof container,
|
typeof container, string,
|
||||||
string,
|
{ render(tokens: Token[], idx: number): string }
|
||||||
{
|
|
||||||
render(tokens: Token[], idx: number): string
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
|
|
||||||
export default function createContainer(
|
export default function createContainer(
|
||||||
|
@ -2,11 +2,8 @@ import container from 'markdown-it-container'
|
|||||||
import type Token from 'markdown-it/lib/token'
|
import type Token from 'markdown-it/lib/token'
|
||||||
|
|
||||||
type ContainerArgs = [
|
type ContainerArgs = [
|
||||||
typeof container,
|
typeof container, string,
|
||||||
string,
|
{ render(tokens: Token[], idx: number): string }
|
||||||
{
|
|
||||||
render(tokens: Token[], idx: number): string
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
|
|
||||||
export default function createContainer(
|
export default function createContainer(
|
||||||
|
@ -2,11 +2,8 @@ import container from 'markdown-it-container'
|
|||||||
import type Token from 'markdown-it/lib/token'
|
import type Token from 'markdown-it/lib/token'
|
||||||
|
|
||||||
type ContainerArgs = [
|
type ContainerArgs = [
|
||||||
typeof container,
|
typeof container, string,
|
||||||
string,
|
{ render(tokens: Token[], idx: number): string }
|
||||||
{
|
|
||||||
render(tokens: Token[], idx: number): string
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
|
|
||||||
export default function createContainer(
|
export default function createContainer(
|
||||||
@ -21,9 +18,9 @@ export default function createContainer(
|
|||||||
const token = tokens[idx]
|
const token = tokens[idx]
|
||||||
const info = token.info.trim().slice(klass.length).trim()
|
const info = token.info.trim().slice(klass.length).trim()
|
||||||
if (token.nesting === 1) {
|
if (token.nesting === 1) {
|
||||||
return `<lay-field title="${
|
return `<lay-field id="${info || defaultTitle}" title="${
|
||||||
info || defaultTitle
|
info || defaultTitle
|
||||||
}" style="margin-top:20px;margin-bottom: 20px;">`
|
}" style="margin-top:21px;margin-bottom: 20px;">`
|
||||||
} else {
|
} else {
|
||||||
return '</lay-field>\n'
|
return '</lay-field>\n'
|
||||||
}
|
}
|
||||||
|
@ -19,13 +19,8 @@ export default (md: MarkdownIt): void => {
|
|||||||
}
|
}
|
||||||
const start = pos + 3
|
const start = pos + 3
|
||||||
const end = state.skipSpacesBack(max, pos)
|
const end = state.skipSpacesBack(max, pos)
|
||||||
const rawPath = state.src
|
const rawPath = state.src.slice(start, end).trim().replace(/^@/, process.cwd())
|
||||||
.slice(start, end)
|
const content = fs.existsSync(rawPath) ? fs.readFileSync(rawPath).toString() : 'Not found: ' + rawPath
|
||||||
.trim()
|
|
||||||
.replace(/^@/, process.cwd())
|
|
||||||
const content = fs.existsSync(rawPath)
|
|
||||||
? fs.readFileSync(rawPath).toString()
|
|
||||||
: 'Not found: ' + rawPath
|
|
||||||
const meta = rawPath.replace(rawPath, '')
|
const meta = rawPath.replace(rawPath, '')
|
||||||
state.line = startLine + 1
|
state.line = startLine + 1
|
||||||
const token = state.push('fence', 'code', 0)
|
const token = state.push('fence', 'code', 0)
|
||||||
|
@ -76,6 +76,11 @@ const zhCN = [
|
|||||||
component: Component,
|
component: Component,
|
||||||
meta: { title: '组件' },
|
meta: { title: '组件' },
|
||||||
children: [
|
children: [
|
||||||
|
{
|
||||||
|
path: '/zh-CN/components/skeleton',
|
||||||
|
component: () => import('../../docs/zh-CN/components/skeleton.md'),
|
||||||
|
meta: { title: '骨架屏' },
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: '/zh-CN/components/layout',
|
path: '/zh-CN/components/layout',
|
||||||
component: () => import('../../docs/zh-CN/components/layout.md'),
|
component: () => import('../../docs/zh-CN/components/layout.md'),
|
||||||
|
@ -37,7 +37,13 @@
|
|||||||
</lay-scroll>
|
</lay-scroll>
|
||||||
</lay-side>
|
</lay-side>
|
||||||
<lay-body>
|
<lay-body>
|
||||||
<div style="padding: 20px">
|
<div
|
||||||
|
style="
|
||||||
|
padding: 20px;
|
||||||
|
margin-right: 180px;
|
||||||
|
transition: margin 240ms 60ms;
|
||||||
|
"
|
||||||
|
>
|
||||||
<router-view />
|
<router-view />
|
||||||
</div>
|
</div>
|
||||||
</lay-body>
|
</lay-body>
|
||||||
@ -98,6 +104,12 @@ export default {
|
|||||||
id: 1,
|
id: 1,
|
||||||
title: '布局',
|
title: '布局',
|
||||||
children: [
|
children: [
|
||||||
|
{
|
||||||
|
id: 111,
|
||||||
|
title: '骨架屏',
|
||||||
|
subTitle: 'skeleton',
|
||||||
|
path: '/zh-CN/components/skeleton',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: 4,
|
id: 4,
|
||||||
title: '布局',
|
title: '布局',
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
<div class="site-version">
|
<div class="site-version">
|
||||||
<span>当前版本:v<cite class="site-showv">0.3.1</cite></span>
|
<span>当前版本:v<cite class="site-showv">0.3.2</cite></span>
|
||||||
<span
|
<span
|
||||||
><router-link
|
><router-link
|
||||||
class="layui-inline site-down"
|
class="layui-inline site-down"
|
||||||
@ -34,7 +34,7 @@
|
|||||||
>更新日志</router-link
|
>更新日志</router-link
|
||||||
></span
|
></span
|
||||||
>
|
>
|
||||||
<span>下载量:<em class="site-showdowns">2324</em></span>
|
<span>下载量:<em class="site-showdowns">3124</em></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="site-banner-other">
|
<div class="site-banner-other">
|
||||||
@ -44,7 +44,7 @@
|
|||||||
rel="nofollow"
|
rel="nofollow"
|
||||||
class="site-star"
|
class="site-star"
|
||||||
>
|
>
|
||||||
<i class="layui-icon"></i> Star <cite id="getStars">521</cite>
|
<i class="layui-icon"></i> Star <cite id="getStars">544</cite>
|
||||||
</a>
|
</a>
|
||||||
<a
|
<a
|
||||||
href="https://gitee.com/layui-vue"
|
href="https://gitee.com/layui-vue"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@layui/layui-vue",
|
"name": "@layui/layui-vue",
|
||||||
"version": "0.3.1",
|
"version": "0.3.2",
|
||||||
"author": "sleeprite",
|
"author": "sleeprite",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"description": "a component library for Vue 3 base on layui-vue",
|
"description": "a component library for Vue 3 base on layui-vue",
|
||||||
@ -26,14 +26,14 @@
|
|||||||
"build": "vite build --emptyOutDir && npm run build:types",
|
"build": "vite build --emptyOutDir && npm run build:types",
|
||||||
"build:types": "rimraf types && tsc -d",
|
"build:types": "rimraf types && tsc -d",
|
||||||
"build:example": "vite build example",
|
"build:example": "vite build example",
|
||||||
"lint:eslint": "eslint \"src/**/*.{vue,ts,tsx}\" --fix",
|
"lint:eslint": "eslint 'src/**/*.{vue,ts,tsx}' --fix",
|
||||||
"lint:prettier": "prettier --write \"src/**/*.{js,json,tsx,css,less,scss,vue,html,md}\"",
|
"lint:prettier": "prettier --write 'src/**/*'",
|
||||||
"commit": "git cz"
|
"commit": "git cz"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@layui/hooks-vue": "^0.1.6",
|
"@layui/hooks-vue": "^0.1.6",
|
||||||
"@layui/icons-vue": "^1.0.2",
|
"@layui/icons-vue": "^1.0.2",
|
||||||
"@layui/layer-vue": "^1.2.2",
|
"@layui/layer-vue": "^1.2.4",
|
||||||
"async-validator": "^4.0.7",
|
"async-validator": "^4.0.7",
|
||||||
"countup.js": "^2.0.8",
|
"countup.js": "^2.0.8",
|
||||||
"evtd": "^0.2.3",
|
"evtd": "^0.2.3",
|
||||||
|
@ -2844,6 +2844,25 @@ body .layui-table-tips .layui-layer-content {
|
|||||||
color: #5fb878;
|
color: #5fb878;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.layui-nav .layui-show.layui-anim-upbit .layui-show.layui-anim-upbit {
|
||||||
|
top: 0px;
|
||||||
|
left: 106px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.layui-nav .layui-show.layui-anim-upbit .layui-nav-item {
|
||||||
|
display: block;
|
||||||
|
height: 40px;
|
||||||
|
line-height: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.layui-nav .layui-show.layui-anim-upbit .layui-nav-item.layui-this {
|
||||||
|
background-color: whitesmoke;
|
||||||
|
}
|
||||||
|
|
||||||
|
.layui-nav .layui-show.layui-anim-upbit .layui-nav-item.layui-this:after {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
.layui-nav {
|
.layui-nav {
|
||||||
position: relative;
|
position: relative;
|
||||||
padding: 0 20px;
|
padding: 0 20px;
|
||||||
@ -2868,7 +2887,7 @@ body .layui-table-tips .layui-layer-content {
|
|||||||
|
|
||||||
.layui-nav .layui-nav-item a {
|
.layui-nav .layui-nav-item a {
|
||||||
display: block;
|
display: block;
|
||||||
padding: 0 20px;
|
padding: 0 30px;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
color: rgba(255, 255, 255, 0.7);
|
color: rgba(255, 255, 255, 0.7);
|
||||||
-webkit-transition: all 0.3s;
|
-webkit-transition: all 0.3s;
|
||||||
@ -2881,7 +2900,7 @@ body .layui-table-tips .layui-layer-content {
|
|||||||
left: 0;
|
left: 0;
|
||||||
top: 0;
|
top: 0;
|
||||||
width: 0;
|
width: 0;
|
||||||
height: 5px;
|
height: 3px;
|
||||||
background-color: #5fb878;
|
background-color: #5fb878;
|
||||||
transition: all 0.2s;
|
transition: all 0.2s;
|
||||||
-webkit-transition: all 0.2s;
|
-webkit-transition: all 0.2s;
|
||||||
@ -2917,7 +2936,7 @@ body .layui-table-tips .layui-layer-content {
|
|||||||
.layui-nav .layui-nav-more {
|
.layui-nav .layui-nav-more {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
right: 3px;
|
right: 8px;
|
||||||
left: auto !important;
|
left: auto !important;
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
font-size: 12.5px !important;
|
font-size: 12.5px !important;
|
||||||
@ -2988,13 +3007,13 @@ body .layui-table-tips .layui-layer-content {
|
|||||||
.layui-nav-tree .layui-nav-item {
|
.layui-nav-tree .layui-nav-item {
|
||||||
display: block;
|
display: block;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
line-height: 40px;
|
line-height: 42px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.layui-nav-tree .layui-nav-item a {
|
.layui-nav-tree .layui-nav-item a {
|
||||||
position: relative;
|
position: relative;
|
||||||
height: 46px;
|
height: 42px;
|
||||||
line-height: 46px;
|
line-height: 42px;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
15
src/index.ts
15
src/index.ts
@ -6,7 +6,7 @@ import "@layui/layer-vue/lib/index.css";
|
|||||||
import "@layui/icons-vue/lib/index.css";
|
import "@layui/icons-vue/lib/index.css";
|
||||||
import { layer } from "@layui/layer-vue";
|
import { layer } from "@layui/layer-vue";
|
||||||
|
|
||||||
import LayModal from "./module/layer/modal/index";
|
import LayLayer from "./module/layer/index";
|
||||||
import LayBacktop from "./module/backTop/index";
|
import LayBacktop from "./module/backTop/index";
|
||||||
import LayAvatar from "./module/avatar/index";
|
import LayAvatar from "./module/avatar/index";
|
||||||
import LayRadio from "./module/radio/index";
|
import LayRadio from "./module/radio/index";
|
||||||
@ -40,7 +40,6 @@ import LayContainer from "./module/container/index";
|
|||||||
import LayCountUp from "./module/countUp/index";
|
import LayCountUp from "./module/countUp/index";
|
||||||
import LayMenu from "./module/menu/index";
|
import LayMenu from "./module/menu/index";
|
||||||
import LayMenuItem from "./module/menuItem/index";
|
import LayMenuItem from "./module/menuItem/index";
|
||||||
import LayMenuChildItem from "./module/menuChildItem/index";
|
|
||||||
import LayCheckbox from "./module/checkbox/index";
|
import LayCheckbox from "./module/checkbox/index";
|
||||||
import LayCheckboxGroup from "./module/checkboxGroup/index";
|
import LayCheckboxGroup from "./module/checkboxGroup/index";
|
||||||
import LayForm from "./module/form/index";
|
import LayForm from "./module/form/index";
|
||||||
@ -67,6 +66,8 @@ import LayCarouselItem from "./module/carouselItem/index";
|
|||||||
import LayColorPicker from "./module/colorPicker/index";
|
import LayColorPicker from "./module/colorPicker/index";
|
||||||
import LayTooltip from "./module/tooltip/index";
|
import LayTooltip from "./module/tooltip/index";
|
||||||
import LayInputNumber from "./module/inputNumber/index";
|
import LayInputNumber from "./module/inputNumber/index";
|
||||||
|
import LaySkeleton from './module/skeleton/index';
|
||||||
|
import LaySkeletonItem from './module/skeletonItem/index';
|
||||||
|
|
||||||
const components: Record<string, IDefineComponent> = {
|
const components: Record<string, IDefineComponent> = {
|
||||||
LayRadio,
|
LayRadio,
|
||||||
@ -99,7 +100,6 @@ const components: Record<string, IDefineComponent> = {
|
|||||||
LayContainer,
|
LayContainer,
|
||||||
LayMenu,
|
LayMenu,
|
||||||
LayMenuItem,
|
LayMenuItem,
|
||||||
LayMenuChildItem,
|
|
||||||
LayCheckbox,
|
LayCheckbox,
|
||||||
LayForm,
|
LayForm,
|
||||||
LayBreadcrumb,
|
LayBreadcrumb,
|
||||||
@ -126,9 +126,11 @@ const components: Record<string, IDefineComponent> = {
|
|||||||
LayCarousel,
|
LayCarousel,
|
||||||
LayCarouselItem,
|
LayCarouselItem,
|
||||||
LayColorPicker,
|
LayColorPicker,
|
||||||
LayModal,
|
LayLayer,
|
||||||
LayTooltip,
|
LayTooltip,
|
||||||
LayInputNumber,
|
LayInputNumber,
|
||||||
|
LaySkeleton,
|
||||||
|
LaySkeletonItem,
|
||||||
LayCountUp,
|
LayCountUp,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -142,6 +144,8 @@ const install = (app: App, options?: InstallOptions): void => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export {
|
export {
|
||||||
|
LaySkeleton,
|
||||||
|
LaySkeletonItem,
|
||||||
LayRadio,
|
LayRadio,
|
||||||
LayIcon,
|
LayIcon,
|
||||||
LayButton,
|
LayButton,
|
||||||
@ -172,7 +176,6 @@ export {
|
|||||||
LayContainer,
|
LayContainer,
|
||||||
LayMenu,
|
LayMenu,
|
||||||
LayMenuItem,
|
LayMenuItem,
|
||||||
LayMenuChildItem,
|
|
||||||
LayCheckbox,
|
LayCheckbox,
|
||||||
LayForm,
|
LayForm,
|
||||||
LayBreadcrumb,
|
LayBreadcrumb,
|
||||||
@ -199,7 +202,7 @@ export {
|
|||||||
LayCarousel,
|
LayCarousel,
|
||||||
LayCarouselItem,
|
LayCarouselItem,
|
||||||
LayColorPicker,
|
LayColorPicker,
|
||||||
LayModal
|
LayLayer
|
||||||
};
|
};
|
||||||
|
|
||||||
export { layer };
|
export { layer };
|
||||||
|
9
src/module/layer/index.ts
Normal file
9
src/module/layer/index.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import type { App } from "vue";
|
||||||
|
import { LayLayer } from "@layui/layer-vue";
|
||||||
|
import type { IDefineComponent } from "../type/index";
|
||||||
|
|
||||||
|
LayLayer.install = (app: App) => {
|
||||||
|
app.component(LayLayer.name || "LayLayer", LayLayer);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default LayLayer as IDefineComponent;
|
@ -1,9 +0,0 @@
|
|||||||
import type { App } from "vue";
|
|
||||||
import { LayModal } from "@layui/layer-vue";
|
|
||||||
import type { IDefineComponent } from "../../type/index";
|
|
||||||
|
|
||||||
LayModal.install = (app: App) => {
|
|
||||||
app.component(LayModal.name || "LayModal", LayModal);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default LayModal as IDefineComponent;
|
|
@ -1,9 +0,0 @@
|
|||||||
import type { App } from "vue";
|
|
||||||
import Component from "./index.vue";
|
|
||||||
import type { IDefineComponent } from "../type/index";
|
|
||||||
|
|
||||||
Component.install = (app: App) => {
|
|
||||||
app.component(Component.name || "LayMenuChildItem", Component);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default Component as IDefineComponent;
|
|
@ -1,25 +0,0 @@
|
|||||||
<template>
|
|
||||||
<dd :class="[selectedKey === id ? 'layui-this' : '']" @click="selectHandle()">
|
|
||||||
<slot v-if="slots.title" name="title"></slot>
|
|
||||||
<a v-else href="javascript:void(0)">
|
|
||||||
{{ title }}
|
|
||||||
</a>
|
|
||||||
</dd>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup name="LayMenuChildItem" lang="ts">
|
|
||||||
import { defineProps, inject, Ref, useSlots } from "vue";
|
|
||||||
|
|
||||||
const slots = useSlots();
|
|
||||||
|
|
||||||
const props = defineProps<{
|
|
||||||
id: string;
|
|
||||||
title: string;
|
|
||||||
}>();
|
|
||||||
|
|
||||||
const selectedKey: Ref<string> = inject("selectedKey") as Ref<string>;
|
|
||||||
|
|
||||||
const selectHandle = function () {
|
|
||||||
selectedKey.value = props.id;
|
|
||||||
};
|
|
||||||
</script>
|
|
@ -14,21 +14,21 @@
|
|||||||
@attr : ~'[position=@{position}]';
|
@attr : ~'[position=@{position}]';
|
||||||
&{
|
&{
|
||||||
border: 1px solid @m-border-color;
|
border: 1px solid @m-border-color;
|
||||||
&.layui-popper@{attr}{
|
&@{attr}{
|
||||||
margin-@{contrary_position}: 6px;
|
margin-@{contrary_position}: 6px;
|
||||||
.layui-popper-arrow {
|
.layui-popper-arrow {
|
||||||
@{contrary_position}: -6px;
|
@{contrary_position}: -6px;
|
||||||
border-@{contrary_position}-width: 0;
|
|
||||||
border-@{position}-color: @m-border-color;
|
|
||||||
&::after{
|
|
||||||
@{contrary_position}: 1px;
|
|
||||||
border-@{contrary_position}-width: 0;
|
border-@{contrary_position}-width: 0;
|
||||||
margin-@{margin_postion}: -6px;
|
border-@{position}-color: @m-border-color;
|
||||||
border-@{position}-color: @color;
|
&::after{
|
||||||
|
@{contrary_position}: 1px;
|
||||||
|
border-@{contrary_position}-width: 0;
|
||||||
|
margin-@{margin_postion}: -6px;
|
||||||
|
border-@{position}-color: @color;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// 统一设置四个方向的主题
|
// 统一设置四个方向的主题
|
||||||
.theme(@background-color, @color, @border-color) {
|
.theme(@background-color, @color, @border-color) {
|
||||||
@ -43,7 +43,7 @@
|
|||||||
// 箭头默认居中
|
// 箭头默认居中
|
||||||
.arrow-default-center(@position, @prop) {
|
.arrow-default-center(@position, @prop) {
|
||||||
@attr : ~'[position=@{position}]';
|
@attr : ~'[position=@{position}]';
|
||||||
&.layui-popper@{attr} {
|
&@{attr} {
|
||||||
.layui-popper-arrow{
|
.layui-popper-arrow{
|
||||||
@{prop}: -moz-calc(50% - 6px);
|
@{prop}: -moz-calc(50% - 6px);
|
||||||
@{prop}: -webkit-calc(50% - 6px);
|
@{prop}: -webkit-calc(50% - 6px);
|
||||||
@ -58,6 +58,23 @@
|
|||||||
.arrow-default-center(right, top);
|
.arrow-default-center(right, top);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 填充popper,支持可以移动到popper使用到
|
||||||
|
.single-fill-popper(@position, @contrary_position, @zeroPosition, @all, @seven){
|
||||||
|
@attr : ~'[position=@{position}]';
|
||||||
|
&@{attr}::after{
|
||||||
|
@{contrary_position}: -7px;
|
||||||
|
@{zeroPosition}: 0;
|
||||||
|
@{all}: 100%;
|
||||||
|
@{seven}: 7px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.fill-popper(){
|
||||||
|
.single-fill-popper(top, bottom, left, width, height);
|
||||||
|
.single-fill-popper(bottom, top, left, width, height);
|
||||||
|
.single-fill-popper(left, right, bottom, height, width);
|
||||||
|
.single-fill-popper(right, left, bottom, height, width);
|
||||||
|
}
|
||||||
|
|
||||||
// 样式开始
|
// 样式开始
|
||||||
.layui-popper {
|
.layui-popper {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
@ -76,9 +93,17 @@
|
|||||||
// 箭头默认居中
|
// 箭头默认居中
|
||||||
.all-arrow-default-center();
|
.all-arrow-default-center();
|
||||||
|
|
||||||
|
&::after{
|
||||||
|
content: " ";
|
||||||
|
position: absolute;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
// 填充
|
||||||
|
.fill-popper();
|
||||||
|
|
||||||
.layui-popper-arrow {
|
.layui-popper-arrow {
|
||||||
&,&::after{
|
&,&::after{
|
||||||
position: absolute;
|
position: absolute;
|
||||||
display: block;
|
display: block;
|
||||||
width: 0;
|
width: 0;
|
||||||
height: 0;
|
height: 0;
|
||||||
|
@ -1,15 +1,17 @@
|
|||||||
<template>
|
<template>
|
||||||
<transition v-show="innerVisible">
|
<teleport to="body" v-if="isExist">
|
||||||
<div
|
<transition v-show="innerVisible">
|
||||||
ref="popper"
|
<div
|
||||||
:class="['layui-popper', { 'layui-dark': innnerIsDark }]"
|
ref="popper"
|
||||||
:style="style"
|
:class="['layui-popper', { 'layui-dark': isDark }]"
|
||||||
:position="innnerPosition"
|
:style="style"
|
||||||
>
|
:position="position"
|
||||||
<slot>{{ content.value }}</slot>
|
>
|
||||||
<div class="layui-popper-arrow"></div>
|
<slot>{{ content }}</slot>
|
||||||
</div>
|
<div class="layui-popper-arrow"></div>
|
||||||
</transition>
|
</div>
|
||||||
|
</transition>
|
||||||
|
</teleport>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
const NAME = "LayPopper";
|
const NAME = "LayPopper";
|
||||||
@ -25,30 +27,33 @@ import {
|
|||||||
CSSProperties,
|
CSSProperties,
|
||||||
ref,
|
ref,
|
||||||
watch,
|
watch,
|
||||||
onUpdated,
|
|
||||||
defineEmits,
|
defineEmits,
|
||||||
onMounted,
|
onMounted,
|
||||||
Ref,
|
|
||||||
} from "vue";
|
} from "vue";
|
||||||
import { on } from "../../tools/domUtil";
|
import { on } from "../../tools/domUtil";
|
||||||
const props = withDefaults(
|
const props = withDefaults(
|
||||||
defineProps<{
|
defineProps<{
|
||||||
el: any;
|
el: any;
|
||||||
content?: Ref<string | Number>;
|
content?: string | Number;
|
||||||
position?: Ref<string>;
|
position?: string;
|
||||||
trigger?: string;
|
trigger?: string;
|
||||||
enterable?: boolean;
|
enterable?: boolean;
|
||||||
isDark?: Ref<boolean>;
|
isDark?: boolean;
|
||||||
disabled?: Ref<boolean>;
|
disabled?: boolean;
|
||||||
visible?: Ref<boolean>;
|
visible?: boolean;
|
||||||
isCanHide?: Ref<boolean>;
|
isCanHide?: boolean;
|
||||||
updateVisible?: Function;
|
|
||||||
}>(),
|
}>(),
|
||||||
{
|
{
|
||||||
|
position: 'top',
|
||||||
|
isDark: true,
|
||||||
|
disabled: false,
|
||||||
enterable: true,
|
enterable: true,
|
||||||
|
visible: true,
|
||||||
|
isCanHide: true,
|
||||||
trigger: "hover",
|
trigger: "hover",
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
const emit = defineEmits(["update:visible"]);
|
||||||
|
|
||||||
const EVENT_MAP: any = {
|
const EVENT_MAP: any = {
|
||||||
hover: ["mouseenter", null, "mouseleave", false],
|
hover: ["mouseenter", null, "mouseleave", false],
|
||||||
@ -63,55 +68,52 @@ if (!triggerArr) {
|
|||||||
const style = ref<CSSProperties>({ top: -window.innerHeight + "px", left: 0 });
|
const style = ref<CSSProperties>({ top: -window.innerHeight + "px", left: 0 });
|
||||||
const checkTarget = ref(false);
|
const checkTarget = ref(false);
|
||||||
const popper = ref<HTMLDivElement>({} as HTMLDivElement);
|
const popper = ref<HTMLDivElement>({} as HTMLDivElement);
|
||||||
const tempPosition = props.position ?? ref("top");
|
const innnerPosition = ref(props.position);
|
||||||
const innnerPosition = ref(tempPosition.value);
|
|
||||||
const innnerIsDark = ref(props.isDark ?? true);
|
|
||||||
const innnerDisabled = ref(props.disabled ?? false);
|
|
||||||
const innerVisible = ref(props.visible ?? true);
|
const innerVisible = ref(props.visible ?? true);
|
||||||
|
const isExist = ref(false);
|
||||||
|
|
||||||
watch(innerVisible, (val) => {
|
watch(innerVisible, (val) => {
|
||||||
invokeShowPosistion();
|
invokeShowPosistion();
|
||||||
props.updateVisible && props.updateVisible(val);
|
emit("update:visible", val);
|
||||||
});
|
});
|
||||||
watch(innnerDisabled, (val) => {
|
watch(popper, (val) => {
|
||||||
innerVisible.value = false;
|
if (props.trigger === 'hover' && props.enterable) {
|
||||||
|
on(popper.value, EVENT_MAP['hover'][0], doShow);
|
||||||
|
on(popper.value, EVENT_MAP['hover'][2], doHidden);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
watch(
|
watch(
|
||||||
() => props.content?.value,
|
() => props.content,
|
||||||
(val) => {
|
(val) => {
|
||||||
innerVisible.value && invokeShowPosistion();
|
innerVisible.value && invokeShowPosistion();
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
const doShow = function () {
|
const doShow = function () {
|
||||||
if (!innnerDisabled.value) {
|
if (!props.disabled) {
|
||||||
innerVisible.value = true;
|
innerVisible.value = true;
|
||||||
|
isExist.value = true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const doHidden = function (e: MouseEvent) {
|
const doHidden = function (e: MouseEvent) {
|
||||||
|
// ||(props.enterable && popper.value.contains(e.target as Node))
|
||||||
if (
|
if (
|
||||||
(checkTarget.value && props.el.contains(e.target)) ||
|
(checkTarget.value && props.el.contains(e.target))
|
||||||
(props.enterable && popper.value.contains(e.target as Node))
|
|
||||||
)
|
)
|
||||||
return;
|
return;
|
||||||
// style.value = {top: (-window.innerHeight) + 'px',left:0};
|
// style.value = {top: (-window.innerHeight) + 'px',left:0};
|
||||||
// popper.value.remove();
|
// popper.value.remove();
|
||||||
if (props.isCanHide?.value !== false) {
|
if (props.isCanHide !== false) {
|
||||||
innerVisible.value = false;
|
innerVisible.value = false;
|
||||||
}
|
}
|
||||||
innnerPosition.value = tempPosition.value;
|
innnerPosition.value = props.position;
|
||||||
};
|
};
|
||||||
|
|
||||||
// 事件绑定
|
|
||||||
on(props.el, triggerArr[0], doShow);
|
|
||||||
on(triggerArr[1] ?? props.el, triggerArr[2], doHidden);
|
|
||||||
checkTarget.value = triggerArr[3];
|
|
||||||
|
|
||||||
// 计算位置显示
|
// 计算位置显示
|
||||||
const showPosistion = function () {
|
const showPosistion = function () {
|
||||||
postionFns[tempPosition.value] &&
|
postionFns[props.position] &&
|
||||||
(style.value = postionFns[tempPosition.value](
|
(style.value = postionFns[props.position](
|
||||||
props.el,
|
props.el,
|
||||||
popper.value,
|
popper.value,
|
||||||
innnerPosition
|
innnerPosition
|
||||||
@ -126,6 +128,12 @@ const invokeShowPosistion = function () {
|
|||||||
setTimeout(() => innerVisible.value && showPosistion(), 2);
|
setTimeout(() => innerVisible.value && showPosistion(), 2);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 事件绑定
|
||||||
|
on(props.el, triggerArr[0], doShow);
|
||||||
|
on(triggerArr[1] ?? props.el, triggerArr[2], doHidden);
|
||||||
|
checkTarget.value = triggerArr[3];
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
invokeShowPosistion();
|
invokeShowPosistion();
|
||||||
});
|
});
|
||||||
|
@ -1,47 +0,0 @@
|
|||||||
import { h, ref, render, watchEffect, watch } from "vue";
|
|
||||||
import popper from "./index.vue";
|
|
||||||
import { once } from "../../tools/domUtil";
|
|
||||||
const EVENT_MAP: any = {
|
|
||||||
hover: "mouseenter",
|
|
||||||
click: "click",
|
|
||||||
};
|
|
||||||
const usePopper = {
|
|
||||||
createPopper(el: HTMLElement, props: any, trigger: string) {
|
|
||||||
const _this = this;
|
|
||||||
once(el, EVENT_MAP[trigger], () => {
|
|
||||||
// TODO 临时解决方案
|
|
||||||
const _props: any = { el };
|
|
||||||
for (const key in props) {
|
|
||||||
_props[key] = ref(props[key]);
|
|
||||||
}
|
|
||||||
_props.updateVisible = function (val: boolean) {
|
|
||||||
_props.visible && (_props.visible.value = val);
|
|
||||||
};
|
|
||||||
_this.renderPopper(_props);
|
|
||||||
watchEffect(() => {
|
|
||||||
for (const key in _props) {
|
|
||||||
if (key === "visible") {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
_props[key].value = props[key];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
watch(
|
|
||||||
() => props.visible,
|
|
||||||
(val: boolean) => {
|
|
||||||
_props.updateVisible(val);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
renderPopper(props: any) {
|
|
||||||
const container: HTMLDivElement = document.createElement("div");
|
|
||||||
// container.setAttribute("class", "lay-div");
|
|
||||||
const node = h(popper, props);
|
|
||||||
render(node, container);
|
|
||||||
container.firstElementChild &&
|
|
||||||
document.body.appendChild(container.firstElementChild);
|
|
||||||
return node;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
export default usePopper;
|
|
72
src/module/skeleton/index.less
Normal file
72
src/module/skeleton/index.less
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
.lay-skeleton{
|
||||||
|
.lay-skeleton-item {
|
||||||
|
height: 16px;
|
||||||
|
border-radius: 5px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
background: #eeeeee;
|
||||||
|
}
|
||||||
|
.lay-skeleton-type--p{
|
||||||
|
height: 16px;
|
||||||
|
border-radius: 5px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
background: #eeeeee;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lay-skeleton-type--image{
|
||||||
|
width: 240px;
|
||||||
|
height: 240px;
|
||||||
|
background: #eeeeee;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
i{
|
||||||
|
font-size: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.lay-skeleton-animated {
|
||||||
|
.lay-skeleton-type--image{
|
||||||
|
width: 240px;
|
||||||
|
height: 240px !important;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
i{
|
||||||
|
font-size: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.lay-skeleton-item {
|
||||||
|
height: 16px;
|
||||||
|
border-radius: 5px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
background: #eeeeee;
|
||||||
|
background: linear-gradient(
|
||||||
|
90deg,#f2f2f2 25%,#ececec 37%,#f2f2f2 63%);
|
||||||
|
background-size: 400% 100%;
|
||||||
|
animation: lay-skeleton-loading 1.2s ease infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.lay-skeleton-first {
|
||||||
|
width: 30%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lay-skeleton-last {
|
||||||
|
width: 62.8%;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@keyframes lay-skeleton-loading {
|
||||||
|
0% {
|
||||||
|
background-position: 100% 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
background-position: 0 50%;
|
||||||
|
}
|
||||||
|
}
|
9
src/module/skeleton/index.ts
Normal file
9
src/module/skeleton/index.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import type { App } from 'vue'
|
||||||
|
import Component from './index.vue'
|
||||||
|
import type { IDefineComponent } from '../type/index'
|
||||||
|
|
||||||
|
Component.install = (app: App) => {
|
||||||
|
app.component(Component.name || 'LaySkeleton', Component)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Component as IDefineComponent
|
34
src/module/skeleton/index.vue
Normal file
34
src/module/skeleton/index.vue
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<template>
|
||||||
|
<div :class="['lay-skeleton', animated ? 'lay-skeleton-animated': '',]" v-bind="$attrs">
|
||||||
|
<template v-if="loading">
|
||||||
|
<slot name="skeleton">
|
||||||
|
<lay-skeleton-item
|
||||||
|
v-for="item in rows"
|
||||||
|
:class="[
|
||||||
|
item===1? 'lay-skeleton-first': '',
|
||||||
|
item === rows? 'lay-skeleton-last': '']"
|
||||||
|
type="p"
|
||||||
|
></lay-skeleton-item>
|
||||||
|
</slot>
|
||||||
|
</template>
|
||||||
|
<slot v-else></slot>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup name="LaySkeleton" lang="ts">
|
||||||
|
import LaySkeletonItem from '../skeletonItem/index.vue'
|
||||||
|
import './index.less'
|
||||||
|
import { defineProps, withDefaults} from "vue";
|
||||||
|
|
||||||
|
export interface LaySkeletonProps {
|
||||||
|
rows?: number;
|
||||||
|
loading?: boolean;
|
||||||
|
animated?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
const props = withDefaults(defineProps<LaySkeletonProps>(), {
|
||||||
|
rows: 4,
|
||||||
|
loading: false,
|
||||||
|
animated: false,
|
||||||
|
});
|
||||||
|
</script>-
|
9
src/module/skeletonItem/index.ts
Normal file
9
src/module/skeletonItem/index.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import type { App } from 'vue'
|
||||||
|
import Component from './index.vue'
|
||||||
|
import type { IDefineComponent } from '../type/index'
|
||||||
|
|
||||||
|
Component.install = (app: App) => {
|
||||||
|
app.component(Component.name || 'LaySkeletonItem', Component)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Component as IDefineComponent
|
19
src/module/skeletonItem/index.vue
Normal file
19
src/module/skeletonItem/index.vue
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<template>
|
||||||
|
<div :class="['lay-skeleton-item',`lay-skeleton-type--${type}`]" v-bind="$attrs">
|
||||||
|
<div v-if="type==='image'" >
|
||||||
|
<lay-icon type="layui-icon-picture"></lay-icon>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup name="LaySkeletonItem" lang="ts">
|
||||||
|
import { defineProps, withDefaults} from "vue";
|
||||||
|
|
||||||
|
export interface LaySkeletonProps {
|
||||||
|
type?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const props = withDefaults(defineProps<LaySkeletonProps>(), {
|
||||||
|
type: 'p',
|
||||||
|
});
|
||||||
|
</script>-
|
@ -99,3 +99,10 @@
|
|||||||
position: relative;
|
position: relative;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.layui-slider-vrange {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
position: relative;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
@ -1,6 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="layui-slider-vertical" v-if="vertical">
|
<div class="layui-slider-vertical" v-if="vertical">
|
||||||
<div v-if="range">range vertical slider</div>
|
<div ref="rangetracker2" class="layui-slider-vrange" v-if="range">
|
||||||
|
<div class="layui-slider-vertical-btn"></div>
|
||||||
|
<div class="layui-slider-vertical-btn"></div>
|
||||||
|
<div class="layui-slider-vertical-line"></div>
|
||||||
|
<div class="layui-slider-vertical-rate"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
ref="verticaltracker"
|
ref="verticaltracker"
|
||||||
@ -26,27 +31,35 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="layui-slider-v" v-else>
|
<div class="layui-slider-v" v-else>
|
||||||
|
<div
|
||||||
|
@mousedown.stop="handle_mousedown"
|
||||||
|
ref="rangetracker1"
|
||||||
|
class="layui-slider-srange"
|
||||||
|
v-if="range"
|
||||||
<div @mousedown.stop="handle_mousedown" ref="rangetracker1" class="layui-slider-srange" v-if="range">
|
>
|
||||||
<lay-tooltip :content="rangeValue[0] + ''">
|
<lay-tooltip :content="rangeValue[0] + ''">
|
||||||
<div :style="{ left: rangeValue[0] + '%' }" class="layui-slider-btn-v"></div>
|
<div
|
||||||
|
:style="{ left: rangeValue[0] + '%' }"
|
||||||
|
class="layui-slider-btn-v"
|
||||||
|
></div>
|
||||||
</lay-tooltip>
|
</lay-tooltip>
|
||||||
<lay-tooltip :content="rangeValue[1]">
|
<lay-tooltip :content="rangeValue[1]">
|
||||||
<div :style="{ left: rangeValue[1] + '%' }" class="layui-slider-btn-v"></div>
|
<div
|
||||||
|
:style="{ left: rangeValue[1] + '%' }"
|
||||||
|
class="layui-slider-btn-v"
|
||||||
|
></div>
|
||||||
</lay-tooltip>
|
</lay-tooltip>
|
||||||
|
|
||||||
<div class="layui-slider-line-v"></div>
|
<div class="layui-slider-line-v"></div>
|
||||||
<div :style="{ width:rangeValue[1]-rangeValue[0] +'%', left: rangeValue[0]+'%' }" class="layui-slider-rate-v"></div>
|
<div
|
||||||
|
:style="{
|
||||||
|
width: rangeValue[1] - rangeValue[0] + '%',
|
||||||
|
left: rangeValue[0] + '%',
|
||||||
|
}"
|
||||||
|
class="layui-slider-rate-v"
|
||||||
|
></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div
|
<div
|
||||||
ref="standardtracker"
|
ref="standardtracker"
|
||||||
@mousedown.stop="handle_mousedown"
|
@mousedown.stop="handle_mousedown"
|
||||||
@ -71,7 +84,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { defineProps, onMounted, reactive, Ref, ref } from "vue";
|
import { defineProps, reactive, Ref, ref } from "vue";
|
||||||
import { on, off } from "evtd";
|
import { on, off } from "evtd";
|
||||||
import "./index.less";
|
import "./index.less";
|
||||||
|
|
||||||
@ -93,13 +106,23 @@ const props = withDefaults(defineProps<LaySliderProps>(), {
|
|||||||
disabled: false,
|
disabled: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
let rangeValue:Ref<number[]> = ref([0,0])
|
let rangeValue: Ref<number[]> = ref([0, 0]);
|
||||||
if(Array.isArray(props.modelValue)){
|
if (Array.isArray(props.modelValue)) {
|
||||||
rangeValue.value = props.modelValue
|
// eslint-disable-next-line vue/no-setup-props-destructure
|
||||||
|
rangeValue.value = props.modelValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let verticalRangeValue: Ref<number[]> = ref([0, 0]);
|
||||||
|
if (Array.isArray(props.modelValue)) {
|
||||||
|
// eslint-disable-next-line vue/no-setup-props-destructure
|
||||||
|
verticalRangeValue.value = props.modelValue;
|
||||||
|
}
|
||||||
|
|
||||||
const standardtracker = ref<HTMLElement | null>(null);
|
const standardtracker = ref<HTMLElement | null>(null);
|
||||||
const verticaltracker = ref<HTMLElement | null>(null);
|
const verticaltracker = ref<HTMLElement | null>(null);
|
||||||
const rangetracker1 = ref<HTMLElement | null>(null);
|
const rangetracker1 = ref<HTMLElement | null>(null);
|
||||||
|
const rangetracker2 = ref<HTMLElement | null>(null);
|
||||||
|
|
||||||
const standard_style = reactive({
|
const standard_style = reactive({
|
||||||
left: props.modelValue,
|
left: props.modelValue,
|
||||||
width: props.modelValue,
|
width: props.modelValue,
|
||||||
@ -131,6 +154,10 @@ function handle_mousemove(e: MouseEvent) {
|
|||||||
if (props.vertical === false && props.range === true) {
|
if (props.vertical === false && props.range === true) {
|
||||||
starndardRangeMove(e);
|
starndardRangeMove(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (props.vertical === true && props.range === true) {
|
||||||
|
verticalRangeMove(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function handle_mouseup() {
|
function handle_mouseup() {
|
||||||
@ -188,7 +215,7 @@ const verticalMove = (e: MouseEvent) => {
|
|||||||
emit("update:modelValue", vertical_style.bottom);
|
emit("update:modelValue", vertical_style.bottom);
|
||||||
};
|
};
|
||||||
|
|
||||||
const starndardRangeMove =(e:MouseEvent)=>{
|
const starndardRangeMove = (e: MouseEvent) => {
|
||||||
if (!rangetracker1.value) {
|
if (!rangetracker1.value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -196,31 +223,32 @@ const starndardRangeMove =(e:MouseEvent)=>{
|
|||||||
let origin_left = tracker_rect.left;
|
let origin_left = tracker_rect.left;
|
||||||
let point_left = e.clientX;
|
let point_left = e.clientX;
|
||||||
let distance = point_left - origin_left;
|
let distance = point_left - origin_left;
|
||||||
if(distance < 0){
|
if (distance < 0) {
|
||||||
rangeValue.value[0] = 0
|
rangeValue.value[0] = 0;
|
||||||
} else {
|
} else {
|
||||||
let rate = (distance / tracker_rect.width) * 100;
|
let rate = (distance / tracker_rect.width) * 100;
|
||||||
let idx = moveNeighbor(Math.floor(rate))
|
let idx = moveNeighbor(Math.floor(rate));
|
||||||
rangeValue.value[idx] = Math.floor(rate)
|
rangeValue.value[idx] = Math.floor(rate);
|
||||||
if(rangeValue.value[1] > 100) {
|
if (rangeValue.value[1] > 100) {
|
||||||
rangeValue.value[1] = 100
|
rangeValue.value[1] = 100;
|
||||||
}
|
}
|
||||||
if(rangeValue.value[0] < 0) {
|
if (rangeValue.value[0] < 0) {
|
||||||
rangeValue.value[0] = 0
|
rangeValue.value[0] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
emit("update:modelValue", rangeValue.value);
|
emit("update:modelValue", rangeValue.value);
|
||||||
}
|
};
|
||||||
|
|
||||||
|
const verticalRangeMove = (e: MouseEvent) => {};
|
||||||
|
|
||||||
function moveNeighbor(rate: number) {
|
function moveNeighbor(rate: number) {
|
||||||
let d1 = Math.abs(rate - rangeValue.value[0]);
|
let d1 = Math.abs(rate - rangeValue.value[0]);
|
||||||
let d2 = Math.abs(rate - rangeValue.value[1]);
|
let d2 = Math.abs(rate - rangeValue.value[1]);
|
||||||
|
|
||||||
if(d1 > d2){
|
if (d1 > d2) {
|
||||||
return 1
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
return 0
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,8 +1,15 @@
|
|||||||
|
<template>
|
||||||
|
<slot></slot>
|
||||||
|
<lay-popper v-if="isMounted" v-bind="innerProps"></lay-popper>
|
||||||
|
</template>
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import usePopper from "../popper/usePopper";
|
import LayPopper from "../popper/index.vue";
|
||||||
import { defineComponent } from "vue";
|
import { defineComponent, ref } from "vue";
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "LayTooltip",
|
name: "LayTooltip",
|
||||||
|
components: {
|
||||||
|
LayPopper
|
||||||
|
},
|
||||||
props: {
|
props: {
|
||||||
content: {
|
content: {
|
||||||
type: [Number, String],
|
type: [Number, String],
|
||||||
@ -22,21 +29,26 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
visible: {
|
visible: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: true,
|
default: false,
|
||||||
},
|
},
|
||||||
isCanHide: {
|
isCanHide: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: true,
|
default: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
setup(){
|
||||||
|
const isMounted = ref(false);
|
||||||
|
return {
|
||||||
|
isMounted
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
innerProps(){
|
||||||
|
return {el: this.$el.nextElementSibling, ...this.$props};
|
||||||
|
}
|
||||||
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
const _this = this;
|
this.$nextTick(() => this.isMounted = true);
|
||||||
this.$nextTick(() => {
|
}
|
||||||
usePopper.createPopper(_this.$el, _this.$props, "hover");
|
|
||||||
});
|
|
||||||
},
|
|
||||||
render() {
|
|
||||||
return this.$slots.default && this.$slots.default()[0];
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user