视频地址: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 的超链接。
- 使用超链接的 class 属性来标记哪些图片用于大图展示
- 使用超链接的 href 属性记录需要展示的大图地址
- 超链接的内容则是页面上显示的缩略图
<!DOCTYPE html> <html> <head> <title>图片循环展示 - 三石jQuery视频教程</title> </head> <body> <div id="main"> <h2> 图片循环展示 - 三石jQuery视频教程 </h2> <a class="showit" href="images/1.jpg"> <img src="images/small/1.jpg"> </a> <a class="showit" href="images/2.jpg"> <img src="images/small/2.jpg"> </a> <a class="showit" href="images/3.jpg"> <img src="images/small/3.jpg"> </a> <a class="showit" href="images/4.jpg"> <img src="images/small/4.jpg"> </a> <a class="showit" href="images/5.jpg"> <img src="images/small/5.jpg"> </a> <a class="showit" href="images/6.jpg"> <img src="images/small/6.jpg"> </a> </div> </body> </html>
Step3:CSS样式
下面我们来创建基本的 CSS 样式,让这个默认显示看起来更加专业和美观,我们所做的努力包含:
- 页面背景设为非常浅的灰色(#efefef)
- 主体内容加上了边框和白色背景
- 主体内容居中(margin-left 和 margin-right 设为 auto)
- 去掉了超链接的下划线
<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()
- 判断 id=showbox 的大图节点是否存在
来看下相应的实现代码:
<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样式
在没有为大图创建样式时,大图是紧挨着页面主体结构显示的,下面为其创建样式:
- #showbox 绝对定位,宽度和高度设为 100%,使其填充整个页面
- 设置 #showbox 中的内容居中显示
- 为大图设置隐藏和圆角,使其更美观
#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:点击大图的左右部分
现在我们要实现点击图片的右半部分,可以导航到下一张图片;相反,如果点击大图的左半部分,则导航到上一张图片。
为了实现这个效果,我们需要知道当前点击的是图片的哪半部分。来看下实现这一功能需要了解的知识:
- 当前点击的元素 event.target
- 元素左上角偏离当前文档左上角的位置,使用 jQuery 提供的 offset 函数
- 元素的宽度(包含 padding + border),使用 outerWidth 函数
- 当前点击的位置在 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(); } }); });
相关推荐
【三石导航.rar】是一个压缩包文件,其中包含了一个简洁且高效的导航系统。这个导航系统被称为"三石导航",其特点在于它无广告、无弹窗,为用户提供了一个清爽的浏览体验。文件大小适中,表明设计者在保证功能的同时...
[精选]理财-三石投资.pptx
本快速入门教程将引导初学者了解*** MVC的基本概念和操作,例如数据库操作、数据注解、安全策略和如何利用FineUIMvc控件库。我们将以MVC5版本和Entity Framework 6(EF6)版本为例,进行深入讲解。 1. 新建*** MVC...
主要功能:0),系统统计,统计影片总数,近日更新,在线人数,计数器;1),网吧开关模块,IP管理模块;2),影片分类浏览模块;3),新闻公告模块;4),影片浏览模块;5),影片查询、排序;6)影片推荐;...
简单介绍下python的*index()*方法: 查找参数是否在list、tuple等内部,若存在返回第一个index,不存在会报ValueError。 name = ["a", "ying", "de", "san", "shi", ... File "C:\Users\阿莹的三石\Desktop\test.py",
通过实现以上功能,本系统将为用户提供一个方便快捷的图片共享平台。本系统将实现以下功能: ## 1. 用户管理 用户可以通过注册账号、登录等方式进入系统,管理自己的个人信息和上传的图片。同时,管理员可以管理...
5. 动态发布和浏览:用户可以发布和浏览其他用户发布的动态,包括文字、图片和视频等。 ## 实现方式 为了实现上述功能,我们将使用以下技术和工具: 1. PHP LDU v702 汉化版:该框架为本毕设提供了基础的Web应用...
2. 使用Bootstrap作为前端框架,使用jQuery作为JavaScript库 3. 采用MVC架构,将程序分为Model、View、Controller三个部分 4. 用户注册和登录系统使用加密算法保证安全性 5. 上传和下载代码的功能使用文件上传和下载...
同时,本系统前台应该能够支持多种不同的格式化方式,如文本、图片、视频等。此外,本系统前台应该具有良好的可扩展性,方便后期进行功能扩展和升级。 ## 系统设计方案 在本毕业设计中,我们将采用PHP作为主要的...
HillStone最新配置手册
这篇毕设将介绍一个基于Java的简单即时通讯工具的设计和开发过程。 ## 设计 ...通过实现基本功能和用户界面,我们将展示Socket编程的基本知识和Java Swing的使用技巧。最终我们将得到一个可以在局域
- 前端:HTML、CSS、JavaScript、jQuery、Bootstrap等。 - 后端:PHP、MySQL等。 - 前后端交互:AJAX。 ## 开发计划 以下是该网站的开发计划: 1. 设计并实现数据库结构,完成用户和影片管理系统的开发。 2. 完善...
前端框架使用 Bootstrap 和 jQuery,后端框架使用 CodeIgniter。系统采用 MVC 模式进行开发,具有良好的代码结构和可维护性。 ## 系统功能 1. 域名查询:用户可以通过输入域名进行查询,系统将自动获取 Whois 信息...
总之,"ASP.NET+ACCESS视频点播系统设计"项目展示了如何利用这两种技术构建一个功能完善的视频点播平台。ASP.NET提供了强大的Web开发能力,而ACCESS则为数据管理提供了便捷的工具。通过深入理解和实践这个项目,...
在电子硬件设计领域,锂电池充电器是至关重要的设备,尤其对于使用三芯锂电池的设备而言。三芯锂电池,也称为Li-ion电池组,通常由三个单体锂电池串联组成,提供更高的电压,适用于需要较大能量存储的设备。...
2. **斯通亨奇巨石环** - 这是英格兰新石器时代的建筑遗产,由多个三石塔结构组成的大圆环,可能作为仪式场地、界石、纪念场所或是历法工具。它们体现了原始人严谨的工艺和创造力,至今仍保留着神秘和庄重的气氛。 ...
该程序旨在提供一个完整的...采用JQuery和Bootstrap框架,实现网站的响应式设计,确保在各种设备上都能正常使用。 该程序将为亿网家教网站提供一个完整的管理解决方案。它将简化网站管理流程,提高用户的体验,使网站
20. 三石图书文化传播网(3stonebook/):这个网站提供了丰富的电子书籍资源,涵盖了文学、历史、哲学等领域,供读者下载和阅读。 21. 电子图书基地(kahn.xj.cninfo.net/ljw/):这个网站提供了丰富的电子书籍资源...
三石汤:主要用于清热泻火,适合热邪较重。 - C. 王氏连朴饮:清热利湿,适用于湿热并重。 - D. 三仁汤:亦能化湿,但更偏向于轻度的湿热并重。 - E. 雷氏芳香化浊法:用于化湿醒脾,适用于湿浊较重的情况。 2....
描述部分提到了实习生在浦东的三石律师事务所的实习经历,强调了实习的重要性以及实习期间的具体体验。实习生跟随江律师工作,从中获得了专业知识和人际交往能力的提升。描述中提到的实习收获包括对律师行业的深入...