写在前面

作为一只前端小汪,以自己一个初学者的视角,在这里记录自己在学习过程中遇到的问题,解决的方法,也算是成长的历程吧!过程中难免会有疏忽和自己没有发现的错误,如果你碰巧看到了我的博客,欢迎和我一起交流、学习,给我提出宝贵的意见。

我的QQ群号:495086635,需要学习资源的欢迎进群,我自己的资源无偿提供给大家。

酷炫的手风琴效果

手风琴效果的特点:每次只展开一个元素,其他的兄弟元素都闭合

先从样式和布局开始,做一个原生JS的手风琴效果

html:

<div class="c"><p class="red">1</p><p class="blue">2</p><p class="green">3</p><p class="yellow">4</p>
</div>

css:

.c{background-color: black;
}
.c::before,.c::after{content: '';display: table;
}
.c::after{clear: both;
}
.red{width: 100px;background-color:red;float: left;height: 300px;
}.blue{background-color:blue;
}
.green{background-color: green;
}
.yellow{background-color: yellow;
}
.yellow,.green,.blue{width: 20px;float: left;height: 300px;
}

效果如图:

写完结构和样式,对JS要完成的效果进行拆解

需求分析:当鼠标点击一个元素时,对应元素的宽度变大,兄弟元素中宽度最大的元素宽度变小

实践:

1.首先,手风琴的效果要动起来,在JS中能够动起来的只有计时器,因此这里会用到周期性计时器,这一步可以后写,先进行第二步

如果你回到这里,恭喜你,已经完成了一半

问题:何时停掉计时器,停计时器要写在计时器函数中,满足条件时清除计时器

+(function () {//查找元素var c = document.querySelector('.c');var ps = document.querySelectorAll('.c p');//绑定事件:事件的对象是其中一个p元素,给每个p元素绑定事件for (var i = 0; i < ps.length; i++) {//需求的第一个元素:被点击的元素var p = ps[i];p.onclick = function () {//需求的第二个元素:兄弟中最大的元素for (var j = 0; j < ps.length; j++) {if(getComputedStyle(ps[j]).width=='100px'){var obj = ps[j];break;}}if(parseInt(getComputedStyle(this).width)==20){//添加计时器var timer = setInterval(move,100);var step = 10;var that = this;function move() {if(parseInt(getComputedStyle(that).width)<100){//点击的当前元素宽度变大that.style.width = parseInt(getComputedStyle(that).width) + step + 'px';obj.style.width = parseInt(getComputedStyle(obj).width) - step + 'px';console.log(getComputedStyle(that).width);}else{clearInterval(timer);}}}}}
})();

问题:如果一次元素的宽度尚未到达20px,又去点击另一个元素,这时两个元素会同时动,

解决:让一个动作完成再执行另一个动作

分析:判断另一个动作是否要执行时在执行前判断的,所以在事件之外定义一个布尔全局变量

+(function () {//查找元素var c = document.querySelector('.c');var ps = document.querySelectorAll('.c p');//绑定事件:事件的对象是其中一个p元素,给每个p元素绑定事件for (var i = 0; i < ps.length; i++) {//需求的第一个元素:被点击的元素var p = ps[i];var flag = true;p.onclick = function () {if(flag){flag = false;//需求的第二个元素:兄弟中最大的元素for (var j = 0; j < ps.length; j++) {if(getComputedStyle(ps[j]).width=='100px'){var obj = ps[j];break;}}if(parseInt(getComputedStyle(this).width)==20){//添加计时器var timer = setInterval(move,100);var step = 10;var that = this;function move() {if(parseInt(getComputedStyle(that).width)<100){//点击的当前元素宽度变大that.style.width = parseInt(getComputedStyle(that).width) + step + 'px';obj.style.width = parseInt(getComputedStyle(obj).width) - step + 'px';console.log(getComputedStyle(that).width);}else{clearInterval(timer);flag = true;}}}}}}
})();

2.从需求来看,这里需要一个事件,事件的三要素:元素、事件、函数

元素:被点击的元素和兄弟元素中最大的那个(两个)

事件:click

函数:匿名函数

函数的功能:①点击的当前元素:如果宽度为20px,变为100px;否则,不变

+(function () {//查找元素var c = document.querySelector('.c');var ps = document.querySelectorAll('.c p');//绑定事件:事件的对象是其中一个p元素,给每个p元素绑定事件for (var i = 0; i < ps.length; i++) {//需求的第一个元素:被点击的元素var p = ps[i];//需求的第二个元素:兄弟中最大的元素for (var j = 0; j < ps.length; j++) {if(getComputedStyle(ps[j]).width=='100px'){var obj = ps[j];break;}}p.onclick = function () {console.log("我执行了");//点击的当前元素宽度变大if(getComputedStyle(this).width=='20px'){this.style.width = 100 + 'px';obj.style.width = 20 + 'px';}}}
})();

代码到这里遇到一个问题:除了初始设置默认值100px的那个元素,以后的元素宽度都不会再变回20px

分析:兄弟中最大的元素除了默认值之外,都是点击事件发生后才产生的,上面的代码只在初始时获得一次,点击后产生的最大兄弟元素并没有获得,因此,查找兄弟中最大的元素应该放在事件处理函数中

更新代码:

