非常漂亮的相册集 使用jquery制作相册集


Posted in Javascript onApril 28, 2016

一、简单的图像翻滚

image-rollover常被用在交互式导航栏上,当我们的鼠标移动到导航栏时,按钮的外观改变。例如我们以如下几幅黑白缩略图作为导航图表,当鼠标移动到指定图标时,图标变为明亮的彩色图片。预览如下:

非常漂亮的相册集 使用jquery制作相册集

该页面的代码十分简单,我们以此为例逐步实现图像的翻滚:

img-rollover.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Rollover Images</title>
<style>
html , body{
  line-height: 1;
  background-color: #334873;
}

h1 {
  font-family: 'ColaborateRegular', Arial, sans-serif;  
}

p {
  font-family: 'ColaborateRegular', Arial, sans-serif;
  color: white;
}

.logo {
  letter-spacing: -1px;
  color: rgb(195,151,51);
  text-shadow: 2px 2px 1px rgba(0,0,0,.25);
  font: normal 54px 'ColaborateThinRegular', Arial, sans-serif;
}

#gallery img {
  display: inline-block;
  margin: 10px;
  border: 1px solid rgb(0,0,0);
}
</style>

<script src="js/jquery-1.7.2.min.js"></script>
<script>
$(ducument).ready(

);//end ready
</script>
</head>
<body>
<div class="wrapper">
<div class="header">
  <p class="logo">Easy Sir</p>
</div>


<div class="content">
  <div class="main">
    <h1>Rollover Images</h1>
    <p>Mouse over the images below</p>
    <div id="gallery"> 
     <a href="images/blue.jpg"><img src="images/blue.jpg" width="70" height="70" alt="blue">
     </a> 
     <a href="images/green.jpg"><img src="images/green.jpg" width="70" height="70" alt="green">
     </a> 
     <a href="images/orange.jpg"><img src="images/orange.jpg" width="70" height="70" alt="orange">
     </a> 
     <a href="images/purple.jpg"><img src="images/purple.jpg" width="70" height="70" alt="purple">
     </a> 
     <a href="images/red.jpg"><img src="images/red.jpg" width="70" height="70" alt="red">
     </a> 
     <a href="images/yellow.jpg"><img src="images/yellow.jpg" width="70" height="70" alt="yellow"></a>
    </div>
  </div>
</div>
</div>
</body>
</html>

这段代码十分简单。主要就是包含一个Logo部分,一个标题和6个<a>链接。中间我们省略了38行中的jQuery代码部分,下面我们逐步在其中添加代码实现图像翻滚的效果。

1、改变图像的src属性

我们知道显示在Web页面的每一个图像都有一个src属性,该属性表示文件的路径,它指向服务器上的一幅图片。如果我们更改了该属性的值,浏览器将会显示新的图片。对于以上代码,我们首先可以通过each()函数获取所有img元素的遍历,在对应位置添加如下代码:

<script>
 $(document).ready(function(){
  $('#gallery img').each();
 });//end ready
</script>

我们可以通过jQuery的arrt()方法来获取img的src属性。然后,我们将以上img的src属性值替换为新图片的路径,方法如下:

<script>
 $(document).ready(function(){
  $('#gallery img').each(function(){
   var oldSrc = $(this).attr('src');
   var newPic = new Image();
   var imgExt = /(\.\w{3,4}$)/;
   newPic.src = oldSrc.replace(imgExt, '_h$1');
  });
 });//end ready
</script>

后面的图像预载入中会有这段代码的简单分析,这里首先复习一下,attr()函数允许读取一个标签的指定html属性值,如上例中传入的'src'参数即读取图片的src属性。如果给attr()方法传入第二个参数,则可以重设该属性的值。比如:

$('#pic1').attr('src', 'images/newImg.jpg');

另外,attr()函数也允许我们一次修改多个HTML属性值。比如,当我们需要载入的newImg和oldImg尺寸不符的时候,为了避免新图片的扭曲,我们可以同时更改img元素的宽、高属性。方法如下,传入一个对象直接量作为参数:

var newImg = new Image();
newImg.src = 'images/newImage.jpg';
$('#pic1').attr({
  src: newImg.src,
  width: newImg.width,
  height: newImg.height
});

2、图像预载入

