原生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操作cookie
验证jquery的cookie插件时才知道原先文件一直在桌面上放着执行发现没有效果,文件必须放在web服务器下面执行才会生效,晕菜! $.cookie(name,value,{expires: 7,p ...
- IPv6套接字地址结构
IPv6套接字地址结构 struct in6_addr{ unit8_t sa_addr[16]; }; #define SIN6_LEN struct sockaddr_in6{ unit8_t s ...
- 【Oracle】ORACLE SQL Developer不支持JAVA版本
ORACLE SQL Developer不支持JAVA版本 今天我打开 ORACLE SQL Developer准备开始练手.没有想到却给出了错误提示. 我 是安装了java JDK的而且是1.6版本 ...
- Color the ball
hdu1556:http://acm.hdu.edu.cn/showproblem.php?pid=1556 题意:中文题. 题解:这一题当然可以直接用线段树来打,但是最近在学树状数组,所以用树状数组 ...
- Delphi GDI或图像处理的博客
http://blog.csdn.net/w1028489713/article/category/1918251
- SDUT2087 离散事件模拟-银行管理(模拟)
题目链接. 分析: 模拟. 果然模拟什么的最讨厌了. 用e1,e2分别记录队列1,队列2的结束时间. 每个结点的s记录开始时间,e一开是记录逗留时间,进队列的时候,改成离开的时间.时刻记录总时间就可以 ...
- jQuey事件委托
javascript的事件模型,采用"冒泡"模式,子元素的事件会逐级向上"冒泡",成为父元素的事件. 在需要为较多的元素绑定事件时应该使用事件委托 event ...
- Eclipse无法设置NDK路径的解决方法
如果在Eclipse中设置NDK路径的时候遇到下面的情况(尼玛,我的NDK设置呢?): 可以参考百度经验解决:http://jingyan.baidu.com/article/4d58d5413000 ...
- 【用PS3手柄在安卓设备上玩游戏系列】FC(任天堂NES/FC主机)模拟器
NESoid 是安卓系统下公认最好的FC模拟器.据我所知,现在安卓系统下面的绝大部分的FC模拟器,都是基于 NESoid 的内核来开发的. 官方网站:http://www.nesoid.com NES ...
- c++ map 插入数据后,begin(),end()以及当前迭代器的变化
1. map.end()指向map的最后一个元素之后的地址,无论执行map.erase(iter)还是map.add(key, value),map.end()所返回的值永远不会发生变化,都是指向同一 ...