经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTMLCSS » CSS » 查看文章
jQuery自适应-3D旋转轮播图
来源:cnblogs  作者:Milkice  时间:2018/10/18 8:44:09  对本文有异议

3D旋转轮播图

本例源于(站长之家实例http://sc.chinaz.com/jiaoben/170215391070.htm)

其他相似示例(https://www.cnblogs.com/incredible-x/p/9688333.html)

自己研究重写了一遍。

一、先写静态的初始样式的css和html。我用的是 550x300的大小一致的 5张图片,代码可拓展为三张、四张、甚至大于五张。如图是静态效果:

图后的代码是静态时的样式html和css。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. <!-- jquery CDN -->
  9. <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
  10. <style>
  11. * { margin: 0; padding: 0;word-break: break-all; }
  12. a { color:#fff;text-decoration: none;}
  13. a:hover { text-decoration: none;}
  14. ul,li { list-style: none;}
  15. html,body{width: 100%;height: 100%;}
  16. .main {max-width: 800px; margin: 0 auto;}
  17. #slide {width: 100%;height: 420px;position: relative;overflow: hidden;}
  18. #slide .pic { position: absolute; }
  19. #slide .pic img {width: calc(100% - 14px);height: calc(100% - 14px);}
  20. #slide .p1 { z-index: 3;width: 40%;height: 40%;left: -50%;top: 30%;}
  21. #slide .p2 { z-index: 4;width: 60%;height: 60%;left: -20%;top: 20%;}
  22. #slide .p3 {z-index: 5; width: 80%;height: 80%; left: 10%;top: 10%;}
  23. #slide .p4 { z-index: 4; width: 60%; height: 60%; left: 60%; top: 20%;}
  24. #slide .p5 { z-index: 3; width: 40%;height: 40%; left: 110%; top: 30%;}
  25. #slide .btn {
  26. position: absolute;
  27. z-index: 6;
  28. bottom: 20%;
  29. width: 180px; /* 计算得出 5*30+5*6=180 */
  30. margin-left: -90px;
  31. left: 50%;
  32. }
  33. #slide .btn span {
  34. width: 24px;
  35. height: 8px;
  36. border-radius: 3px;
  37. float: left;
  38. background-color: #dedede;
  39. margin: 0 3px;
  40. }
  41. #slide .btn .on {background-color: #ffd200; }
  42.  
  43. </style>
  44. </head>
  45.  
  46. <body>
  47. <div class="main">
  48. <div id="slide" class="slide">
  49. <div class="pic"><img src="./images/1.png"></div>
  50. <div class="pic"><img src="./images/2.png"></div>
  51. <div class="pic"><img src="./images/3.png"></div>
  52. <div class="pic"><img src="./images/4.png"></div>
  53. <div class="pic"><img src="./images/5.png"></div>
  54. <div class="btn">
  55. <!-- <span data-minibtn-id='1'></span><span></span><span></span><span></span><span></span> -->
  56. </div>
  57. </div>
  58. <button class="btn-prev">向左</button>
  59. <button class="btn-next">向右</button>
  60. </div>
  61. </body>
  62. </html>
View Code

二、然后,js编写动态交互效果。这段是js代码(要引入jQuery库)

备注还比较详细,一和二的代码直接复制就可以运行。

  1. <script>
  2. var slideNumber; //轮播图片的数量
  3. var miniSlideBtn = true; //miniSlideBtn=true为开启滚动按钮
  4. var isableTouch = true; //是否可以触摸滑动切换
  5. var isAutoPlay = true; //是否可以自动轮播
  6.  
  7. //窗口大小改变时改变轮播图宽高
  8. $(window).resize(function () {
  9. $(".slide").height($(".slide").width() * 0.56);
  10. });
  11. $(function () {
  12. $("#slide").height($("#slide").width() * 0.56); //调整轮播图的高度
  13. slideNumber = $("#slide img").length; //轮播图数量
  14. for (let i = 0; i < slideNumber; i++) { //给每个div,而不是img,添加自定义属性编号
  15. $("#slide .pic").eq(i).attr('data-img-id', i);
  16. }
  17. // 根据轮播图片数量添加图片位置对应的样式
  18. // 还有 if(slideNumber=1,=2,=3,=4,>5)
  19. if (slideNumber = 5) {
  20. for (let i = 0; i < slideNumber; i++) {
  21. $("#slide .pic").eq(i).addClass('p' + (i + 1));
  22. }
  23. }
  24. //根据图片数量设置轮播图按钮
  25. if (miniSlideBtn) {
  26. for (let i = 0; i < slideNumber; i++) {
  27. $("#slide .btn").append("<span data-minibtn-id=" + i + "></span>");
  28. }
  29. $("#slide .btn").width(slideNumber * 34);
  30. $("#slide .btn").css('margin-left', '-' + slideNumber * 17 + 'px'); //调整margin-left 负值使按钮居中
  31. }
  32. //自动切换
  33. if (isAutoPlay) { setInterval(() => { right(); }, 3000) }
  34. //触摸切换
  35. if (isableTouch) { slideTouch(); }
  36. imgClickChange();//点击图片左右切换图片
  37. currentBtn();//当前轮播按钮的选中状态
  38. });
  39. $(".btn-prev").click(function () { //点击按钮翻上一页
  40. left();
  41. })
  42. $(".btn-next").click(function () { //点击按钮翻下一页
  43. right();
  44. })
  45. /*下一张图片,右边的图向左走,注意:第一个变成最后一个,最后一个变成倒数第二个*/
  46. function right() {
  47. let temp = new Array();
  48. for (let i = 0; i < slideNumber; i++) {
  49. temp[i] = $("#slide .pic[data-img-id=" + i + "]").attr('class'); //临时数组获取class是pic p1,pic p2,pic p3...
  50. }
  51. for (let i = 0; i < slideNumber; i++) {
  52. if (i == 0) { //如果编号为第一张图片,它将变成最后一个
  53. $("#slide .pic[data-img-id=" + i + "]").attr('class', temp[slideNumber - 1]);
  54. } else {
  55. $("#slide .pic[data-img-id=" + i + "]").attr('class', temp[i - 1]);
  56. }
  57. }
  58. imgClickChange();//点击图片左右切换图片
  59. currentBtn();//当前轮播按钮的选中状态
  60. }
  61. /*上一张图片, 左边的图向右走,注意:最后一张会变成第一张,第一个图变成第二个*/
  62. function left() {
  63. let temp = new Array();
  64. for (let i = 0; i < slideNumber; i++) {
  65. temp[i] = $("#slide .pic[data-img-id=" + i + "]").attr('class'); //临时数组获取class pic p1,pic p2...
  66. }
  67. for (let i = 0; i < slideNumber; i++) {
  68. if (i == slideNumber - 1) { //如果编号为最后一张图片,它将变成
  69. $("#slide .pic[data-img-id=" + i + "]").attr('class', temp[0]);
  70. } else {
  71. $("#slide .pic[data-img-id=" + i + "]").attr('class', temp[i + 1]);
  72. }
  73. }
  74. imgClickChange();//点击图片本身切换图片
  75. currentBtn();//当前轮播按钮的选中状态
  76. }
  77. /*点击图片左右切换图片*/
  78. function imgClickChange() {
  79. // $("#slide .p2").click(function(){ prevImg();});//为什么这种写法无效
  80. // $("#slide .p4").click(function(){ nextImg();});//为什么这种写法无效
  81. $('#slide .pic').removeAttr('onclick');
  82. $("#slide .p2").attr('onclick', 'left()');
  83. $("#slide .p4").attr('onclick', 'right()');
  84. }
  85. /*当前轮播按钮的选中状态*/
  86. function currentBtn() {
  87. var cur = parseInt($("#slide .p3").attr('data-img-id'));//取.p3的当前img-id
  88. $("#slide .btn span").removeClass('on');
  89. $("#slide .btn span[data-minibtn-id=" + cur + "]").addClass('on');
  90. }
  91. /* jquery写法 slideTouch(),触摸滑动切换 */
  92. /*
  93. function slideTouch() {
  94. let _start = 0, _end = 0;
  95. $("#slide").on('touchstart', (e) => {
  96. _start = e.originalEvent.targetTouches[0].pageX;
  97. });
  98. $('#slidd').on('touchmove', (e) => {
  99. // _end = (_start - e.originalEvent.targetTouches[0].pageX);
  100. _end = e.originalEvent.targetTouches[0].pageX;
  101. });
  102. $('#slide').on('touchend', (e) => {
  103. if ((_start - _end) < -100) { //【起点-终点】的绝对值 >100,故 x<-100 & x>100
  104. left();
  105. _end = 0;
  106. } else if ((_start - _end) > 100) {
  107. right();
  108. _end = 0;
  109. }
  110. });
  111. }*/
  112.  
  113.  
  114. /* js原生写法 slideTouch(),作用完全同上,触摸滑动切换 */
  115. function slideTouch() {
  116. let _start = 0, _end = 0,
  117. _ele = document.getElementById('slide');
  118. _ele.addEventListener('touchstart', touchStart, false);
  119. _ele.addEventListener('touchmove', touchMove, false);
  120. _ele.addEventListener('touchend', touchEnd, false);
  121. function touchStart(e) {
  122. _start = e.targetTouches[0].pageX;
  123. }
  124. function touchMove(e) {
  125. _end = e.targetTouches[0].pageX;
  126. }
  127. function touchEnd(e) {
  128. if ((_start - _end) < -100) { //【起点-终点】的绝对值 >100,故 x<-100 & x>100
  129. left();
  130. _end = 0;
  131. } else if ((_start - _end) > 100) {
  132. right();
  133. _end = 0;
  134. }
  135. }
  136. }
  137. </script>
View Code

效果如下图:只显示三张,太多图的话,手机移动端显示不下

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号