mirror of
https://gitee.com/wot-design-uni/wot-design-uni.git
synced 2025-12-06 17:18:40 +08:00
feat: ✨ 优化 Divider 分割线功能支持虚线、垂直等功能 (#737)
This commit is contained in:
parent
abc84886e6
commit
1b9d7e6252
@ -1,14 +1,53 @@
|
|||||||
<frame/>
|
<frame/>
|
||||||
|
|
||||||
# Divider 分割线
|
# Divider 分割线
|
||||||
|
|
||||||
|
:::danger 请注意
|
||||||
|
`hairline`、`dashed`、`content-position`、`vertical`属性为 $LOWEST_VERSION$ 版本新增支持,在此之前仅支持默认插槽显示文本和自定义`color`。
|
||||||
|
:::
|
||||||
|
|
||||||
## 基本使用
|
## 基本使用
|
||||||
|
|
||||||
使用默认插槽设置内容。
|
默认渲染一条水平分割线。
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<wd-divider>这是分割线</wd-divider>
|
<wd-divider></wd-divider>
|
||||||
|
```
|
||||||
|
|
||||||
|
## 展示文本
|
||||||
|
|
||||||
|
使用默认插槽在分割线中间插入内容。
|
||||||
|
|
||||||
|
```html
|
||||||
|
<wd-divider>展示文本</wd-divider>
|
||||||
|
```
|
||||||
|
|
||||||
|
## 自定义渲染内容
|
||||||
|
|
||||||
|
使用默认插槽在分割线中间插入自定义内容。
|
||||||
|
|
||||||
|
```html
|
||||||
|
<wd-divider>
|
||||||
|
<wd-icon name="arrow-down" size="20" color="#1989fa" />
|
||||||
|
</wd-divider>
|
||||||
|
```
|
||||||
|
|
||||||
|
## 内容位置
|
||||||
|
|
||||||
|
通过 `content-position` 指定内容所在位置。
|
||||||
|
|
||||||
|
```html
|
||||||
|
<wd-divider>中间</wd-divider>
|
||||||
|
<wd-divider content-position="left">左侧</wd-divider>
|
||||||
|
<wd-divider content-position="right">右侧</wd-divider>
|
||||||
|
```
|
||||||
|
|
||||||
|
## 虚线
|
||||||
|
|
||||||
|
添加 `dashed` 属性使分割线渲染为虚线。
|
||||||
|
|
||||||
|
```html
|
||||||
|
<wd-divider dashed>虚线分割</wd-divider>
|
||||||
```
|
```
|
||||||
|
|
||||||
## 自定义颜色
|
## 自定义颜色
|
||||||
@ -19,20 +58,48 @@
|
|||||||
<wd-divider color="#4D80F0">自定义颜色</wd-divider>
|
<wd-divider color="#4D80F0">自定义颜色</wd-divider>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 垂直分割线
|
||||||
|
|
||||||
|
添加 `vertical` 属性使分割线渲染为垂直分割线。
|
||||||
|
|
||||||
|
```html
|
||||||
|
<view class="content">
|
||||||
|
文本
|
||||||
|
<wd-divider vertical />
|
||||||
|
文本
|
||||||
|
<wd-divider vertical dashed />
|
||||||
|
文本
|
||||||
|
<wd-divider vertical :hairline="false" />
|
||||||
|
文本
|
||||||
|
<wd-divider vertical color="#1989fa" />
|
||||||
|
文本
|
||||||
|
</view>
|
||||||
|
```
|
||||||
|
|
||||||
|
```css
|
||||||
|
.content {
|
||||||
|
padding: 12rpx 15px;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Attributes
|
## Attributes
|
||||||
|
|
||||||
| 参数 | 说明 | 类型 | 可选值 | 默认值 | 最低版本 |
|
| 参数 | 说明 | 类型 | 可选值 | 默认值 | 最低版本 |
|
||||||
|-----|------|-----|-------|-------|--------|
|
| ---------------- | ------------------------------ | ------- | ----------------------- | -------- | ---------------- |
|
||||||
| color | 自定义颜色,所有颜色的写法 | string | - | - | - |
|
| color | 自定义颜色,支持所有颜色的写法 | string | - | - | - |
|
||||||
|
| hairline | 是否显示边框 | boolean | - | true | $LOWEST_VERSION$ |
|
||||||
|
| dashed | 是否显示为虚线 | boolean | - | false | $LOWEST_VERSION$ |
|
||||||
|
| content-position | 内容位置 | string | `left`/`center`/`right` | `center` | $LOWEST_VERSION$ |
|
||||||
|
| vertical | 是否显示为垂直分割线 | boolean | - | false | $LOWEST_VERSION$ |
|
||||||
|
|
||||||
## Slot
|
## Slot
|
||||||
|
|
||||||
| name | 说明 | 最低版本 |
|
| name | 说明 | 最低版本 |
|
||||||
|------|-----|---------|
|
| ------- | ---- | -------- |
|
||||||
| default | 内容 | - |
|
| default | 内容,仅在 `vertical` 为 `false` 时生效 | - |
|
||||||
|
|
||||||
## 外部样式类
|
## 外部样式类
|
||||||
|
|
||||||
| 类名 | 说明 | 最低版本 |
|
| 类名 | 说明 | 最低版本 |
|
||||||
|-----|-----|---------|
|
| ------------ | ---------- | -------- |
|
||||||
| custom-class | 根节点样式 | - |
|
| custom-class | 根节点样式 | - |
|
||||||
|
|||||||
@ -1,21 +1,51 @@
|
|||||||
<!--
|
|
||||||
* @Author: weisheng
|
|
||||||
* @Date: 2023-06-13 11:47:12
|
|
||||||
* @LastEditTime: 2023-08-07 20:19:49
|
|
||||||
* @LastEditors: weisheng
|
|
||||||
* @Description:
|
|
||||||
* @FilePath: \wot-design-uni\src\pages\divider\Index.vue
|
|
||||||
* 记得注释
|
|
||||||
-->
|
|
||||||
<template>
|
<template>
|
||||||
<page-wraper>
|
<page-wraper>
|
||||||
<demo-block title="基本用法" transparent>
|
<demo-block title="基本用法" transparent>
|
||||||
<wd-divider>这是分割线</wd-divider>
|
<wd-divider></wd-divider>
|
||||||
</demo-block>
|
</demo-block>
|
||||||
|
|
||||||
|
<demo-block title="展示文本" transparent>
|
||||||
|
<wd-divider>展示文本</wd-divider>
|
||||||
|
</demo-block>
|
||||||
|
|
||||||
|
<demo-block title="自定义渲染内容" transparent>
|
||||||
|
<wd-divider>
|
||||||
|
<wd-icon name="arrow-down" size="20" />
|
||||||
|
</wd-divider>
|
||||||
|
</demo-block>
|
||||||
|
|
||||||
|
<demo-block title="内容位置" transparent>
|
||||||
|
<wd-divider>中间</wd-divider>
|
||||||
|
<wd-divider content-position="left">左侧</wd-divider>
|
||||||
|
<wd-divider content-position="right">右侧</wd-divider>
|
||||||
|
</demo-block>
|
||||||
|
|
||||||
|
<demo-block title="虚线" transparent>
|
||||||
|
<wd-divider dashed>虚线分割</wd-divider>
|
||||||
|
</demo-block>
|
||||||
|
|
||||||
<demo-block title="自定义颜色" transparent>
|
<demo-block title="自定义颜色" transparent>
|
||||||
<wd-divider color="#4D80F0">自定义颜色</wd-divider>
|
<wd-divider color="#4D80F0">自定义颜色</wd-divider>
|
||||||
</demo-block>
|
</demo-block>
|
||||||
|
|
||||||
|
<demo-block title="垂直分割线" transparent>
|
||||||
|
<view class="content">
|
||||||
|
文本
|
||||||
|
<wd-divider vertical />
|
||||||
|
文本
|
||||||
|
<wd-divider vertical dashed />
|
||||||
|
文本
|
||||||
|
<wd-divider vertical :hairline="false" />
|
||||||
|
文本
|
||||||
|
<wd-divider vertical color="#1989fa" />
|
||||||
|
文本
|
||||||
|
</view>
|
||||||
|
</demo-block>
|
||||||
</page-wraper>
|
</page-wraper>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts" setup></script>
|
<script lang="ts" setup></script>
|
||||||
<style lang="scss" scoped></style>
|
<style lang="scss" scoped>
|
||||||
|
.content {
|
||||||
|
padding: 12rpx 15px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@ -268,9 +268,21 @@ $-collapse-more-color: var(--wot-collapse-more-color, $-color-theme) !default; /
|
|||||||
|
|
||||||
/* divider */
|
/* divider */
|
||||||
$-divider-padding: var(--wot-divider-padding, 0 $-size-side-padding) !default; // 两边间距
|
$-divider-padding: var(--wot-divider-padding, 0 $-size-side-padding) !default; // 两边间距
|
||||||
|
$-divider-margin: var(--wot-divider-margin, 16px 0) !default; // 上下间距
|
||||||
$-divider-color: var(--wot-divider-color, rgba(0, 0, 0, 0.45)) !default; // 字体颜色
|
$-divider-color: var(--wot-divider-color, rgba(0, 0, 0, 0.45)) !default; // 字体颜色
|
||||||
$-divider-line-color: var(--wot-divider-line-color, rgba(0, 0, 0, 0.15)) !default; // 线条颜色
|
$-divider-line-color: var(--wot-divider-line-color, currentColor) !default; // 线条颜色
|
||||||
|
$-divider-line-height: var(--wot-divider-line-height, 1px) !default; // 线条高度
|
||||||
$-divider-fs: var(--wot-divider-fs, 14px) !default; // 字体大小
|
$-divider-fs: var(--wot-divider-fs, 14px) !default; // 字体大小
|
||||||
|
$-divider-content-left-width: var(--wot-divider-content-left-width, 10%) !default; // 左侧内容宽度
|
||||||
|
$-divider-content-left-margin: var(--wot-divider-content-left-margin, 12px) !default; // 左侧内容距离线距离
|
||||||
|
$-divider-content-right-margin: var(--wot-divider-content-right-margin, 12px) !default; // 右侧内容距离线距离
|
||||||
|
$-divider-content-right-width: var(--wot-divider-content-right-width, 10%) !default; // 右侧内容宽度
|
||||||
|
$-divider-vertical-height: var(--wot-divider-vertical-height, 16px) !default; // 垂直分割线高度
|
||||||
|
$-divider-vertical-content-margin: var(--wot-divider-vertical-content-margin, 0 8px) !default; // 垂直分割线内容间距
|
||||||
|
$-divider-vertical-line-width: var(--wot-divider-vertical-line-width, 1px) !default; // 线条高度
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* drop-menu */
|
/* drop-menu */
|
||||||
$-drop-menu-height: var(--wot-drop-menu-height, 48px) !default; // 展示选中项的高度
|
$-drop-menu-height: var(--wot-drop-menu-height, 48px) !default; // 展示选中项的高度
|
||||||
|
|||||||
@ -15,18 +15,86 @@
|
|||||||
position: relative;
|
position: relative;
|
||||||
display: flex;
|
display: flex;
|
||||||
padding: $-divider-padding;
|
padding: $-divider-padding;
|
||||||
|
margin: $-divider-margin;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
color: $-divider-color;
|
color: $-divider-color;
|
||||||
font-size: $-divider-fs;
|
font-size: $-divider-fs;
|
||||||
|
|
||||||
@include e(line) {
|
&::after,
|
||||||
display: block;
|
&::before {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
height: 1px;
|
display: block;
|
||||||
transform: scaleY(0.5);
|
box-sizing: border-box;
|
||||||
background: $-divider-line-color;
|
border-style: solid;
|
||||||
|
border-color: $-divider-line-color;
|
||||||
|
border-width: $-divider-line-height 0 0;
|
||||||
}
|
}
|
||||||
@include e(content) {
|
|
||||||
padding: 0 12px;
|
&::before {
|
||||||
|
content: '';
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
@include m(center, left, right) {
|
||||||
|
&::after {
|
||||||
|
content: '';
|
||||||
|
margin-left: $-divider-content-left-margin;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
margin-right: $-divider-content-right-margin;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include m(left) {
|
||||||
|
&::before {
|
||||||
|
max-width: $-divider-content-left-width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include m(right) {
|
||||||
|
&::after {
|
||||||
|
max-width: $-divider-content-right-width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include when(hairline) {
|
||||||
|
|
||||||
|
&::before,
|
||||||
|
&::after {
|
||||||
|
transform: scaleY(0.5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include when(dashed) {
|
||||||
|
|
||||||
|
&::before,
|
||||||
|
&::after {
|
||||||
|
border-style: dashed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include m(vertical) {
|
||||||
|
display: inline-block;
|
||||||
|
width: $-divider-vertical-line-width;
|
||||||
|
height: $-divider-vertical-height;
|
||||||
|
margin: $-divider-vertical-content-margin;
|
||||||
|
padding: 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
height: 100%;
|
||||||
|
border-width: 0 0 0 $-divider-vertical-line-width;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include when(hairline) {
|
||||||
|
&::before {
|
||||||
|
transform: scaleX(0.5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,12 +1,35 @@
|
|||||||
import type { ExtractPropTypes } from 'vue'
|
import type { ExtractPropTypes } from 'vue'
|
||||||
import { baseProps, makeStringProp } from '../common/props'
|
import { baseProps, makeBooleanProp, makeStringProp } from '../common/props'
|
||||||
|
|
||||||
|
export type DividerPosition = 'center' | 'left' | 'right'
|
||||||
|
export type DividerDirection = 'horizontal' | 'vertical'
|
||||||
|
|
||||||
export const dividerProps = {
|
export const dividerProps = {
|
||||||
...baseProps,
|
...baseProps,
|
||||||
/**
|
/**
|
||||||
* 自定义颜色,所有颜色的写法
|
* 自定义颜色
|
||||||
*/
|
*/
|
||||||
color: makeStringProp('')
|
color: makeStringProp(''),
|
||||||
|
/**
|
||||||
|
* 内容位置,可选值为 `left` `right` `center`
|
||||||
|
* 默认值:`center`
|
||||||
|
*/
|
||||||
|
contentPosition: makeStringProp<DividerPosition>('center'),
|
||||||
|
/**
|
||||||
|
* 是否显示为虚线
|
||||||
|
* 默认值:`false`
|
||||||
|
*/
|
||||||
|
dashed: Boolean,
|
||||||
|
/**
|
||||||
|
* 是否为垂直分割线
|
||||||
|
* 默认值:`false`
|
||||||
|
*/
|
||||||
|
vertical: makeBooleanProp(false),
|
||||||
|
/**
|
||||||
|
* 是否显示为 0.5px 的线
|
||||||
|
* 默认值:`true`
|
||||||
|
*/
|
||||||
|
hairline: makeBooleanProp(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
export type DividerProps = ExtractPropTypes<typeof dividerProps>
|
export type DividerProps = ExtractPropTypes<typeof dividerProps>
|
||||||
|
|||||||
@ -1,10 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<view :class="`wd-divider ${customClass}`" :style="customStyle">
|
<view :class="rootClass" :style="rootStyle">
|
||||||
<view class="wd-divider__line" :style="color ? 'background: ' + color : ''"></view>
|
<slot v-if="!vertical"></slot>
|
||||||
<view class="wd-divider__content" :style="color ? 'color: ' + color : ''">
|
|
||||||
<slot></slot>
|
|
||||||
</view>
|
|
||||||
<view class="wd-divider__line" :style="color ? 'background: ' + color : ''"></view>
|
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
@ -19,9 +15,36 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
|
import { computed, useSlots } from 'vue'
|
||||||
import { dividerProps } from './types'
|
import { dividerProps } from './types'
|
||||||
|
|
||||||
defineProps(dividerProps)
|
const props = defineProps(dividerProps)
|
||||||
|
const slots = useSlots()
|
||||||
|
|
||||||
|
const rootStyle = computed(() => {
|
||||||
|
return `--wot-divider-color:${props.color};${props.customStyle}`
|
||||||
|
})
|
||||||
|
|
||||||
|
const rootClass = computed(() => {
|
||||||
|
const prefixCls = 'wd-divider'
|
||||||
|
if (!props.vertical) {
|
||||||
|
return {
|
||||||
|
[prefixCls]: true,
|
||||||
|
[`${prefixCls}--center`]: slots.default,
|
||||||
|
[`${prefixCls}--left`]: props.contentPosition === 'left',
|
||||||
|
[`${prefixCls}--right`]: props.contentPosition === 'right',
|
||||||
|
['is-dashed']: props.dashed,
|
||||||
|
['is-hairline']: props.hairline
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
[prefixCls]: true,
|
||||||
|
[`${prefixCls}--vertical`]: true,
|
||||||
|
['is-dashed']: props.dashed,
|
||||||
|
['is-hairline']: props.hairline
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user