{!!title && typeof title === 'function'
? title()
- : titles.current.map((item) => {
+ : titles.current.map((item, index) => {
+ const isActive =
+ !item.disabled && String(item.value) === String(value)
+ const flush =
+ isActive && activeType === 'card' && direction === 'horizontal'
+ ? getCardFlushSides(index, titles.current.length, {
+ scrollable: isScrollable,
+ rtl,
+ align,
+ })
+ : { left: false, right: false }
return (
titleItemsRef.current.push(ref)}
onClick={() => tabChange(item)}
className={classNames(`${classPrefix}-titles-item`, {
- [`nut-tabs-titles-item-active`]:
- !item.disabled && String(item.value) === String(value),
+ [`nut-tabs-titles-item-active`]: isActive,
[`nut-tabs-titles-item-disabled`]: item.disabled,
[`nut-tabs-titles-item-${align}`]: align,
+ [`${classPrefix}-titles-item-active--flush-left`]:
+ flush.left,
+ [`${classPrefix}-titles-item-active--flush-right`]:
+ flush.right,
})}
>
+ {activeType === 'card' && isActive && (
+ <>
+
+
+ >
+ )}
{activeType === 'line' && (
+ calcByProfile(CARD_ACTIVE_MARGIN_TOTAL)
+
+/**
+ * 内容是否超出容器而需要横向滑动。
+ * H5 与 Taro 共用同一判定口径,避免临界宽度下两端得出不同结论、出现一端贴边一端留肩。
+ *
+ * @param contentWidth 内容总宽度(各项宽度之和 + 激活卡片预留外边距)
+ * @param containerWidth 标题容器可视宽度
+ */
+export const isContentScrollable = (
+ contentWidth: number,
+ containerWidth: number
+) => contentWidth - containerWidth > 1
+
+export interface CardFlushSides {
+ left: boolean
+ right: boolean
+}
+
+const NO_FLUSH: CardFlushSides = { left: false, right: false }
+
+/**
+ * 计算卡片模式下激活卡片应贴靠的物理边。
+ *
+ * 贴边侧需取消该侧外边距并隐藏对应肩部装饰(另一侧保留肩部与留白)。
+ * 样式层只按 `nut-tabs-titles-item-active--flush-left/right` 两个修饰类渲染,
+ * 可滑动性与 RTL 镜像关系全部在此处收敛,避免 SCSS 里四套选择器各自维护。
+ *
+ * @param index 当前项在标题列表中的下标
+ * @param count 标题总数
+ * @param options scrollable 是否可横向滑动,rtl 是否书写方向为右到左,align 对齐方式
+ */
+export const getCardFlushSides = (
+ index: number,
+ count: number,
+ options: { scrollable: boolean; rtl: boolean; align?: PositionX }
+): CardFlushSides => {
+ if (count <= 0 || index < 0 || index >= count) return NO_FLUSH
+
+ // 起始边/结束边:书写方向决定其在物理方向上的映射(RTL 呈镜像)
+ const startSide: PositionX = options.rtl ? 'right' : 'left'
+ const endSide: PositionX = options.rtl ? 'left' : 'right'
+ const isFirst = index === 0
+ const isLast = index === count - 1
+
+ // 内容可滑动时,DOM 首/末项分别贴住起始/结束边
+ if (options.scrollable) {
+ return {
+ left: (isFirst && startSide === 'left') || (isLast && endSide === 'left'),
+ right:
+ (isFirst && startSide === 'right') || (isLast && endSide === 'right'),
+ }
+ }
+
+ // 不可滑动时(仅在设置了 align 时出现),内容整体靠向 align 指定的一侧,
+ // 只有贴靠该侧的那一项才是贴边项
+ const packedSide = options.align === 'right' ? endSide : startSide
+ const packedItem = packedSide === startSide ? isFirst : isLast
+
+ return {
+ left: packedItem && packedSide === 'left',
+ right: packedItem && packedSide === 'right',
+ }
+}
diff --git a/src/styles/variables-daojia.scss b/src/styles/variables-daojia.scss
index 46b14e801b..d0fb7b551d 100644
--- a/src/styles/variables-daojia.scss
+++ b/src/styles/variables-daojia.scss
@@ -1403,9 +1403,13 @@ $pagination-progress-inactive-color: var(
$tabs-titles-height: var(--nutui-tabs-titles-height, 44px) !default;
$tabs-titles-background-color: var(--nutui-tabs-titles-background-color,
$color-background) !default;
-$tabs-titles-gap: var(--nutui-tabs-titles-gap, 12px) !default;
+$tabs-titles-gap: var(--nutui-tabs-titles-gap, 8px) !default;
$tabs-titles-font-size: var(--nutui-tabs-titles-font-size,
- $font-size-base) !default;
+ $font-size-md) !default;
+$tabs-titles-item-font-family: var(--nutui-tabs-titles-item-font-family,
+ PingFangSC-Semibold) !default;
+$tabs-titles-item-font-weight: var(--nutui-tabs-titles-item-font-weight,
+ $font-weight-bold) !default;
$tabs-titles-item-min-width: var(--nutui-tabs-titles-item-min-width,
50px) !default;
$tabs-titles-item-color: var(--nutui-tabs-titles-item-color,
@@ -1414,8 +1418,10 @@ $tabs-titles-item-active-color: var(--nutui-tabs-titles-item-active-color,
$color-primary) !default;
$tabs-titles-item-active-font-weight: var(--nutui-tabs-titles-item-active-font-weight,
$font-weight-bold) !default;
+$tabs-titles-item-active-font-family: var(--nutui-tabs-titles-item-active-font-family,
+ PingFangSC-Semibold) !default;
$tabs-titles-item-active-font-size: var(--nutui-tabs-titles-item-active-font-size,
- $font-size-l) !default;
+ $font-size-md) !default;
$tabs-titles-item-active-background-color: var(--nutui-tabs-titles-item-active-background-color,
$color-background-overlay) !default;
$tabs-tab-line-width: var(--nutui-tabs-tab-line-width, 12px) !default;
@@ -1427,10 +1433,18 @@ $tabs-tab-line-border-radius: var(--nutui-tabs-line-border-radius,
$tabs-tab-line-opacity: var(--nutui-tabs-tab-line-opacity, 1) !default;
$tabs-tab-button-border-radius: var(--nutui-tabs-button-border-radius,
$radius-circle) !default;
+$tabs-tab-button-font-size: var(--nutui-tabs-button-font-size,
+ $font-size-base) !default;
+$tabs-tab-button-active-font-size: var(--nutui-tabs-button-active-font-size,
+ $font-size-base) !default;
+$tabs-tab-button-active-font-weight: var(--nutui-tabs-button-active-font-weight,
+ $font-weight-bold) !default;
+$tabs-tab-button-background-color: var(--nutui-tabs-button-background-color,
+ var(--nutui-color-background-component)) !default;
$tabs-tab-button-active-background-color: var(--nutui-tabs-button-active-background-color,
$color-primary-light-pressed) !default;
$tabs-tab-button-active-border: var(--nutui-tabs-button-active-border,
- 1px solid $color-primary) !default;
+ inset 0 0 0 1px $color-primary) !default;
$tabs-vertical-titles-width: var(--nutui-tabs-vertical-titles-width,
100px) !default;
$tabs-vertical-titles-item-height: var(--nutui-tabs-vertical-titles-item-height,
@@ -1444,7 +1458,7 @@ $tabs-vertical-tab-line-width: var(--nutui-tabs-vertical-tab-line-width,
$tabs-vertical-tab-line-height: var(--nutui-tabs-vertical-tab-line-height,
12px) !default;
$tabs-titles-item-smile-bottom: var(--nutui-tabs-titles-item-smile-bottom,
- -10%) !default;
+ 4%) !default;
$tabs-tabpane-padding: var(--nutui-tabs-tabpane-padding, 24px 20px) !default;
$tabs-tabpane-background-color: var(--nutui-tabs-tabpane-background-color,
#fff) !default;
diff --git a/src/styles/variables-jmapp.scss b/src/styles/variables-jmapp.scss
index 5d8096710f..d013b1b802 100644
--- a/src/styles/variables-jmapp.scss
+++ b/src/styles/variables-jmapp.scss
@@ -2272,10 +2272,18 @@ $tabs-titles-background-color: var(
--nutui-tabs-titles-background-color,
$white
) !default;
-$tabs-titles-gap: var(--nutui-tabs-titles-gap, 12px) !default;
+$tabs-titles-gap: var(--nutui-tabs-titles-gap, 8px) !default;
$tabs-titles-font-size: var(
--nutui-tabs-titles-font-size,
- $font-size-base
+ $font-size-md
+) !default;
+$tabs-titles-item-font-family: var(
+ --nutui-tabs-titles-item-font-family,
+ PingFangSC-Semibold
+) !default;
+$tabs-titles-item-font-weight: var(
+ --nutui-tabs-titles-item-font-weight,
+ $font-weight-bold
) !default;
$tabs-titles-item-min-width: var(
--nutui-tabs-titles-item-min-width,
@@ -2293,9 +2301,13 @@ $tabs-titles-item-active-font-weight: var(
--nutui-tabs-titles-item-active-font-weight,
$font-weight-bold
) !default;
+$tabs-titles-item-active-font-family: var(
+ --nutui-tabs-titles-item-active-font-family,
+ PingFangSC-Semibold
+) !default;
$tabs-titles-item-active-font-size: var(
--nutui-tabs-titles-item-active-font-size,
- $font-size-l
+ $font-size-md
) !default;
$tabs-titles-item-active-background-color: var(
--nutui-tabs-titles-item-active-background-color,
@@ -2314,13 +2326,29 @@ $tabs-tab-button-border-radius: var(
--nutui-tabs-button-border-radius,
$radius-xs
) !default;
+$tabs-tab-button-font-size: var(
+ --nutui-tabs-button-font-size,
+ $font-size-base
+) !default;
+$tabs-tab-button-active-font-size: var(
+ --nutui-tabs-button-active-font-size,
+ $font-size-base
+) !default;
+$tabs-tab-button-active-font-weight: var(
+ --nutui-tabs-button-active-font-weight,
+ $font-weight-bold
+) !default;
+$tabs-tab-button-background-color: var(
+ --nutui-tabs-button-background-color,
+ var(--nutui-color-background-component)
+) !default;
$tabs-tab-button-active-background-color: var(
--nutui-tabs-button-active-background-color,
$color-primary-light-pressed
) !default;
$tabs-tab-button-active-border: var(
--nutui-tabs-button-active-border,
- 1px solid $color-primary
+ inset 0 0 0 1px $color-primary
) !default;
$tabs-vertical-titles-width: var(
--nutui-tabs-vertical-titles-width,
@@ -2348,7 +2376,7 @@ $tabs-vertical-tab-line-height: var(
) !default;
$tabs-titles-item-smile-bottom: var(
--nutui-tabs-titles-item-smile-bottom,
- -10px
+ 4%
) !default;
$tabs-tabpane-padding: var(--nutui-tabs-tabpane-padding, 24px 20px) !default;
$tabs-tabpane-background-color: var(
diff --git a/src/styles/variables-jrkf.scss b/src/styles/variables-jrkf.scss
index 4e2826293e..c978c24dfc 100644
--- a/src/styles/variables-jrkf.scss
+++ b/src/styles/variables-jrkf.scss
@@ -2379,10 +2379,18 @@ $tabs-titles-background-color: var(
--nutui-tabs-titles-background-color,
$white
) !default;
-$tabs-titles-gap: var(--nutui-tabs-titles-gap, 12px) !default;
+$tabs-titles-gap: var(--nutui-tabs-titles-gap, 8px) !default;
$tabs-titles-font-size: var(
--nutui-tabs-titles-font-size,
- $font-size-base
+ $font-size-md
+) !default;
+$tabs-titles-item-font-family: var(
+ --nutui-tabs-titles-item-font-family,
+ PingFangSC-Semibold
+) !default;
+$tabs-titles-item-font-weight: var(
+ --nutui-tabs-titles-item-font-weight,
+ $font-weight-bold
) !default;
$tabs-titles-item-min-width: var(
--nutui-tabs-titles-item-min-width,
@@ -2400,9 +2408,13 @@ $tabs-titles-item-active-font-weight: var(
--nutui-tabs-titles-item-active-font-weight,
$font-weight-bold
) !default;
+$tabs-titles-item-active-font-family: var(
+ --nutui-tabs-titles-item-active-font-family,
+ PingFangSC-Semibold
+) !default;
$tabs-titles-item-active-font-size: var(
--nutui-tabs-titles-item-active-font-size,
- $font-size-l
+ $font-size-md
) !default;
$tabs-titles-item-active-background-color: var(
--nutui-tabs-titles-item-active-background-color,
@@ -2421,13 +2433,29 @@ $tabs-tab-button-border-radius: var(
--nutui-tabs-button-border-radius,
$radius-xs
) !default;
+$tabs-tab-button-font-size: var(
+ --nutui-tabs-button-font-size,
+ $font-size-base
+) !default;
+$tabs-tab-button-active-font-size: var(
+ --nutui-tabs-button-active-font-size,
+ $font-size-base
+) !default;
+$tabs-tab-button-active-font-weight: var(
+ --nutui-tabs-button-active-font-weight,
+ $font-weight-bold
+) !default;
+$tabs-tab-button-background-color: var(
+ --nutui-tabs-button-background-color,
+ var(--nutui-color-background-component)
+) !default;
$tabs-tab-button-active-background-color: var(
--nutui-tabs-button-active-background-color,
$color-primary-light
) !default;
$tabs-tab-button-active-border: var(
--nutui-tabs-button-active-border,
- 1px solid $color-primary
+ inset 0 0 0 1px $color-primary
) !default;
$tabs-vertical-titles-width: var(
--nutui-tabs-vertical-titles-width,
@@ -2451,7 +2479,7 @@ $tabs-vertical-tab-line-height: var(
) !default;
$tabs-titles-item-smile-bottom: var(
--nutui-tabs-titles-item-smile-bottom,
- -10px
+ 4%
) !default;
$tabs-tabpane-padding: var(--nutui-tabs-tabpane-padding, 24px 20px) !default;
$tabs-tabpane-background-color: var(
diff --git a/src/styles/variables.scss b/src/styles/variables.scss
index bf3d605d71..8019cd1aa0 100644
--- a/src/styles/variables.scss
+++ b/src/styles/variables.scss
@@ -2292,15 +2292,23 @@ $pagination-progress-inactive-color: var(
) !default;
// tabs(✅)
-$tabs-titles-height: var(--nutui-tabs-titles-height, scale-px(44px)) !default;
+$tabs-titles-height: var(--nutui-tabs-titles-height, scale-px(36px)) !default;
$tabs-titles-background-color: var(
--nutui-tabs-titles-background-color,
- $color-background
+ $color-background-overlay
) !default;
-$tabs-titles-gap: var(--nutui-tabs-titles-gap, scale-px(12px)) !default;
+$tabs-titles-gap: var(--nutui-tabs-titles-gap, scale-px(8px)) !default;
$tabs-titles-font-size: var(
--nutui-tabs-titles-font-size,
- $font-size-base
+ $font-size-md
+) !default;
+$tabs-titles-item-font-family: var(
+ --nutui-tabs-titles-item-font-family,
+ PingFangSC-Semibold
+) !default;
+$tabs-titles-item-font-weight: var(
+ --nutui-tabs-titles-item-font-weight,
+ $font-weight-bold
) !default;
$tabs-titles-item-min-width: var(
--nutui-tabs-titles-item-min-width,
@@ -2318,15 +2326,19 @@ $tabs-titles-item-active-font-weight: var(
--nutui-tabs-titles-item-active-font-weight,
$font-weight-bold
) !default;
+$tabs-titles-item-active-font-family: var(
+ --nutui-tabs-titles-item-active-font-family,
+ PingFangSC-Semibold
+) !default;
$tabs-titles-item-active-font-size: var(
--nutui-tabs-titles-item-active-font-size,
- $font-size-l
+ $font-size-md
) !default;
$tabs-titles-item-active-background-color: var(
--nutui-tabs-titles-item-active-background-color,
$color-background-overlay
) !default;
-$tabs-tab-line-width: var(--nutui-tabs-tab-line-width, scale-px(12px)) !default;
+$tabs-tab-line-width: var(--nutui-tabs-tab-line-width, scale-px(16px)) !default;
$tabs-tab-line-height: var(--nutui-tabs-tab-line-height, scale-px(2px)) !default;
$tabs-tab-line-color: var(--nutui-tabs-tab-line-color, $color-primary) !default;
$tabs-tab-line-bottom: var(--nutui-tabs-line-bottom, 15%) !default;
@@ -2337,7 +2349,23 @@ $tabs-tab-line-border-radius: var(
$tabs-tab-line-opacity: var(--nutui-tabs-tab-line-opacity, 1) !default;
$tabs-tab-button-border-radius: var(
--nutui-tabs-button-border-radius,
- $radius-circle
+ scale-px(6px)
+) !default;
+$tabs-tab-button-font-size: var(
+ --nutui-tabs-button-font-size,
+ $font-size-base
+) !default;
+$tabs-tab-button-active-font-size: var(
+ --nutui-tabs-button-active-font-size,
+ $font-size-base
+) !default;
+$tabs-tab-button-active-font-weight: var(
+ --nutui-tabs-button-active-font-weight,
+ $font-weight-bold
+) !default;
+$tabs-tab-button-background-color: var(
+ --nutui-tabs-button-background-color,
+ var(--nutui-color-background-component)
) !default;
$tabs-tab-button-active-background-color: var(
--nutui-tabs-button-active-background-color,
@@ -2345,7 +2373,7 @@ $tabs-tab-button-active-background-color: var(
) !default;
$tabs-tab-button-active-border: var(
--nutui-tabs-button-active-border,
- scale-px(1px) solid $color-primary
+ inset 0 0 0 1px $color-primary
) !default;
$tabs-vertical-titles-width: var(
--nutui-tabs-vertical-titles-width,
@@ -2373,7 +2401,7 @@ $tabs-vertical-tab-line-height: var(
) !default;
$tabs-titles-item-smile-bottom: var(
--nutui-tabs-titles-item-smile-bottom,
- -10%
+ 4%
) !default;
$tabs-tabpane-padding: var(--nutui-tabs-tabpane-padding, scale-px(24px) scale-px(20px)) !default;
$tabs-tabpane-background-color: var(