原生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 ...
随机推荐
- jQuery获取select、checkbox、radio的方法总结
在进行网页的前后台交互的时候,经常需要获取单选框(radio).复选框(checkbox)以及下拉列表(select/dropdownlist)选中的值. 总结了一下,方便以后复习查看: 1.获取选中 ...
- Thinkphp 表单验证
在服务器端通过tp框架实现表单验证 用户名.密码.重复密码.邮箱.qq.手机号码.爱好.学历 具体步骤: 制作表单 表单form数据通过create()方法收集(验证功能要求我们必须通过create( ...
- win10 64bit 安装scrapy-1.1
0.环境说明 win10 64bit,电脑也是64bit的处理器,电脑装有vs2010 64bit,但是为了保险起见,只试验了32位的安装,等有时间了,再试下64位的安装.如无特殊说明,一切操作都是在 ...
- Pyhon + Django 1.7.2 tutorial + virtualenv简单使用
最近工作中要用到python,先前没怎么接触过,把python本身的语法以及特性撸过一边之后,这两天按着django官方的文档倒腾了几天, 文档非常详细,本人英语水平也就那样,大体没什么压力,建议像我 ...
- UVA - 11346 Probability (概率)
Description Probability Time Limit: 1 sec Memory Limit: 16MB Consider rectangular coordinate system ...
- linux c数据库备份第五版
linux下c实现的数据库备份程序终于迎来第五版啦,这样改程序就暂告一段落啦,有点小激动呢...接下来的一周(可能两周)时间里,我会用一个小型的网络游戏(比拼99乘法)作为我学习linux c的毕业之 ...
- out.print和out.write方法
<%@ page language="java" import="java.util.*" %> <%@ page pageEncoding= ...
- 脚本两则--用于快速部署HADOOP,SPARK这些(特别是VM虚拟机模板部署出来的)。。
感觉可能只是适合我自己的部署习惯吧,且只针对CENTOS6及以下版本,以后有时间,可能还是要改进.. 1,从VM的模块产生的虚拟机,如何快速搞定网络配置? #!/bin/bash #usage:./i ...
- COJ 3016 WZJ的图论问题
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1046 试题描述: WZJ又有一个问题想问问大家.WZJ用数据生成器生成了一 ...
- 【转】ubuntu打包压缩命令总结
原文网址:http://blog.csdn.net/renero/article/details/6428523 .tar解包:tar xvf FileName.tar打包:tar cvf FileN ...