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

此处最吸引我的地方在于将鼠标划过上面一排公司列表时,感觉像是绿色的区块跟着你的鼠标移动一样,颇有动感。闲言少续,下面是代码。

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-拉勾网首页效果的更多相关文章

  1. React.js实现原生js拖拽效果及思考

    一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...

  2. 原生JS实现分页效果2.0(新增了上一页和下一页,添加当前元素样式)

    虽然写的很烂,但至少全部都是自己写的,因为这个没有固定的顺序,所以就没有封装,如果你技术好的话,可以你写的分享给我,谢谢. <!DOCTYPE html><html lang=&qu ...

  3. 原生JS实现分页效果1.0

    不太完整,写的太急,等等加上完整注释,写起来还是有些难度的,写的有点水,后面再改进改进. <!DOCTYPE html><html lang="en">&l ...

  4. 原生JS实现弹幕效果

    纯属无聊写的,可能有很多问题,欢迎批评指教. 效果图:图一是预设的一些弹幕,图二是自己发射的弹幕,效果是一样的.   首先是弹幕的位置,是要从最右滑到最左,为了防止随机高度弹幕会覆盖的问题,设置了通道 ...

  5. 原生JS实现"旋转木马"效果的图片轮播插件

    一.写在最前面 最近都忙一些杂七杂八的事情,复习软考.研读经典...好像都好久没写过博客了... 我自己写过三个图片轮播,一个是简单的原生JS实现的,没有什么动画效果的,一个是结合JQuery实现的, ...

  6. 原生js实现的效果

    原生js实现tooltip提示框的效果   在js的世界里面,每一个小的特效都那么微不足道,却又那么的令人向往与好奇.前端工程师的任务特别高大上,因为他们的一个小小的设计就会激发别人的求知欲.比如说我 ...

  7. 原生js仿jquery--animate效果

    效果 代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  8. 原生js简易日历效果实现

    这里我们将用原生js实现简易的日历,原理和之前的原生js选项卡差不多,不过也有些区别: 首先html代码: <div class="container"> <di ...

  9. 再谈React.js实现原生js拖拽效果

    前几天写的那个拖拽,自己留下的疑问...这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分...就再聊聊拖拽吧 一.不要直接操作dom元素 react中使用了虚拟dom的概念,目 ...

  10. 原生js显示分页效果

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

随机推荐

  1. 让织梦CMS的后台编辑器支持优酷视频

    最近做了一些视频教程传到优酷网站上,但我想引入这些视频教程到我的网站,在发表时我发现织梦CMS自带的编辑器又不直接支持优酷等视频网站的引用.所以为了方便教程的发布,特意在网站搜索到本篇教程,详细讲解如 ...

  2. HDU-2054 A==B?

    #include<stdio.h>#include<string.h>char n[100000], m[100000];int main(){ int i, j, len_n ...

  3. iOS开发——OC篇&纯代码退出键盘

    关于iOS开发中键盘的退出,其实方法有很多中,而且笔者也也学会了不少,包括各种非纯代码界面的退出. 但是最近开始着手项目的时候却闷了,因为太多了,笔者确实知道有很多中方法能实现,而且令我影响最深的就是 ...

  4. 【Maven实战】Maven开发环境的搭建和案例展示

    1.首先到www.apache.org中下载maven,得到一个apache-maven-3.1.0-bin.zip的压缩包. 2.将此压缩包解压,这里解压到D:\docs中,然后找到maven的bi ...

  5. ANDROID与.Net之间JSON实践

    Asp.Net端: JsonHelper.cs using System.Runtime.Serialization.Json; using System.IO; using System.Text; ...

  6. windows下和linux下 Redis 安装

    Redis 是一个高性能的key-value数据库, 使用内存作为主存储,数据访问速度非常快,当然它也提供了两种机制支持数据持久化存储.比较遗憾的是,Redis项目不直接支持Windows,Windo ...

  7. (转载)偏序集的Dilworth定理学习

    导弹拦截是一个经典问题:求一个序列的最长不上升子序列,以及求能最少划分成几组不上升子序列.第一问是经典动态规划,第二问直接的方法是最小路径覆盖, 但是二分图匹配的复杂度较高,我们可以将其转化成求最长上 ...

  8. (2015年郑州轻工业学院ACM校赛题) C 数列

    在我们做完B题之后就去看C题了, 发现很多人都已经做出来了, 并且一血还是我们学弟拿的, 感觉这题不难, 我们举了几个例子之后发现全是Alice 然后我们就决定意淫一下,试试看! 没想到就A了 - . ...

  9. windows7中的“mklink命令” 转

    从 Vista 以后,微软将用户文件和用户的软件配置( AppData ) 明确划分开,并且全部存放在使用者的用户目录下. Linux早已这样做了,并且在Linux中可将 home 挂载为独立分区,而 ...

  10. 调侃Cookie

    近期看着某些小朋友那琢急的学习心态,瞬间发文一篇,谨此以助小朋友早日有成! 闲话不扯远,实话见真言,晃悠许久觉得开头还是谈谈Cookie这只菜篮,而且是一只私家菜篮,为啥说它是一只菜篮呢,各位看官必定 ...