如果我们不加”心机”地在鼠标移动到指定图片时改变图像的src属性来实现image-rollover,会有一个小问题。当我们把鼠标移动到指定图标上时,该图像的src属性被改变,此时浏览器会去新的src路径下载资源图片,现场下载图片往往会给用户一个明显的延迟感。为了克服这个恼人的问题,我们可以预先将图片下载到浏览器的缓存中。

实际上,在代码2中,我们便实现了图片的预载入。代码2中的第4行,首先获取每幅图片的src属性;第5行创建一个新图像;第6~7行,使用正则表达式,在旧图像src末尾添加_h后赋给新创建图像的src。例如旧图片src为'images/blue.jpg',将'images/blue_h.jpg'赋给新创建的newPic的src属性。

代码执行到'newPic.src = oldSrc.replace(imgExt, ‘_h$1');'时,浏览器便会到指定的src去下载新图片放在浏览器缓存中。此时尚未触发鼠标事件,我们通过在脚本开始处将需要的图片逐一下载实现图像的预载入。

3、添加hover()事件实现图像rollover

在完成图像预载入后,接下来就是给需要翻滚的图片添加一个hover事件了。当鼠标移动到指定的图片时,图片变为绚丽的彩色,移走时变回黑白。我们在代码2的基础上,作如下添加:

$(document).ready(function(){
  $('#gallery img').each(function(){
   var oldSrc = $(this).attr('src');
   var newPic = new Image();
   var imgExt = /(\.\w{3,4}$)/;
   newPic.src = oldSrc.replace(imgExt, '_h$1');
   $(this).hover(
    function(){
     $(this).attr('src', newPic.src);
    },
    function(){
     $(this).attr('src', oldSrc);
    }
   );//end hover
  });
 });//end ready

代码十分简单,只不过在7~14行通过this给当前图片添加了一个hover事件,鼠标移入移出时改变图片的src。此时,保存添加后的img-rollover.html,注意将需要包含的js/jquery-1.7.2.min.js以及图片资源按照代码中指定的路径放置完好。大功告成,可以像预览图片那样测试图片导航图片翻滚的效果了。

二、漂亮的相册集

在实现图像的翻滚之后,我们希望进一步,当我们点击小的缩略图的时候,能够展现图片的大图,像一个可以翻看的相册一样。预览如下:

非常漂亮的相册集 使用jquery制作相册集

接下来我们在实现了小图翻滚的代码1的基础上,增添相册集的功能。

1、为什么要把img放在链接中

可能有人不理解,为什么要把img分别包含在<a>链接中。实际上这是一种无干扰的JavaScript技术,如果你的浏览器关闭了JavaScript,这里将图像包含在一个链接中,当用户点击小图的时候,同样会访问到大图文件。只不过是通过链接的方式,单击链接时会退出当前Web页面并根据链接载入大图文件。如下图所示:

非常漂亮的相册集 使用jquery制作相册集

以上是为关闭了JavaScript的用户准备的。然而在通常情况下,对于使用JS的访问者,我们希望单击小的缩略图的时候在页面上呈现该图的大图,而不是链接到另一个页面。一般情况下,单击一个链接会使Web浏览器载入链接指向的内容,所以此处第一步我们需要做的就是阻止浏览器在单击图片链接的时候跳转页面。我们使用事件的preventDefault()方法来阻止事件的常规行为,添加如下代码:

$(document).ready(function(){
  ...//省略未改动部分

  $('#gallery a').click(function(evt){
   evt.preventDefault();
  });//end click

 });//end ready

添加的代码为链接添加单击事件,单击链接时,通过事件的preventDefault()方法阻止了事件的常规行为。此时我们再在页面单击图片链接的时候,浏览器便不会跳转到大图页面了。当然,对于没有JavaScript的浏览器依然会实现跳转,因为关闭是通过JavaScript来完成的。

2、单击缩略图在页面呈现大图

为了显示大图,我们在上面代码基础上添加一个id为bigImg的div,如代码4第9行:

<div id="gallery"> 
 <a href="images/blue.jpg"><img src="images/blue.jpg" width="70" height="70" alt="blue"></a> 
 <a href="images/green.jpg"><img src="images/green.jpg" width="70" height="70" alt="green"></a> 
 <a href="images/orange.jpg"><img src="images/orange.jpg" width="70" height="70" alt="orange"></a> 
 <a href="images/purple.jpg"><img src="images/purple.jpg" width="70" height="70" alt="purple"></a> 
 <a href="images/red.jpg"><img src="images/red.jpg" width="70" height="70" alt="red"></a> 
 <a href="images/yellow.jpg"><img src="images/yellow.jpg" width="70" height="70" alt="yellow"></a>
