纵向导航栏使用navbar-nav-scroll溢出截断问题

项目场景:

项目首页组件:Bootstrap-4.6.2、JQuery 3.7.1
测试浏览器:Firefox126.0.1、Microsoft Edge125.0.2535.67
IDE:eclipes2024-03.R

在编写CRM的工作台主页面时,由于该页面使用的是较旧的技术,所以打算使用Bootstrap重写响应式页面,主要使用了Bootstrap的格栅布局系统。在编写左侧纵向导航栏时,发现添加滚动条后,导航栏下面缩短了一部分流出大部分空白,使得页面不美观。

溢出截断
问题代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link href="/crm-core/css/bootstrap_css/bootstrap.min.css" type="text/css" rel="stylesheet" />
<script type="text/javascript" src="/crm-core/js/jquery/jquery-3.7.1-min.js"></script>
<!-- bootstrap.bundle.js包含了popper.min.js,这个是下拉菜单的依赖 -->
<script type="text/javascript" src="/crm-core/js/bootstrap_js/bootstrap.bundle.js"></script>
<script type="text/javascript">...
</script>
</head>
<body>...<!-- 中间部分 --><div id="center" style="position: absolute; top: 50px; bottom: 30px; left: 0px; right: 0px;"><!-- 导航 --><div class="col-2 border-right navbar-nav-scroll" style="height: 100%;"><div class="nav flex-column nav-pills" id="v-pills-tab" role="tablist" aria-orientation="vertical"><button class="nav-link active" id="v-pills-home-tab" data-toggle="pill" data-target="#v-pills-home" type="button"role="tab" aria-controls="v-pills-home" aria-selected="true">工作台</button></div></div><!-- 右侧框架栏 --><div class="col-10 iframe-container"><div class="embed-responsive embed-responsive-16by9"><iframe class="embed-responsive-item border border-white" name="workareaFrame"></iframe></div></div></div></div>
</body>
</html>

问题描述

经过测试后,发现是在添加了navbar-nav-scroll后出现截断问题,但是该类如果删除会导致在滚动页面时右侧的<iframe>也会跟着滚动,这不是我所期望的,我想要的只是左侧的导航栏在溢出时滚动,而右侧的<iframe>框架只是用来显示左侧各导航栏对应的页面。
在尝试不再使用Flex布局时,移除了flex-column相关内容后,又出现了按钮组垂直排列错位、按钮无法点击跳转链接、导航栏点击动态特效消失等问题。


原因分析:

尝试了诸多方法,官方文档也没有给出相关问题的解决方案,AI也没有给出准确的解决方案,在问了别人说的可能是Flex 布局下居中溢出滚动截断问题,看了几篇文章 ,不过在尝试后也并没有达到预期效果,只是知道不应该用Flex布局。
Bootstrap官网给出的示例中没有给出纵向导航栏跳转链接等相关内容,而由于不懂前端,只好复制过来稍微改了改,存在属性冲突的情况。
既然官方给的类无法满足要求,只能用js代码实现。


解决方案:

  1. 放弃使用Flex相关代码,以Grid布局进行排版,并指定垂直高度
  2. 使用列表组代替nav,通过给<a>标签绑定"btn"类得到一组按钮列表组。
  3. 使用js代码实现纵向导航栏点击的动态效果。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link href="/crm-core/css/bootstrap_css/bootstrap.min.css" type="text/css" rel="stylesheet" />
