officialWebsite/src/components/AppHeader/size768/index.vue

337 lines
8.4 KiB
Vue
Raw Normal View History

2025-02-27 04:00:56 +00:00
<template>
<header className="header flex items-center justify-between">
<div class="logo">
<img src="@/assets/image/logo.png" alt="logo" />
</div>
<div class="tabs">
<div class="tab-item pt-[10px]" @click="handleLanguageChange">
{{ currentLanguageLabel }}
<img
src="@/assets/image/home/768/icon-language.png"
alt="language"
class="w-[18px] ml-[13px]"
/>
</div>
<div class="ml-[53px] cursor" @click="handleMenuClick">
<img
src="@/assets/image/home/768/icon-menu.png"
class="w-[115px]"
alt="logo"
/>
</div>
</div>
<n-drawer
v-model:show="state.dialogMenu"
default-width="100%"
resizable
placement="left"
>
<n-drawer-content>
<template #header>
<div class="flex flex-wrap items-center justify-between px-[143px]">
<img src="@/assets/image/logo.png" class="w-[270px]" alt="logo" />
<img
src="@/assets/image/home/768/icon-header-close.png"
class="w-[35px] h-[35px] cursor"
alt="close"
@click="state.dialogMenu = false"
/>
</div>
</template>
<div class="flex flex-wrap font-semibold text-[35px] text-[#10253E]">
<div
class="w-full flex justify-between px-[188px] pt-[50px] pb-[46px] items-center"
@click="handleTabClick('home')"
>
{{ t("home.nav.home") }}
<img
src="@/assets/image/home/768/icon-menu-right.png"
class="w-[22px] h-[38px]"
/>
</div>
<div class="divider3"></div>
<div
class="w-full flex justify-between px-[188px] pt-[50px] pb-[46px] items-center"
@click="handleTabClick('companyprofil')"
>
{{ t("home.nav.company") }}
<img
src="@/assets/image/home/768/icon-menu-right.png"
class="w-[22px] h-[38px]"
/>
</div>
<div class="divider3"></div>
<div
class="w-full flex justify-between px-[188px] pt-[50px] pb-[46px] items-center"
@click="handleTabClick('businessintroduction')"
>
{{ t("home.nav.businessintroduction") }}
<img
src="@/assets/image/home/768/icon-menu-right.png"
class="w-[22px] h-[38px]"
/>
</div>
2025-03-14 09:05:00 +00:00
<div class="divider3"></div>
<div
class="w-full flex justify-between px-[188px] pt-[50px] pb-[46px] items-center"
@click="handleTabClick('investor')"
>
投资者关系
<img
src="@/assets/image/home/768/icon-menu-right.png"
class="w-[22px] h-[38px]"
/>
</div>
2025-02-27 04:00:56 +00:00
<div class="divider3"></div>
</div>
</n-drawer-content>
</n-drawer>
</header>
<!-- 语言选择模态框 - 使用纯div实现 -->
<div v-if="showLanguageModal" class="language-modal">
<div class="language-modal-backdrop" @click="closeLanguageModal"></div>
<div class="language-modal-content">
<div class="modal-header font-semibold flex items-center">
{{ $t("home.nav.please_select") }}
<img
src="@/assets/image/home/768/icon-close.png"
alt="close"
class="close-btn w-[102px]"
@click="closeLanguageModal"
/>
</div>
<div class="language-modal-body">
<div
v-for="option in languageOptions"
:key="option.value"
class="language-option"
:class="{ active: selectedLanguage === option.value }"
@click="selectedLanguage = option.value"
>
{{ option.label }}
</div>
</div>
<div class="language-modal-footer">
<button class="confirm-btn" @click="confirmLanguageChange">
{{ $t("home.nav.confirm_select") }}
</button>
</div>
</div>
</div>
</template>
<script setup>
import { onUnmounted, ref, watch, onMounted, computed, reactive } from "vue";
import { useI18n } from "vue-i18n";
const { t } = useI18n();
import { useHome } from "@/store/home/index.js";
const { currentTab } = useHome();
import { useRouter } from "vue-router";
const router = useRouter();
import { useLanguage } from "@/utils/changeLanguage.js";
import { NDrawer, NDrawerContent } from "naive-ui";
const {
languageOptions,
currentLanguageLabel,
changeLanguage,
initLanguage,
currentLang,
} = useLanguage();
onMounted(() => {
initLanguage();
});
const state = reactive({
dialogMenu: false,
});
const handleMenuClick = () => {
state.dialogMenu = true;
};
const emit = defineEmits(["triggerLanguageChange"]);
const handleTabClick = (tab) => {
currentTab.value = tab;
router.push("/" + tab);
};
// 语言选择模态框相关变量
const showLanguageModal = ref(false);
// 默认选中的语言从localStorage获取如果没有则默认为简体中文
const selectedLanguage = ref(localStorage.getItem("language") || "zh");
// 打开语言选择模态框
const handleLanguageChange = () => {
showLanguageModal.value = true;
// 打开时设置当前选中的语言
selectedLanguage.value = localStorage.getItem("language") || "zh";
// 禁止背景滚动
document.body.style.overflow = "hidden";
};
// 确认语言选择
const confirmLanguageChange = () => {
changeLanguage(selectedLanguage.value);
emit("triggerLanguageChange", selectedLanguage.value);
// 关闭模态框
showLanguageModal.value = false;
// 恢复背景滚动
document.body.style.overflow = "";
window.location.reload(true);
};
// 关闭语言选择模态框
const closeLanguageModal = () => {
showLanguageModal.value = false;
// 恢复背景滚动
document.body.style.overflow = "";
};
</script>
<style scoped lang="scss">
.header {
width: 100%;
height: 155px;
position: fixed;
z-index: 10;
top: 0;
left: 0;
right: 0;
padding: 0 200px 0 188px;
background-color: #fff;
}
.logo {
img {
width: 270px;
height: 83px;
}
}
.tabs {
display: flex;
align-items: center;
}
.tab-item {
display: flex;
align-items: center;
font-size: 30px;
color: #000000;
cursor: pointer;
transition: color 0.3s ease;
&.active {
color: #8b59fa;
}
&:hover {
color: #8b59fa;
}
}
/* 语言选择模态框样式 */
.language-modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1000;
touch-action: none; /* 防止触摸事件影响背景 */
}
.language-modal-backdrop {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
z-index: 1001;
}
.language-modal-content {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
max-height: 90vh; /* 最大高度为视口高度的90% */
background-color: #fff;
z-index: 1002;
box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.1);
display: flex;
flex-direction: column;
overflow: hidden; /* 内容溢出隐藏 */
}
.modal-header {
padding: 33px 38px 55px 38px;
display: flex;
justify-content: space-between;
align-items: center;
font-size: 40px;
color: #000000;
position: relative;
flex-shrink: 0; /* 不允许头部收缩 */
}
.close-btn {
cursor: pointer;
}
.language-modal-body {
padding: 10px 0;
overflow-y: auto; /* 只有内容区域可滚动 */
-webkit-overflow-scrolling: touch; /* 为iOS设备提供平滑滚动 */
flex: 1; /* 内容区域填充剩余空间 */
overscroll-behavior: contain; /* 阻止滚动穿透 */
}
.language-option {
padding: 30px 0;
font-size: 40px;
color: #333;
cursor: pointer;
transition: background-color 0.3s;
text-align: center;
}
.language-option:hover,
.language-option.active {
background-color: #f5f5f5;
color: #8b59f7;
}
.language-modal-footer {
padding: 40px 38px;
display: flex;
justify-content: center;
flex-shrink: 0; /* 不允许底部收缩 */
}
.confirm-btn {
background-color: #8b59f7;
color: white;
border: none;
border-radius: 10px;
padding: 23px 0;
width: 100%;
font-size: 40px;
cursor: pointer;
}
.confirm-btn:hover {
background-color: #7a48e6;
}
.divider3 {
width: 100%;
height: 10px;
background-image: linear-gradient(to right, #e6eaee 50%, transparent 50%);
background-size: 40px 6px; // 第一个值是宽度,第二个值是虚线的总长度(实线+空白)
background-repeat: repeat-x;
}
</style>