这是一个基于jQuery的效果,当鼠标在小图片上悬停时,会弹出一个大图,该大图会跟随鼠标的移动而移动。这个效果最初源于小敏同志的一个想法,刚开始做的时候只能实现弹出的图片是固定的,不能随鼠标移动,最后加以改善,终于实现了比较理想的效果。今天就把制作该效果的经验与大家一同分享。先看看最终效果演示:
HTML结构部分:
先编写一个无序列表的结构,a标签中的img标签用来存放小图片,a标签添加一个rel属性,用来存放大图片的路径。
2 |
<li><a href="http://stylechen.com/" class="smallimage" rel="images/001_big.jpg"><img src="images/001_small.jpg" alt=""></a></li> |
4 |
<li><a href="http://stylechen.com/" class="smallimage" rel="images/002_big.jpg"><img src="images/002_small.jpg" alt=""></a></li> |
6 |
<li><a href="http://stylechen.com/" class="smallimage" rel="images/003_big.jpg"><img src="images/003_small.jpg" alt=""></a></li> |
CSS样式表部分:
bigimage是用jQuery创建的一个p标签的id,用来存放大图片,设置其样式为绝对定位,并先隐藏。给a标签添加一个黑色的背景,是为了给图片变暗的效果做铺垫。就这样,一个简单的相册效果就做好了。
1 |
ul#gallery { list-style:none; width:660px; margin:0 auto 10px; padding-left:20px; border:1px solid #d3d3d3; background:#fff; overflow:hidden; } |
3 |
ul#gallery li { width:200px; height:200px; float:left; margin:20px 20px 20px 0; } |
5 |
ul#gallery li a.smallimage { background:#333; /*添加一个黑色的背景为图片变暗的效果做铺垫*/ display:block; width:200px; height:200px; } |
7 |
#bigimage { position:absolute; display:none; /*大图片的父标签设置相对定位并将显示样式设置为隐藏*/ } |
9 |
#bigimage img { width:400px; height:400px; padding:5px; background:#fff; border:1px solid #e3e3e3; } |
jQuery代码部分:
先声明2个变量x,y用来存放大图片离鼠标的距离。在body中追加一个id为bigimage的p标签,用来存放大图片,大图片的路径就包含在了a标签的rel属性中。当鼠标在小图片悬停的时候,将获取到的鼠标在浏览器中的坐标赋值给大图片绝对定位的坐标,并以淡入的效果显示。之后,再给小图片绑定一个mousemove事件,也就是当鼠标移动的时候,大图片就会跟着鼠标移动了。看以下的代码:
02 |
<script type="text/javascript"> |
09 |
$("a.smallimage").hover(function(e){ //绑定一个鼠标悬停时事件 |
10 |
//新建一个p标签来存放大图片,this.rel就是获取到a标签的大图片的路径,然后追加到body中 |
11 |
$("body").append("<p id="bigimage"><img src="" this.rel "" alt="" /></p>"); |
13 |
//改变小图片的透明度为0.5,结合上面的CSS,看起来就象是图片变暗了 |
14 |
$(this).find("img").stop().fadeTo("slow",0.5); |
16 |
//将鼠标的坐标和声明的x,y做运算并赋值给大图片绝对定位的坐标,然后以fadeIn的效果显示 |
17 |
$("#bigimage").css({top:(e.pageY - y ) "px",left:(e.pageX x ) "px"}).fadeIn("fast"); |
22 |
$(this).find("img").stop().fadeTo("slow",1); |
25 |
$("#bigimage").remove(); |
28 |
$("a.smallimage").mousemove(function(e){ //绑定一个鼠标移动的事件 |
30 |
//将鼠标的坐标和声明的x,y做运算并赋值给大图片绝对定位的坐标,这样大图片就能跟随图片而移动了 |
31 |
$("#bigimage").css({top:(e.pageY -y ) "px",left:(e.pageX x ) "px"}); |
到这一步,效果已经差不多了,但是正如蓝秋枫同志提到的,效果还并不完美。如果弹出的大图片超过了浏览器的宽度就会出现滚动条,这对于用户体验来说的确很不好。趁周末有时间我又在原来的基础上进行了修改。
先分析下思路,默认情况下,弹出的大图片的位置始终是在当前鼠标指针的右侧,如果当前鼠标指针离浏览器右侧边界的宽度小于弹出的大图片的宽度时,就会出现图片溢出浏览器的现象。那么只要写一个语句判断当前鼠标指针离浏览器右侧的边界的宽度是否小于大图片的宽度,然后再根据这个判断来显示。
有了上面的思路就好办了,为了使代码更简洁,提高复用性,我新增了一个widthJudge函数用于判断宽度:
01 |
function widthJudge(e){ |
02 |
//页面的总宽度减去鼠标当前的X坐标得到右侧边界的宽度 |
03 |
var marginRight = document.documentElement.clientWidth - e.pageX; |
06 |
var imageWidth = $("#bigimage").width(); |
08 |
//如果右侧边界的宽度小于弹出的大图片的宽度 |
09 |
if(marginRight < imageWidth) |
14 |
//此时大图片的位置应该是当前鼠标指针的宽度减去新的x的值 |
15 |
$("#bigimage").css({top:(e.pageY - y ) "px",left:(e.pageX - x ) "px"}); |
17 |
//仍将x定义为22,这一步千万不能省略,因为之前x的值已经改变 |
20 |
//如果右侧的宽度值够显示大图片,将仍然按照原来的位置显示 |
21 |
$("#bigimage").css({top:(e.pageY - y ) "px",left:(e.pageX x ) "px"}); |
最后再结合上面的代码,完整的jQuery代码部分如下:
01 |
<script type="text/javascript"> |
08 |
$("a.smallimage").hover(function(e){ |
09 |
$("body").append("<p id="bigimage"><img src="" this.rel "" alt="" /></p>"); |
10 |
$(this).find("img").stop().fadeTo("slow",0.5); |
11 |
widthJudge(e); //调用宽度判断函数 |
12 |
$("#bigimage").fadeIn("fast"); |
14 |
$(this).find("img").stop().fadeTo("slow",1); |
15 |
$("#bigimage").remove(); |
18 |
$("a.smallimage").mousemove(function(e){ |
19 |
widthJudge(e); //调用宽度判断函数 |
22 |
function widthJudge(e){ |
23 |
var marginRight = document.documentElement.clientWidth - e.pageX; |
24 |
var imageWidth = $("#bigimage").width(); |
25 |
if(marginRight < imageWidth) |
28 |
$("#bigimage").css({top:(e.pageY - y ) "px",left:(e.pageX - x ) "px"}); |
31 |
$("#bigimage").css({top:(e.pageY - y ) "px",left:(e.pageX x ) "px"}); |
解决了图片溢出浏览器的问题,这个效果还算不错了。如果你喜欢这个效果,你可以下载源文件。
- jQuery的鼠标悬停时放大图片的效果
这是一个基于jQuery的效果,当鼠标在小图片上悬停时,会弹出一个大图,该大图会跟随鼠标的移动而移动.这个效果最初源于小敏同志的一个想法,刚开始做的时候只能实现弹出的图片是固定的,不能随鼠标移动,最后 ...
- 【学习笔记01】:hover为DIV添加鼠标悬停时改变颜色的效果
:hover所有主流浏览器都支持(IE6.0以下支持不好,以后再学习用Javascript来实现悬停效果) 这是一个绿色底白色Icon的搜索按钮
- 使用 jQuery 操作页面元素的方法,实现浏览大图片的效果,在页面上插入一幅小图片,当鼠标悬停到小图片上时,在小图片的右侧出现与之相对应的大图片
查看本章节 查看作业目录 需求说明: 使用 jQuery 操作页面元素的方法,实现浏览大图片的效果,在页面上插入一幅小图片,当鼠标悬停到小图片上时,在小图片的右侧出现与之相对应的大图片 实现思路: 在 ...
- 一款基于jquery的鼠标经过图片列表特效
今天要给大家推荐一款基于jquery的鼠标经过图片列表特效.当鼠标经过列表图片的时候,图片放大,且有一个半透明的遮罩层随之移动.效果图如下: 在线预览 源码下载 实现的代码 html代码: < ...
- jQuery css3鼠标悬停图片显示遮罩层动画特效
jQuery css3鼠标悬停图片显示遮罩层动画特效 效果体验:http://hovertree.com/texiao/jquery/39/ 效果图: 源码下载:http://hovertree.co ...
- 基于jQuery向下弹出遮罩图片相册
今天给大家分享一款基于jQuery向下弹出遮罩图片相册.单击相册图片时,一个遮罩层从上到下动画出现.然后弹出显示图片.这款插件适用浏览器:IE8.360.FireFox.Chrome.Safari.O ...
- 基于jQuery CSS3鼠标点击动画效果
分享基于jQuery CSS3鼠标点击动画效果支持图片或内容滑动,允许设置动画延迟效果.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div class="co ...
- 在循环中使用鼠标悬停时表示当前悬停选中,传入this关键字即可
在前端循环中使用鼠标悬停事件 <div class="message-widget contact-widget"> <!-- Message --> {% ...
- 基于jQuery点击图像居中放大插件Zoom
分享一款基于jQuery点击图像居中放大插件Zoom是一款放大的时候会从原图像的位置以动画方式放大到画面中间,支持点击图像或者按ESC键来关闭效果.效果图如下: 在线预览 源码下载 实现的代码. ...
随机推荐
- C#LeetCode刷题之#206-反转链表(Reverse Linked List)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3828 访问. 反转一个单链表. 输入: 1->2-> ...
- 《JavaScript语言入门教程》记录整理:面向对象
目录 面向对象编程 实例对象与 new 命令 this关键字 对象的继承 Object对象的方法 严格模式(strict mode) 本系列基于阮一峰老师的<JavaScrip语言入门教程> ...
- JavaScript基础-01
1. Javascript是一门动态的.弱类型的.解释型的脚本语言 动态:数据类型在运行时决定 弱类型:变量数据的类型不是确定的,可以随意的进行改变: 解释型:相对编译型来说,编译型计算机在执行之前需 ...
- 性能测试必备知识(10)- Linux 是怎么管理内存的?
做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 内存映射 日常生活常说的内存是什么 比方说, ...
- 【Spring】看了这篇Spring事务原理,我才知道我对Spring事务的误解有多深!
写在前面 有很多小伙伴们留言说,冰河,你能不能写一篇关于Spring事务的文章呢?我:可以啊,安排上了!那还等什么呢?走起啊!! 事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有 ...
- CopyOnWriteArrayList源码阅读笔记
简介 ArrayList是开发中使用比较多的集合,它不是线程安全的,CopyOnWriteArrayList就是线程安全版本的ArrayList.CopyOnWriteArrayList同样是通过数组 ...
- 4.设置静态IP
由于Ubuntu重启之后,ip很容易改变,可以用以下方式固定ip地址 1.设置ip地址 vi /etc/network/interface # The loopback network interfa ...
- maven命令下载jar包
mvn install:install-file -Dfile=jar包保存的本地路径 -DgroupId=jar保存的父级路径 -DartifactId=jar包文件夹名称 -Dversion=版本 ...
- random模块python
random是用于生成随机数的,我们可以利用它随机生成数字或者选择字符串. random.random() 用于生成一个随机浮点数:range[0.0,1.0) ? 1 2 import ran ...
- 要点4:C的文件操作
关于文件操作个人比较困惑的地方有两点: 关于w和wb的区别 如何定位文件的读写位置 文件格式和打开模式 c中的文件打开模式分为:文本模式和二进制模式,分别处理文本格式文件和二进制格式文件. 两个模式的 ...