輪番図(クリック切り替えと自動再生)


輪番パターン例
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
<script>
    // 1、  
    // 2、                   
    // 3、                    
    // 4、             
    // 5、            

    // imgCon            
    // dotList         
    // bnList            
    // imgList           
    // pos                
    // direction       
    // imgSrcList       
    var imgCon,ul,preDot;
    var pos=0,
        x=0,
        bool=false;
        dotList=[],
        imgList=[],
        bnList=[],
        time=300,
        imgSrcList=["./img/a.png","./img/b.png","./img/c.png","./img/d.png","./img/e.png"]
        direction=""
        autoBool=false;
    const WIDTH=1500;
    const HEIGHT=500;
    const LEFT=Symbol();
    const RIGHT=Symbol();
    const SPEED=40;
    init();
    /*
        init()      
        1、         
        2、         
        3、      
        4、       
        5、        body 
        6、     ,      0 ,              
        7、            
        8、      , 16    animation    ,     1000  
                 60 ,  60  ,        16.6666  
        9、              ,       ,       
    */
    function init(){
        var carousel=ce("div",{
            width:WIDTH+"px",
            height:HEIGHT+"px",
            position:"relative",
            margin:"auto",
            overflow:"hidden"
        });
        createImgCon(carousel);
        createButton(carousel);
        createDotList(carousel);
        document.body.appendChild(carousel);
        changeDot();
        ul.style.left=(WIDTH-ul.offsetWidth)/2+"px"; 
        setInterval(animation,16);
        carousel.addEventListener("mouseenter",mouseHandler);
        carousel.addEventListener("mouseleave",mouseHandler);
    }

    /*
                     
        1、       ,          false,      
                      300
        2、       ,         true,       
    */
    function mouseHandler(e){
        if(e.type==="mouseenter"){
            autoBool=false;
            time=300;
        }else if(e.type==="mouseleave"){
            autoBool=true;
        }
    }

    /*
            
          :
            type           ,   
            style          ,  ,              
        1、        
        2、                
        3、        
    */
    function ce(type,style){
        var elem=document.createElement(type);
        // ES6   ,                  
        Object.assign(elem.style,style);//        
        /* for(var prop in style){
            elem.style[prop]=style[prop];
        } */
        return elem;
    }

    /* 
                  
          :
            parent    ,                
        1、      ,            
        2、           ,            imgList 
        3、  0           imgCon 
        4、               
    */
    function createImgCon(parent){
        imgCon=ce("div",{
            position:"absolute",
            width:2*WIDTH+"px",
            height:HEIGHT+"px",
            left:0
        });
        for(var i=0;i<imgSrcList.length;i++){
            var img=ce("img",{
                width:WIDTH+"px",
                height:HEIGHT+"PX"
            });
            img.src=imgSrcList[i];
            imgList.push(img);
        }
        imgCon.appendChild(imgList[0]);
        parent.appendChild(imgCon);
    }

    /*
                
          :
            parent    ,             
        1、        
        2、        ,      ,         
        3、      
        4、             
        5、               bnClickHander
    */
    function createButton(parent){
        //     
        var arr=["left","right"];
        for(var i=0;i<arr.length;i++){
            var img=ce("img",{
                position:"absolute",
                // (     -      ) / 2     
                top:(HEIGHT-60)/2 +"px",
                //     0   ,    ,    50  ,  none
                left:i===0 ? "50px" : "none",
                //     1   ,    ,    50  ,  none
                right:i===1 ? "50px" : "none",
            });
            img.src=`./img/${arr[i]}.png`;
            bnList.push(img);
            parent.appendChild(img);
            img.addEventListener("click",bnClickHander);
        }
    }

    /*
               
          :
            parent    ,              
        1、  ul    
        2、         ,     ,                
        3、          dotList 
        4、      ul 
        5、 ul      ,        ,    

    */
    function createDotList(parent){
        ul=ce("ul",{
            listStyle:"none",
            margin:0,
            padding:0,
            position:"absolute",
            bottom:"50px"
        });
        for(var i=0;i<imgSrcList.length;i++){
            var dot=ce("li",{
                width:"28px",
                height:"28px",
                borderRadius:"50%",
                border:"2px solid #FF0000",
                float:"left",
                marginLeft:i===0 ? "0px" : "15px"
            });
            dotList.push(dot);
            ul.appendChild(dot);
        }
        // dotList=Array.from(ul.children);
        parent.appendChild(ul);
        ul.addEventListener("click",dotClickHandler);
    }

    /*
                  
        e           MouseEvent
        e.target          
          bool true,             ,      ,     
        1、                left.png   
           ,        ,        
        2、         ,      -1
            0,           -1,         ,           
        3、         ,      +1,            -1,    0
              0   ,           
    */
    function bnClickHander(e){
        if(bool) return;
        //      src       
        if(e.target.src.includes("left.png")){
            pos--;
            // imgSrcList.length-1         ,   pos            
            if(pos<0) pos=imgSrcList.length-1;
            direction=RIGHT;
        }else{
            pos++;
            if(pos>imgSrcList.length-1) pos=0;
            direction=LEFT;
        }
        createNextImg();
    }

    /*
                 
        e        MouseEvent
        e.target         
                 ,           li,       
          bool true,             ,      ,     
        1、         li,    
        2、                 
        3、                          ,     
        4、             ,         ,    
        5、                    
    */
    function dotClickHandler(e){
        if(bool) return;
        // if(e.target.nodeName!="LI") return;
        if(e.target.constructor!==HTMLLIElement) return;
        var index=dotList.indexOf(e.target);
        if(index===pos) return;
        direction=index>pos ? LEFT : RIGHT;
        pos=index;
        createNextImg();
    }

    /*
                    
                       ,     
        1、        ,             
        2、        ,              
                     ,                 
        3、     ,  bool true,              
                  
        4、       
    */
    function createNextImg(){
        // console.log(direction,pos,imgList[pos]);
        if(direction===LEFT){
            imgCon.appendChild(imgList[pos]);
            x=0;
        }else if(direction===RIGHT){
            // insertBefore      ,       
            imgCon.insertBefore(imgList[pos],imgCon.firstElementChild);
            imgCon.style.left=-WIDTH+"px";
            x=-WIDTH;
        }
        bool=true;
        changeDot();
    }

    /*
             
        preDot             
               ,    ,     ,           0    
            0        
                       0 ,                
                     ,       
                    ,    
    */
    function changeDot(){
        if(preDot){
            preDot.style.backgroundColor="rgba(255,0,0,0)";
        }
        preDot=dotList[pos];
        preDot.style.backgroundColor="rgba(255,0,0,0.5)";
    }

    /*
         16         
        1、  imgConMove    ,        
        2、      
    */
    function animation(){
        imgConMove();
        autoplay();
    }

    /*
         16         
                  ,     bool   ,  false ,      
              
        1、      
                 x  , 16   40  ,        ,          
                                ,   x          
              bool false,16          
                       ,            ,   x 0,             
        2、      
            x    40  
              x  0,               ,        
                    ,bool  false,x     0,       
    */
    function imgConMove(){
        if(!bool) return;
        if(direction===LEFT){
            x-=SPEED;
            if(x<=-WIDTH){
                imgCon.firstElementChild.remove();
                x=0;
                bool=false;
            }
            imgCon.style.left=x+"px";
        }else if(direction===RIGHT){
            x+=SPEED;
            if(x>=0){
                bool=false;
                x=0;
                imgCon.lastElementChild.remove();
            }
            imgCon.style.left=x+"px";
        }
    }
    
    /*
            
        1、         fasle ,  
        2、time    
        3、  time  0        
        4、time  0,  time   300
        5、          
        6、             
    */
    function autoplay(){
        if(!autoBool) return;
        time--;
        if(time>0) return;
        time=300;
        var evt=new MouseEvent("click");
        bnList[1].dispatchEvent(evt);
    }
</script>
</body>
</html>

効果の表示