前言

突然想起来之前看到拉钩网上的hot_info(不知道该叫什么,但是拉钩网上这个divclasshot_info),感觉实现起来还是比较轻松简单的,效果也不错,于是简单模仿了一下。就不截图了,有兴趣的可以去拉钩网看看效果。模仿的效果可以点这里

技术

主要是用了jQuery。动画部分是animate()来实现的。

判断进入div的方向

首先用jQuery的offset()方法获得元素相对于页面的坐标;然后用event对象的pageXpageY属性,这是鼠标进入元素的相对于页面的坐标。要注意的是这两个坐标的值都是浮点型(当然也有直接进入div内部的情况,鼠标滚轮啊之类的),显然只能比较距离,判断距离最近的就是进入的方向。

function judgeD(item, event) {
//判斷方向
var $this = $(item);
var outx = event.pageX;
var outy = event.pageY;
var offset = $this.offset();
var itemx = offset.left;
var itemy = offset.top;
var width = parseInt($this.css('width'));
var height = parseInt($this.css('height'));
var min = {
d: 'left',
val: Math.abs(outx - itemx)
}
var tempVal = Math.abs(outy - itemy);
if (tempVal < min.val) {
min.d = 'top';
min.val = tempVal;
}
var tempVal = Math.abs(outx - width - itemx);
if (tempVal < min.val) {
min.d = 'right';
min.val = tempVal;
}
var tempVal = Math.abs(outy - height - itemy);
if (tempVal < min.val) {
min.d = 'bottom';
min.val = tempVal;
}
return min.d;
};

动画

动画就不多说了。。,这个方法有些太长了。其中的flag是为了在快速移出移入的时候不闪烁,并且更自然一些。

function move($target, d, f, flag) {
$target.show().stop(true);
if (!flag) {
switch(f) {
case 'left':
$target.css({
top: 0,
left: '-100%'
});
break;
case 'right':
$target.css({
top: 0,
left: '200%'
});
break;
case 'top':
$target.css({
top: '-100%',
left: 0
});
break;
case 'bottom':
$target.css({
top: '200%',
left: 0
});
break;
case 'center':
$target.css({
top: 0,
left: 0
});
break;
}
}
var easing = 'swing';
switch(d) {
case 'left':
$target.animate({
top: 0,
left: '-100%'
}, {
speed: 500,
easing: easing,
});
break;
case 'right':
$target.animate({
top: 0,
left: '200%'
}, {
speed: 500,
easing: easing,
});
break;
case 'top':
$target.animate({
top: '-100%',
left: 0
}, {
speed: 500,
easing: easing,
});
break;
case 'bottom':
$target.animate({
top: '200%',
left: 0
}, {
speed: 500,
easing: easing,
});
break;
case 'center':
$target.animate({
top: 0,
left: 0
}, {
speed: 500,
easing: easing,
});
break;
}
}

绑定事件

$(function() {
$('.test_item').hover(function(event) {
var d = judgeD(this, event);
var $target = $(this).find('.test_inner');
move($target, 'center', d);
}, function(event) {
var d = judgeD(this, event);
var $target = $(this).find('.test_inner');
move($target, d, 'center', true);
});
});

css

html, body {
width: 100%;
height: 100%;
} .test_item {
width: 30%;
height: 30%;
overflow: hidden;
background: #333;
position: relative;
float: left;
margin: 15px;
} .test_item .test_inner {
width: 100%;
height: 100%;
top: 100%;
left: 100%;
background: #1fa67a;
position: absolute;
}

html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<link rel="stylesheet" href="css/test.css">
</head>
<body>
<!-- Emmet -->
(.test_item>.test_inner)*12
<script type="text/javascript" src="js/jquery-3.1.1.js"></script>
</body>
</html>

还需改进的地方

除了有个方法太长了,还有其他一些需要改进的地方(其实是太懒了懒得改了):

  1. 首先是污染了全局环境,闭包或者封装成对象都可解决。
  2. 绑定的事件有点多(是指每一个.test_item元素上都绑定了两个事件处理函数)。因为mouseovermouseout是会冒泡的,因此增加一个包装层,在包装层上绑定事件,再用event.target来获得目标就行。