<script type="text/javascript" src="/crm-core/js/jquery/jquery-3.7.1-min.js"></script>
<!-- bootstrap.bundle.js包含了popper.min.js,这个是下拉菜单的依赖 -->
<script type="text/javascript" src="/crm-core/js/bootstrap_js/bootstrap.bundle.js"></script>
<script type="text/javascript">// 通过js发送ajax请求,获取session中的用户姓名$(function() {$.ajax({url : '/crm-core/workbench/getName.do',type : "post",dataType : "json",success : function(data) {console.log(data);$("#userName").text(data.userName);}})});// 安全退出功能$(document).ready(function() {// 等模态框加载完成后再调用$('#exitModal').on('shown.bs.modal', function() {$('#logoutBtn').on('click', function() {window.location.href = "/crm-core/settings/qx/user/logout.do";});});});//页面加载完毕$(function() {// 一登录就在框架窗口中显示工作台window.open("/crm-core/workbench/main/index.do", "workareaFrame");});// 通过js代码实现导航栏点击特效// 导航栏点击动态document.addEventListener('DOMContentLoaded', function() {var buttonGroup = document.getElementById('myButtonGroup');var buttons = buttonGroup.getElementsByClassName('btn');// 初始化点击事件  for (var i = 0; i < buttons.length; i++) {buttons[i].addEventListener('click', function(e) {// 移除组内所有按钮的 active 类  for (var j = 0; j < buttons.length; j++) {buttons[j].classList.remove('active');}// 给当前点击的按钮添加 active 类  this.classList.add('active');// 阻止事件冒泡到按钮组外部(可选,如果外部有事件监听器)  e.stopPropagation();});}// 监听文档点击事件以取消按钮选中(可选,如果您想要这样的行为)  document.addEventListener('click', function(e) {// 检查点击是否在按钮组内  if (!buttonGroup.contains(e.target)) {// 移除组内所有按钮的 active 类  for (var i = 0; i < buttons.length; i++) {buttons[i].classList.remove('active');}}});});
</script>
<style>
/* 自定义css */
.nav-left {height: 700px;overflow-y: scroll;padding-left: 15px;
}.btn-secondary {color: #fff;background-color: #6c757d;border-color: #6c757d;transition: background-color 0.3s ease; /* 添加过渡效果 */
}.btn-secondary.active {color: #fff;background-color: #007bff;border-color: #007bff;
}.btn-secondary:hover {background-color: #606870; /* 鼠标悬停时背景色稍深 */
}
</style>
</head>
<body><!-- 我的资料 --><div class="modal fade" id="myInformation" role="dialog"><div class="modal-dialog" role="document" style="width: 30%;"><div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span></button><h4 class="modal-title">我的资料</h4></div><div class="modal-body"><div style="position: relative; left: 40px;">姓名:<b>张三</b><br> <br> 登录帐号:<b>zhangsan</b><br> <br> 组织机构:<b>1005,市场部,二级部门</b><br> <br>邮箱:<b>zhangsan@bjpowernode.com</b><br> <br> 失效时间:<b>2017-02-14 10:10:10</b><br> <br> 允许访问IP:<b>127.0.0.1,192.168.100.2</b></div></div><div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">关闭</button></div></div></div></div><!-- 修改密码的模态窗口 --><div class="modal fade" id="editPwdModal" role="dialog"><div class="modal-dialog" role="document" style="width: 70%;"><div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span></button><h4 class="modal-title">修改密码</h4></div><div class="modal-body"><form class="form-horizontal" role="form"><div class="form-group"><label for="oldPwd" class="col-sm-2 control-label">原密码</label><div class="col-sm-10" style="width: 300px;"><input type="text" class="form-control" id="oldPwd" style="width: 200%;"></div></div><div class="form-group"><label for="newPwd" class="col-sm-2 control-label">新密码</label><div class="col-sm-10" style="width: 300px;"><input type="text" class="form-control" id="newPwd" style="width: 200%;"></div></div><div class="form-group"><label for="confirmPwd" class="col-sm-2 control-label">确认密码</label><div class="col-sm-10" style="width: 300px;"><input type="text" class="form-control" id="confirmPwd" style="width: 200%;"></div></div></form></div><div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">取消</button><button type="button" class="btn btn-primary" data-dismiss="modal" onclick="window.location.href='../login.html';">更新</button></div></div></div></div><!-- 退出系统的模态窗口 --><div class="modal" tabindex="-1" id="exitModal"><div class="modal-dialog"><div class="modal-content"><div class="modal-header"><h5 class="modal-title">安全退出</h5><button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button></div><div class="modal-body"><p>您确定是否要安全退出系统</p></div><div class="modal-footer"><button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button><button type="button" class="btn btn-primary" data-dismiss="modal" id="logoutBtn">确定</button></div></div></div></div><!-- 顶部导航栏 --><div class="container-fluid h-100"><div class="row sticky-top"><div class="col-12"><nav class="navbar navbar-expand-lg  navbar-light bg-light"><a class="navbar-brand" href="#">CRM&nbsp;</a><span>&copy;2030&nbsp;UMBRELLA</span><button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText"aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button><div class="collapse navbar-collapse" id="navbarText"><ul class="navbar-nav mr-auto"><li class="nav-item active"><a class="nav-link" href="#"><span class="sr-only">(current)</span></a></li><li class="nav-item"><a class="nav-link" href="#"></a></li><li class="nav-item"><a class="nav-link" href="#"></a></li></ul><ul class="navbar-nav mr-right"><li class="nav-item dropdown"><a class="nav-link dropdown-toggle" data-toggle="dropdown" id="userName"role="button" aria-expanded="false"></a><div class="dropdown-menu dropdown-menu-sm-right"><a class="dropdown-item" href="#">个人中心</a> <a class="dropdown-item" href="#">其他操作</a> <a class="dropdown-item"href="#">修改密码</a><div class="dropdown-divider"></div><a class="dropdown-item" data-toggle="modal" data-target="#exitModal">安全退出</a></div></li></ul></div></nav></div></div><!-- 中间部分 --><!-- 左侧导航栏 --><div class="row" style="height: 700px;"><div class="col-2 nav-left btn-group-vertical align-self-start" id="myButtonGroup" role="navigation"><a class="btn btn-light" href="/crm-core/workbench/main/index.do" role="tab" target="workareaFrame"><span><img src="/crm-core/image/icons/house-fill.svg"></img>&nbsp;</span>工作台</a> <a class="btn btn-light" href="#list-profile" role="tab" target="workareaFrame"><span> <img src="/crm-core/image/icons/activity.svg"></img>&nbsp;</span>动态</a> <a class="btn  btn-light" href="#list-messages" role="tab" data-toggle="button-group" target="workareaFrame"><span><img src="/crm-core/image/icons/shield-fill-check.svg"></img>&nbsp;</span>审批</a> <a class="btn  btn-light" href="#list-settings"	role="tab" data-toggle="button-group" target="workareaFrame"><span><img src="/crm-core/image/icons/people-fill.svg"></img>&nbsp;</span>客户公海</a> <a class="btn btn-light" href="/crm-core/workbench/activity/index.do" role="tab" data-toggle="button-group" target="workareaFrame"><span><img src="/crm-core/image/icons/buildings-fill.svg"></img>&nbsp;</span>市场活动</a> <a class="btn  btn-light" href="#list-settings"	role="tab" data-toggle="button-group" target="workareaFrame"><span><img src="/crm-core/image/icons/collection-fill.svg"></img>&nbsp;</span>线索(潜在客户)</a> <a class="btn  btn-light" href="#list-settings" role="tab" data-toggle="button-group" target="workareaFrame"><span><img src="/crm-core/image/icons/person-fill-up.svg"></img>&nbsp;</span>客户</a> <a class="btn  btn-light" href="#list-settings" role="tab" data-toggle="button-group" target="workareaFrame"><span><img src="/crm-core/image/icons/person-lines-fill.svg"></img>&nbsp;</span>联系人</a> <a class="btn  btn-light" href="#list-settings" role="tab" data-toggle="button-group" target="workareaFrame"><span><img src="/crm-core/image/icons/hand-thumbs-up-fill.svg"></img>&nbsp;</span>交易(商机)</a> <a class="btn btn-light" href="#list-settings" role="tab" data-toggle="button-group" target="workareaFrame"><span><img src="/crm-core/image/icons/telephone-forward-fill.svg"></img>&nbsp;</span>售后回访</a> <a class="btn btn-light" href="#list-settings" role="tab" data-toggle="button-group" target="workareaFrame"><span><img src="/crm-core/image/icons/bar-chart-line-fill.svg"></img>&nbsp;</span>统计图表</a> <a class="btn btn-light" href="#list-settings" role="tab" data-toggle="button-group" target="workareaFrame"><span><img src="/crm-core/image/icons/clipboard2-fill.svg"></img>&nbsp;</span>报表</a> <a class="btn btn-light" href="#list-settings" role="tab" data-toggle="button-group" target="workareaFrame"><span><img src="/crm-core/image/icons/receipt.svg"></img>&nbsp;</span>销售订单</a> <a class="btn btn-light" href="#list-settings" role="tab" data-toggle="button-group" target="workareaFrame"><span><img src="/crm-core/image/icons/rocket-fill.svg"></img>&nbsp;</span>发货单</a><a class="btn btn-light" href="#list-settings" role="tab" data-toggle="button-group" target="workareaFrame"><span><img src="/crm-core/image/icons/bar-chart-steps.svg"></img>&nbsp;</span>跟进</a> <a class="btn btn-light" href="#list-settings" role="tab" data-toggle="button-group" target="workareaFrame"><span><img src="/crm-core/image/icons/virus.svg"></img>&nbsp;</span>产品</a> <a class="btn btn-light" href="#list-settings" role="tab" data-toggle="button-group" target="workareaFrame"><span><img src="/crm-core/image/icons/currency-bitcoin.svg"></img>&nbsp;</span>报价</a></div><!-- 右侧框架栏,显示导航栏对应的页面 --><div class="col iframe-container"><div class="embed-responsive embed-responsive-16by9"><iframe class="embed-responsive-item border border-white" name="workareaFrame"></iframe></div></div></div></div>
</body>
</html>