</div>
<div id="bigImg"><div>

接下来,我们通过jQuery为要显示的大图创建一个img标签,在代码3中添加如下代码:

...//省略未改动部分

  $('#gallery a').click(function(evt){
   evt.preventDefault();
   var imgPath = $(this).attr('href');
   var newImg = $('<img src="' + imgPath + '">');
   newImg.hide();
   $('#bigImg').prepend(newImg);
   newImg.fadeIn(1000);
  });//end click

在代码5的第5行,首先通过attr()函数获取<a>的href属性,即链接地址imgPath;第6行根据该连接地址创建一个img标签,将该标签的src属性赋值为imgPath;第7行,首先将图片隐藏,后面将通过淡入的方式华丽出现;第8行将img标签添加到<div id="bigImg"></div>中,如果没有第7行的隐藏操作,此时图像会立即出现;第9行,使用淡入的方式显示图像。OK,保存代码,在浏览器中打开,点击缩略图,发现已经有了相册查看效果了,但是,当我们连续点击相册图片的时候,历史图片并不会消失,如果我们一直点击下去,图片会一直罗列。如下图所示:

非常漂亮的相册集 使用jquery制作相册集

实际上,每当我们点击一个缩略图的时候,代码都会为我们创建一个新的img并添加到<div id="bigImg"></div>中,从DOM的角度看,会不停地增加子节点:

非常漂亮的相册集 使用jquery制作相册集

为了实现”相册”翻阅的效果,我们在显示新的相片的时候同时要把之前的图片删掉。继续在代码5中作如下添加:

...//省略未改动部分

  $('#gallery a').click(function(evt){
   evt.preventDefault();
   var imgPath = $(this).attr('href');
   var oldImg = $('#bigImg img');
   var newImg = $('<img src="' + imgPath + '">');
   newImg.hide();
   $('#bigImg').prepend(newImg);
   newImg.fadeIn(1000);
   oldImg.fadeOut(1000, function(){
    $(this).remove();
   });
  });//end click

代码第6行首先获取当前存在的图像oldImg,在新的图片淡入的时候,此图应该进行淡出处理。11~13行,在新的图片淡入之后,oldImg淡出。同时给fadeOut函数传入一个回调函数,在oldImg淡出之后一并移除该图像的img标签。这样我们就保证在DOM树中<div id="bigImg"></div>始终只有一个img节点,而不会无限地增长下去。

接下来进行一些细节的调整,当我们点入这个页面的时候,希望默认显示第一幅图片,为了实现这个小功能,我们只需要在代码6后面添加一行代码:

...//省略未改动部分

  $('#gallery a').click(function(evt){
   evt.preventDefault();
   var imgPath = $(this).attr('href');
   var oldImg = $('#bigImg img');
   var newImg = $('<img src="' + imgPath + '">');
   newImg.hide();
   $('#bigImg').prepend(newImg);
   newImg.fadeIn(1000);
   oldImg.fadeOut(1000, function(){
    $(this).remove();
   });
  });//end click

  $('#gallery a:first').click();

我们在后面添加了$('#gallery a:first').click();,在jQuery中,如果没有给事件函数传递任何参数,jQuery便会触发一次该事件。保存代码,重新用浏览器打开,第一幅图片已经默认显示了:

非常漂亮的相册集 使用jquery制作相册集

3、css绝对定位实现图片的重叠

漂亮的相册集基本上已经完成了,但是吹毛求疵地看,当我们更换要查看的照片的时候,旧图片的淡出会在新图的后面完成,给人一种赘余不利落的感觉:

非常漂亮的相册集 使用jquery制作相册集

为了解决这个问题,我们让新图的淡入和旧图的淡出重叠显示。为了实现图片的重叠显示我们需要用到css的绝对定位。

通常情况下,在隐藏或者添加一个新的元素的时候,其他元素会像流一样自动移动来填补空白或者给新的元素腾位置。但是像我们本文的示例,如果我们不希望看到这样的效果,我们可以使用css的绝对定位。css的绝对定位会把一个元素放置在常规页面内容流之外,这样就不会在内容流中出现填补移动等操作了。如果我们使用绝对定位将元素定位在相同的位置,那么元素将会重叠在一起。本例中,这恰恰是我们想要的。实现起来其实十分简单,只需要在css中将<div id="bigImg"></div>中的img指定为绝对定位就可以了。我们在代码1的</style>前添加以下代码:

