【JavaScript】用类的操作对CSDN社区管理菜单栏优化

简介: 【JavaScript】用类的操作对CSDN社区管理菜单栏优化

前言


在此之前,我们对一个元素的样式进行修改,需要对其所有样式逐一更改,如下所示:


//获取按钮和div
let btn = document.getElementById('bt1');
let box = document.getElementById('box');
//给按钮绑定单击响应函数
btn.addEventListener('click',()=>{
    // 一项一项修改
    box.style.height = 300+'px';
    box.style.backgroundColor = "yellow";
    box.style.marginTop = 30 + 'px';
});


实际上,当我们使用这种方法时,浏览器会对其样式进行一次又一次的渲染。即渲染多次之后得到最后样式,那么,如何只让浏览器渲染一次就得到该效果呢?下面我们就一起来看看如何操作吧。


下面是该实例操作的一些样式和html。


HTML:


<button id="bt1">点击按钮修改样式</button>
<div id="box" class="b1"></div>


CSS:


.b1{
   margin-top: 20px;
   background-color: antiquewhite;
   width: 150px;
   height: 150px;
}
.b2{
   margin-top: 20px;
   /* width: 30px; */
   height: 300px;
   background-color: aqua;
}


b1样式:



b2样式:



b1 b2样式:



直接修改类名


可直接修改类名,将b1样式修改为b2样式。


btn.addEventListener('click',()=>{
  box.className = 'b2';
});


添加b2样式


这里需要判断className中是否存在b2样式,若不存在则添加。


判断是否存在


定义一个函数来判断b2是否存在。


obj - 需要修改的对象


cn - class名


若存在,返回true,反之,返回false


function hasClass(obj,cn){
     let reg = new RegExp("\\b" + cn + "\\b");
     return reg.test(obj.className);
     // alert(reg);
 }


定义一个添加函数


obj - 需要修改的对象


cn - class名


//添加class
function addClass(obj,cn){
       obj.className += ' '+ cn;
   }


调用添加:若无b2,则添加。


btn.addEventListener('click',()=>{
if(!hasClass(box,'b2')){
    addClass(box,'b2');
  };
});


删除样式


定义一个删除函数:


obj - 需要修改的对象


cn - class名


 function removeClass(obj,cn){
    let reg = new RegExp("\\b" + cn + "\\b");
    obj.className = obj.className.replace(reg,"");
}


调用删除函数:


btn.addEventListener('click',()=>{
  removeClass(box,'b2');
});


替换样式


有则删除,无则添加。


定义一个替换函数


obj - 需要修改的对象


cn - class名


function toggleClass(obj,cn){
  if(hasClass(obj,cn)){
            removeClass(obj,cn);
        }else{
            addClass(obj,cn);
        };
    }


调用替换函数


btn.addEventListener('click',()=>{
  toggleClass(box,'b2');            
});


对CSDN社区管理菜单栏的优化


前一阵听到有大佬反馈csdn社区管理的菜单栏的问题,让我们先看看怎么个事儿


首先这是csdn社区管理的菜单栏:



存在的问题就是,对于屏幕较小的用户将所有菜单展开后,不能向下滚动。例如将所有菜单打开之后,管理员那栏就被隐藏了,需要再次将其他菜单栏关闭才能够显示。


优化方案:


打开下一个菜单栏立即关闭上一个菜单栏。


如图:



CSS:


.box{
     width: 256px;
     height: 760px;
     background-color: #515a6e;
     text-align: center;
 }
 .csdnImg{
     /* position: relative; */
     height: 40px;
     width: 150px;
     line-height: 32px;
 }
 .webImg{
     width: 24px;
     height: 24px;
     margin-right: 8px;
     border-radius: 2px;
 }
 #suliang{
     display: inline-block;
     height: 24px;
     text-align: center;
     font-size: 20px;
     color: #fff;
     font-weight: 500;
     white-space: nowrap;
     line-height: 100%;
     /* background-color: antiquewhite; */
     cursor: pointer;
 }
 .childDiv{
     display: flex;
     flex-direction: column;
     align-items: center;
     overflow: hidden;
     width: 256px;
     position: relative;
     margin-bottom: 5px;
     box-sizing: border-box;
     transition:all 0.5s;
     height: 170px;
 }
 .menuList{
     border: 2px gray solid;
     width: 230px;
     border-radius: 10px;
     padding: 14px 24px;
     /* position: absolute; */
     cursor: pointer;
     height: 52px;
     box-sizing: border-box;
     text-align:justify;
 }
 .menuList>img{
     width: 20px;
     height: 20px;
     /* align:top; */
     margin-right: 5px;
 }
 .menuList:hover{
     color: #fff;
     transition: 0.4s;
 }
 a{
     text-decoration: none;
     color: #191a23;
     margin: 10px;
 }
 a:hover{
     color: #fff;
     transition: 0.4s;
 }
 .change{
     height: 52px;
     transition: 0.6s;
 }


HTML:


