90 lines
2.2 KiB
Vue
90 lines
2.2 KiB
Vue
<template>
|
||
<view class="u-time-axis-item" :class="customClass" :style="$u.toStyle(customStyle)">
|
||
<slot name="content" />
|
||
<view class="u-time-axis-node" :style="[nodeStyle]">
|
||
<slot name="node">
|
||
<view class="u-dot"> </view>
|
||
</slot>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script lang="ts">
|
||
export default {
|
||
name: 'u-time-line-item',
|
||
options: {
|
||
addGlobalClass: true,
|
||
// #ifndef MP-TOUTIAO
|
||
virtualHost: true,
|
||
// #endif
|
||
styleIsolation: 'shared'
|
||
}
|
||
};
|
||
</script>
|
||
|
||
<script setup lang="ts">
|
||
import { computed } from 'vue';
|
||
import { TimeLineItemProps } from './types';
|
||
import { $u } from '../../';
|
||
|
||
/**
|
||
* timeLineItem 时间轴Item
|
||
* @description 时间轴组件一般用于物流信息展示,各种跟时间相关的记录等场景。(搭配u-time-line使用)
|
||
* @tutorial https://uviewpro.cn/zh/components/timeLine.html
|
||
* @property {String} bg-color 左边节点的背景颜色,一般通过slot内容自定义背景颜色即可(默认var(--u-bg-white))
|
||
* @property {String | Number} node-top 节点左边图标绝对定位的top值,单位rpx
|
||
* @example <u-time-line-item node-top="2">...</u-time-line-item>
|
||
*/
|
||
|
||
/**
|
||
* 节点的背景颜色
|
||
*/
|
||
const props = defineProps(TimeLineItemProps);
|
||
|
||
/**
|
||
* 计算节点样式
|
||
* @returns 节点样式对象
|
||
*/
|
||
const nodeStyle = computed(() => {
|
||
// 生成节点样式对象
|
||
const style: Record<string, string> = {
|
||
backgroundColor: props.bgColor
|
||
};
|
||
// 如果设置了 nodeTop,则添加 top 属性
|
||
if (props.nodeTop !== '') style.top = String(props.nodeTop) + 'rpx';
|
||
return style;
|
||
});
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
@import '../../libs/css/style.components.scss';
|
||
|
||
.u-time-axis-item {
|
||
@include vue-flex;
|
||
flex-direction: column;
|
||
width: 100%;
|
||
position: relative;
|
||
margin-bottom: 32rpx;
|
||
}
|
||
|
||
.u-time-axis-node {
|
||
position: absolute;
|
||
top: 12rpx;
|
||
left: -40rpx;
|
||
transform-origin: 0;
|
||
transform: translateX(-50%);
|
||
@include vue-flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
z-index: 1;
|
||
font-size: 24rpx;
|
||
}
|
||
|
||
.u-dot {
|
||
height: 16rpx;
|
||
width: 16rpx;
|
||
border-radius: 100rpx;
|
||
background: var(--u-divider-color);
|
||
}
|
||
</style>
|