之前的文章,由于在博文的底部放有微信公众号的缘故,被管理员判定为:

您好,您的这篇博文内容本身没什么问题,但是,在博文底部存在推广信息内容。。。。

你们也没告知到底是哪条触犯了博客园的规矩,我就把底部信息全部删除,这样总行了吧。


视频地址:http://v.qq.com/page/e/5/t/e0149n5he5t.html


大家好,欢迎来到【三石jQuery视频教程】,我是您的老朋友 - 三生石上。

今天,我们要通过基本的HTML、CSS和jQuery来实现一个超级简单的图片循环展示效果,先来看下最终的产品:

Step1:网站目录

网站目录非常简单,包含三部分:lesson1.html文件、lib目录和images目录。

其中 lesson1.html 包含了一个页面最基本的组成部分,正确的设置 DOCTYPE 有助于页面在现代浏览器中正确渲染。

<!DOCTYPE html>
<html>
<head><title>图片循环展示 - 三石jQuery视频教程</title></head>
<body></body>
</html>

lib目录仅包含了最新的 jQuery 库;images目录包含了 6 张大图和相应的 6 张小图(小图放在 images/small 子目录中)。 

Step2:页面结构

为页面添加基本的 html 标签,包含 id=main 的内容块,以及 class=showit 的超链接。

  1. 使用超链接的 class 属性来标记哪些图片用于大图展示
  2. 使用超链接的 href 属性记录需要展示的大图地址
  3. 超链接的内容则是页面上显示的缩略图
<!DOCTYPE html>
<html>
<head><title>图片循环展示 - 三石jQuery视频教程</title>
</head>
<body><div id="main"><h2>图片循环展示 - 三石jQuery视频教程</h2><a class="showit" href="images/1.jpg"><img src="data:images/small/1.jpg"></a><a class="showit" href="images/2.jpg"><img src="data:images/small/2.jpg"></a><a class="showit" href="images/3.jpg"><img src="data:images/small/3.jpg"></a><a class="showit" href="images/4.jpg"><img src="data:images/small/4.jpg"></a><a class="showit" href="images/5.jpg"><img src="data:images/small/5.jpg"></a><a class="showit" href="images/6.jpg"><img src="data:images/small/6.jpg"></a></div>
</body>
</html>

  

Step3:CSS样式

