feat(header): 新增头部组件功能与样式优化
- 添加默认头像图片资源 - 扩展监听文件同步配置 - 重构头像展示样式,增加背景和尺寸控制 - 完善签到功能逻辑和样式交互 - 新增头部组件HTML模板和JS实现 - 调整搜索框和历史记录显示逻辑 - 优化页面布局和响应式设计
This commit is contained in:
@@ -37,23 +37,12 @@ export const headTop = defineComponent({
|
||||
// 设置新的定时器,每秒滚动一次
|
||||
carouselTimer.value = setInterval(() => {
|
||||
if (!searchInputState.value && hotSearchWords.value.length > 1) {
|
||||
// 当滚动到复制的数据部分时,进行无缝切换
|
||||
if (currentIndex.value >= hotSearchWords.value.length - 1) {
|
||||
// 先滚动到复制的数据
|
||||
currentIndex.value++;
|
||||
// 在下一帧,当动画完成后,立即切换回对应的数据索引位置,但不带动画
|
||||
setTimeout(() => {
|
||||
if (!searchInputState.value) {
|
||||
currentIndex.value = 0;
|
||||
// 强制重新渲染以重置位置
|
||||
nextTick(() => {
|
||||
// 继续正常滚动
|
||||
});
|
||||
}
|
||||
if (!searchInputState.value) currentIndex.value = 0;
|
||||
}, 2300);
|
||||
} else {
|
||||
currentIndex.value++;
|
||||
}
|
||||
} else currentIndex.value++;
|
||||
}
|
||||
}, 2300);
|
||||
};
|
||||
@@ -68,13 +57,6 @@ export const headTop = defineComponent({
|
||||
isPaused.value = false;
|
||||
};
|
||||
|
||||
// 组件卸载时清理定时器
|
||||
const onUnmounted = () => {
|
||||
if (carouselTimer.value) {
|
||||
clearInterval(carouselTimer.value);
|
||||
}
|
||||
};
|
||||
|
||||
let hotSearchWords = ref([]);
|
||||
|
||||
const checkWConfig = () => {
|
||||
@@ -117,23 +99,13 @@ export const headTop = defineComponent({
|
||||
|
||||
const signIn = () => {
|
||||
SignInComponent.initComponent();
|
||||
// ajax("/v2/api/forum/sign").then((res) => {
|
||||
// if (res.code != 200) {
|
||||
// creationAlertBox("error", res.message);
|
||||
// return;
|
||||
// }
|
||||
|
||||
// let data = res.data;
|
||||
// state.value = 1;
|
||||
// creationAlertBox("success", res.message || "签到成功");
|
||||
// });
|
||||
};
|
||||
|
||||
let pitchState = ref(false);
|
||||
|
||||
let page = ref(...props.page);
|
||||
let page = ref(props.page);
|
||||
|
||||
// console.log("page", page.value);
|
||||
console.log("page", page.value, props.page);
|
||||
|
||||
let input = ref("");
|
||||
|
||||
@@ -175,5 +147,5 @@ export const headTop = defineComponent({
|
||||
return { hotSearchWords, historySearchList, searchEvent, searchInputState, searchHistoryShowState, searchInputFocus, searchInputBlur, page, pitchState, state, signIn, input, currentIndex, pauseCarousel, resumeCarousel };
|
||||
},
|
||||
|
||||
template: `<div class="head-top flexacenter"> <a href="/" class="flexacenter" target="_blank"> <img class="logo" src="https://oss.gter.net/logo" alt="" /> </a> <div class="flex1"></div> <div class="input-box flexacenter" :class="{'pitch': searchInputState}"> <div class="placeholder" v-if="!searchInputState && !input"> <div class="placeholder-box" :style="{transform: 'translateY(-' + currentIndex * 36 + 'px)', transition: 'transform .3s ease'}"> <div class="item one-line-display" v-for="(item,index) in hotSearchWords" :key="index">大家都在搜:{{ item.keyword }}</div> <div class="item one-line-display" v-for="(item,index) in hotSearchWords.slice(0, 2)" :key="'copy-' + index">大家都在搜:{{ item.keyword }}</div> </div> </div> <input class="input flex1" type="text" @keyup.enter="searchEvent()" v-model="input" @focus="searchInputFocus" @blur="searchInputBlur" maxlength="140" /> <img class="icon" src="/img/search-icon.svg" @click="searchEvent()" /> <div class="search-box-history" v-if="searchHistoryShowState"> <div class="search-box-history-title">历史搜索</div> <div class="search-box-history-list"> <div class="search-box-history-item one-line-display" v-for="(item,index) in historySearchList " :key="index" @click="searchEvent(item)">{{ item }}</div> </div> </div> </div> <div class="post-list flexacenter" v-if="page == 'details'"> <a href="/publish" target="_blank" style="margin-right: 10px"> <img class="post-item" src="/img/post-thread.png" /> </a> <a href="https://offer.gter.net/post" target="_blank" style="margin-right: 10px"> <img class="post-item" src="/img/post-offer.png" /> </a> <a href="https://offer.gter.net/post/summary" target="_blank" style="margin-right: 10px"> <img class="post-item" src="/img/post-summary.png" /> </a> <a href="https://interviewexperience.gter.net/publish" target="_blank" style="margin-right: 10px"> <img class="post-item" src="/img/post-mj.png" /> </a> <a href="https://vote.gter.net/publish" target="_blank" style="margin-right: 10px"> <img class="post-item" src="/img/post-vote.png" /> </a> </div> <template v-else> <div class="sign-in sign-in-no flexacenter" v-if="state == 0" @click="signIn()" v-cloak> <img class="sign-in-bj" src="/img/sign-in-bj.svg" /> <img class="coin-bj" src="/img/coin-bj.svg" /> <img class="coin-icon" src="/img/coin-icon.png" /> <span class="text flex1">签到领寄托币</span> <div class="sign-go flexcenter"> <img class="sign-go-bj" src="/img/sign-go.svg" /> GO </div> <img class="petal1" src="/img/petal1.png" /> <img class="petal2" src="/img/petal2.png" /> <img class="petal3" src="/img/petal3.png" /> </div> <div class="sign-in sign-in-already flexcenter" v-else @click="signIn()"> <img class="sign-icon" src="/img/sign-icon.png" /> <span>已签到,明天再来</span> </div> </template></div>`,
|
||||
template: `<div class="head-top flexacenter"> <a href="/" class="flexacenter" target="_blank"> <img class="logo" src="https://oss.gter.net/logo" alt="" /> </a> <div class="flex1"></div> <div class="input-box flexacenter" :class="{'pitch': searchInputState}"> <div class="placeholder" v-if="!searchInputState && !input"> <div class="placeholder-box" :style="{transform: 'translateY(-' + currentIndex * 36 + 'px)', transition: 'transform .3s ease'}"> <div class="item one-line-display" v-for="(item,index) in hotSearchWords" :key="index">大家都在搜:{{ item.keyword }}</div> <div class="item one-line-display" v-for="(item,index) in hotSearchWords.slice(0, 2)" :key="'copy-' + index">大家都在搜:{{ item.keyword }}</div> </div> </div> <input class="input flex1" type="text" @keyup.enter="searchEvent()" v-model="input" @focus="searchInputFocus" @blur="searchInputBlur" maxlength="140" /> <img class="icon" src="/img/search-icon.svg" @click="searchEvent()" /> <div class="search-box-history" v-if="searchHistoryShowState"> <div class="search-box-history-title">历史搜索</div> <div class="search-box-history-list"> <div class="search-box-history-item one-line-display" v-for="(item,index) in historySearchList " :key="index" @click="searchEvent(item)">{{ item }}</div> </div> </div> </div> <div class="post-list flexacenter" v-if="page == 'details'"><a href="/publish" target="_blank" style="margin-right: 10px"> <img class="post-item" src="/img/post-thread.png" /> </a> <a href="https://offer.gter.net/post" target="_blank" style="margin-right: 10px"> <img class="post-item" src="/img/post-offer.png" /> </a> <a href="https://offer.gter.net/post/summary" target="_blank" style="margin-right: 10px"> <img class="post-item" src="/img/post-summary.png" /> </a> <a href="https://interviewexperience.gter.net/publish" target="_blank" style="margin-right: 10px"> <img class="post-item" src="/img/post-mj.png" /> </a> <a href="https://vote.gter.net/publish" target="_blank" style="margin-right: 10px"> <img class="post-item" src="/img/post-vote.png" /> </a> </div> <template v-else> <div class="sign-in flexacenter" :class="{'sign-in-already': state == 1, 'sign-in-no': state == 0}" @click="signIn()" v-cloak> <div class="sign-in-no-box"> <img class="sign-in-bj" src="/img/sign-in-bj.svg" /> <img class="coin-bj" src="/img/coin-bj.svg" /> <img class="coin-icon" src="/img/coin-icon.png" /> <span class="text flex1">签到领寄托币</span> <div class="sign-go flexcenter"> <img class="sign-go-bj" src="/img/sign-go.svg" /> GO </div> <img class="petal1" src="/img/petal1.png" /> <img class="petal2" src="/img/petal2.png" /> <img class="petal3" src="/img/petal3.png" /> </div> <div class="sign-in-already-box"> <img class="sign-icon" src="/img/sign-icon.png" /> <span>已签到,明天再来</span> </div> </div> </template></div>`,
|
||||
});
|
||||
|
||||
@@ -5,47 +5,40 @@
|
||||
<div class="flex1"></div>
|
||||
<div class="input-box flexacenter" :class="{'pitch': searchInputState}">
|
||||
<div class="placeholder" v-if="!searchInputState && !input">
|
||||
<div class="placeholder-box"
|
||||
:style="{transform: 'translateY(-' + currentIndex * 36 + 'px)', transition: 'transform .3s ease'}">
|
||||
<div class="placeholder-box" :style="{transform: 'translateY(-' + currentIndex * 36 + 'px)', transition: 'transform .3s ease'}">
|
||||
<div class="item one-line-display" v-for="(item,index) in hotSearchWords" :key="index">大家都在搜:{{
|
||||
item.keyword }}</div>
|
||||
<div class="item one-line-display" v-for="(item,index) in hotSearchWords.slice(0, 2)"
|
||||
:key="'copy-' + index">大家都在搜:{{ item.keyword }}</div>
|
||||
<div class="item one-line-display" v-for="(item,index) in hotSearchWords.slice(0, 2)" :key="'copy-' + index">大家都在搜:{{ item.keyword }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<input class="input flex1" type="text" @keyup.enter="searchEvent()" v-model="input" @focus="searchInputFocus"
|
||||
@blur="searchInputBlur" maxlength="140" /> <img class="icon" src="/img/search-icon.svg"
|
||||
@click="searchEvent()" />
|
||||
<input class="input flex1" type="text" @keyup.enter="searchEvent()" v-model="input" @focus="searchInputFocus" @blur="searchInputBlur" maxlength="140" /> <img class="icon" src="/img/search-icon.svg" @click="searchEvent()" />
|
||||
<div class="search-box-history" v-if="searchHistoryShowState">
|
||||
<div class="search-box-history-title">历史搜索</div>
|
||||
<div class="search-box-history-list">
|
||||
<div class="search-box-history-item one-line-display" v-for="(item,index) in historySearchList "
|
||||
:key="index" @click="searchEvent(item)">{{ item }}</div>
|
||||
<div class="search-box-history-item one-line-display" v-for="(item,index) in historySearchList " :key="index" @click="searchEvent(item)">{{ item }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="post-list flexacenter" v-if="page == 'details'"> <a href="/publish" target="_blank"
|
||||
style="margin-right: 10px"> <img class="post-item" src="/img/post-thread.png" /> </a> <a
|
||||
href="https://offer.gter.net/post" target="_blank" style="margin-right: 10px"> <img class="post-item"
|
||||
src="/img/post-offer.png" /> </a> <a href="https://offer.gter.net/post/summary" target="_blank"
|
||||
style="margin-right: 10px"> <img class="post-item" src="/img/post-summary.png" /> </a> <a
|
||||
href="https://interviewexperience.gter.net/publish" target="_blank" style="margin-right: 10px"> <img
|
||||
class="post-item" src="/img/post-mj.png" /> </a> <a href="https://vote.gter.net/publish" target="_blank"
|
||||
style="margin-right: 10px"> <img class="post-item" src="/img/post-vote.png" /> </a> </div> <template v-else>
|
||||
<div class="sign-in sign-in-no flexacenter" v-if="state == 0" @click="signIn()" v-cloak> <img class="sign-in-bj"
|
||||
src="/img/sign-in-bj.svg" /> <img class="coin-bj" src="/img/coin-bj.svg" /> <img class="coin-icon"
|
||||
src="/img/coin-icon.png" /> <span class="text flex1">签到领寄托币</span>
|
||||
<div class="sign-go flexcenter">
|
||||
<img class="sign-go-bj" src="/img/sign-go.svg" /> GO
|
||||
<div class="post-list flexacenter" v-if="page == 'details'"><a href="/publish" target="_blank" style="margin-right: 10px"> <img class="post-item" src="/img/post-thread.png" /> </a> <a href="https://offer.gter.net/post" target="_blank" style="margin-right: 10px"> <img class="post-item" src="/img/post-offer.png" /> </a> <a href="https://offer.gter.net/post/summary" target="_blank" style="margin-right: 10px"> <img class="post-item" src="/img/post-summary.png" /> </a> <a href="https://interviewexperience.gter.net/publish" target="_blank" style="margin-right: 10px"> <img class="post-item" src="/img/post-mj.png" /> </a> <a href="https://vote.gter.net/publish" target="_blank" style="margin-right: 10px"> <img class="post-item" src="/img/post-vote.png" /> </a> </div>
|
||||
<template v-else>
|
||||
<div class="sign-in flexacenter" :class="{'sign-in-already': state == 1, 'sign-in-no': state == 0}" @click="signIn()" v-cloak>
|
||||
<div class="sign-in-no-box">
|
||||
<img class="sign-in-bj" src="/img/sign-in-bj.svg" /> <img class="coin-bj" src="/img/coin-bj.svg" />
|
||||
<img class="coin-icon" src="/img/coin-icon.png" /> <span class="text flex1">签到领寄托币</span>
|
||||
<div class="sign-go flexcenter">
|
||||
<img class="sign-go-bj" src="/img/sign-go.svg" /> GO
|
||||
</div>
|
||||
<img class="petal1" src="/img/petal1.png" />
|
||||
<img class="petal2" src="/img/petal2.png" />
|
||||
<img class="petal3" src="/img/petal3.png" />
|
||||
</div>
|
||||
<img class="petal1" src="/img/petal1.png" />
|
||||
<img class="petal2" src="/img/petal2.png" />
|
||||
<img class="petal3" src="/img/petal3.png" />
|
||||
</div>
|
||||
<div class="sign-in sign-in-already flexcenter" v-else @click="signIn()">
|
||||
<img class="sign-icon" src="/img/sign-icon.png" />
|
||||
<span>已签到,明天再来</span>
|
||||
|
||||
<div class="sign-in-already-box">
|
||||
<img class="sign-icon" src="/img/sign-icon.png" />
|
||||
<span>已签到,明天再来</span>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
Reference in New Issue
Block a user