#bigImg img {
  position: absolute;
}

保存,重新用浏览器打开,大功告成!漂亮的相册已经做好了。

jquery文件下载

以上就是本文的全部内容,希望对大家学习jquery程序设计有所帮助。

Javascript 相关文章推荐
JavaScript中继承的一些示例方法与属性参考
Aug 07 Javascript
jquery中防刷IP流量软件影响统计的一点对策
Jul 10 Javascript
js Array操作的最简短最容易理解方法
Dec 09 Javascript
2014年最火的Node.JS后端框架推荐
Oct 27 Javascript
JS实现带鼠标效果的头像及文章列表代码
Sep 27 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
Dec 29 Javascript
Layui组件Table绑定行点击事件和获取行数据的方法
Aug 19 Javascript
javascript中call()、apply()的区别
Mar 21 Javascript
vue路由守卫,限制前端页面访问权限的例子
Nov 11 Javascript
vue-resourc发起异步请求的方法
Feb 11 Javascript
通过vue刷新左侧菜单栏操作
Aug 06 Javascript
Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法
Dec 25 Vue.js
jQuery事件绑定on()与弹窗实现代码
Apr 28 #Javascript
jquery拖动层效果插件用法实例分析(附demo源码)
Apr 28 #Javascript
JS模仿手机端九宫格登录功能实现代码
Apr 28 #Javascript
jQuery实现的鼠标经过时变宽的效果(附demo源码)
Apr 28 #Javascript
Bootstrap Chart组件使用教程
Apr 28 #Javascript
jQuery内容折叠效果插件用法实例分析(附demo源码)
Apr 28 #Javascript
location.hash保存页面状态的技巧
Apr 28 #Javascript
You might like
关于mysql 字段的那个点为是定界符
2007/01/15 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
2016/09/23 PHP
Yii核心验证器api详解
2016/11/23 PHP
PHP7内核之Reference详解
2019/03/14 PHP
下拉菜单点击实现连接跳转功能的js代码
2013/05/19 Javascript
Jquery 模拟用户点击超链接或者按钮的方法
2013/10/25 Javascript
jQuery多级弹出菜单插件ZoneMenu
2014/12/18 Javascript
javascript中定义类的方法详解
2015/02/10 Javascript
jQuery焦点控制图层展示延迟隐藏的方法
2015/03/09 Javascript
Jquery基础教程之DOM操作
2015/08/19 Javascript
jquery实现鼠标滑过显示二级下拉菜单效果
2015/08/24 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
2015/08/31 Javascript
页面向下滚动ajax获取数据的实现方法(兼容手机)
2016/05/24 Javascript
html中鼠标滚轮事件onmousewheel的处理方法
2016/11/11 Javascript
浅谈js script标签中的预解析
2016/12/30 Javascript
详解Vue.js入门环境搭建
2017/03/17 Javascript
Vue组件创建和传值的方法
2018/08/17 Javascript
关于JS模块化的知识点分享
2019/10/16 Javascript
vue自定义树状结构图的实现方法
2020/10/18 Javascript
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
2020/11/24 Javascript
原生js实现移动小球(碰撞检测)
2020/12/17 Javascript
使用Python的Tornado框架实现一个一对一聊天的程序
2015/04/25 Python
Python中利用sorted()函数排序的简单教程
2015/04/27 Python
Django框架下静态模板的继承操作示例
2019/11/08 Python
python实现小程序推送页面收录脚本
2020/04/20 Python
pycharm 实现本地写代码,服务器运行的操作
2020/06/08 Python
英国复古服装购物网站:Collectif
2019/10/30 全球购物
汽车维修专业毕业生的求职信分享
2013/12/04 职场文书
车间工艺员岗位职责
2013/12/09 职场文书
物流管理专业职业生涯规划书
2014/01/06 职场文书
虎兄虎弟观后感
2015/06/12 职场文书
关于应聘教师的自荐信
2016/01/28 职场文书
送给客户微信问候语!
2019/07/04 职场文书
大学生饮品店创业计划书范文
2019/07/10 职场文书
matplotlib之pyplot模块实现添加子图subplot的使用
2021/04/25 Python
MySQL优化常用的19种有效方法(推荐!)
2022/03/17 MySQL