下面我们来创建基本的 CSS 样式,让这个默认显示看起来更加专业和美观,我们所做的努力包含:

  1. 页面背景设为非常浅的灰色(#efefef)
  2. 主体内容加上了边框和白色背景
  3. 主体内容居中(margin-left 和 margin-right 设为 auto)
  4. 去掉了超链接的下划线
<style>body{background-color: #efefef;}#main {border: solid 1px #ccc;background-color: #fff;max-width: 500px;padding: 20px;margin: 20px auto;}.showit {text-decoration: none;}
</style>

  

此时的页面显示效果:

Step4:显示大图

下面是 jQuery 出场的时候了,首页在页面底部引入 jQuery 库。

注:把页面上所有 JavaScript 脚本放在页面底部是推荐的做法,这样可以让页面的基本HTML结构更快的显示出来。

基本的逻辑:

  • 用户点击了 class=showit 的超链接

    • 判断 id=showbox 的大图节点是否存在

      • 如果不存在,则创建大图节点并添加到 document.body 中
    • 找到大图节点内部的 img 标签,并将其 src 属性设置为所点击超链接的 href 属性
    • 阻止超链接的默认行为 event.preventDefault()

来看下相应的实现代码:

<script>
$(function() {$('.showit').click(function(event) {var largeImageUrl = $(this).attr('href');var boxEl = $('#showbox');if(!boxEl.length) {boxEl = $('<div>', {id: 'showbox',html: '<img/>'}).appendTo(document.body);}boxEl.find('img').attr('src', largeImageUrl);boxEl.show();event.preventDefault();});
</script>

此时,点击页面上的缩略图,显示效果如下:

  

Step5:大图的CSS样式

在没有为大图创建样式时,大图是紧挨着页面主体结构显示的,下面为其创建样式:

  1. #showbox 绝对定位,宽度和高度设为 100%,使其填充整个页面
  2. 设置 #showbox 中的内容居中显示
  3. 为大图设置隐藏和圆角,使其更美观
#showbox {position: absolute;top: 0;left: 0;background-color: #000;width: 100%;height: 100%;text-align: center;
}#showbox img {max-width: 500px;margin-top: 100px;box-shadow: 0 0 20px #fff;border-radius: 10px;
}

此时的页面效果:  

Step6:点击隐藏大图

页面第一次加载完毕后,#showbox 节点还不存在,只有用户第一次点击页面上的缩略图时才会创建 #showbox。

所以下面的代码是不能正常运行的:

$('#showbox').click(function(event) {$(this).hide();
});

我们需要使用 jQuery 提供的 on 函数,来注册点击事件,即使在注册事件时节点不存在也一样有效:

$(document.body).on('click', '#showbox', function(event) {$(this).hide();
});

Step7:点击大图的左右部分

现在我们要实现点击图片的右半部分,可以导航到下一张图片;相反,如果点击大图的左半部分,则导航到上一张图片。

为了实现这个效果,我们需要知道当前点击的是图片的哪半部分。来看下实现这一功能需要了解的知识:

  1. 当前点击的元素 event.target
  2. 元素左上角偏离当前文档左上角的位置,使用 jQuery 提供的 offset 函数
  3. 元素的宽度(包含 padding + border),使用 outerWidth 函数
  4. 当前点击的位置在 X 轴的坐标 event.pageX
$(document.body).on('click', '#showbox', function(event) {  var targetEl = $(event.target);if(targetEl.is('img')) {var imageLeft = targetEl.offset().left;var imageHalfX = imageLeft + targetEl.outerWidth() / 2;if(event.pageX > imageHalfX) {alert('click right part');} else {alert('click left part');}} else {$(this).hide();}});

  

Step8:缓存页面上所有的大图

下面就需要知道,相对于当前展示的图片,上一张图片和下一张图片分别是什么?

我们使用两个函数来获取即将展示的图片,从而完整主题的JavaScript代码,如下所示:

$(document.body).on('click', '#showbox', function(event) {var targetEl = $(event.target);if(targetEl.is('img')) {var imageLeft = targetEl.offset().left;var imageHalfX = imageLeft + targetEl.outerWidth() / 2;var imageUrl = targetEl.attr('src');var nextImageUrl;if(event.pageX > imageHalfX) {nextImageUrl = getNextImageUrl(imageUrl);} else {nextImageUrl = getPrevImageUrl(imageUrl);}if(nextImageUrl) {targetEl.attr('src', nextImageUrl);}} else {$(this).hide();}});

为了对页面上所有的图片进行精确定位,我需要一个缓存数组来记录这些图片:

var cachedImageUrls;

然后定义一个函数,来初始化这个数组,为了避免多次初始化,我们进行了非空判断:

function cacheImageUrls() {if(!cachedImageUrls) {cachedImageUrls = $('.showit').map(function() {return $(this).attr('href');});   }
}

在此,jQuery 的 map 函数为我们提供了很大的便利,map 函数将一个 jQuery 对象映射为数组,函数内的 return 确定了数组中的每一项。

在执行完这个函数后,cachedImageUrls 内数据如下所示:

["images/1.jpg", "images/2.jpg", "images/3.jpg", "images/4.jpg", "images/5.jpg", "images/6.jpg"]

  

Step9:获取上一张图片和下一张图片

拿到页面上所有的大图数组后,我们可以很方便的计算出当前图片的上一张或者下一张图片,注意做下数组的边界检查就行了:

function getNextImageUrl(imageUrl) {cacheImageUrls();var imageUrlIndex = $.inArray(imageUrl, cachedImageUrls);if(imageUrlIndex >= 0) {imageUrlIndex++;if(imageUrlIndex >= cachedImageUrls.length) {imageUrlIndex = 0;}return cachedImageUrls[imageUrlIndex];}}

注:jQuery 提供的 inArray 函数用来查找某项元素在数组中的索引,如果返回值小于零,则数组中不存在此项元素。  

Step10:完整的JavaScript代码

最后,来看下完整的 JavaScript 代码:

$(function() {$('.showit').click(function(event) {var largeImageUrl = $(this).attr('href');var boxEl = $('#showbox');if(!boxEl.length) {boxEl = $('<div>', {id: 'showbox',html: '<img/>'}).appendTo(document.body);}boxEl.find('img').attr('src', largeImageUrl);boxEl.show();event.preventDefault();});var cachedImageUrls;function cacheImageUrls() {if(!cachedImageUrls) {cachedImageUrls = $('.showit').map(function() {return $(this).attr('href');});   }}function getNextImageUrl(imageUrl) {cacheImageUrls();var imageUrlIndex = $.inArray(imageUrl, cachedImageUrls);if(imageUrlIndex >= 0) {imageUrlIndex++;if(imageUrlIndex >= cachedImageUrls.length) {imageUrlIndex = 0;}return cachedImageUrls[imageUrlIndex];}}function getPrevImageUrl(imageUrl) {cacheImageUrls();var imageUrlIndex = $.inArray(imageUrl, cachedImageUrls);if(imageUrlIndex >= 0) {imageUrlIndex--;if(imageUrlIndex < 0) {imageUrlIndex = cachedImageUrls.length - 1;}return cachedImageUrls[imageUrlIndex];}}$(document.body).on('click', '#showbox', function(event) {var targetEl = $(event.target);if(targetEl.is('img')) {var imageLeft = targetEl.offset().left;var imageHalfX = imageLeft + targetEl.outerWidth() / 2;var imageUrl = targetEl.attr('src');var nextImageUrl;if(event.pageX > imageHalfX) {nextImageUrl = getNextImageUrl(imageUrl);} else {nextImageUrl = getPrevImageUrl(imageUrl);}if(nextImageUrl) {targetEl.attr('src', nextImageUrl);}} else {$(this).hide();}});});

  

【三石jQuery视频教程】01.图片循环展示_再次重发相关推荐

  1. 【三石jQuery视频教程】01.图片循环展示_重发

    大家好,欢迎来到[三石jQuery视频教程],我是您的老朋友 - 三生石上. 今天,我们要通过基本的HTML.CSS和jQuery来实现一个超级简单的图片循环展示效果,先来看下最终的产品: Step1 ...

  2. 【三石jQuery视频教程】03.创建垂直时间表(Timeline)

    视频地址:http://v.qq.com/page/g/i/o/g0150rvi6io.html 大家好,欢迎来到[三石jQuery视频教程],我是您的老朋友 - 三生石上. 今天,我们要通过基本的H ...

  3. jquery 实现背景图片循环切换,显示隐藏div

    jquery实现图片背景循环切换,显示隐藏一个div. <script type="text/javascript"> $(function(){ $("#t ...

  4. creator图片循环显示_江淮宣传车厂家价格 图片 配置

    国六 江淮宣传车配置: 整车型号:CLW5040XXCH6 整车尺寸:5995*2190*2970 [底盘配置] 轴距:3365 发动机:全柴120马力 排量:2.0L 轮胎:7.00R16 其它:助 ...

  5. laravel商品图片怎么展示_如何使用Laravel图片处理包intervention-image

    下面由Laravel教程栏目给大家介绍如何使用Laravel图片处理包intervention-image,希望对需要的朋友有所帮助! 最近偶然发现了Laravel可用的图片处理包interventi ...

  6. 使用Axure制作无限循环展示图片效果

    一.实现的效果 如图: 1.此次需要实现的效果是,进入界面后,在图片展示区域的图片根据事先设定好的时间,自动切换不同的图片: 2.循环不间断: 3.页面不出现闪烁的现象. 二.做前工作 图片:4张 软 ...

  7. [JQuery]用InsertAfter实现图片走马灯展示效果

    写在前面 最近一个搞美工的朋友让我给他写一个图片轮播的特效. 需求: 图片向左循环滚动. 图片滚动到中间高亮显示,并在下方显示照片人物对应的信息. 鼠标悬停止滚动. 鼠标离开开始滚动. 单击图片,图片 ...

  8. dev中循环展示图片的样式怎么写_DevExpress:可左右滑动的图片框的ImageSlider

    控件库DevExpress使用笔记,我的DevExpress版本为13.1 1.控件类型全称:DevExpress.XtraEditors.Controls.ImageSlider 2.控件所在程序集 ...

  9. 小猿圈用jQuery实现手风琴图片展示效果

    对web前端了解的同学会知道jQuery是现在前端中使用的框架之一,但是你知道jQuery可以做到一些你意想不到的效果吗?下面小猿圈web前端老师用jQuery实现手风琴图片展示效果,希望对你有所帮助 ...

最新文章

  1. C面向对象之透明指针的运用
  2. 大学最重要的七项学习
  3. Linux awk+uniq+sort 统计文件中某字符串出现次数并排序
  4. 通过反射将变量值转为变量名本身
  5. 如何理解Eating这个词?云原生与微服务专场介绍
  6. python 协程爬虫_Python爬虫进阶教程(二):线程、协程
  7. winform combobox 单机不关闭_单机脉冲除尘器铜仁单机脉冲除尘器参数
  8. 读取自定义配置文件属性值
  9. UnionPay-银联支付-netcore(一)
  10. 测试cpu多核性能软件,处理器多核性能测试_微星 X99A XPOWER GAMMING TITANIUM_CPUCPU评测-中关村在线...
  11. 路由器如何设置无线桥接
  12. 二阶系统级联_一种高二阶级联结构Sigma-Delta调制器系统的制作方法
  13. 欧美html真人游戏,推荐几个好玩场面大的,欧美3d史诗级rpg魔幻手游
  14. 被Z世代称为B站张子枫,她有一种天然的治愈力。
  15. 【JSP笔记02】JSP注释、脚本、表达式、JSP三大指令、JSP七大动作的介绍及使用
  16. 前端高效开发必备的 js 库
  17. 张博涵清华大学_2009年北大,清华提前录取保送生人数最多的 33所中学
  18. 阿里云的混合云战略,凭啥扯上Zstack?
  19. 图像抓拍录像视频捕获软件微软Amcap怎么使用
  20. java导入excel数据_java使用POI批量导入excel数据的方法

热门文章

  1. 问题:网页版微信协议如何获取语音消息并播放
  2. 【MySQL基本查询】Create(创建), Retrieve(读取),Update(更新),Delete(删除)
  3. edk2+vs2019环境搭建
  4. 极简时钟,记录时间的利器
  5. 电脑怎么打出冒号符号_冒号的用法有哪些?写作文的时候冒号怎么用?冒号在电脑上怎么打出来?...
  6. 【Proteus】动态数码管显示
  7. 2016年上半年信息系统监理师考试感想
  8. 教你用OpenCV 和 Python给证件照换底色(蓝底 <->红底->白底)
  9. 高通WLAN框架学习(27)-- Types of regulatory 和WCNSS_qcom_cfg.ini配置参数
  10. LeetCode每日一题: 1723. 完成所有工作的最短时间