非常漂亮的相册集 使用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 相关文章推荐
IE6下js通过css隐藏select的一个bug
Aug 16 Javascript
百度判断手机终端并自动跳转js代码及使用实例
Jun 11 Javascript
js流动式效果显示当前系统时间
May 16 Javascript
js不间断滚动的简单实现
Jun 03 Javascript
使用 bootstrap modal遇到的问题小结
Nov 09 Javascript
jQuery获取table下某一行某一列的值实现代码
Apr 07 jQuery
jquery animate动画持续运动的实例
Nov 29 jQuery
Vue2.2.0+新特性整理及注意事项
Aug 22 Javascript
微信小程序实现联动选择器
Feb 15 Javascript
详解如何写出一个利于扩展的vue路由配置
May 16 Javascript
JS实现灯泡开关特效
Mar 30 Javascript
详解vue-router的Import异步加载模块问题的解决方案
May 13 Javascript
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
《星际争霸II》全新指挥官斯台特曼现已上线
2020/03/08 星际争霸
详解配置 Apache 服务器支持 PHP 文件的解析
2017/02/15 PHP
php web环境和命令行环境下查找php.ini的位置
2019/07/17 PHP
制作特殊字的脚本
2006/06/26 Javascript
3Z版基于jquery的图片复选框(asp.net+jquery)
2010/04/12 Javascript
腾讯的ip接口 方便获取当前用户的ip地理位置
2010/11/25 Javascript
dotopAlert 提示用户需安装播放器的代码
2012/09/17 Javascript
在jQuery中 关于json空对象筛选替换
2013/04/15 Javascript
jQuery 事件的命名空间简单了解
2013/11/22 Javascript
Web前端开发工具——bower依赖包管理工具
2016/03/29 Javascript
BootStrap 超链接变按钮的实现方法
2016/09/25 Javascript
vue插件tab选项卡使用小结
2016/10/27 Javascript
使用ionic播放轮询广告的实现方法(必看)
2017/04/24 Javascript
深入浅析javascript继承体系
2017/10/23 Javascript
js生成word中图片处理方法
2018/01/06 Javascript
Node.Js生成比特币地址代码解析
2018/04/21 Javascript
通过webpack引入第三方库的方法
2018/07/20 Javascript
使用Nuxt.js改造已有项目的方法
2018/08/07 Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
2018/08/12 Javascript
Nest.js散列与加密实例详解
2021/02/24 Javascript
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
2021/02/24 Javascript
不要用强制方法杀掉python线程
2017/02/26 Python
python实现决策树
2017/12/21 Python
python查看模块安装位置的方法
2018/10/16 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
基于Python+Appium实现京东双十一自动领金币功能
2019/10/31 Python
keras自定义回调函数查看训练的loss和accuracy方式
2020/05/23 Python
Python unittest discover批量执行代码实例
2020/09/08 Python
CK美国官网:Calvin Klein
2016/08/26 全球购物
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
伦敦眼门票在线预订:London Eye
2018/05/31 全球购物
卫生巾广告词
2014/03/18 职场文书
学生党员一帮一活动总结
2014/07/08 职场文书
2015年导购员工作总结
2015/04/25 职场文书
Nginx stream 配置代理(Nginx TCP/UDP 负载均衡)
2021/11/17 Servers
经典《舰娘》游改全新动画预告 预定11月开播
2022/04/01 日漫