zoukankan      html  css  js  c++  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 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>

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

    遇到问题:

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

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

    蛋疼。。以后来填坑吧

  • 相关阅读:
    吴恩达 机器学习笔记
    三个水杯
    架构之美读书笔记05
    架构之美读书笔记04
    架构之美读书笔记03
    架构之美读书笔记02
    架构之美读书笔记01
    《需求工程——软件建模与分析》阅读笔记03
    《需求工程——软件建模与分析》阅读笔记02
    16下学期进度条2
  • 原文地址:https://www.cnblogs.com/fuyinsheng/p/5287610.html
Copyright © 2011-2022 走看看