你的位置:首页 > Java教程

[Java教程]【JS/CSS3】实现带预览图幻灯片效果~


一、前期准备

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 id="template_main">
<h2>{{h2}}}</h2>
<h3>{{h3}}}</h3>
<img src="images/{{index}}.jpg">
按钮区
<div id="template_ctrl">
<a 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>

 

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

 

遇到问题:

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

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

 

蛋疼。。以后来填坑吧