Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
52c138b3
提交
52c138b3
authored
1月 16, 2026
作者:
coderBryanFu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update
上级
800667be
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
9 个修改的文件
包含
112 行增加
和
77 行删除
+112
-77
App.vue
src/App.vue
+3
-7
index.vue
src/views/bill/deepDig/poliContribution/index.vue
+2
-2
index.vue
src/views/bill/deepDig/processAnalysis/index.vue
+0
-0
index.vue
src/views/bill/deepDig/processOverview/index.vue
+1
-1
index.vue
src/views/bill/introdoction/index.vue
+4
-1
index.vue
src/views/comprehensiveSearch/chat/index.vue
+7
-0
index.vue
src/views/comprehensiveSearch/searchResults/index.vue
+40
-20
index.vue
src/views/decree/decreeHome/index.vue
+33
-28
index.vue
src/views/thinkTank/index.vue
+22
-18
没有找到文件。
src/App.vue
浏览文件 @
52c138b3
<
template
>
<
template
>
<div
id=
"app"
>
<div
id=
"app"
>
<div
class=
"pro-wrapper"
>
<div
class=
"pro-wrapper"
>
<div
class=
"home-page"
v-
show
=
"isCurrentOverview"
>
<div
class=
"home-page"
v-
if
=
"isCurrentOverview"
>
<div
class=
"navbar"
>
<div
class=
"navbar"
>
<div
class=
"nav-left"
>
<div
class=
"nav-left"
>
<div
class=
"icon"
>
<div
class=
"icon"
>
...
@@ -53,7 +53,7 @@
...
@@ -53,7 +53,7 @@
<router-view
/>
<router-view
/>
</div>
</div>
</div>
</div>
<div
class=
"content-page"
v-
show
=
"!isCurrentOverview"
>
<div
class=
"content-page"
v-
if
=
"!isCurrentOverview"
>
<div
class=
"navbar"
>
<div
class=
"navbar"
>
<div
class=
"nav-brand"
>
<div
class=
"nav-brand"
>
<div
class=
"brand-icon"
>
<div
class=
"brand-icon"
>
...
@@ -136,8 +136,8 @@ const route = useRoute()
...
@@ -136,8 +136,8 @@ const route = useRoute()
const
handleToHome
=
()
=>
{
const
handleToHome
=
()
=>
{
router
.
push
({
router
.
push
({
path
:
"/ZMOverView"
path
:
"/ZMOverView"
// path: "/overview"
});
});
isCurrentOverview
.
value
=
true
;
};
};
const
isShowAiBox
=
ref
(
false
);
const
isShowAiBox
=
ref
(
false
);
...
@@ -150,10 +150,6 @@ const openAiBox = () => {
...
@@ -150,10 +150,6 @@ const openAiBox = () => {
isShowAiBox
.
value
=
true
;
isShowAiBox
.
value
=
true
;
};
};
const
handleHomeCommand
=
command
=>
{
router
.
push
(
command
);
};
const
personTypeList
=
ref
([]);
const
personTypeList
=
ref
([]);
// 获取人物类别
// 获取人物类别
...
...
src/views/bill/deepDig/poliContribution/index.vue
浏览文件 @
52c138b3
...
@@ -933,7 +933,7 @@ onMounted(() => {
...
@@ -933,7 +933,7 @@ onMounted(() => {
width
:
1064
px
;
width
:
1064
px
;
height
:
846
px
;
height
:
846
px
;
.
box2
{
.
box2
{
width
:
1
210
px
;
width
:
1
064
px
;
height
:
415
px
;
height
:
415
px
;
border
:
1
px
solid
rgba
(
234
,
236
,
238
,
1
);
border
:
1
px
solid
rgba
(
234
,
236
,
238
,
1
);
border
-
radius
:
10
px
;
border
-
radius
:
10
px
;
...
@@ -948,7 +948,7 @@ onMounted(() => {
...
@@ -948,7 +948,7 @@ onMounted(() => {
}
}
.
box3
{
.
box3
{
margin
-
top
:
16
px
;
margin
-
top
:
16
px
;
width
:
1
210
px
;
width
:
1
064
px
;
height
:
415
px
;
height
:
415
px
;
border
:
1
px
solid
rgba
(
234
,
236
,
238
,
1
);
border
:
1
px
solid
rgba
(
234
,
236
,
238
,
1
);
border
-
radius
:
10
px
;
border
-
radius
:
10
px
;
...
...
src/views/bill/deepDig/processAnalysis/index.vue
浏览文件 @
52c138b3
差异被折叠。
点击展开。
src/views/bill/deepDig/processOverview/index.vue
浏览文件 @
52c138b3
...
@@ -635,7 +635,7 @@ onMounted(() => {
...
@@ -635,7 +635,7 @@ onMounted(() => {
<
style
lang=
"scss"
scoped
>
<
style
lang=
"scss"
scoped
>
.process-overview-wrap
{
.process-overview-wrap
{
width
:
1
744
px
;
width
:
1
600
px
;
height
:
848px
;
height
:
848px
;
border-radius
:
10px
;
border-radius
:
10px
;
box-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0
.1
);
box-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0
.1
);
...
...
src/views/bill/introdoction/index.vue
浏览文件 @
52c138b3
...
@@ -183,7 +183,7 @@
...
@@ -183,7 +183,7 @@
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
div
class
=
"info-right"
>
<
div
class
=
"info-right"
>
<
div
class
=
"info-right-title"
>
{{
curPerson
.
name
}}
<
/div
>
<
div
class
=
"info-right-title"
@
click
=
"handleClickAvatar(curPerson)"
>
{{
curPerson
.
name
}}
<
/div
>
<
div
class
=
"info-right-item"
>
<
div
class
=
"info-right-item"
>
<
div
class
=
"item-left"
>
英文名
:
<
/div
>
<
div
class
=
"item-left"
>
英文名
:
<
/div
>
<
div
class
=
"item-right"
>
{{
curPerson
.
ename
}}
<
/div
>
<
div
class
=
"item-right"
>
{{
curPerson
.
ename
}}
<
/div
>
...
@@ -889,6 +889,7 @@ onMounted(() => {
...
@@ -889,6 +889,7 @@ onMounted(() => {
margin
-
top
:
25
px
;
margin
-
top
:
25
px
;
display
:
flex
;
display
:
flex
;
.
info
-
left
{
.
info
-
left
{
cursor
:
pointer
;
img
{
img
{
width
:
128
px
;
width
:
128
px
;
height
:
128
px
;
height
:
128
px
;
...
@@ -935,6 +936,7 @@ onMounted(() => {
...
@@ -935,6 +936,7 @@ onMounted(() => {
font
-
size
:
16
px
;
font
-
size
:
16
px
;
font
-
weight
:
600
;
font
-
weight
:
600
;
line
-
height
:
22
px
;
line
-
height
:
22
px
;
cursor
:
pointer
;
}
}
.
info
-
right
-
item
{
.
info
-
right
-
item
{
margin
-
top
:
8
px
;
margin
-
top
:
8
px
;
...
@@ -1110,6 +1112,7 @@ onMounted(() => {
...
@@ -1110,6 +1112,7 @@ onMounted(() => {
line
-
height
:
22
px
;
line
-
height
:
22
px
;
text
-
align
:
center
;
text
-
align
:
center
;
margin
-
bottom
:
50
px
;
margin
-
bottom
:
50
px
;
cursor
:
pointer
;
}
}
.
info
-
right
-
item
{
.
info
-
right
-
item
{
margin
-
top
:
8
px
;
margin
-
top
:
8
px
;
...
...
src/views/comprehensiveSearch/chat/index.vue
浏览文件 @
52c138b3
...
@@ -978,6 +978,7 @@ onUnmounted(() => {
...
@@ -978,6 +978,7 @@ onUnmounted(() => {
<
style
lang=
"scss"
scoped
>
<
style
lang=
"scss"
scoped
>
:deep
(
.el-input__wrapper
)
{
:deep
(
.el-input__wrapper
)
{
box-shadow
:
none
;
box-shadow
:
none
;
height
:
44px
;
}
}
:deep
(
.el-input__wrapper
:hover
)
{
:deep
(
.el-input__wrapper
:hover
)
{
box-shadow
:
none
!
important
;
box-shadow
:
none
!
important
;
...
@@ -1024,7 +1025,13 @@ onUnmounted(() => {
...
@@ -1024,7 +1025,13 @@ onUnmounted(() => {
font-weight
:
400
;
font-weight
:
400
;
}
}
.wrapper
{
.wrapper
{
width
:
100%
;
height
:
100%
;
overflow-y
:
auto
;
.header
{
.header
{
position
:
sticky
;
top
:
0
;
z-index
:
9999
;
height
:
64px
;
height
:
64px
;
color
:
#fff
;
color
:
#fff
;
font-family
:
Microsoft
YaHei
;
font-family
:
Microsoft
YaHei
;
...
...
src/views/comprehensiveSearch/searchResults/index.vue
浏览文件 @
52c138b3
...
@@ -6,9 +6,9 @@
...
@@ -6,9 +6,9 @@
<div
class=
"icon"
>
<div
class=
"icon"
>
<img
src=
"./assets/images/search-icon1.png"
alt=
""
/>
<img
src=
"./assets/images/search-icon1.png"
alt=
""
/>
</div>
</div>
<el-input
v-model=
"keyword"
:border=
"false"
style=
"width: 900px
; height: 100%
"
@
keyup
.
enter=
"handleSearch"
/>
<el-input
v-model=
"keyword"
:border=
"false"
style=
"width: 900px"
@
keyup
.
enter=
"handleSearch"
/>
</div>
</div>
<div
class=
"right"
@
click=
"handle
Search
"
>
<div
class=
"right"
@
click=
"handle
ToAi
"
>
<img
src=
"./assets/images/ai-icon.png"
alt=
""
/>
<img
src=
"./assets/images/ai-icon.png"
alt=
""
/>
</div>
</div>
</div>
</div>
...
@@ -51,9 +51,9 @@
...
@@ -51,9 +51,9 @@
<div
class=
"text-box"
>
<div
class=
"text-box"
>
搜索关键词:
<span
class=
"text-2"
>
{{
keyword
}}
</span>
搜索关键词:
<span
class=
"text-2"
>
{{
keyword
}}
</span>
</div>
</div>
<div
class=
"text-box"
>
<
!--
<
div
class=
"text-box"
>
当前领域:
<span
class=
"text-2"
>
{{
curArea
}}
</span>
当前领域:
<span
class=
"text-2"
>
{{
curArea
}}
</span>
</div>
</div>
-->
</div>
</div>
<!--
<div
class=
"info-right"
>
<!--
<div
class=
"info-right"
>
<el-select
v-model=
"selectTime"
placeholder=
"选择时间"
style=
"width: 125px"
>
<el-select
v-model=
"selectTime"
placeholder=
"选择时间"
style=
"width: 125px"
>
...
@@ -262,6 +262,13 @@ const handleClickDomains = domain => {
...
@@ -262,6 +262,13 @@ const handleClickDomains = domain => {
handleSearch
();
handleSearch
();
};
};
function
highlightText
(
text
,
keyword
)
{
if
(
!
text
||
!
keyword
)
return
text
;
const
regex
=
new
RegExp
(
`(
${
keyword
}
)`
,
'gi'
);
return
text
.
replace
(
regex
,
'<span style="color: red; font-weight: bold;">$1</span>'
);
}
const
handleSearch
=
async
()
=>
{
const
handleSearch
=
async
()
=>
{
let
params
;
let
params
;
if
(
activeTabId
.
value
)
{
if
(
activeTabId
.
value
)
{
...
@@ -292,6 +299,10 @@ const handleSearch = async () => {
...
@@ -292,6 +299,10 @@ const handleSearch = async () => {
}));
}));
}
}
searchResults
.
value
=
res
.
data
.
records
;
searchResults
.
value
=
res
.
data
.
records
;
searchResults
.
value
.
forEach
(
item
=>
{
item
.
originalTitle
=
highlightText
(
item
.
originalTitle
,
keyword
.
value
)
item
.
originalDescription
=
highlightText
(
item
.
originalDescription
,
keyword
.
value
)
})
totalNum
.
value
=
res
.
data
.
total
;
totalNum
.
value
=
res
.
data
.
total
;
if
(
totalNum
.
value
)
{
if
(
totalNum
.
value
)
{
ElMessage
.
success
(
`共计搜索到
${
totalNum
.
value
}
条结果`
);
ElMessage
.
success
(
`共计搜索到
${
totalNum
.
value
}
条结果`
);
...
@@ -475,27 +486,26 @@ onMounted(() => {
...
@@ -475,27 +486,26 @@ onMounted(() => {
}
}
handleSearch
();
handleSearch
();
});
});
const
handleToAi
=
()
=>
{
const
route
=
router
.
resolve
({
path
:
"/chat"
});
window
.
open
(
route
.
href
,
"_blank"
);
};
</
script
>
</
script
>
<
style
lang=
"scss"
scoped
>
<
style
lang=
"scss"
scoped
>
:deep
(
.el-input__wrapper
)
{
box-shadow
:
none
;
}
:deep
(
.el-input__wrapper
:hover
)
{
box-shadow
:
none
!
important
;
}
:deep
(
.el-input__wrapper.is-focus
)
{
box-shadow
:
none
!
important
;
}
.wrapper
{
.wrapper
{
width
:
100%
;
width
:
100%
;
height
:
100%
;
height
:
100%
;
background
:
url("../assets/images/background.png")
no-repeat
;
background
:
url("../assets/images/background.png")
no-repeat
;
background-size
:
100%
100%
;
background-size
:
100%
100%
;
overflow-y
:
auto
;
.header
{
.header
{
margin-top
:
24px
;
margin-top
:
24px
;
position
:
relative
;
// position: sticky;
// top: 24px;
.header-right
{
.header-right
{
position
:
absolute
;
position
:
absolute
;
width
:
360px
;
width
:
360px
;
...
@@ -589,12 +599,12 @@ onMounted(() => {
...
@@ -589,12 +599,12 @@ onMounted(() => {
margin-top
:
12px
;
margin-top
:
12px
;
height
:
48px
;
height
:
48px
;
display
:
flex
;
display
:
flex
;
margin-left
:
257px
;
margin-left
:
240px
;
align-items
:
center
;
.tab-left
{
.tab-left
{
width
:
726px
;
width
:
726px
;
height
:
48px
;
height
:
48px
;
display
:
flex
;
display
:
flex
;
justify-content
:
flex-start
;
gap
:
32px
;
gap
:
32px
;
.tab
{
.tab
{
color
:
rgba
(
59
,
65
,
75
,
1
);
color
:
rgba
(
59
,
65
,
75
,
1
);
...
@@ -655,7 +665,7 @@ onMounted(() => {
...
@@ -655,7 +665,7 @@ onMounted(() => {
display
:
flex
;
display
:
flex
;
flex-wrap
:
wrap
;
flex-wrap
:
wrap
;
gap
:
12px
;
gap
:
12px
;
margin-left
:
2
56
px
;
margin-left
:
2
40
px
;
.tag
{
.tag
{
height
:
32px
;
height
:
32px
;
line-height
:
30px
;
line-height
:
30px
;
...
@@ -678,7 +688,7 @@ onMounted(() => {
...
@@ -678,7 +688,7 @@ onMounted(() => {
}
}
.info-box
{
.info-box
{
margin-top
:
26px
;
margin-top
:
26px
;
margin-left
:
2
57
px
;
margin-left
:
2
40
px
;
width
:
920px
;
width
:
920px
;
height
:
32px
;
height
:
32px
;
display
:
flex
;
display
:
flex
;
...
@@ -748,7 +758,7 @@ onMounted(() => {
...
@@ -748,7 +758,7 @@ onMounted(() => {
width
:
913px
;
width
:
913px
;
// height: 1464px;
// height: 1464px;
margin-top
:
36px
;
margin-top
:
36px
;
margin-left
:
2
64
px
;
margin-left
:
2
40
px
;
.item
{
.item
{
width
:
913px
;
width
:
913px
;
min-height
:
108px
;
min-height
:
108px
;
...
@@ -848,7 +858,17 @@ onMounted(() => {
...
@@ -848,7 +858,17 @@ onMounted(() => {
justify-content
:
center
;
justify-content
:
center
;
}
}
}
}
:deep
(
.el-input__wrapper
)
{
box-shadow
:
none
;
height
:
46px
;
}
:deep
(
.el-input__wrapper
:hover
)
{
box-shadow
:
none
!
important
;
}
:deep
(
.el-input__wrapper.is-focus
)
{
box-shadow
:
none
!
important
;
}
:deep
(
.el-input__inner
)
{
:deep
(
.el-input__inner
)
{
color
:
rgba
(
59
,
65
,
75
,
1
);
color
:
rgba
(
59
,
65
,
75
,
1
);
font-family
:
Microsoft
YaHei
;
font-family
:
Microsoft
YaHei
;
...
...
src/views/decree/decreeHome/index.vue
浏览文件 @
52c138b3
...
@@ -285,17 +285,17 @@
...
@@ -285,17 +285,17 @@
<div
class=
"header-title"
>
{{ "社交媒体" }}
</div>
<div
class=
"header-title"
>
{{ "社交媒体" }}
</div>
</div>
</div>
<div
class=
"box4-main"
>
<div
class=
"box4-main"
>
<MessageBubble
<MessageBubble
v-for=
"(item, index) in messageList"
v-for=
"(item, index) in messageList"
@
click=
"handleClickPerson(item)"
@
click=
"handleClickPerson(item)"
@
info-click=
"handleMediaClick(item)"
@
info-click=
"handleMediaClick(item)"
:key=
"index"
:key=
"index"
:avatar=
"item.img ? item.img : DefaultIcon1"
:avatar=
"item.img ? item.img : DefaultIcon1"
:name=
"item.name"
:name=
"item.name"
:time=
"item.time"
:time=
"item.time"
:source=
"item.source"
:source=
"item.source"
:content=
"item.content"
:content=
"item.content"
/>
/>
<!-- <div class="box4-main-item" v-for="(item, index) in messageList" :key="index">
<!-- <div class="box4-main-item" v-for="(item, index) in messageList" :key="index">
<div class="left" @click="handleClickPerson(item)">
<div class="left" @click="handleClickPerson(item)">
<img :src="item.img ? item.img : DefaultIcon1" alt="" />
<img :src="item.img ? item.img : DefaultIcon1" alt="" />
...
@@ -407,8 +407,7 @@
...
@@ -407,8 +407,7 @@
</div>
</div>
<div
class=
"header-title"
>
{{ "政令重点条款" }}
</div>
<div
class=
"header-title"
>
{{ "政令重点条款" }}
</div>
</div>
</div>
<div
class=
"box8-main"
id=
"wordCloudChart"
>
<div
class=
"box8-main"
id=
"wordCloudChart"
></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
...
@@ -561,7 +560,7 @@
...
@@ -561,7 +560,7 @@
</template>
</template>
<
script
setup
>
<
script
setup
>
import
{
onMounted
,
ref
,
computed
,
watch
}
from
"vue"
;
import
{
onMounted
,
ref
,
computed
,
watch
,
nextTick
}
from
"vue"
;
import
router
from
"@/router"
;
import
router
from
"@/router"
;
import
HeaderMenu
from
"@/components/headerMenu.vue"
;
import
HeaderMenu
from
"@/components/headerMenu.vue"
;
import
headerInfo
from
"@/components/headerInfo.vue"
;
import
headerInfo
from
"@/components/headerInfo.vue"
;
...
@@ -1141,19 +1140,25 @@ const handleSwithSort = () => {
...
@@ -1141,19 +1140,25 @@ const handleSwithSort = () => {
};
};
const
handleToPosi
=
id
=>
{
const
handleToPosi
=
id
=>
{
// 0 618 1240 2350
const
element
=
document
.
getElementById
(
id
);
switch
(
id
)
{
if
(
element
&&
containerRef
.
value
)
{
case
"position2"
:
// 1. 如果是从完整搜索框跳转,先强制切换状态稳定布局
containerRef
.
value
.
scrollTop
=
isShow
.
value
?
844
:
1190
;
if
(
!
isShow
.
value
)
{
break
;
isShow
.
value
=
true
;
case
"position3"
:
}
containerRef
.
value
.
scrollTop
=
isShow
.
value
?
1480
:
1826
;
break
;
// 2. 使用 nextTick 等待 DOM 布局(如高度切换)完成后再进行坐标计算
case
"position4"
:
nextTick
(()
=>
{
containerRef
.
value
.
scrollTop
=
isShow
.
value
?
2554
:
2900
;
const
containerRect
=
containerRef
.
value
.
getBoundingClientRect
();
break
;
const
elementRect
=
element
.
getBoundingClientRect
();
default
:
// 使用 getBoundingClientRect 计算元素相对于容器顶部的绝对距离,不受嵌套布局影响
containerRef
.
value
.
scrollTop
=
0
;
const
top
=
elementRect
.
top
-
containerRect
.
top
+
containerRef
.
value
.
scrollTop
;
containerRef
.
value
.
scrollTo
({
top
:
top
,
behavior
:
"smooth"
});
});
}
}
};
};
...
@@ -1583,7 +1588,7 @@ onMounted(async () => {
...
@@ -1583,7 +1588,7 @@ onMounted(async () => {
box-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0
.1
);
box-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0
.1
);
background
:
rgba
(
255
,
255
,
255
,
0
.65
);
background
:
rgba
(
255
,
255
,
255
,
0
.65
);
align-items
:
center
;
align-items
:
center
;
gap
:
17px
;
gap
:
17px
;
margin
:
0
6px
16px
6px
;
margin
:
0
6px
16px
6px
;
cursor
:
pointer
;
cursor
:
pointer
;
transition
:
transform
0
.3s
ease
,
box-shadow
0
.3s
ease
;
transition
:
transform
0
.3s
ease
,
box-shadow
0
.3s
ease
;
...
...
src/views/thinkTank/index.vue
浏览文件 @
52c138b3
...
@@ -42,9 +42,9 @@
...
@@ -42,9 +42,9 @@
</div>
</div>
</div>
</div>
</div>
</div>
<div
class=
"home-main"
:class=
"
{ scrollHomeMain: isShow }" ref="containerRef">
<div
class=
"home-main"
:class=
"
{ scrollHomeMain: isShow }" ref="containerRef">
<div
class=
"home-main-header"
>
<div
class=
"home-main-header"
>
<div
class=
"home-main-header-top"
v-show=
"!isShow"
>
<div
class=
"home-main-header-top"
v-show=
"!isShow"
>
<div
class=
"header-left"
>
<div
class=
"header-left"
>
<HeaderMenu></HeaderMenu>
<HeaderMenu></HeaderMenu>
</div>
</div>
...
@@ -592,7 +592,7 @@
...
@@ -592,7 +592,7 @@
</template>
</template>
<
script
setup
>
<
script
setup
>
import
{
onMounted
,
ref
,
computed
,
reactive
}
from
"vue"
;
import
{
onMounted
,
ref
,
computed
,
reactive
,
nextTick
}
from
"vue"
;
import
scrollToTop
from
"@/utils/scrollToTop"
;
import
scrollToTop
from
"@/utils/scrollToTop"
;
import
router
from
"@/router"
;
import
router
from
"@/router"
;
import
DivideHeader
from
"@/components/DivideHeader.vue"
;
import
DivideHeader
from
"@/components/DivideHeader.vue"
;
...
@@ -657,22 +657,26 @@ import { useContainerScroll } from "@/hooks/useScrollShow";
...
@@ -657,22 +657,26 @@ import { useContainerScroll } from "@/hooks/useScrollShow";
const
containerRef
=
ref
(
null
);
const
containerRef
=
ref
(
null
);
const
{
isShow
}
=
useContainerScroll
(
containerRef
);
const
{
isShow
}
=
useContainerScroll
(
containerRef
);
const
handleToPosi
=
id
=>
{
const
handleToPosi
=
id
=>
{
// 0 618 1240 2350
const
element
=
document
.
getElementById
(
id
);
switch
(
id
)
{
if
(
element
&&
containerRef
.
value
)
{
case
"position2"
:
// 1. 如果是从完整搜索框跳转,先强制切换状态稳定布局
// containerRef.value.scrollTop = isShow.value ? 744 : 1090;
if
(
!
isShow
.
value
)
{
containerRef
.
value
.
scrollTop
=
isShow
.
value
?
900
:
1150
;
isShow
.
value
=
true
;
break
;
}
case
"position3"
:
containerRef
.
value
.
scrollTop
=
isShow
.
value
?
1480
:
1730
;
// 2. 使用 nextTick 等待 DOM 布局(如高度切换)完成后再进行坐标计算
break
;
nextTick
(()
=>
{
case
"position4"
:
const
containerRect
=
containerRef
.
value
.
getBoundingClientRect
();
containerRef
.
value
.
scrollTop
=
isShow
.
value
?
2545
:
2795
;
const
elementRect
=
element
.
getBoundingClientRect
();
break
;
// 使用 getBoundingClientRect 计算元素相对于容器顶部的绝对距离,不受嵌套布局影响
default
:
const
top
=
elementRect
.
top
-
containerRect
.
top
+
containerRef
.
value
.
scrollTop
;
containerRef
.
value
.
scrollTop
=
0
;
containerRef
.
value
.
scrollTo
({
top
:
top
,
behavior
:
"smooth"
});
});
}
}
};
};
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论