一个JS效果竟然要研究一天,我是不是不适合做前端?
前言
今天这篇文章的标题,显然是要搞事情。一个JS交互效果,居然花费了一天的宝贵时间才研究出来,我是不是不太适合做前端?
别急,搬好小板凳,正文从这开始~
本来今天下班回来感觉有点累,想着今天就别学了吧,正好看见停播了好久的《极限挑战》在网上放出了最新的一期。但是,今天发生在公司的一件小事儿,在我心里产生了不小的波澜,正好拿这个话题跟同行们聊聊.....
今天早晨我按时去了公司,坐在我的工位上,习惯性地点开了编辑器SublimeText(我宠幸了它三年之久~),一天的编码工作正式开始。
我的大脑高速运转,回忆了下昨天下班前的进度,以及要修改的bug,一个是替换iconfont字体图标的问题,一个是编写官网首页通用导航栏鼠标hover的交互效果,我估摸着上午先把这两个问题解决了,下午再忙其他的任务。
不一会儿,iconfont的替换工作就完成了。紧接着就是导航栏mouse over 的特效编写,殊不知,就是这个效果,让原本计划上午完成的事情,愣是被我研究了大半天才解决。二话不说,直接上图:
我先给大家说下这里要实现的效果,就是当鼠标移入导航栏的某个栏目时,顶部的4px 的蓝色滑动条要尾随着鼠标,如丝般顺滑地滑入相应栏目的顶部位置,当鼠标leave时,蓝色滑动条要退回到当前current的栏目顶部。
刚开始我的布局是,导航栏是一个ul,ul下面有八个li,分别是八个栏目。在每个li的顶部设置一个border-top: 4px solid #2ea0ff;html结构如下:

我的初步设想是,先隐藏这个border-top,然后当鼠标移入的时候,再显示出来。代码如下:

任何效果都是经过一步一步思考打磨出来的,不可能是一蹴而就。就比如这个例子,学过jQuery的同学都知道,这个效果就是很生硬的显示一条顶部边框,然后隐藏,没有动画的效果。但是jQuery的动画api辣么多,什么slideDown、slideUp、fadeIn、fadeOut、animate......

(默默地给@愚人码头打了个广告)
于是,我对代码进行了第二波改造,加上了动画效果,以下是debug现场重现:

预期的效果在浏览器上渲染出来,此时已经有了动画。但是,这还不是我想要的那个效果,后来我又想了一招,可以在每个li里添加一个span,设置为绝对定位,width默认为0,然后animate的时候,让它过渡到li的宽度。
嗯,这个想法不错,有点接近我心中的那个效果了。于是,我又折腾了一番:

这回终于有点样子了,只不过还是每个li都有一个自己的滑动条,而领导的意思是导航栏顶部只有一条公用的4px的蓝色滑动条,鼠标移入时来回切换。
此时,已将近中午,我debug 的幕后过程其实更加艰辛,不像我现在写文字时那么轻描淡写。而我旁边的同事说,看你折腾来折腾去的,干嘛那么辛苦,去网上找个插件就好了,省时省力。
当时,我只能苦笑,因为前些日子我跟着视频里写过这个例子,不过时间隔的有点久,我自己想不起当时的逻辑了。
下午又研究了大半天,突然灵光一现,想到了一招,可以在ul的外层包一层div,和ul同级新增一个span元素,这个span就是那个公用的蓝色滑动条。然后给父元素设置为相对位置,给span设置为绝对位置。然后根据鼠标移入的li的索引,计算出span要滑动的距离,这个距离就等于li的width乘以移入li的index的值,再加上每个li之间的间距。还是赶紧贴上html结构:

中途因为li的index索引停滞了好一阵子,因为index值取不到。于是,我又用原生javascript写了一遍,还是取不到值,然后又改回来jquery的写法。在经过多次翻阅jquery的api文档,多次试错之后,终于效果写出来了,以下是最终的业务代码:

在这里,我先解释下:
第一步,通过filter方法筛选出className为current的li,获得它的index,然后赋值给变量currentNum;
第二步,在浏览器刷新时初始化滑动条sliderBar的位置到指定的栏目上;
第三步,利用hover方法监控鼠标移入移出的效果,从而改变sliderBar的left的值,达到滑动的动画效果。其中,stop()方法是为了解决动画队列的问题。
以上就是我debug的过程,虽然浪费了一些时间,但是好歹问题解决了。如果你要问我,你哪来那么大的勇气,去死磕这个效果(bug)?我会告诉你,如果搁以前,我可能会在网上找个插件了事,因为在谈到javascript业务逻辑开发这块,我承认还是有不小的差距。
但是,今年我开始认真的研究了红皮书,也就是《JavaScript高级程序设计》这本被奉为经典的JS书籍。在经过不断的拜读和敲代码,现在我对自己的原生JS这块逐渐有了些许自信,明白了它的一些底层原理和概念设计。以前是只会照葫芦画瓢,现在也有了点知其然,更知其所以然的味道。
正是通过对基础的夯实,我才有了莫名的勇气去死磕这些开发中遇到的各种疑难杂症。
感谢老铁们不厌其烦的看我debug思维重现到这里,其实,闰土也是想借着这个事儿想跟大家说,前端基础真的很重要,尤其是JS!如果你基础不牢靠,一味的追逐热门框架,看似解决了工作上的一些问题。但回头想想,你的这种技术逻辑还没有形成自己的知识体系,它是松散的,是畸形的,是根基不牢靠的。学好基础再去学框架,会事半功倍,游刃有余。如果基础没打好,不注重底层原理,你的前端路注定走不远。
因为解决一个bug,浪费了一些时间,看似得不偿失,但是搞出来就算牛逼。最起码等你以后当老大了,别人问你,你就知道怎么解决,自己踩过的坑,印象最深。而不是说,以前有人帮我解决过,现在忘了。
所以说,实践是检验真理的唯一标准。网上很多文章写的有好有坏,自己去动手debug或者是实践一下,得出自己的结论才是靠谱的。
后记
凌晨1点,夜已深,估计大家看到这篇文章的推送,已是明早上班赶路时。临睡之前,闰土送大家一句话:别人也没有多牛逼,你也可以在你的领域,开辟天地。
一个JS效果竟然要研究一天,我是不是不适合做前端?的更多相关文章
- 【JS学习笔记】第一个JS效果——鼠标提示框
分析效果实现原理--鼠标提示框 样式:div的display 事件:onmouseover,onmouseout 编写JS的流程 布局:HTML+CSS 属性:确定需要修改哪些属性 事件:确定用户做哪 ...
- 可复用的js效果
以下案例的html以及css代码 <!doctype html> <html lang="zh-hans"> <head> <meta c ...
- m.jd.com首页中的js效果
m.jd.com中的部分js效果 昨天把m.jd.com的首页布局写好了,今天写一下首页中部分js效果.头部背景色透明度的改变,焦点图轮播,京东快报的小轮播,以及秒杀倒计时.这里html,css样式就 ...
- [jQuery编程挑战]006 生成一个倒计时效果
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="utf-8&quo ...
- JS效果的步骤
一.写JS效果的步骤 1.先实现布局 (XHTML+CSS2) 2.实现原理 (1)希望把某个元素移除你的视线: a. display:none; 显示为无,不占据空间 b. vi ...
- Github上html页面(包括CSS样式和JS效果)如何显示出来
在看Github上项目时,发现有的html页面效果能很好的展现出来,而有的则不能.对这个问题很好奇,因此研究了一下,最终做到了将页面展示出来的目的.下面以我的Github的开源项目bootstrap- ...
- 【原创】贡献一个JS的弹出框代码...
一.前言 最近在做一个项目,自己感觉系统自带的alert()方法的弹出框实在是不堪入目,所以在网上找了一些资料,然后自己加工了一下,做出了自己的一个js弹出框,在这里贡献出来,希望对你有帮助. 二.开 ...
- 我的第一个JS组件-跨浏览器JS调试工具
武汉九天鸟-p2p网贷系统开发-互联网应用软件开发 公司官网:http://jiutianniao.com 社交问答:http://ask.jiutianniao.com 最近,在看公司一个JS大牛 ...
- 类js效果
类似js效果,点击看看 代码 onclick="return confirm('您确定要看看吗?')" 放入a标签里面
随机推荐
- java 对象的序列化与反序列化
一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...
- JAVA基础---编码解码
所谓编码 即char->byte 所谓解码 即byte->char ISO-8859-1 中文字符会被黑洞吸收 全部变为"?" GB2312 汉字可以被编码为双字节 但 ...
- Vuex 学习笔记
Vuex 是什么? Vuex 是一个专为 Vue.js应用程序开发的状态管理模式.由于SPA应用的模块化,每个组件都有它各自的数据(state).视图(view)和方法(actions),当项目内容越 ...
- MyCAT-EYE开源
MyCAT EYE MySQL数据库监控工具,实现了对MySQL节点的管理和监控,可供开发人员和DBA使用.后续版本将整合MyCAT2.0的管理和配置. 演示地址: 开发人员视图:http://120 ...
- 【转】Keberos认证原理
前几天在给人解释Windows是如何通过Kerberos进行Authentication的时候,讲了半天也别把那位老兄讲明白,还差点把自己给绕进去.后来想想原因有以下两点:对于一个没有完全不了解Ker ...
- Springboot - 学习笔记 ②
前言 这一篇是关于spring boot中的配置(configuration)的介绍,我们接下来要说的男主就是 “application.properties”. “男神”默认是生成在“/src/ma ...
- Operating system hdu 2835 OPT
Operating system Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- MySQL之多表操作
前言:之前已经针对数据库的单表查询进行了详细的介绍:MySQL之增删改查,然而实际开发中业务逻辑较为复杂,需要对多张表进行操作,现在对多表操作进行介绍. 前提:为方便后面的操作,我们首先创建一个数据库 ...
- YYHS-Super Big Stupid Cross(二分+扫描线+平衡树)
题目描述 “我是超级大沙茶”——Mato_No1 为了证明自己是一个超级大沙茶,Mato 神犇决定展示自己对叉(十字型)有多么的了 解. Mato 神犇有一个平面直角坐标系,上面有一些线段,保证这些线 ...
- [js插件开发教程]一步步开发一个可以定制配置的隔行变色小插件
隔行变色功能,不用js,直接用css伪类就可以做,这个实例可以作为js插件开发很好的入门级实例.本文实现的隔行变色包括以下功能: 1,支持2种常用结构共存( div元素 和 表格类型 ) 2,一个页面 ...