原生js-拉勾网首页效果
拉勾网首页公司广告位的悬浮划过效果着实很吸引我。如下(不会做动图!--,感兴趣的可以去拉勾看看):

此处最吸引我的地方在于将鼠标划过上面一排公司列表时,感觉像是绿色的区块跟着你的鼠标移动一样,颇有动感。闲言少续,下面是代码。
css
/*此处简单粗暴的使用了*,此处不是重点^-^*/
*{padding:0;margin:0;}
ul{
text-align: center;
margin: 100px auto 0;
width: 535px;
font-size: 0;
}
li{
position:relative;
display: inline-block;
width:100px;
height: 100px;
overflow: hidden;
background: rgba(0,0,0,0);
z-index:10;
margin: 3px;
}
.bg{
width:100px;
height: 100px;
background: #ccc;
}
p{
position: absolute;
top:0;
left:100%;
width:90px;
height: 80px;
padding:10px 5px;
font-size:20px;
line-height: 24px;
font-weight: bold;
color:#fff;
background: rgba(0,179,138,0.9);
z-index: 1;
}
p em{
display: inline-block;
width: 80px;
border: 3px solid rgba(0, 255, 229, 0.5);
border-radius: 9999px;
}
html
<ul>
<li>
<div class="bg"></div>
<p>智联招聘<em></em></p>
</li>
<li>
<div class="bg"></div>
<p>百度<em></em></p>
</li>
<li>
<div class="bg"></div>
<p>阿里巴巴<em></em></p>
</li>
<li>
<div class="bg"></div>
<p>爱奇艺<em></em></p>
</li>
<li>
<div class="bg"></div>
<p>腾讯<em></em></p>
</li>
<li>
<div class="bg"></div>
<p>搜狐<em></em></p>
</li>
<li>
<div class="bg"></div>
<p>雅虎<em></em></p>
</li>
<li>
<div class="bg"></div>
<p>Google<em></em></p>
</li>
<li>
<div class="bg"></div>
<p>乐视<em></em></p>
</li>
<li>
<div class="bg"></div>
<p>360<em></em></p>
</li>
<li>
<div class="bg"></div>
<p>迅雷<em></em></p>
</li>
<li>
<div class="bg"></div>
<p>Apple<em></em></p>
</li>
<li>
<div class="bg"></div>
<p>Oracle<em></em></p>
</li>
<li>
<div class="bg"></div>
<p>天猫<em></em></p>
</li>
<li>
<div class="bg"></div>
<p>去哪儿网<em></em></p>
</li>
</ul>
js(关键)
//滑动效果组件
var HoverBox=function(){
function fun(out,inner){
this._out=out;
this._inner=inner;
this._speed=0.3;
this._timeout=null;
this._addEvent();
}
fun.prototype={
constructor:fun,
_addEvent:function(){
//0.从上 1.从下 2.从左 3.从右
var _this=this;
_this._out.onmouseenter=function(event){
var pagePos=_this.getPagePos(event);
var pageX=pagePos.pageX,
pageY=pagePos.pageY;
var arrow=_this.getArrow(_this._out,_this.getPos(_this._out),{top:pageY,left:pageX});
clearTimeout(_this._timeout);
switch (arrow){
case 0:
_this._inner.style.cssText='left:0;top:-100%;';
break;
case 1:
_this._inner.style.cssText='left:0;top:100%;';
break;
case 2:
_this._inner.style.cssText='left:-100%;top:0;';
break;
case 3:
_this._inner.style.cssText='left:100%;top:0;';
break;
}
_this._timeout=setTimeout(function(){
_this._inner.style.cssText='top:0;left:0;transition:all ease '+_this._speed+'s;-webkit-transition:all ease '+_this._speed+'s';
},50);
};
_this._out.onmouseleave=function(event){
var pagePos=_this.getPagePos(event);
var pageX=pagePos.pageX,
pageY=pagePos.pageY,
leftSize= 0,topSize=0;
var arrow=_this.getArrow(_this._out,_this.getPos(_this._out),{top:pageY,left:pageX});
clearTimeout(_this._timeout);
switch (arrow){
case 0:
leftSize=0;
topSize='-100%';
break;
case 1:
leftSize=0;
topSize='100%';
break;
case 2:
leftSize='-100%';
topSize=0;
break;
case 3:
leftSize='100%';
topSize=0;
break;
}
_this._inner.style.transition=null;
_this._inner.style.webkitTransition=null;
_this._timeout=setTimeout(function(){
_this._inner.style.cssText='left:'+leftSize+';top:'+topSize+';transition:all ease '+_this._speed+'s;-webkit-transition:all ease '+_this._speed+'s;';
},50);
};
},
//鼠标坐标
getPagePos:function(event){
var event=event||window.event;
var pageX=event.pageX!=null?event.pageX:(event.clientX+document.documentElement.scrollLeft||document.body.scrollLeft),
pageY=event.pageY!=null?event.pageY:(event.clientY+document.documentElement.scrollTop||document.body.scrollTop);
return {
pageX:pageX,
pageY:pageY
}
},
//元素偏移量
getPos:function(element){
var top= 0,left=0;
while(element!=null){
top+=element.offsetTop;
left+=element.offsetLeft;
element=element.offsetParent;
}
return {
top:top,
left:left
}
},
//获取鼠标从哪个方向移入或移出的方块
getArrow:function(ele,elePos,mousePos){
//0.向上 1.向下 2.向左 3.向右
//中心点坐标
var centerL=elePos.left+ele.offsetWidth/2,
centerT=elePos.top+ele.offsetHeight/2;
//偏离中心坐标距离
var devPosL=mousePos.left-centerL,
devPosT=mousePos.top-centerT;
if(devPosT<0 && (Math.abs(devPosT/devPosL)>=1)){
return 0;
}else if(devPosT>0 && (Math.abs(devPosT/devPosL)>=1)){
return 1;
}else if(devPosL<0 && (Math.abs(devPosT/devPosL)<1)){
return 2;
}else if(devPosL>0 && (Math.abs(devPosT/devPosL)<1)){
return 3;
}
}
};
return fun;
}();
var lis=document.getElementsByTagName('li'),
ps=document.getElementsByTagName('p');
//添加相关效果
for(var i=0,len=lis.length;i<len;i++){
new HoverBox(lis[i],ps[i]);
}
我认为此效果的关键之处在于判断鼠标是从哪个方向移入或移出的小块。我的想法是在小块上添加onmouseenter和mouseleave事件,在事件触发时可以获得鼠标的坐标,再通过获取小块相对于页面的偏移和小块的宽高,就可以计算出在事件触发时鼠标相对于小块中心点的偏移量(top和left),以此就可以判断出移入或移出的方向了。
本文章为原创文章,代码均为原创手写,转载请注明出处,谢谢。
原生js-拉勾网首页效果的更多相关文章
- React.js实现原生js拖拽效果及思考
一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...
- 原生JS实现分页效果2.0(新增了上一页和下一页,添加当前元素样式)
虽然写的很烂,但至少全部都是自己写的,因为这个没有固定的顺序,所以就没有封装,如果你技术好的话,可以你写的分享给我,谢谢. <!DOCTYPE html><html lang=&qu ...
- 原生JS实现分页效果1.0
不太完整,写的太急,等等加上完整注释,写起来还是有些难度的,写的有点水,后面再改进改进. <!DOCTYPE html><html lang="en">&l ...
- 原生JS实现弹幕效果
纯属无聊写的,可能有很多问题,欢迎批评指教. 效果图:图一是预设的一些弹幕,图二是自己发射的弹幕,效果是一样的. 首先是弹幕的位置,是要从最右滑到最左,为了防止随机高度弹幕会覆盖的问题,设置了通道 ...
- 原生JS实现"旋转木马"效果的图片轮播插件
一.写在最前面 最近都忙一些杂七杂八的事情,复习软考.研读经典...好像都好久没写过博客了... 我自己写过三个图片轮播,一个是简单的原生JS实现的,没有什么动画效果的,一个是结合JQuery实现的, ...
- 原生js实现的效果
原生js实现tooltip提示框的效果 在js的世界里面,每一个小的特效都那么微不足道,却又那么的令人向往与好奇.前端工程师的任务特别高大上,因为他们的一个小小的设计就会激发别人的求知欲.比如说我 ...
- 原生js仿jquery--animate效果
效果 代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 原生js简易日历效果实现
这里我们将用原生js实现简易的日历,原理和之前的原生js选项卡差不多,不过也有些区别: 首先html代码: <div class="container"> <di ...
- 再谈React.js实现原生js拖拽效果
前几天写的那个拖拽,自己留下的疑问...这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分...就再聊聊拖拽吧 一.不要直接操作dom元素 react中使用了虚拟dom的概念,目 ...
- 原生js显示分页效果
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
随机推荐
- Tinkphp定时发布文章的教程
第一步:在文章表中加一个字段,用来保存定时发布的时间 假定我把这个字段设为 push_time 默认为 0 第二步:写一个方法来检查文章列表,把文章列表到时间的文章改为发布状态 //定时发布文章 pu ...
- select 下拉菜单Option对象使用add(elements,index)方法动态添加
原生js 的add函数为下拉菜单增加选项 1.object.add(oElement [, iIndex]) index 可选参数:指定元素放置所在的索引号,整形值.如果没有指定值,将添加到集合的最后 ...
- HTTP协议学习-03
浏览器访问一个网站,的原理图
- python运维开发之第十天
一.多进程 1.进程模块 multiprocessing 简单的创建一个进程 #!/usr/bin/env python # -*- coding: utf- -*- # @Author : Will ...
- python 深拷贝和浅拷贝浅析
简单点说 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.id会变化2. copy.deepcopy 深拷贝 拷贝对象及其子对象.id会变化 >>> im ...
- JVM笔记-temp
jvm源码分析之堆外内存完全解读 http://lovestblog.cn/blog/2015/05/12/direct-buffer/
- centos7 jsoup java.net.UnknownHostException
[root@localhost ~]# vi /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.loc ...
- 脚本两则--用于快速部署HADOOP,SPARK这些(特别是VM虚拟机模板部署出来的)。。
感觉可能只是适合我自己的部署习惯吧,且只针对CENTOS6及以下版本,以后有时间,可能还是要改进.. 1,从VM的模块产生的虚拟机,如何快速搞定网络配置? #!/bin/bash #usage:./i ...
- 吃了单片机GPIO端口工作模式的大亏 ——关于强推挽输出和准双向口(弱上拉)的实际应用
最近公司在进行一个项目,需要用到超声波测距的功能,于是在做好硬件电路,但在写控制程序时,却遇上了令我费解的事情. 当在单片机最小系统上调好输出频率40kHz,占空比50%的方波输出信号后,将程序烧至超 ...
- BZOJ 1023 [SCOI2009]生日快乐
1024: [SCOI2009]生日快乐 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1729 Solved: 1219[Submit][Statu ...