当前的解决方案在一定程度上牺牲了响应式的布局优势,后期如果有更好的解决方案再更新。

相关文章

一下几篇是在排错过程中看到的几篇文章,对Flex布局跟Grid布局讲的很好。

1. flex布局看这一篇就够了
2. column分栏布局只是文字布局吗_「一劳永逸」48张小图带你领略flex布局之美
3. 【布局技巧】Flex 布局下居中溢出滚动截断问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/343579.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安全U盘和普通U盘有什么区别?

安全U盘&#xff08;也称为加密U盘或安全闪存驱动器&#xff09;与普通U盘肯定是有一些区别的&#xff0c;从字面意思上来看&#xff0c;就能看出&#xff0c;安全U盘是能够保护文件数据安全性的&#xff0c;普通U盘没这一些功能的&#xff0c;可随意拷贝文件&#xff0c;不防盗…

Django里的ModelForm组件

ModelForm组件 自动生成HTML标签 自动读取关联数据表单验证 保留之前提交的数据 错误提示数据库进行&#xff1a;新建&#xff0c;修改 步骤如下&#xff1a; 创建类 # 在 views.py 文件里# 创建一个类 class AssetModelForm(forms.ModelForm):class Meta:model models.…

华为端云一体化开发 (起步1.0)(HarmonyOS学习第七课)

