diff --git a/packages/components/anchor/Anchor.tsx b/packages/components/anchor/Anchor.tsx index 9e67a1e620..dab30f6ee2 100644 --- a/packages/components/anchor/Anchor.tsx +++ b/packages/components/anchor/Anchor.tsx @@ -20,8 +20,17 @@ import type { TdAnchorProps } from './type'; export interface AnchorProps extends TdAnchorProps, StyledProps { children?: React.ReactNode; + direction?: Direction; } +type Direction = 'vertical' | 'horizontal'; + +type CursorStyle = T extends 'vertical' + ? { top: string; height?: string; opacity: number } + : T extends 'horizontal' + ? { left: string; width?: string; opacity: number } + : never; + interface IntervalRef { // 收集 anchor-item items: string[]; @@ -47,13 +56,14 @@ const Anchor = forwardRefWithStatics( onChange, className, getCurrentAnchor, + direction, ...rest } = useDefaultProps(props, anchorDefaultProps); const { classPrefix } = useConfig(); const [activeItem, setActiveItem] = useState(''); - const [cursorStyle, setCursorStyle] = useState<{ top: string; height?: string; opacity: number }>({ + const [cursorStyle, setCursorStyle] = useState({ top: '0px', height: '0px', opacity: 0, @@ -66,6 +76,8 @@ const Anchor = forwardRefWithStatics( handleScrollLock: false, }); + const isHorizontal = direction === 'horizontal'; + useImperativeHandle(ref, () => anchorEl.current); /** @@ -112,10 +124,13 @@ const Anchor = forwardRefWithStatics( if (!pointEl) { setCursorStyle(null); } else { - const { offsetTop: top, offsetHeight: height } = pointEl; - setCursorStyle({ top: `${top}px`, height: `${height}px`, opacity: 1 }); + const { offsetTop: top, offsetHeight: height, offsetLeft: left, offsetWidth: width } = pointEl; + const style = isHorizontal + ? { left: `${left}px`, width: `${width}px`, opacity: 1 } + : { top: `${top}px`, height: `${height}px`, opacity: 1 }; + setCursorStyle(style); } - }, [activeItem, classPrefix]); + }, [activeItem, classPrefix, isHorizontal]); const handleScroll = useCallback(() => { const { scrollContainer, handleScrollLock } = intervalRef.current; @@ -164,6 +179,7 @@ const Anchor = forwardRefWithStatics( [`${classPrefix}-size-s`]: size === 'small', [`${classPrefix}-size-m`]: size === 'medium', [`${classPrefix}-size-l`]: size === 'large', + [`${classPrefix}-anchor__horizontal`]: isHorizontal, }, className, ); @@ -194,7 +210,30 @@ const Anchor = forwardRefWithStatics( ); - return isEmpty(affixProps) ? Cmp : {Cmp}; + return ( + <> + + {isEmpty(affixProps) ? Cmp : {Cmp}} + + ); }, { AnchorItem, diff --git a/packages/components/anchor/_example/container-horizontal.tsx b/packages/components/anchor/_example/container-horizontal.tsx new file mode 100644 index 0000000000..ec740c4507 --- /dev/null +++ b/packages/components/anchor/_example/container-horizontal.tsx @@ -0,0 +1,46 @@ +import React from 'react'; +import { Anchor } from 'tdesign-react'; + +import type { TdAnchorProps } from 'tdesign-react'; + +const { AnchorItem } = Anchor; + +export default function AnchorAttach() { + const handleClick: TdAnchorProps['onClick'] = ({ e, href, title }) => { + e.preventDefault(); + console.log('handleClick', href, title); + }; + + return ( + <> +
+ + + + + + +
+
+ content-1 +
+
+ content-2 +
+
+ content-3 +
+
+ content-4 +
+
+ content-5 +
+
+
+ + ); +} diff --git a/packages/components/anchor/_example/cursor.tsx b/packages/components/anchor/_example/cursor.tsx index 5256a1c6e5..0d14753655 100644 --- a/packages/components/anchor/_example/cursor.tsx +++ b/packages/components/anchor/_example/cursor.tsx @@ -13,18 +13,52 @@ const cursorStyle: React.CSSProperties = { marginLeft: '-5px', top: '50%', marginTop: '-5px', + zIndex: 2, }; export default function AnchorBase() { return ( -
-
}> - - - - - + <> + } + > + + + + - +
+
}> + + + + + + +
+
+ content-1 +
+
+ content-2 +
+
+ content-3 +
+
+ content-4 +
+
+ content-5 +
+
+ + ); } diff --git a/test/snap/__snapshots__/csr.test.jsx.snap b/test/snap/__snapshots__/csr.test.jsx.snap index 795867b4c4..c30f0c6c3c 100644 --- a/test/snap/__snapshots__/csr.test.jsx.snap +++ b/test/snap/__snapshots__/csr.test.jsx.snap @@ -1198,6 +1198,25 @@ exports[`csr snapshot test > csr test packages/components/anchor/_example/base.t
+
csr test packages/components/anchor/_example/contai id="attach" style="display: flex;" > +
@@ -1392,11 +1430,241 @@ exports[`csr snapshot test > csr test packages/components/anchor/_example/contai
`; -exports[`csr snapshot test > csr test packages/components/anchor/_example/cursor.tsx 1`] = ` +exports[`csr snapshot test > csr test packages/components/anchor/_example/container-horizontal.tsx 1`] = `
+ +
+ +
+
+ content-1 +
+
+ content-2 +
+
+ content-3 +
+
+ content-4 +
+
+ content-5 +
+
+
+
+`; + +exports[`csr snapshot test > csr test packages/components/anchor/_example/cursor.tsx 1`] = ` +
+ +
+ +
+ +
+
- - 尺寸 - + content-1 +
+
+ content-2 +
+
+ content-3 +
+
+ content-4 +
+
+ content-5
@@ -1485,6 +1776,25 @@ exports[`csr snapshot test > csr test packages/components/anchor/_example/custom
+
@@ -1594,6 +1904,25 @@ exports[`csr snapshot test > csr test packages/components/anchor/_example/large.
+
@@ -1688,6 +2017,25 @@ exports[`csr snapshot test > csr test packages/components/anchor/_example/large. exports[`csr snapshot test > csr test packages/components/anchor/_example/multiple.tsx 1`] = `
+
@@ -1796,6 +2144,25 @@ exports[`csr snapshot test > csr test packages/components/anchor/_example/small.
+
@@ -153180,19 +153547,181 @@ exports[`ssr snapshot test > ssr test packages/components/alert/_example/swiper. exports[`ssr snapshot test > ssr test packages/components/alert/_example/title.tsx 1`] = `"
这是一条普通的消息提示
这是一条普通的消息提示描述,这是一条普通的消息提示描述
相关操作
"`; -exports[`ssr snapshot test > ssr test packages/components/anchor/_example/base.tsx 1`] = `""`; - -exports[`ssr snapshot test > ssr test packages/components/anchor/_example/container.tsx 1`] = `"
content-1
content-2
content-3
content-4
content-5
"`; - -exports[`ssr snapshot test > ssr test packages/components/anchor/_example/cursor.tsx 1`] = `""`; - -exports[`ssr snapshot test > ssr test packages/components/anchor/_example/customize-highlight.tsx 1`] = `""`; - -exports[`ssr snapshot test > ssr test packages/components/anchor/_example/large.tsx 1`] = `""`; - -exports[`ssr snapshot test > ssr test packages/components/anchor/_example/multiple.tsx 1`] = `""`; - -exports[`ssr snapshot test > ssr test packages/components/anchor/_example/small.tsx 1`] = `""`; +exports[`ssr snapshot test > ssr test packages/components/anchor/_example/base.tsx 1`] = ` +"
" +`; + +exports[`ssr snapshot test > ssr test packages/components/anchor/_example/container.tsx 1`] = ` +"
content-1
content-2
content-3
content-4
content-5
" +`; + +exports[`ssr snapshot test > ssr test packages/components/anchor/_example/container-horizontal.tsx 1`] = ` +"
content-1
content-2
content-3
content-4
content-5
" +`; + +exports[`ssr snapshot test > ssr test packages/components/anchor/_example/cursor.tsx 1`] = ` +"
content-1
content-2
content-3
content-4
content-5
" +`; + +exports[`ssr snapshot test > ssr test packages/components/anchor/_example/customize-highlight.tsx 1`] = ` +"
" +`; + +exports[`ssr snapshot test > ssr test packages/components/anchor/_example/large.tsx 1`] = ` +"
" +`; + +exports[`ssr snapshot test > ssr test packages/components/anchor/_example/multiple.tsx 1`] = ` +"" +`; + +exports[`ssr snapshot test > ssr test packages/components/anchor/_example/small.tsx 1`] = ` +"
" +`; exports[`ssr snapshot test > ssr test packages/components/anchor/_example/target.tsx 1`] = `"

基础锚点

多级锚点

尺寸大小

指定容器

"`; diff --git a/test/snap/__snapshots__/ssr.test.jsx.snap b/test/snap/__snapshots__/ssr.test.jsx.snap index 46e9f02c8d..b59e3d757c 100644 --- a/test/snap/__snapshots__/ssr.test.jsx.snap +++ b/test/snap/__snapshots__/ssr.test.jsx.snap @@ -18,19 +18,181 @@ exports[`ssr snapshot test > ssr test packages/components/alert/_example/swiper. exports[`ssr snapshot test > ssr test packages/components/alert/_example/title.tsx 1`] = `"
这是一条普通的消息提示
这是一条普通的消息提示描述,这是一条普通的消息提示描述
相关操作
"`; -exports[`ssr snapshot test > ssr test packages/components/anchor/_example/base.tsx 1`] = `""`; - -exports[`ssr snapshot test > ssr test packages/components/anchor/_example/container.tsx 1`] = `"
content-1
content-2
content-3
content-4
content-5
"`; - -exports[`ssr snapshot test > ssr test packages/components/anchor/_example/cursor.tsx 1`] = `""`; - -exports[`ssr snapshot test > ssr test packages/components/anchor/_example/customize-highlight.tsx 1`] = `""`; - -exports[`ssr snapshot test > ssr test packages/components/anchor/_example/large.tsx 1`] = `""`; - -exports[`ssr snapshot test > ssr test packages/components/anchor/_example/multiple.tsx 1`] = `""`; - -exports[`ssr snapshot test > ssr test packages/components/anchor/_example/small.tsx 1`] = `""`; +exports[`ssr snapshot test > ssr test packages/components/anchor/_example/base.tsx 1`] = ` +"
" +`; + +exports[`ssr snapshot test > ssr test packages/components/anchor/_example/container.tsx 1`] = ` +"
content-1
content-2
content-3
content-4
content-5
" +`; + +exports[`ssr snapshot test > ssr test packages/components/anchor/_example/container-horizontal.tsx 1`] = ` +"
content-1
content-2
content-3
content-4
content-5
" +`; + +exports[`ssr snapshot test > ssr test packages/components/anchor/_example/cursor.tsx 1`] = ` +"
content-1
content-2
content-3
content-4
content-5
" +`; + +exports[`ssr snapshot test > ssr test packages/components/anchor/_example/customize-highlight.tsx 1`] = ` +"
" +`; + +exports[`ssr snapshot test > ssr test packages/components/anchor/_example/large.tsx 1`] = ` +"
" +`; + +exports[`ssr snapshot test > ssr test packages/components/anchor/_example/multiple.tsx 1`] = ` +"" +`; + +exports[`ssr snapshot test > ssr test packages/components/anchor/_example/small.tsx 1`] = ` +"
" +`; exports[`ssr snapshot test > ssr test packages/components/anchor/_example/target.tsx 1`] = `"

基础锚点

多级锚点

尺寸大小

指定容器

"`;