raylinx/components/TopNavbar.vue

816 lines
18 KiB
Vue
Raw Normal View History

2025-02-14 18:46:25 +08:00
<template>
<div>
<div v-if="showHomeAndroid == false" class="NavBar">
<div class="logo">
<a href="/"
><img src="@/assets/Home_IMG/raylinx.logo.png" alt=""
/></a>
</div>
<div class="menu">
<div class="Menu-right">
<MenuNav></MenuNav>
</div>
</div>
<div class="navRightMenu" ref="navRightMenu">
<div v-for="i in navRightMenu" class="item">
<a :href="i.href" target="_blank" ref="">
<div class="item-mini">
<div class="icon"><img :src="i.icon" alt="i.title"/></div>
<div class="title">{{ i.title }}</div>
</div>
</a>
</div>
<div class="lang_select">
<div class="icon">
<img src="@/assets/Home_IMG/lang1.png" alt=""/>
</div>
<div>
<el-dropdown>
<span class="el-dropdown-link">
语言类型<i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown" class="lang-select-dropdown">
<el-dropdown-item v-for="i in langList" :key="i.index">{{
i.name
}}
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
</div>
</div>
</div>
<div v-if="showHomeAndroid == true">
<div class="AndroidNav">
<div class="a-logo">
<a href="/"
><img src="@/assets/Home_IMG/raylinx.logo.png" alt="raylinx.com"
/></a>
</div>
<div>
<input
id="menu"
type="checkbox"
v-model="isMenuChecked"
@change="toggleMenu"
/>
<label for="menu"></label>
</div>
</div>
<div class="MenuAndr">
<el-drawer
:visible.sync="drawer"
:direction="direction"
class="ElDrawer"
size="70%"
:modal="false"
:show-close="false"
:before-close="handleClose"
>
<div class="sidebar">
<div class="sidebar_logo">
<img src="@/assets/Home_IMG/raylinx.logo.png" alt="Logo"/>
<div>raylinx.com</div>
</div>
<ul class="sidebar_menu">
<li
v-for="(menuItem, index) in menuItems"
:key="index"
:class="{ active: isMenuActive(menuItem) }"
>
<!-- 如果有子菜单阻止跳转 -->
<a
:href="menuItem.path"
@click="menuItem.submenu ? toggleMenuAndroid(index) : null"
:class="{ 'has-submenu': menuItem.submenu }"
>
{{ menuItem.name }}
<!-- 显示子菜单切换图标 -->
<i
v-if="menuItem.submenu"
:class="
menuItem.open ? 'el-icon-arrow-up' : 'el-icon-arrow-down'
"
></i>
</a>
<!-- 子菜单过渡动画 -->
<transition name="fade">
<ul
v-show="menuItem.open"
class="sidebar_submenu"
v-if="menuItem.submenu"
>
<li
v-for="(subItem, subIndex) in menuItem.submenu"
:key="subIndex"
:class="{ active: isMenuActive(subItem) }"
>
<a
:href="subItem.path"
@click="toggleSubmenu(index, subIndex)"
>
{{ subItem.name }}
<i
v-if="subItem.submenu"
:class="
subItem.open
? 'el-icon-arrow-up'
: 'el-icon-arrow-down'
"
></i>
</a>
<!-- 二级子菜单过渡动画 -->
<transition name="fade">
<ul
v-show="subItem.open"
class="sidebar_submenu"
v-if="subItem.submenu"
>
<li
v-for="(thirdItem, thirdIndex) in subItem.submenu"
:key="thirdIndex"
:class="{ active2: isMenuActive(thirdItem) }"
>
<a :href="thirdItem.path">{{ thirdItem.name }}</a>
</li>
</ul>
</transition>
</li>
</ul>
</transition>
</li>
</ul>
</div>
</el-drawer>
</div>
</div>
</div>
</template>
<script>
import MenuNav from "./MenuNav.vue";
export default {
components: {
MenuNav,
},
data() {
return {
activeIndex: this.$route.path,
langList: [{index: "1", name: "中文"}],
navRightMenu: [
{
index: "1",
icon: require("@/assets/Home_IMG/TG1.png"),
title: "@raylinxjim",
href: "https://t.me/raylinxjim",
},
{
index: "2",
icon: require("@/assets/Home_IMG/whatsApp1.png"),
title: "+1(212)518-8846",
href: "https://api.whatsapp.com/send/?phone=12125188846&text&type=phone_number&app_absent=0",
},
],
menuList: [
{
index: "1",
path: "/",
name: "home",
meta: {
title: "首页",
},
},
{
index: "2",
path: "/pricing",
name: "pricing",
meta: {
title: "价格计划",
},
// children: [
// {
// index: "2-1",
// path: "/cloud-product/cloud-Server",
// name: "cloud-Server",
// meta: {
// title: "云服务器",
// },
// },
// {
// index: "2-2",
// path: "/cloud-product/account",
// name: "account",
// meta: {
// title: "aws高配额账号",
// },
// },
// ],
},
// {
// index: "3",
// path: "/cases",
// name: "cases",
// meta: {
// title: "客户案例",
// },
// },
{
index: "4",
path: "/aws-services",
name: "aws-services",
meta: {
title: "AWS服务",
},
},
{
index: "5",
path: "/knowledge-center",
name: "knowledge-center",
meta: {
title: "知识中心",
},
},
{
index: "6",
path: "/about",
name: "about",
meta: {
title: "关于我们",
},
children: [
{
index: "2-1",
path: "/cloud-product/cloud-Server",
name: "cloud-Server",
meta: {
title: "云服务器",
},
},
{
index: "2-2",
path: "/cloud-product/account",
name: "account",
meta: {
title: "aws高配额账号",
},
},
],
},
],
menuList2: [
{
path: "/",
// component: () => import("@/views/index.vue"),
name: "home",
meta: {
title: "首页",
isHidden: false,
},
},
],
menuItems: [
{
name: "首页",
open: false,
path: "/",
},
{
name: "价格计划",
open: false,
path: "/pricing/highBandwidthServer",
// submenu: [
// {
// name: "服务器",
// open: false,
// submenu: [
// {name: "EC2服务器", path: "/pricing/highBandwidthServer"},
// {name: "轻量服务器", path: "/lightServer"}, // Add paths for submenus
// {name: "高防服务器", path: "/defenseServer"},
// {name: "站群服务器", path: "/clusterServer"},
// ],
// },
// // Add other items as necessary
//
// {
// name: "区块链",
// open: false,
// },
// {
// name: "存储",
// open: false,
// },
// {
// name: "网络服务",
// open: false,
// },
// {
// name: "技术支持",
// open: false,
// },
// {
// name: "游戏",
// open: false,
// },
// {
// name: "媒体视频",
// open: false,
// },
// ],
},
{
name: "客户案例",
open: false,
path: "/cases",
},
{
name: "AWS服务",
open: false,
path: "/aws-services",
},
{
name: "知识中心",
open: false,
path: "/knowledge-center",
},
{
name: "关于我们",
open: false,
path: "/about",
},
],
direction: "ltr",
showHomeAndroid: false,
screenWidth: null,
isMenuChecked: null, // 初始化为全局菜单状态
drawer:false,
};
},
methods: {
handleClose(){
this.isMenuChecked = false;
this.drawer = false;
},
toggleMenu() {
this.drawer = this.isMenuChecked; // 同步更新全局菜单状态
},
toggleMenuAndroid(index) {
this.menuItems[index].open = !this.menuItems[index].open;
},
toggleSubmenu(index, subIndex) {
this.menuItems[index].submenu[subIndex].open =
!this.menuItems[index].submenu[subIndex].open;
},
// Recursive function to check if current path or any of its children match the current URL
isActive(path) {
if (process.client) {
// 只有在客户端才运行的代码
return path && window.location.pathname === path;
}
},
// New method to check if any submenu is active
isMenuActive(menuItem) {
// Check if the current item is active
if (this.isActive(menuItem.path)) {
return true;
}
// Check if any submenu item is active
if (menuItem.submenu) {
for (let subItem of menuItem.submenu) {
if (this.isMenuActive(subItem)) {
return true;
}
}
}
return false;
},
bodyScale() {
var devicewidth = document.documentElement.clientWidth; //获取当前分辨率下的可是区域宽度
if(devicewidth<=1600){
var scale = devicewidth / 1600; // 分母——设计稿的尺寸
document.body.style.zoom = scale; //放大缩小相应倍数
}
},
},
mounted() {
this.screenWidth = document.body.clientWidth;
this.isMenuChecked = this.globalData.showMenu;
this.drawer = this.globalData.showMenu;
window.onresize = () => {
return (() => {
this.screenWidth = document.body.clientWidth;
})();
};
},
watch: {
// 监听路由变化或全局状态变化
$route: {
handler(newVal) {
// 你的逻辑代码,例如重置复选框状态
this.isMenuChecked = false;
this.drawer = false;
},
deep: true,
},
'globalData.showMenu': function (newValue) {
this.isMenuChecked = newValue;
},
screenWidth: {
handler: function (val) {
if (val >= 800) {
this.bodyScale();
this.showHomeAndroid = false;
// console.log( this.showHomeAndroid);
} else if (val < 800) {
this.showHomeAndroid = true;
// console.log( this.showHomeAndroid);
}
// this.$forceUpdate();
},
immediate: true,
deep: true,
},
},
};
// const handleSelect = (key: string, keyPath: string[]) => {
// console.log(key, keyPath)
// }
</script>
<style lang="scss" scoped>
::v-deep .el-drawer__header {
display: none;
}
.sidebar {
width: 100%;
background-color: #f3f8fc;
min-height: 100%;
padding: 10px;
box-shadow: 2px 0 5px rgba(0, 0, 0, 0.1);
}
.active-menu-item {
border-left: 3px solid #0077ff; /* Change border style as needed */
padding-left: 5px;
}
.sidebar_logo {
display: flex;
align-items: center; /* 确保 logo 和文字水平对齐 */
width: 150px;
height: 70px;
line-height: 70px;
margin-bottom: 4%;
color: #0077ff;
}
.sidebar_logo img {
display: block;
width: 150px;
height: 70px;
margin-right: 10px;
}
.active > a {
border: 2px solid #0077ff; /* Highlight active menu */
}
.sidebar_menu {
list-style-type: none;
padding: 0;
}
.sidebar_menu li {
margin-bottom: 10px;
}
.sidebar_menu li a {
position: relative; /* 确保图标能够正确定位 */
text-decoration: none;
color: #0077ff;
display: block;
padding: 10px;
// background-color: #fff;
border-radius: 5px;
transition: background-color 0.3s;
height: 40px;
line-height: 40px;
text-align: left;
}
.fade-enter-active,
.fade-leave-active {
transition: all 0.3s ease;
}
.fade-enter, .fade-leave-to /* 兼容 vue <2.1.8 的版本 */
{
opacity: 0;
transform: translateY(-10px);
}
.sidebar_menu li a .el-icon-arrow-down,
.sidebar_menu li a .el-icon-arrow-up {
position: absolute;
right: 10px; /* 图标放在右边 */
top: 50%;
transform: translateY(-50%);
}
.sidebar_menu li a:hover {
//background-color: #000000;
}
.sidebar_submenu {
display: none; /* 默认隐藏子菜单 */
list-style-type: none;
padding-left: 20px;
border-bottom: 1px solid #0077ff;
border-top: 1px solid #0077ff;
margin-top: 2%;
padding-top: 2%;
}
.sidebar_menu li:hover .sidebar_submenu {
display: block; /* 悬停时显示子菜单 */
}
.sidebar_submenu li {
margin-bottom: 5px;
}
.sidebar_submenu li a {
// background-color: #ffffff;
color: #000000;
padding: 0;
}
.sidebar_submenu ul {
border-left: 2px solid #0077ff; /* 左边框样式 */
padding-left: 10px; /* 留出空间让左边框可见 */
border-bottom: none;
border-top: none;
font-size: 15px !important;
margin-left: 20px;
}
.sidebar_submenu ul li {
font-size: 15px;
height: 30px;
line-height: 30px;
}
.sidebar_submenu ul li a {
font-size: 15px;
height: 30px;
line-height: 30px;
}
.ElDrawer {
z-index: 2002 !important;
}
.el-dropdown-link {
cursor: pointer;
color: #000000;
}
.el-icon-arrow-down {
font-size: 12px;
}
.lang-select-dropdown {
position: fixed !important;
top: 56px !important;
left: 1465px !important;
}
.AndroidNav {
display: flex;
position: relative;
#menu {
visibility: hidden;
}
/* hiding the checkbox */
/* hamburger */
label {
width: 30px;
height: 3px;
border-radius: 5px;
background: #000000;
cursor: pointer;
-webkit-transition: 0.6s;
transition: 0.6s;
position: fixed;
top: 30px;
left: 85%;
/* margin-left: -50px;
margin-top: -7.5px; */
}
label:before {
content: "";
width: 30px;
height: 3px;
background: #000000;
position: absolute;
transform: translateY(-10px);
-webkit-transform: translateY(-10px);
border-radius: 5px;
-webkit-transition: 0.6s;
transition: 0.6s;
}
label:after {
content: "";
width: 30px;
height: 3px;
background: #000000;
position: absolute;
transform: translateY(10px);
-webkit-transform: translateY(10px);
border-radius: 5px;
transition: 0.6s;
-webkit-transition: 0.6s;
}
/* animation when checked */
#menu:checked + label {
width: 0px;
}
#menu:checked + label:before {
transform: rotate(45deg) translate(0px);
-webkit-transform: rotate(45deg) translate(0px);
}
#menu:checked + label:after {
transform: rotate(-45deg) translate(0px);
-webkit-transform: rotate(-45deg) translate(0px);
}
.MenuAndr {
position: absolute;
width: 100%;
background-color: #ffffff;
top: 8%;
z-index: 999;
left: 0;
a {
text-decoration: none;
color: #404040;
}
.homeMenu-min {
height: 40px;
}
.el-collapse {
width: 100%;
}
.homeMenu {
background-color: #ffffff;
line-height: 50px;
height: 100%;
border-bottom: 1px solid #ccc;
}
}
.a-logo {
width: 100px;
height: 100%;
margin-left: -10px;
margin-top: 10px;
img {
width: 250px;
height: 100%;
position: absolute;
top: 0;
left: -10px;
}
}
.a-menu {
width: 100%;
height: 100%;
text-align: right;
img {
width: 40px;
height: 40px;
margin-top: 20px;
margin-right: 10px;
}
}
}
.NavBar {
height: 100%;
display: flex;
width: 100%;
.logo {
width: 200px;
height: 80px;
// border: 1px solid #000;
// margin-top: -10px;
img {
width: 200px;
height: 80px;
}
}
.navRightMenu {
display: flex;
height: 100%;
width: 35%;
.lang_select {
height: 80px;
display: flex;
margin-left: 5%;
.icon {
width: 50px;
height: 50px;
margin: auto 0;
img {
width: 50px;
height: 50px;
}
}
}
a {
color: #000000;
text-decoration: none;
}
a:hover {
color: #0077ff;
}
.item-mini {
display: flex;
}
.item {
display: flex;
margin-left: 10%;
font-size: small;
.icon {
width: 50px;
height: 50px;
margin: auto 0;
img {
width: 50px;
height: 50px;
}
}
}
}
.menu {
width: 50%;
height: 100%;
::v-deep .el-menu-item.is-active {
background: transparent !important;
}
::v-deep .el-menu {
background: transparent !important;
}
.Menu-right {
float: left;
margin-left: 2%;
.el-menu {
height: 80px;
line-height: 80px;
font-size: 20px !important;
border-bottom: none;
}
}
}
}
</style>