+export type IndicatorPlacement =
+ | 'outside'
+ | 'inside-top-right'
+ | 'inside-bottom-center'
+ | 'inside-bottom-left'
export interface BaseIndicator extends BaseProps {
total: number
@@ -10,4 +15,5 @@ export interface BaseIndicator extends BaseProps {
direction: string
color: IndicatorColor
type: IndicatorType
+ placement: IndicatorPlacement
}
From ede7ddd421d8d8dacf4abb3d0db9db91d436ced2 Mon Sep 17 00:00:00 2001
From: xiyehutao <1254524557@qq.com>
Date: Tue, 9 Jun 2026 14:13:35 +0800
Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=A1=AC=E7=BC=96?=
=?UTF-8?q?=E7=A0=81=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../indicator/__test__/indicator.spec.tsx | 10 ++++++----
src/packages/indicator/indicator.scss | 17 +++++++++++++++++
src/packages/indicator/indicator.taro.tsx | 7 ++-----
src/packages/indicator/indicator.tsx | 12 ++++++------
4 files changed, 31 insertions(+), 15 deletions(-)
diff --git a/src/packages/indicator/__test__/indicator.spec.tsx b/src/packages/indicator/__test__/indicator.spec.tsx
index 638c7e5dd1..12f422e297 100644
--- a/src/packages/indicator/__test__/indicator.spec.tsx
+++ b/src/packages/indicator/__test__/indicator.spec.tsx
@@ -102,10 +102,12 @@ test('should render placement inside-bottom-left', () => {
).toBeInTheDocument()
})
-test('slide type should calculate correct transform', () => {
+test('slide type should set CSS custom properties for transform', () => {
const { container } = render(
)
- const line = container.querySelector('.nut-indicator-line-active')
+ const line = container.querySelector(
+ '.nut-indicator-line-active'
+ ) as HTMLElement
expect(line).toBeInTheDocument()
- // stride = (24 - 8) / (3 - 1) = 8, current=1 → translateX(8px)
- expect(line).toHaveStyle({ transform: 'translateX(8px)' })
+ expect(line.style.getPropertyValue('--nutui-indicator-current')).toBe('1')
+ expect(line.style.getPropertyValue('--nutui-indicator-total')).toBe('3')
})
diff --git a/src/packages/indicator/indicator.scss b/src/packages/indicator/indicator.scss
index 70fad738a8..93a153abc3 100644
--- a/src/packages/indicator/indicator.scss
+++ b/src/packages/indicator/indicator.scss
@@ -82,6 +82,13 @@
transition: transform 0.3s ease-in-out;
background: $indicator-color;
border: $indicator-dot-border;
+ transform: translateX(
+ calc(
+ var(--nutui-indicator-current, 0) /
+ (var(--nutui-indicator-total, 2) - 1) *
+ (#{$indicator-track-width} - #{$indicator-slider-width})
+ )
+ );
}
}
@@ -189,6 +196,16 @@
&-line {
width: $indicator-dot-size;
height: $indicator-slider-width;
+
+ &-active {
+ transform: translateY(
+ calc(
+ var(--nutui-indicator-current, 0) /
+ (var(--nutui-indicator-total, 2) - 1) *
+ (#{$indicator-track-width} - #{$indicator-slider-width})
+ )
+ );
+ }
}
}
}
diff --git a/src/packages/indicator/indicator.taro.tsx b/src/packages/indicator/indicator.taro.tsx
index b0e4e4c282..962adbd2b8 100644
--- a/src/packages/indicator/indicator.taro.tsx
+++ b/src/packages/indicator/indicator.taro.tsx
@@ -1,7 +1,6 @@
import React, { FunctionComponent, ReactNode } from 'react'
import classNames from 'classnames'
import { View, ViewProps } from '@tarojs/components'
-import { pxTransform } from '@/utils/taro/px-transform'
import { TaroIndicatorProps, IndicatorType } from '@/types'
const defaultProps = {
@@ -60,13 +59,11 @@ export const Indicator: FunctionComponent<
return childs
}
const renderLineElement = () => {
- const trackWidth: number = 24
- const sliderWidth: number = 8
- const stride = (trackWidth - sliderWidth) / (total - 1)
return (
diff --git a/src/packages/indicator/indicator.tsx b/src/packages/indicator/indicator.tsx
index 2e8fd39a35..45556b50d1 100644
--- a/src/packages/indicator/indicator.tsx
+++ b/src/packages/indicator/indicator.tsx
@@ -55,14 +55,14 @@ export const Indicator: FunctionComponent
> = (
return childs
}
const renderLineElement = () => {
- const trackWidth: number = 24
- const sliderWidth: number = 8
- const stride = (trackWidth - sliderWidth) / (total - 1)
return (
)