NewNav.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. <!-- eslint-disable vue/multi-word-component-names -->
  2. <template>
  3. <div class="New-nav">
  4. <div class="main-title">{{ Title }}</div>
  5. <!-- menu区域 -->
  6. <div class="nav-menu">
  7. <div class="nav-menu-left">
  8. <div v-for="(item, index) in leftMenus" :key="index">
  9. <div :class="activeIndex == index ? 'nav-menu-active' : 'nav-menu-unactive'" :key="index" @click="menuClick({ item, index })">
  10. <div style="color: #ddd">{{ item.name }}</div>
  11. <div v-if="activeIndex == index && isShowMenuItem" class="nav-menu-item">
  12. <div class="nav-menu-content">
  13. <div class="nav-menu-List">
  14. <div
  15. :class="menuItemActive == ind ? 'menu-item-active' : 'menu-item-unactive'"
  16. v-for="(ite, ind) in item.MenuItemList"
  17. :key="ind"
  18. @click.stop="menuItemClick(ind)"
  19. >{{ ite.name }}</div
  20. >
  21. </div>
  22. </div>
  23. </div>
  24. </div>
  25. </div>
  26. </div>
  27. <div class="nav-menu-right">
  28. <div v-for="(item, index) in rightMenus" :key="index + 4">
  29. <div :class="activeIndex == index + 4 ? 'nav-menu-active' : 'nav-menu-unactive'" :key="index + 4" @click="menuClick(index + 4)">
  30. <div style="color: #ddd">{{ item.name }}</div>
  31. <div v-if="activeIndex == index + 4 && isShowMenuItem" class="nav-menu-item">
  32. <div class="nav-menu-content">
  33. <div class="nav-menu-List">
  34. <div
  35. :class="menuItemActive == ind ? 'menu-item-active' : 'menu-item-unactive'"
  36. v-for="(ite, ind) in item.MenuItemList"
  37. :key="ind"
  38. @click.stop="menuItemClick(ind)"
  39. >{{ ite.name }}</div
  40. >
  41. </div>
  42. </div>
  43. </div>
  44. </div>
  45. </div>
  46. </div>
  47. </div>
  48. <!-- <div class="userInfo">
  49. <div class="userName">admin</div>
  50. </div> -->
  51. </div>
  52. </template>
  53. <script lang="ts" setup>
  54. import { onMounted, onUnmounted, ref, watch, computed } from 'vue';
  55. import { useRouter } from 'vue-router';
  56. let props = defineProps({
  57. Title: {
  58. type: String,
  59. default: '',
  60. },
  61. });
  62. let menuList = ref<any[]>([
  63. {
  64. name: '智能通风',
  65. MenuItemList: [{ name: '多灾融合预警' }, { name: '通风监测预警' }, { name: '火灾监测预警' }, { name: '粉尘监测预警' }, { name: '瓦斯监测预警' }],
  66. },
  67. {
  68. name: '火灾监控',
  69. // MenuItemList: [{ name: '多灾融合预警' }, { name: '通风监测预警' }, { name: '火灾监测预警' }, { name: '粉尘监测预警' }, { name: '瓦斯监测预警' }],
  70. targatUrl: '/configurable/fireNew/home',
  71. },
  72. {
  73. name: '粉尘监控',
  74. // MenuItemList: [{ name: '多灾融合预警' }, { name: '通风监测预警' }, { name: '火灾监测预警' }, { name: '粉尘监测预警' }, { name: '瓦斯监测预警' }],
  75. targatUrl: '/configurable/dustNew/home',
  76. },
  77. {
  78. name: '瓦斯监控',
  79. MenuItemList: [{ name: '多灾融合预警' }, { name: '通风监测预警' }, { name: '火灾监测预警' }, { name: '粉尘监测预警' }, { name: '瓦斯监测预警' }],
  80. },
  81. {
  82. name: '灾害预警',
  83. MenuItemList: [{ name: '多灾融合预警' }, { name: '通风监测预警' }, { name: '火灾监测预警' }, { name: '粉尘监测预警' }, { name: '瓦斯监测预警' }],
  84. },
  85. ]); //一级菜单列表
  86. let activeIndex = ref(0); //当前激活menu索引
  87. let activeIndexL = ref(0); //当前激活menu索引
  88. let activeIndexR = ref(null); //当前激活menu索引
  89. const router = useRouter();
  90. let isShowMenuItem = ref(false); //是否显示menuItem下拉选项菜单
  91. let isShowMenuItemL = ref(false); //是否显示menuItem下拉选项菜单
  92. let isShowMenuItemR = ref(false); //是否显示menuItem下拉选项菜单
  93. let menuItemActive = ref(0); //menuItem当前激活选项
  94. const leftMenus = computed(() => menuList.value.slice(0, 4));
  95. const rightMenus = computed(() => menuList.value.slice(4));
  96. //menu选项切换
  97. function menuLeftClick(index) {
  98. activeIndexL.value = index;
  99. isShowMenuItemL.value = !isShowMenuItemL.value;
  100. }
  101. //menuItem选项切换
  102. function menuItemLeftClick(index) {
  103. menuItemActive.value = index;
  104. isShowMenuItemL.value = false;
  105. }
  106. function menuRightClick(index) {
  107. activeIndexR.value = index;
  108. isShowMenuItemR.value = !isShowMenuItemR.value;
  109. }
  110. function menuItemRightClick(index) {
  111. menuItemActive.value = index;
  112. isShowMenuItemL.value = false;
  113. }
  114. function menuClick(data) {
  115. activeIndex.value = data.index;
  116. isShowMenuItem.value = !isShowMenuItem.value;
  117. router.push({ path: data.item.targatUrl });
  118. }
  119. function menuItemClick(index) {
  120. menuItemActive.value = index;
  121. isShowMenuItem.value = false;
  122. }
  123. </script>
  124. <style lang="less" scoped>
  125. @import '/@/design/theme.less';
  126. @font-face {
  127. font-family: 'douyuFont';
  128. src: url('/@/assets/font/douyuFont.otf');
  129. }
  130. .New-nav {
  131. position: relative;
  132. width: 100%;
  133. height: 100%;
  134. .main-title {
  135. width: 518px;
  136. height: 100%;
  137. display: flex;
  138. align-items: center;
  139. font-family: 'douyuFont';
  140. font-size: 25px;
  141. position: absolute;
  142. left: 50%;
  143. transform: translateX(-50%);
  144. width: auto;
  145. padding: 0;
  146. }
  147. .nav-menu {
  148. position: absolute;
  149. top: 0;
  150. left: 675px;
  151. height: 100%;
  152. display: flex;
  153. position: static; // 移除绝对定位
  154. display: flex;
  155. width: auto;
  156. .nav-menu-left {
  157. display: flex;
  158. flex-direction: row;
  159. align-items: center;
  160. float: left;
  161. }
  162. .nav-menu-right {
  163. display: flex;
  164. flex-direction: row;
  165. align-items: center;
  166. float: left;
  167. margin-left: 40%;
  168. }
  169. .nav-menu-active {
  170. position: relative;
  171. cursor: pointer;
  172. width: 120px;
  173. height: 60px;
  174. margin-top: 20px;
  175. line-height: 45px;
  176. text-align: center;
  177. font-size: 16px;
  178. letter-spacing: 2px;
  179. background: url('@/assets/images/vent/homeNew/Select-btn.png') no-repeat;
  180. background-size: 100% 100%;
  181. }
  182. .nav-menu-unactive {
  183. position: relative;
  184. width: 120px;
  185. height: 60px;
  186. line-height: 65px;
  187. text-align: center;
  188. margin: 0px 10px;
  189. font-size: 16px;
  190. letter-spacing: 2px;
  191. background-size: 100% 100%;
  192. cursor: pointer;
  193. }
  194. .nav-menu-item {
  195. position: absolute;
  196. top: 23px;
  197. width: 130px;
  198. display: flex;
  199. flex-direction: column;
  200. align-items: center;
  201. box-sizing: border-box;
  202. .nav-menu-content {
  203. width: 100%;
  204. height: 100%;
  205. overflow-y: auto;
  206. margin-top: 25%;
  207. .nav-menu-List {
  208. background: url('@/assets/images/vent/homeNew/menuList.png') no-repeat;
  209. background-size: 100% 100%;
  210. }
  211. .menu-item-active {
  212. color: #ddd;
  213. z-index: 999;
  214. width: 100%;
  215. height: 36px;
  216. line-height: 36px;
  217. font-size: 14px;
  218. background: url('@/assets/images/vent/homeNew/selectActive.png') no-repeat;
  219. background-size: 100% 100%;
  220. }
  221. .menu-item-unactive {
  222. color: #ddd;
  223. width: 100%;
  224. height: 40px;
  225. line-height: 40px;
  226. font-size: 14px;
  227. }
  228. }
  229. }
  230. @keyframes fadeIn {
  231. from {
  232. opacity: 0;
  233. }
  234. to {
  235. opacity: 1;
  236. }
  237. }
  238. /* 定义淡出动画 */
  239. @keyframes fadeOut {
  240. from {
  241. opacity: 1;
  242. }
  243. to {
  244. opacity: 0;
  245. }
  246. }
  247. }
  248. .userInfo {
  249. width: 120px;
  250. float: right;
  251. background: url(/src/assets/images/vent/homeNew/user.png) no-repeat;
  252. background-size: 100% 100%;
  253. position: absolute;
  254. top: 14px;
  255. right: 0;
  256. .userName {
  257. margin-left: 40px;
  258. font-size: 20px;
  259. }
  260. }
  261. }
  262. </style>