【JS+CSS3】实现带预览图幻灯片效果的示例代码


Posted in Javascript onMarch 17, 2016

一、前期准备

1.1 案例分析

适用场景:单例布局
1.2 方法论

V视图 HTML+CSS+调试
C js实现控制流程
D数据 优化扩展

二、代码

结构

<div class="slider"><!-- 特效区 -->
  <div class="main"><!-- 主视图区 -->
    <div class="main_i">
      <div class="caption">
        <h2>h2 caption</h2>
        <h2>h3 caption</h2>
      </div>
    <img src="images/{{index}}.jpg" alt="">
    </div>
  </div><!-- 主视图区结束 -->
  <div class="ctrl"><!-- 控制区 -->
    <a href="javascript:;"><img src="images/{{index}}.jpg" alt="">
    </a>
  </div><!-- 控制区结束 -->
</div><!-- 特效区结束 -->

样式(CSS略)

脚本功能开发

>>内容输出
Template改造 输出幻灯片&控制按钮 图片位置调整

>>切换控制
切换幻灯片 .main_i_active 切换控制按钮 .ctrl_i_active

0、修改VIEW ->Template(关键字替换),增加Template id
图片区
<div class="main" id="template_main">
<h2>{{h2}}}</h2>
<h3>{{h3}}}</h3>
<img src="images/{{index}}.jpg">
按钮区
<div class="ctrl" id="template_ctrl">
<a class="ctrl_i" id="ctrl_{{index}}" href="javascript:switchSlider({{index}});"><img src="images/{{index}}.jpg" alt="图片预览"></a>

下面是重点 JS脚本的编写~~

<script type="text/javascript">

  // 1、数据定义(实际生产环境,应由后台给出)
  var data = [
    {img:1,h2:"我是标题二,小标题",h3:"我是标题三,大标题"},
    {img:2,h2:"我是标题二,小标题",h3:"我是标题三,大标题"},
    {img:3,h2:"我是标题二,小标题",h3:"我是标题三,大标题"},
    {img:4,h2:"我是标题二,小标题",h3:"我是标题三,大标题"},
    {img:5,h2:"我是标题二,小标题",h3:"我是标题三,大标题"},
    {img:6,h2:"我是标题二,小标题",h3:"我是标题三,大标题"},
    {img:7,h2:"我是标题二,小标题",h3:"我是标题三,大标题"},
  ];

  // 2、通用函数
  var g = function(id){
    if( id.substr(0,1) =="." ){
      return document.getElementsByClassName( id.substr(1) );
    }
    return document.getElementById(id);
  }

  // 3、添加幻灯片的操作(所有幻灯片&对应的按钮)
  function addSliders(){
    // 3.1 获取模版
    var tpl_main = g("template_main").innerHTML
      .replace(/^\s*/,'')
      .replace(/\s*$/,'');

    var tpl_ctrl = g("template_ctrl").innerHTML
      .replace(/^\s*/,'')
      .replace(/\s*$/,'');

    // 3.2 定义最终输出HTML的变量
    var out_main = [];
    var out_ctrl = [];

    // 3.3 遍历所有数据,构建最终输出的HTML
    for( i in data ){
      var _html_main = tpl_main
        .replace(/{{index}}/g,data[i].img)
        .replace(/{{h2}}/g,data[i].h2)
        .replace(/{{h3}}/g,data[i].h3)
        .replace(/{{css}}/g,['','main_i_right'][i%2]);

      var _html_ctrl = tpl_ctrl
        .replace(/{{index}}/g,data[i].img);
      
      out_main.push(_html_main);
      out_ctrl.push(_html_ctrl);
    }

    // 3.4 把HTML回写到对应的DOM里面
    g("template_main").innerHTML = out_main.join('');
    g("template_ctrl").innerHTML = out_ctrl.join('');
    
    // 7、增加#main_background
    g('template_main').innerHTML += tpl_main
      .replace(/{{index}}/g,'{{index}}')
      .replace(/{{h2}}/g,data[i].h2)
      .replace(/{{h3}}/g,data[i].h3);

    g('main_{{index}}').id = 'main_background';
  }

  // 5、幻灯片切换
  function switchSliders(n){
    // 5.1 获得要展现的幻灯片&控制按钮 DOM
    var main = g("main_"+n);
    var ctrl = g("ctrl_"+n);

    // 5.2 获得所有的幻灯片&控制按钮
    var clear_main = g('.main_i');
    var clear_ctrl = g('.ctrl_i');

    // 5.3 清除他们的active样式
    for(var i=0;i<clear_ctrl.length;i++){
      clear_main[i].className = clear_main[i].className.replace('main_i_active','');
      clear_ctrl[i].className = clear_ctrl[i].className.replace('ctrl_i_active','');
    }

    // 5.4为当前控制按钮和幻灯片附加样式  
    g("main_"+n).className += ' main_i_active';
    g("ctrl_"+n).className += ' ctrl_i_active';
    // 7.2切换时 复制上一张幻灯片到main_background中
    setTimeout(function(){
      g('main_background').innerHTML = main.innerHTML;
    },1000);
    
  }

  // 6、动态调整图片的margin-top 使其垂直居中
  function movePictures(){
    var pictures = g('.picture');
    for(i=0;i<pictures.length;i++){
      pictures[i].style.marginTop = -(pictures[i].clientHeight/3) + 'px';
    }
  }

  // 4、定义何时处理幻灯片输出
  window.onload = function(){
    addSliders();
    switchSliders(1);
    setTimeout(function(){
      movePictures();
    },100)
  }