官方文献&#xff1a; 为丰富HarmonyOS对云端开发的支持、实现端云联动&#xff0c;DevEco Studio推出了云开发功能&#xff0c;开发者在创建工程时选择云开发模板&#xff0c;即可在DevEco Studio内同时完成HarmonyOS应用/元服务的端侧与云侧开发&#xff0c;体验端云一体化协…

gcc与g++的原理

程序的翻译 1 快速认识gcc/g2 程序翻译的过程2.1 预处理阶段2.2 编译阶段2.3 汇编阶段2.4 链接阶段 3 动静态库 1 快速认识gcc/g 首先我们需要在linux系统中安装对应的编译器gcc/g&#xff0c;安装命令如下&#xff08;centos7环境下&#xff09;&#xff1a; gcc: yum instal…

算法金 | 不愧是腾讯,问基础巨细节 。。。

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 最近&#xff0c;有读者参加了腾讯算法岗位的面试&#xff0c;面试着重考察了基础知识&#xff0c;并且提问非常详细。 特别是关于Ada…

GIGE 协议摘录 —— GVCP 协议(二)

系列文章目录 GIGE 学习笔记 GIGE 协议摘录 —— 设备发现&#xff08;一&#xff09; GIGE 协议摘录 —— GVCP 协议&#xff08;二&#xff09; GIGE 协议摘录 —— GVSP 协议&#xff08;三&#xff09; GIGE 协议摘录 —— 引导寄存器&#xff08;四&#xff09; GIGE 协议…

抢人!抢人!抢人! IT行业某岗位已经开始抢人了!

所谓抢滩鸿蒙&#xff0c;人才先行。鸿蒙系统火力全开后&#xff0c;抢人已成鸿蒙市场的主题词&#xff01; 智联招聘数据显示&#xff0c;春节后首周&#xff0c;鸿蒙相关职位数同比增长163%&#xff0c;是去年同期的2.6倍&#xff0c;2023年9-12月鸿蒙相关职位数同比增速为3…

Oracle EBS AP发票验证-计税期间出现意外错误解决方法

系统版本 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状: **打开发票题头或发票行“税详细信息”**错误提示如下: 由于以下原因而无法针对"税"窗口中所做的修改更新 Oraclee Payables信息: 尚未为税率或帐户来源税率设置可退回税/应纳税额帐户。请…

Mac下载Homebrew

通过command空格搜索终端打开 直接输入 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 然后输入电脑密码 然后直接回车等待安装完成 注意⚠️&#xff1a;如果出现报错/opt/homebrew/bin is not in your PATH…

