原生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选择器专题
$(“p”).addClass(css中定义的样式类型); 给某个元素添加样式$(“img”).attr({src:”test.jpg”,alt:”test Image”}); 给某个元素添加属性/值 ...
- Maven 安装记
java初学者 昨天通m2e插件把maven项目导入eclipse的时候各种bug,看了各家技术博客,决定安装maven好好了解下. 安装maven也是一波三折的,先是看各种安装指导,结果环境变量都没 ...
- Foreign Exchange(交换生换位置)
Foreign Exchange Your non-profit organization (iCORE - international Confederation of Revolver Enth ...
- ARM9的MMU
一 页表 1. 页表是放置在RAM(一般为DRAM)中的一个数据段. 2. ARM的地址空间为2^32字节,即4G字节. 3. 一级页表总共有4096条记录,每条记录对应的地址块为1M,一级页表中的记 ...
- PIL Image 转成 wx.Image、wx.Bitmap
import wx from PIL import Image def ConvertToWxImage(): pilImage = Image.open('1.png') image = wx.Em ...
- linux下的工具总结
1. 编译阶段 gcc: -Wall -Werror -O2 make nm: nm -C a.o c++filt strip objdump readelf 2. 链接 ldd: ldd ./a.o ...
- jQuery plugin
SidebarJS http://makotot.github.io/sidebar/
- 玩了一下SDN:MININET+FLOODLIGHT,感觉这确实是一个趋势啊
功能用增加中间层的方案来解决. 仿佛回到用交换机和路由器模拟器的感觉. 遇到执行命令小问题,狗哥搞定: mininet>mininet> dpctl dump-flows tcp:127. ...
- 转:implementing cons/car/cdr without explicit storage
I know this is old wine but it’s just too cool! It elegantly demonstrates closure and higher-order f ...
- Android新浪微博客户端(四)——添加多个账户及认证
原文出自:方杰| http://fangjie.info/?p=75转载请注明出处 二.获取用户信息并保存数据库 上面说到加载AuthActivity有两种情况,其中一种就是授权成功回调,在授权回调成 ...