</script>

效果图 … = =莫吐槽又是这几张图~~~ 

【JS+CSS3】实现带预览图幻灯片效果的示例代码 

遇到问题:

1、 给图片直接加top:50%;会有BUG,没作用,原因可能是没给height固定高度~~给了固定高度就好了

但问题又来了,2、给固定高度后,按钮组不能自适应宽度 … 会被挤到第二排去  ……

以上这篇【JS+CSS3】实现带预览图幻灯片效果的示例代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript XML数据显示为HTML一例
Dec 23 Javascript
JavaScript CSS修改学习第三章 修改样式表
Feb 19 Javascript
jquery实现标题字体变换的滑动门菜单效果
Sep 07 Javascript
BootstrapValidator不触发校验的实现代码
Sep 28 Javascript
JS判断输入的字符串是否是数字的方法(正则表达式)
Nov 29 Javascript
JS使用cookie实现只出现一次的广告代码效果
Apr 22 Javascript
基于Vue的ajax公共方法(详解)
Jan 20 Javascript
原生JS实现列表子元素顺序反转的方法分析
Jul 02 Javascript
JavaScript实现数组全排列、去重及求最大值算法示例
Jul 30 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
Nov 05 Javascript
vue组件暴露和.js文件暴露接口操作
Aug 11 Javascript
Vue实现返回顶部按钮实例代码
Oct 21 Javascript
javascript 继承学习心得总结
Mar 17 #Javascript
Node.js实用代码段之正确拼接Buffer
Mar 17 #Javascript
Node.js实用代码段之获取Buffer对象字节长度
Mar 17 #Javascript
jquery基础知识第一讲之认识jquery
Mar 17 #Javascript
Angularjs 滚动加载更多数据
Mar 17 #Javascript
基于jquery实现智能提示控件intellSeach.js
Mar 17 #Javascript
JavaScript函数内部属性和函数方法实例详解
Mar 17 #Javascript
You might like
如何正确理解PHP的错误信息
2006/10/09 PHP
Mysql中分页查询的两个解决方法比较
2013/05/02 PHP
php设计模式之工厂模式用法经典实例分析
2019/09/20 PHP
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
2009/11/14 Javascript
基于jquery的一行代码轻松实现拖动效果
2010/12/28 Javascript
script的async属性以非阻塞的模式加载脚本
2013/01/15 Javascript
javascript跨域的4种方法和原理详解
2014/04/08 Javascript
Node.js文件操作详解
2014/08/16 Javascript
jQuery实现鼠标划过修改样式的方法
2015/04/14 Javascript
JavaScript中for循环的使用详解
2015/06/03 Javascript
Bootstrap每天必学之缩略图与警示窗
2015/11/29 Javascript
jQuery表格插件datatables用法汇总
2016/03/29 Javascript
Google 地图叠加层实例讲解
2016/08/06 Javascript
jQuery实现自动调用和触发某个事件的方法
2016/11/18 Javascript
jQuery 如何实现一个滑动按钮开关
2016/12/01 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
vue-router history模式下的微信分享小结
2018/07/05 Javascript
js canvas实现橡皮擦效果
2018/12/20 Javascript
javascript实现日历效果
2019/06/17 Javascript
详解Vscode中使用Eslint终极配置大全
2019/11/08 Javascript
JS画布动态实现黑客帝国背景效果
2020/11/08 Javascript
python中dir函数用法分析
2015/04/17 Python
自动化Nginx服务器的反向代理的配置方法
2015/06/28 Python
Python中列表、字典、元组数据结构的简单学习笔记
2016/03/20 Python
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
TensorFlow实现Logistic回归
2018/09/07 Python
通过python将大量文件按修改时间分类的方法
2018/10/17 Python
Python PyCharm如何进行断点调试
2019/07/05 Python
Python实现某论坛自动签到功能
2019/08/20 Python
浅谈Python3实现两个矩形的交并比(IoU)
2020/01/18 Python
美国畅销的跑步机品牌:ProForm
2017/02/06 全球购物
世界领先的26岁以下学生和青少年旅行预订网站:StudentUniverse
2018/07/01 全球购物
俄罗斯珠宝市场的领导者之一:Бронницкий ювелир
2019/10/02 全球购物
大学毕业生求职自荐信
2014/02/20 职场文书
毕业设计论文致谢词
2015/05/14 职场文书
小学生大队委竞选稿
2015/11/20 职场文书