yum进阶——配置yum源

一、yum概述 yum的主要作用 解决依赖关系 自动安装 自动升级 各个系统中的安装软件服务 CentOS7 &#xff1a;yum -y 安装 rpm包 CentOS8 &#xff1a;dnf&#xff08;yum的升级版&#xff09;&#xff0c; Ubantu(22.04) &#xff1a;apt -y 安装&#xff0c;安装源为/…

民主测评要做些什么?

民主测评&#xff0c;作为一种重要的民主管理工具&#xff0c;旨在通过广泛征求群众意见&#xff0c;对特定对象或事项进行客观、公正的评价。它不仅是推动民主参与、民主监督的重要手段&#xff0c;也是提升治理效能、促进社会和谐的有效途径。以下将详细介绍民主测评的主要过…

GNU Radio实现OFDM Radar

文章目录 前言一、GNU Radio Radar Toolbox编译及安装二、ofdm radar 原理讲解三、GNU Radio 实现 OFDM Radar1、官方提供的 grc①、grc 图②、运行结果 2、修改后的便于后续可实现探测和通信的 grc①、grc 图②、运行结果 四、资源自取 前言 本文使用 GNU Radio 搭建 OFDM Ra…

分水岭算法分割和霍夫变换识别图像中的硬币

首先解释一下第一种分水岭算法&#xff1a; 一、分水岭算法 分水岭算法是一种基于拓扑学的图像分割技术&#xff0c;广泛应用于图像处理和计算机视觉领域。它将图像视为一个拓扑表面&#xff0c;其中亮度值代表高度。算法的目标是通过模拟雨水从山顶流到山谷的过程&#xff0…

代码解读 | Hybrid Transformers for Music Source Separation[03]

一、背景 接着上一篇代码解读 | Hybrid Transformers for Music Source Separation[02]文章&#xff0c;继续对Hybrid Transformer Demucs 代码进行解读。 解读目标&#xff1a;明确数据从进入算法&#xff0c;在算法内部&#xff0c;以及在算法输出 这三个阶段中 数据的大小是…

如何执行VMware P2V迁移|VMware Converter和替代方案

VMware中的P2V是什么&#xff1f; 我们常说的VMware P2V其实指的就是“物理到虚拟”&#xff0c;将工作负载从物理机器转换或迁移到虚拟机&#xff08;VM&#xff09;的过程&#xff0c;能够使您无需从头开始费力地创建和配置新虚拟机。 就像您可以使用Disk2vhd执行Hyper-V物理…

如何在virtualbox上安装Linux系统(centerOS)

提示&#xff1a;共同学习 注意&#xff1a;一定要在BIOS中的虚拟化打开。 文章目录 第一步&#xff1a; 第一步&#xff1a; 启动 、显示开启 centos基础安装 ​ ​

九大微服务监控工具详解

Prometheus Prometheus 是一个开源的系统监控、和报警工具包&#xff0c;Prometheus 被设计用来监控“微服务架构”。 主要解决&#xff1a; 监控和告警&#xff1a;Prometheus 可以对系统、和应用程序进行实时监控&#xff0c;并在出现问题时发送告警&#xff1b;数据收集和…

超详细的java Comparable,Comparator接口解析

前言 Hello大家好呀&#xff0c;在java中我们常常涉及到对象的比较&#xff0c;不同于基本数据类型&#xff0c;对于我们的自定义对象&#xff0c;需要我们自己去建立比较标准&#xff0c;例如我们自定义一个People类&#xff0c;这个类有name和age两个属性&#xff0c;那么问…

Bev 车道标注方案及复杂车道线解决

文章目录 1. 数据采集方案1.1 传感器方案1.2 数据同步2. 标注方案2.1 标注注意项2.2 4d 标注(时序)2.2.1 4d标签制作2.2.2 时序融合的作用2.2.2.1 时序融合方式2.2.2.2 时序融合难点2.2.2.2 时序实际应用情况3. 复杂车道线解决3.1 split 和merge车道线的解决3.2 大曲率或U形车道…

自然语言处理(NLP)—— 语言检测器

1. 文章概述 1.1 目的 在本篇文章中&#xff0c;我们将构建一个语言检测器&#xff0c;这是一个能够识别文本语言的简单分类器。这是一个能够识别文本是用哪种语言写的程序。想象一下&#xff0c;你给这个程序一段文字&#xff0c;它就能告诉你这是英语、法语还是其他语言。 …