网站首页 > 基础教程 正文
关于如何去写好JavaScript代码这个问题,我们一般会遵循各司其责、组件封装、过程抽象这三大原则来展开描述。今天我们主要从各司其责原则展开学习。
定义
各司其责主要是指将HTML代码,CSS代码,JavaScript代码的职能相互分离。
我们先了解一个需求:
如上所示,这个需求要求我们能够切换通过点击按钮实现白天和夜间之间的不同背景颜色和字体颜色的切换。下面是原始HTML和CSS代码:
- HTML代码
<body>
<div class="main">
<div class="btn">
<button id="modeBtn"></button>
</div>
<div>
<h2>吴名小卒,好运100%!!</h2>
<div>
<img src="img/2.jpg" style="width: 100px;height: 100px;"/>
</div>
</div>
</div>
</body>
- CSS代码
.main{
display: flex;
flex-direction: row-reverse;
justify-content: space-between;
width: 300px;
}
.btn{
margin-top: 25px;
margin-right: 20px;
}
简单实现
上述需求最简单的实现方式就是直接通过JavaScript直接操作CSS样式,进而达到我们想要的效果。具体JavaScript代码如下:
const btn = document.getElementById("modeBtn")
const body = document.getElementsByTagName("body")[0]
btn.addEventListener("click",function(){
//判断按钮的内容是否是太阳
if(btn.innerHTML == ""){
body.style.background = "black"
body.style.color = "white"
btn.innerHTML = "" //改为月亮
}else{
body.style.background = "white"
body.style.color = "black"
btn.innerHTML = "" //改为太阳
}
})
如上所示,我们通过获取按钮元素以及body元素,并且监听鼠标点击事件,判断按钮元素的内容,进而进行背景的切换。
上述做法虽然实现了我们的需求,但是我们在实际开发的过程中,我们的代码结构并不会这么简短。因此,当我们采用这种方式进行操作后,当我们需要返回来阅读代码时,我们阅读代码的难度就大大增加了。另外,虽然我们可以看懂这代码,对于其他开发人员来说,可读性是较差的。因此,我们需要对代码进行优化。
初步优化
那个我们要如何进行优化呢?既然我们本章讲的是各司其责原则,那么我们是否可以考虑不直接操作元素样式来达到目的呢?
- HTML代码:
<button id="modeBtn"></button>
- CSS代码:
.night{
background-color: black;
color: white;
}
#modeBtn::after {
content: ''; //太阳
}
body.night #modeBtn::after {
content: ''; //月亮
}
- JavaScript代码:
const btn = document.getElementById("modeBtn")
const body = document.getElementsByTagName("body")[0]
btn.addEventListener("click",function(){
if(body.className = "night"){
body.className = ""
}else{
body.className = "night"
}
})
如上所示,我们将按钮的内容作为CSS样式,通过伪类元素after进行按钮内容的切换。同时,在CSS新增一个night的类,通过JS更改body的类名,达到模式切换的效果。这样写大大地提升了代码的可读性。但是,上述操作还是用到了JS,对于一个纯展示类交互需求来说还有种大材小用的感觉。那么,我们能不能寻找一种方法做到让这个实例是零JS的呢?
最终优化
对于这个实例要想实现零JS其实并不是很难,只需要添加一个checkbox勾选框即可。具体代码如下。
- HTML代码
<body>
<input type="checkbox" id="modeChange">
<div class="main">
<div class="btn">
<label for="modeChange" id="modeBtn"></label>
</div>
<div>
<h2>吴名小卒,好运100%!!</h2>
<div>
<img src="img/2.jpg" style="width: 100px;height: 100px;"/>
</div>
</div>
</div>
</body>
- CSS代码
#modeChange{
display: none;
}
#modeChange:checked+.main{
background-color: black;
color: white;
}
#modeBtn::after {
content: ''; //太阳
}
#modeChange:checked+.main #modeBtn::after {
content: ''; //月亮
}
如上所示,我们在最外层定义一个隐藏的勾选框,并且将勾选框绑定给切换按钮,通过勾选框的:check伪类选择器,达到了只通过操作CSS就能实现模式切换的效果。
运用
结合上面的实例以及优化过程,我们可很好的了解到各司其责原则的运用原则:
- HTML/CSS/JavaScript代码各自完成自己的责任;
- 应当避免不必要的JS直接操作样式;
- 可以用class来表示样式状态;
- 对于纯展示类交互我们应当寻求零JS方案。
总结
本篇文章主要通过一个背景切换实例对JavaScript代码编写三原则中的各司其责原则进行了学习。了解到了如何在开发中更好的应用各司其责原则。
猜你喜欢
- 2024-11-09 前端CSS面试题-5 前端css3面试题
- 2024-11-09 Web开发学习笔记(39)——CSS3(12)弹性盒子
- 2024-11-09 鸿蒙学习笔记(呼吸训练index篇) 呼吸模式训练
- 2024-11-09 CSS布局模式之Flex布局&Grid布局
- 2024-11-09 关于 display:flex 的一个奇技淫巧
- 2024-11-09 前端CSS面试题-4 前端样式面试题
- 2024-11-09 JAVA开发第4天上班日记 java面试官问你在开发时遇到过哪些问题模块怎么回答
- 2024-11-09 Next.js 零基础教程3|2024最新更新中|曲速引擎 Warp Drive
- 2024-11-09 CSS Viewport 单位,很多人还不知道使用它来快速布局
- 2024-11-09 使用CSS的animation-direction属性让动画缓慢回弹
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)