简单模仿拉钩网上的“hot_info”的更多相关文章

  1. 爬取拉钩网上所有的python职位

    # 2.爬取拉钩网上的所有python职位. from urllib import request,parse import json,random def user_agent(page): #浏览 ...

  2. react-native 模仿原生 实现下拉刷新/上拉加载更多(RefreshListView)

    1.下拉刷新/上拉加载更多 组件(RefreshListView) src/components/RefreshListView/index.js /** * 下拉刷新/上拉加载更多 组件(Refre ...

  3. RecyclerView下拉刷新上拉加载(三)—对Adapter的封装

    RecyclerView下拉刷新上拉加载(一) http://blog.csdn.net/baiyuliang2013/article/details/51506036 RecyclerView下拉刷 ...

  4. RecyclerView 下拉刷新上拉加载

    步骤: 首先直接定义一个XRecyclerView继承RecyclerView,重写他的三个构造方法. init(Context mContext)方法用来初始化底部加载的view 回到XRecycl ...

  5. JS+CSS实现的下拉刷新/上拉加载插件

    闲来无事,写了一个当下比较常见的下拉刷新/上拉加载的jquery插件,代码记录在这里,有兴趣将代码写成插件与npm包可以留言. 体验地址:http://owenliang.github.io/pull ...

  6. 基于SwiperJs的H5/移动端下拉刷新上拉加载更多的效果

    最早时,公司的H5项目中曾用过点击一个"加载更多"的DOM元素来实现分页的功能,后来又用过网上有人写的一个上拉加载更多的插件,那个插件是页面将要滚动到底部时就自动请求数据并插入到页 ...

  7. 移动端下拉刷新上拉加载-mescroll.js插件

    最近无意间看到有这么一个上拉刷新下拉加载的插件 -- mescroll.js,个人感觉挺好用的,官网地址是:http://www.mescroll.com 然后我就看了一下文档,简单的写了一个小dem ...

  8. ListView下拉刷新上拉加载更多实现

    这篇文章将带大家了解listview下拉刷新和上拉加载更多的实现过程,先看效果(注:图片中listview中的阴影可以加上属性android:fadingEdge="none"去掉 ...

  9. listview下拉刷新上拉加载扩展(三)-仿最新版美团外卖

    本篇是基于上篇listview下拉刷新上拉加载扩展(二)-仿美团外卖改造而来,主要调整了headview的布局,并加了两个背景动画,看似高大上,其实很简单: as源码地址:http://downloa ...

随机推荐

  1. C++设计实现算法时易犯错误

    1.未初始化 指针未初始化为NULL,造成判断条件出错 数值未初始化为0,造成数组超界,内存泄漏 2. long long输入时 lld or I64d 写成d一定出错 3.gcc编译报错:程序中有游 ...

  2. LightOJ 1166 Old Sorting 置换群 或 贪心 水题

    LINK 题意:给出1~n数字的排列,求变为递增有序的最小交换次数 思路:水题.数据给的很小怎么搞都可以.由于坐标和数字都是1~n,所以我使用置换群求循环节个数和长度的方法. /** @Date : ...

  3. hadoop之安全篇

    ---------------持续更新中------------------- hadoop集群安全架构 如下图所示: --------------------------未完待续---------- ...

  4. 用ajax、PHP、session做购物车

    购物车网页代码 1.登录界面login.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  5. MySql 复制表命令

    1.只复制表结构到新表 CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2; 或 CREATE TABLE 新表 LIKE 旧表 ; 注意上面两种方式,前一种方式是不 ...

  6. 洛谷 1.5.1 Number Triangles 数字金字塔

    Description 考虑在下面被显示的数字金字塔. 写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大. 每一步可以走到左下方的点也可以到达右下方的点. 7 3 8 8 1 0 ...

  7. nth-child,nth-last-child,only-child,nth-of-type,nth-last-of-type,only-of-type,first-of-type,last-of-type,first-child,last-child伪类区别和用法

    我将这坨伪类分成三组,第一组:nth-child,nth-last-child,only-child第二组:nth-of-type,nth-last-of-type,第三组:first-of-tpye ...

  8. iOS中UITabelView

    1.概述 继承自UIScrollView,只能显示一列数据,只能纵向滑动.堪称UIKit里面最复杂的一个控件了,使用起来不算难,但是要用好并不容易.当使用的时候我们必须要考虑到后台数据的设计,tabl ...

  9. ../include/squid_md5.h:27:2: error: #error Cannot find OpenSSL MD5 headers【squid安装中】

    ../include/squid_md5.h:27:2: error: #error Cannot find OpenSSL MD5 headers yum install -y openssl* w ...

  10. 【IT公司笔试面试】75道逻辑推理题及答案

    [1]假设有一个池塘,里面有无穷多的水.现有2个空水壶,容积分别为5升和6升.问题是如何只用这2个水壶从池塘里取得3升的水. 由满6向空5倒,剩1升,把这1升倒5里,然后6剩满,倒5里面,由于5里面有 ...