<div class="box">
        <img src="https://csdnimg.cn/release/ccloud/img/ccloud-logo.fdf3c711.png" alt="" class="csdnImg">
        <br>
        <!-- <img src="https://img-community.csdnimg.cn/avatar/cbe53133b4e84b59917aefeaeacb6615.jpg?x-oss-process=image/resize,m_fixed,h_88,w_88" alt="" class="webImg"> -->
        <p id="suliang"><img src="https://img-community.csdnimg.cn/avatar/cbe53133b4e84b59917aefeaeacb6615.jpg?x-oss-process=image/resize,m_fixed,h_88,w_88" alt="" class="webImg" align="top">前端修炼社(苏凉)</p>     
        <div class="childDiv">
            <span class="menuList"><img src="../img/用户.png" alt="" align="top"> 用户</span>
            <a href="#">用户管理</a>
            <a href="#">用户配置</a>
        </div>
        <div class="childDiv change">
            <span class="menuList"><img src="../img/内容模型设置.png" alt="" align="top">内容</span>
            <a href="#">内容管理</a>
            <a href="#">内容收录</a>
        </div>
        <div class="childDiv change">
            <span class="menuList"> <img src="../img/137设置、系统设置、功能设置、属性-线.png" alt="" align="top">功能配置</span>
            <a href="#">频道管理</a>
            <a href="#">信息管理</a>
            <a href="#">广告位配置</a>
        </div>
        <div class="childDiv change">
            <span class="menuList"> <img src="../img/管理员.png" alt="" align="top">管理员</span>
            <a href="#">管理员配置</a>
        </div>
 </div>


JS:


//获取span标签
let menuList = document.getElementsByClassName('menuList');
//获取div
let childDiv = document.getElementsByClassName('childDiv');
let open = childDiv[0];
// let childDivHeight = childDiv.offsetHeight;
// alert(childDivHeight)
//给span绑定单击响应函数
for(let i=0;i<menuList.length;i++){
   menuList[i].addEventListener('click',function(){
       // alert('11')
       let parentDiv = this.parentNode;
       // alert(parentDiv.offsetHeight)
       toggleClass(parentDiv,'change')
       if(parentDiv != open && !hasClass(open,'change')){
           toggleClass(open,'change')
       };
       open = parentDiv;
   })
}
//判断是否含有clsssname
function hasClass(obj,cn){
   let reg = new RegExp("\\b" + cn + "\\b");
   return reg.test(obj.className);
   // alert(reg);
}
//添加class
function addClass(obj,cn){
   // let reg = new RegExp("\\b" + cn + "\\b");
   obj.className += ' '+ cn;
}
//删除class
function removeClass(obj,cn){
   let reg = new RegExp("\\b" + cn + "\\b");
   obj.className = obj.className.replace(reg,"");
}
//替换class
function toggleClass(obj,cn){
   if(hasClass(obj,cn)){
       removeClass(obj,cn);
   }else{
       addClass(obj,cn);
   };
}
目录
相关文章
|
8月前
|
监控 负载均衡 JavaScript
有哪些有效的方法可以优化Node.js应用的性能?
有哪些有效的方法可以优化Node.js应用的性能?
400 69
|
8月前
|
监控 算法 JavaScript
公司局域网管理视域下 Node.js 图算法的深度应用研究:拓扑结构建模与流量优化策略探析
本文探讨了图论算法在公司局域网管理中的应用,针对设备互联复杂、流量调度低效及安全监控困难等问题,提出基于图论的解决方案。通过节点与边建模局域网拓扑结构,利用DFS/BFS实现设备快速发现,Dijkstra算法优化流量路径,社区检测算法识别安全风险。结合WorkWin软件实例,展示了算法在设备管理、流量调度与安全监控中的价值,为智能化局域网管理提供了理论与实践指导。
214 3
|
11月前
|
前端开发 JavaScript Java
JavaScript闭包深入剖析:性能剖析与优化技巧
JavaScript 闭包是强大而灵活的特性,广泛应用于数据封装、函数柯里化和事件处理等场景。闭包通过保存外部作用域的变量,实现了私有变量和方法的创建,提升了代码的安全性和可维护性。然而,闭包也可能带来性能问题,如内存泄漏和执行效率下降。为优化闭包性能,建议采取以下策略:及时解除对不再使用的闭包变量的引用,减少闭包的创建次数,使用 WeakMap 管理弱引用,以及优化闭包结构以减少作用域链查找的开销。在实际开发中,无论是 Web 前端还是 Node.js 后端,这些优化措施都能显著提升程序的性能和稳定性。
257 70
|
7月前
|
JavaScript
JS代码的一些常用优化写法
JS代码的一些常用优化写法
128 0
|
存储 缓存 监控
如何使用内存监控工具来优化 Node.js 应用的性能
需要注意的是,不同的内存监控工具可能具有不同的功能和特点,在使用时需要根据具体工具的要求和操作指南进行正确使用和分析。
590 158
|
JavaScript 前端开发
如何使用时间切片来优化JavaScript动画的性能?
如何使用时间切片来优化JavaScript动画的性能?
473 158
|
8月前
|
人工智能 监控 前端开发
基于 Next.js 的书法字体生成工具架构设计与 SSR 优化实践
本项目是一款书法字体生成工具,采用 Next.js 14(App Router)与 Tailwind CSS 构建前端,阿里云 Serverless 部署后端。通过混合渲染策略(SSG/SSR/CSR)、Web Worker 异步计算及 CDN 字体分片加载优化性能。服务端借助阿里云函数计算处理计算密集型任务,将平均耗时从 1200ms 降至 280ms,支持 1000+ QPS。动态路由与 ARMS 监控提升工程化水平,未来计划引入 WebGPU 和 AI 字体风格迁移技术,进一步优化用户体验。
|
10月前
|
前端开发 JavaScript
【Javascript系列】Terser除了压缩代码之外,还有优化代码的功能
Terser 是一款广泛应用于前端开发的 JavaScript 解析器和压缩工具,常被视为 Uglify-es 的替代品。它不仅能高效压缩代码体积,还能优化代码逻辑,提升可靠性。例如,在调试中发现,Terser 压缩后的代码对删除功能确认框逻辑进行了优化。常用参数包括 `compress`(启用压缩)、`mangle`(变量名混淆)和 `output`(输出配置)。更多高级用法可参考官方文档。
709 11
|
12月前
|
前端开发 JavaScript
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
382 14
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
10月前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

热门文章

最新文章