+(function () {//查找元素var c = document.querySelector('.c');var ps = document.querySelectorAll('.c p');//绑定事件:事件的对象是其中一个p元素,给每个p元素绑定事件for (var i = 0; i < ps.length; i++) {//需求的第一个元素:被点击的元素var p = ps[i];p.onclick = function () {//需求的第二个元素:兄弟中最大的元素for (var j = 0; j < ps.length; j++) {if(getComputedStyle(ps[j]).width=='100px'){var obj = ps[j];break;}}//点击的当前元素宽度变大if(getComputedStyle(this).width=='20px'){this.style.width = 100 + 'px';obj.style.width = 20 + 'px';}}}
})();

此时,测试没有问题,接下来给代码添加动画,回到第一步

手风琴效果——原生JS相关推荐

  1. canvas下雪效果(原生js)

    效果展示: 源码展示: <!doctype html> <html> <head><meta charset="utf-8">< ...

  2. HTML制作手风琴效果,纯js+html和纯css+html制作手风琴效果,css手风琴

    纯js+html和纯css+html制作手风琴效果,css手风琴 本文分享了纯js+html制作手风琴和纯css+html制作手风琴两种效果,供大家参考,具体内容如下 一.纯css+html的手风琴效 ...

  3. html5怎么产生手风琴效果,Html5 js如何实现手风琴效果

    Html5 js如何实现手风琴效果 发布时间:2020-08-03 09:54:10 来源:亿速云 阅读:92 作者:小猪 这篇文章主要为大家展示了Html5 js如何实现手风琴效果,内容简而易懂,希 ...

  4. 手风琴效果(js版本以及jquery版本)

    最近又复习了jQuery的知识,既然jQuery是javascript的一个库.jQuery能做到的事情javascript也能做到.因此用这两种方法实现了图片手风琴效果 按照惯例,还是上代码吧,因为 ...

  5. 圆盘时钟效果 原生JS

    圆盘时钟 旋转时钟 数字时钟 写在前面 仿荣耀手机时钟,设计的同款时钟效果 实现效果 实现原理 数字时钟 利用Date内置对象获取当下的时间,通过处理呈现在页面上 这一步获取时间是非常简单的,通过Da ...

  6. html js 动画效果,原生js html5 canvas 3D云动画效果

    特效描述:原生js html5canvas 3D云动画效果.3D云效果,叼炸天!可用鼠标控制方向!本地要localhost才能正常演示 代码结构 1. 引入JS 2. HTML代码 varying v ...

  7. php侧边栏导航效果,原生js实现电商侧边导航效果

    知识要点 实现原理: 1.点击楼层跳相应楼层,用的是锚点定位 电梯:2F 个护家清 列表title: 这个没什么好说的 2.当点击楼层跳到相应楼层时,该楼层高亮显示 我们的脚本主要就是实现这个功能. ...

  8. js实现html图片翻页效果,原生JS实现图片翻书效果

    JS实现图片翻书效果-懒人图库 #center { LEFT: 50%; POSITION: absolute; TOP: 50% } #DHTMLBOOK { BACKGROUND: #000; L ...

  9. html5做出百叶窗效果,原生js实现百叶窗效果及原理介绍

    百叶窗大家都见过吧!如图: 原理: 如图所示,空心格子就好比是每个li,给它设定相对定位属性,设置overflow:hidden:黑块为li子元素,高度为li的2倍,设置absolute属性,我们正是 ...

最新文章

  1. rdlc报表显示条码 .
  2. Numpy中np.dot()与np.matmul()的区别(矩阵乘积、矩阵乘法、矩阵相乘)
  3. pyspark subtract代码示例
  4. Linux 平台安装 Oracle Timesten
  5. 什么是 Go runtime.KeepAlive?
  6. Python机器学习:PCA与梯度上升002使用梯度上升法求解PCA问题
  7. springSecurity jwt 认证与鉴权及异常
  8. 不确定性原理的前世今生 · 数学篇(二)
  9. hihoCoder #1117 战争年代
  10. php几种常用的加密解密算法
  11. arm 汇编指令 CPS
  12. python数据清洗工具、方法、过程整理归纳(六、数据清洗之数据预处理(一)——重复值处理、缺失值处理)
  13. 翁恺c语言程序设计入门期末,程序设计入门-C语言 翁恺.doc
  14. AE从初级到高级全套视频教程
  15. 3分钟了解入门「机器学习」该学习什么?(下)
  16. inkscape:图层
  17. Vue3中setup前写async页面不显示
  18. Unity 进阶 之 实现简单的音频可视化封装(包括音频和麦克风)
  19. android自定义虚线,Android自定义view的方式绘制虚线
  20. 【CH376】关于CH376的一些使用总结

热门文章

  1. win10如何通过局域网从浏览器访问ip
  2. Ps图层工具怎么使用?以下是我分享的关于ps图层几个小知识
  3. Windows7瘦身优化
  4. 【网站密码管理不用愁】基础篇 • 利用selenium构建网站密码管理和自动登录神器
  5. linux命令 du -h --max-depth=0,查看当前目录下文件大小
  6. 黑盒测试(什么是黑盒测试 黑盒测试的优缺点 黑盒测试中的测试方法)
  7. matlab里的图像处理函数
  8. 做一个成功的软件项目经理
  9. 推荐系统工程篇之搭建以图搜图服务
  10. 5G新型网络架构和5G新型网络架构关键技术