侧边栏子菜单显示异常修复请求:宽度与居中问题
侧边栏子菜单样式调整需求
我希望实现如下效果:
- 子菜单(portfolio、contact等)背景占满整个宽度;
- 子菜单标题大致居中。
我的侧边栏包含Category和Markets两个分类,当前子菜单(Portfolio、Contact、Indice等)宽度不足,左侧存在留白,同时子菜单标题未居中。
以下是相关代码:
HTML 代码
<div class="sidebar" [class.sidebar-close]="!openSidebar" > <div class="logo-details"> <img src="https://zupimages.net/up/22/42/refj.png" /> </div> <ul class="nav-links" id="nav-links" > <li *ngFor="let item of menuSidebar" #itemEl routerLinkActive="active"> <div *ngIf="item.sub_menu.length == 0" class="dropdown-title"> <a [routerLink]="[item.link]"> <i [class]="item.icon"></i> <span class="link_name">{{item.link_name}}</span> </a> </div> <div *ngIf="item.sub_menu.length > 0" class="dropdown-title" (click)="showSubmenu(itemEl)"> <a> <i [class]="item.icon"></i> <span class="link_name">{{item.link_name}}</span> </a> <i class='bx bxs-chevron-down arrow'></i> </div> <ul class="sub-menu" [class.blank]="item.sub_menu.length == 0"> <li><a class="link_name">{{item.link_name}}</a></li> <li *ngFor="let item_sub of item.sub_menu" routerLinkActive="active"> <a [routerLink]="[item_sub.link]">{{item_sub.link_name}}</a> </li> </ul> </li> </ul> </div>
CSS 代码
/* Sidebar */ .sidebar { position: fixed; top: 0; left: 0; height: 100%; width: 260px; background: white; z-index: 100; transition: all 0.5s ease; } .sidebar.sidebar-close { width: 60px; } .sidebar .logo-details{ width: 100%; padding: 10px 10px 10px 10px; } .sidebar .logo-details img{ height: 50px; width: 80%; display: block; margin: 0 auto; } .sidebar.sidebar-close .logo-details img { width: 37px; height: 50px; transform: scale(1.2) translateX(-3px); } .sidebar .nav-links { height: 100%; width: 260px; padding-bottom: 150px; overflow: auto; } .sidebar .nav-links::-webkit-scrollbar { display: none; } .sidebar .nav-links li { list-style: none; } .sidebar .nav-links > li { position: relative; width: fit-content; } .sidebar .nav-links li:hover { background: #ffa726; } .sidebar .nav-links li.active { background-image: linear-gradient(to right, #ffa726, #ff5722); } /* Dropdown Title */ .sidebar .nav-links .dropdown-title { width: 260px; overflow: hidden; transition: all 0.52s ease; /* */ display: flex; align-items: center; justify-content: space-between; position: relative; } .sidebar.sidebar-close .nav-links .dropdown-title { width: 60px; } .sidebar .nav-links li i { height: 50px; min-width: 60px; text-align: center; line-height: 50px; color: #ffa726; font-size: 20px; cursor: pointer; transition: all 0.3s ease; } .sidebar .nav-links li:hover i, .sidebar .nav-links li.active i { color: white; } .sidebar .nav-links li.showMenu i.arrow { transform: rotate(-180deg); } /* a Tag */ .sidebar .nav-links li a { display: flex; align-items: center; text-decoration: none; width: 100%; } /* Link Name */ .sidebar .nav-links li a .link_name { font-size: 16px; font-weight: 600; color: #ffa726; transition: all 0.4s ease; } .sidebar .nav-links li:hover a .link_name, .sidebar .nav-links li.active a .link_name { color: white; } .sidebar.sidebar-close .nav-links li a .link_name { pointer-events: none; } /* Sub Menu */ .sidebar .nav-links li .sub-menu { padding: 6px 6px 14px 70px; /* margin-top: -10px; */ background: white; display: none; transition: all 0.4s ease; } .sidebar .nav-links li.showMenu .sub-menu { display: block; } .sidebar .nav-links li .sub-menu a { color: #ffa726; font-size: 15px; padding: 7px 0; white-space: nowrap; transition: all 0.3s ease; } .sidebar .nav-links li .sub-menu li { padding-left: 10px; } .sidebar .nav-links li .sub-menu li:hover a, .sidebar .nav-links li .sub-menu li.active a { color: white; } .sidebar.sidebar-close .nav-links li .sub-menu { position: absolute; left: 100%; top: -10px; margin-top: 0; padding: 0; border-radius: 0 6px 6px 0; opacity: 0; display: block; pointer-events: none; transition: 0s; overflow: hidden; } .sidebar.sidebar-close .nav-links li .sub-menu li { padding: 6px 15px; width: 200px; } .sidebar.sidebar-close .nav-links li:hover .sub-menu { top: 0; opacity: 1; pointer-events: auto; transition: all 0.4s ease; } .sidebar .nav-links li .sub-menu .link_name { display: none; } .sidebar.sidebar-close .nav-links li .sub-menu .link_name { font-size: 16px; font-weight: 600; /* opacity: 1; */ display: block; } /* li:first-child contain .link_name */ .sidebar.sidebar-close .nav-links li .sub-menu li:first-child { background: white; pointer-events: none; } .sidebar.sidebar-close .nav-links li .sub-menu li:first-child:hover .link_name, .sidebar.sidebar-close .nav-links li .sub-menu li:first-child.active .link_name { color: #ffa726; } .sidebar .nav-links li .sub-menu.blank { pointer-events: auto; /* padding: 3px 20px 6px 16px; */ opacity: 0; pointer-events: none; } .sidebar .nav-links li:hover .sub-menu.blank, .sidebar .nav-links li.active .sub-menu.blank { top: 50%; transform: translateY(-50%); } .sidebar.sidebar-close ~ .home-section { left: 60px; width: calc(100% - 60px); }
解决方案
针对需求修改以下CSS规则即可:
1. 让子菜单背景占满整个宽度
首先修改父级列表项的宽度,使其撑满侧边栏:
.sidebar .nav-links > li { position: relative; width: 100%; /* 替换原有width: fit-content */ }
然后调整子菜单的内边距,去掉左侧偏移:
.sidebar .nav-links li .sub-menu { padding: 6px 6px 14px 6px; /* 替换原有padding: 6px 6px 14px 70px */ background: white; display: none; transition: all 0.4s ease; }
2. 让子菜单标题居中
给子菜单的标题项添加居中样式:
.sidebar .nav-links li .sub-menu li:first-child a { text-align: center; display: block; }
若需在侧边栏收起状态下保持标题居中,补充:
.sidebar.sidebar-close .nav-links li .sub-menu li:first-child a { text-align: center; }
修改后即可实现子菜单背景铺满宽度、标题居中的效果。
内容的提问来源于stack exchange,提问作者poporp
相关产品推荐
相关产品推荐

