JavaScript(16) -缓冲远动,轮播图的实现,js实现全选反选

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

封装的方法

//方法封装
function animated(element,targetObject,callback,speed){//element 变化的元素  传入目标对象 targetObject callback 回调函数
    clearInterval(element.timer)
    if(typeof speed !='number'){
        speed = Number(speed)
        if(isNaN(speed)){
            speed = 0
        }
    }
    //遍历目标对象 查看里面需要变化的内容 {"width":100,"height":100,opacity":1,"zIndex":1}
    element.timer = setInterval(()=>{
        let flag = true 
        for(let key in targetObject){
          let current = parseFloat(getStyle(element,key))
          let step = 0
          //判断传进来的值
          if(key=="opacity"){//如果是opacity是使用下面这个
              //不需要px作为单位
              //目标元素 targetObject[key]  当前的值 Number(getStyle(element,key)) 步长 
              step = (targetObject[key]*100-current*100)/10 //保证最终达到目标位置
              element.style[key] = (current*100+step)/100
          }
          if(key=="zIndex"){//如果是层高 直接设置 
             element.style[key] = targetObject[key]
          }
          if(key!="opacity" && key!="zIndex"){ //height width left top
            step = (targetObject[key]-current)/10>0?Math.ceil((targetObject[key]-current)/10):Math.floor((targetObject[key]-current)/10)
            element.style[key] = current+step+'px'
          }
          if(parseFloat(getStyle(element,key))!=targetObject[key]){//如果某个没有设置完
                flag = false
          }
        }
        if(flag){
            clearInterval(element.timer)
            //执行对应的callback
            if(typeof callback =='function'){//如果你是个函数
                //执行这个函数
                callback()
            }
        }
    },speed)
    //callback是所有的这个函数里面所有的事情做完以后做的事情
}
//获取样式的值
function getStyle(element,attr){ //需要获取样式的对象  样式的名字
    // window.getComputedStyle(element,null)[attr]
    // element.currentStyle ie的兼容写法
    //获取样式对象
    var style = window.getComputedStyle?window.getComputedStyle(element,null):element.currentStyle
    return style[attr]
}
// 封装一个方法 用于获取滚动栏离顶部的距离和离最左距离
function myScoll(){
    //如果没有滚动栏
    if(window.pageYOffset!=null){
        return {"left":window.pageXOffset,"top":window.pageYOffset}
    }
    //获取top值
    let top = document.body.scrollTop?document.body.scrollTop:document.documentElement.scrollTop
    //获取left值
    let left = document.body.scrollLeft?document.body.scrollLeft:document.documentElement.scrollLeft
    //再返回
    return {left,top}
}

提示:以下是本篇文章正文内容,下面案例可供参考

一、双排透明度轮播图

1.要求利用透明度加缓冲动画分上下两排同时轮播

如图

在这里插入图片描述
在这里插入图片描述

2. 代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    
    <style>
        #box {
            height: 500px;
            width: 800px;
            border: 1px solid #c0c0c0;

            position: absolute;
            margin: 100px auto;
            left: 100px;

        }

        * {
            margin: 0;
            padding: 0;
        }

        ul {
            list-style: none;
            height: 100%;
            width: 100%;
        }

        ul > li {
            height: 100%;
            width: 100%;
            position: absolute;
            font-size: 30px;
            text-align: center;

        }
       

        li:nth-child(1) {

            /*background-color: red;*/
        }

        li:nth-child(2) {
            /*background-color: yellow;*/
        }

        li:nth-child(3) {
            /*background-color: green;*/
        }

        li:nth-child(4) {
            /*background-color: #0094ff;*/
        }

        li:nth-child(5) {
            /*background-color: pink;*/
        }

        ol {
            list-style: none;
            width: 100%;
            margin-top: 5px;
        }

        ol > li {
            height: 100px;
            width: 146px;
            margin-left: 8px;
            float: left;
            text-align: center;
            border: 1px solid #999999;
        }

        ol > li img {
            height: 100px;
            width: 146px;
            float: left;
            
        }
       
    </style>

</head>
<body>


<div id="box">
    <ul id="ul">
        <li><a href="javascript:void(0)"><img src="images/slidepic1.jpg" alt=""/></a></li>
        <li><a href="javascript:void(0)"><img src="images/slidepic2.jpg" alt=""/></a></li>
        <li><a href="javascript:void(0)"><img src="images/slidepic3.jpg" alt=""/></a></li>
        <li><a href="javascript:void(0)"><img src="images/slidepic4.jpg" alt=""/></a></li>
        <li><a href="javascript:void(0)"><img src="images/slidepic5.jpg" alt=""/></a></li>
    </ul>

    <ol id="ol">
        <li><a href="javascript:void(0)"><img src="images/slidepic1.jpg" alt=""/></a></li>
        <li><a href="javascript:void(0)"><img src="images/slidepic2.jpg" alt=""/></a></li>
        <li><a href="javascript:void(0)"><img src="images/slidepic3.jpg" alt=""/></a></li>
        <li><a href="javascript:void(0)"><img src="images/slidepic4.jpg" alt=""/></a></li>
        <li><a href="javascript:void(0)"><img src="images/slidepic5.jpg" alt=""/></a></li>
    </ol>
</div>
<script src="./js/animatedPlus.js"></script>
<script>
        var ulList = document.querySelectorAll('ul>li')
        var olList = document.querySelectorAll('ol>li')

    //定时器
    //遍历所有的li
    for(let li of ulList){
        li.style.opacity = 0
    }
    for(let li of olList){
        li.style.opacity = 0.5
    }
    //将第一张图片全部显示出来
    ulList[0].style.opacity = 1
    olList[0].style.opacity = 1
    let i = 0
    let timer
    //自动轮播
    function autoMove(){
        timer = setInterval(()=>{
            animated(ulList[i],{'opacity':0},1,40)
            animated(olList[i],{'opacity':0.5},1,40)
            i++
            if(i>ulList.length-1){
                i = 0
            }
            animated(ulList[i],{'opacity':1},1,40)
            animated(olList[i],{'opacity':1},1,40)
            //ul的li全部透明度为0,显示那个为1
            //ul的li全部透明度为0.5,显示那个为1
        },2000)
    }
    autoMove()
    document.getElementById('ul').onmouseenter = function(){
        clearInterval(timer)
    }
    document.getElementById('ul').onmouseleave = function(){
        autoMove()
    }

</script>
</body>
</html>

二、旋转木马轮播图

1.要求

鼠标移入显示出左右箭头
在这里插入图片描述
在这里插入图片描述
点击左边箭头向左轮播
在这里插入图片描述
点击右边箭头向右轮播
在这里插入图片描述

2.代码

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>旋转木马轮播图</title>
    <link rel="stylesheet" href="css/css.css"/>
</head>
<body>
<div class="wrap" id="wrap">
   <div class="slide" id="slide">
       <ul>
           <li><a href="#"><img src="images/slidepic1.jpg" alt=""/></a></li>
           <li><a href="#"><img src="images/slidepic2.jpg" alt=""/></a></li>
           <li><a href="#"><img src="images/slidepic3.jpg" alt=""/></a></li>
           <li><a href="#"><img src="images/slidepic4.jpg" alt=""/></a></li>
           <li><a href="#"><img src="images/slidepic5.jpg" alt=""/></a></li>
       </ul>
       <div class="arrow" id="arrow">
           <a href="javascript:;" class="prev"></a>
           <a href="javascript:;" class="next"></a>
       </div>
   </div>

</div>

    <script src="./js/animatedPlus.js"></script>
    <script>
        var jsonData = [
        {   //  1
            width:400,
            top:20,  
            left:50,
            opacity:0.2,
            zIndex:2
        },
        {  // 2
            width:600,
            top:70,
            left:0,
            opacity:.80,
            zIndex:3
        },
        {   // 3
            width:800,
            top:100,
            left:200,
            opacity:1,
            zIndex:4
        },
        {  // 4
            width:600,
            top:70,
            left:600,
            opacity:.80,
            zIndex:3
        },
        {   //5
            width:400,
            top:20,
            left:750,
            opacity:.20,
            zIndex:2
        }
    ];
    //渲染到页面
       //获取所有li
       var liList = Array.from(document.getElementsByTagName("li"))//将他转为数组 
       //封装为初始方法
       function init(){
            //给所有li属性
            liList.forEach((li,index)=>{
                animated(li,jsonData[index])
            })
       }
       init()//调用初始化方法
       //移入大盒子显示箭头
            //获取大盒子 添加移入移出事件
            let warp = document.getElementById('wrap')
            //获取箭头
            let arrow = document.querySelectorAll("#arrow>a")
            let arrowBox = document.querySelector('#arrow')
            warp.onmouseenter = function(){
                //把盒子的透明度 变为1
                arrowBox.style.opacity = 1
            }
            warp.onmouseleave = function(){
                //把盒子的透明度 变为1
                arrowBox.style.opacity = 0
            }

        //获取左右切换箭头添加点击事件
        //左
         arrow[0].onclick = function(){
            jsonData.unshift(jsonData.pop())
            init()
         }
         //右
         arrow[1].onclick = function(){
            jsonData.push(jsonData.shift())
            init()
         }
  
 
    </script>
</body>
</html>

css文件

@charset "UTF-8";
/*初始化  reset*/
blockquote,body,button,dd,dl,dt,fieldset,form,h1,h2,h3,h4,h5,h6,hr,input,legend,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0}
body,button,input,select,textarea{font:12px/1.5 "Microsoft YaHei", "微软雅黑", SimSun, "宋体", sans-serif;color: #666;}
ol,ul{list-style:none}
a{text-decoration:none}
fieldset,img{border:0;vertical-align:top;}
a,input,button,select,textarea{outline:none;}
a,button{cursor:pointer;}

.wrap{
    width:1200px;
    margin:100px auto;
}
.slide {
    height:500px;
    position: relative;
}
.slide li{
    position: absolute;
    left:200px;
    top:0;
}
.slide li img{
    width:100%;
}
.arrow{
    opacity: 0;
}
.prev,.next{
    width:76px;
    height:112px;
    position: absolute;
    top:50%;
    margin-top:-56px;
    background: url(../images/prev.png) no-repeat;
    z-index: 99;
}
.next{
    right:0;
    background-image: url(../images/next.png);
}

三、点击按钮方块交换位置

1.要求点击按钮div块交换位置且有动画效果

在这里插入图片描述
在这里插入图片描述

2.代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./js/animatedPlus.js"></script>
    <style>
        *{margin: 0;padding: 0;}
        button{
            height: 20px;
        }
      
        #box1{
            width: 100px;
            height: 100px;
            background-color: aqua;
            position: absolute;
            left: 0;
            top: 20px;
        }
        #box2{
            width: 100px;
            height: 100px;
            background-color: burlywood;
            position: absolute;
            left: 100px;
            top: 120px;
        }
        a{
            position: relative;
        }
    </style>
</head>
<body>
    <button>交换位置</button>
        <a href="#"> 
            <div id="box1"></div>
            <div id="box2"></div>
        </a>
    
    <script>
        //获取按钮
        let btn =  document.querySelector('button')
        //给按钮加点击事件
        btn.onclick = function(){
            
            //点击事件里面交换位置
            //获取两个div 得到两个div的初始位置
            let divs = document.getElementsByTagName('div')
             
            let firstPoint = {"left":parseFloat(getStyle(divs[0],"left")),"top":parseFloat(getStyle(divs[0],'top'))}
            let lastPoint = {"left":parseFloat(getStyle(divs[1],"left")),"top":parseFloat(getStyle(divs[1],'top'))}
            //调用animated方法使用两个div的位置进行交换
            animated(divs[0],lastPoint,function(){
                animated(divs[1],firstPoint ,function(){
                    console.log("完成");
                })
            })
        }
    </script>
</body>
</html>

四、猴子移动

1.要求

移动轨迹: 在页面上点击某处并拖动鼠标,最后松开, 让猴子在你鼠标滑过的地方移动, 如下图
思路:

  1. onmousedown: 记录点击开始

  2. onmousemove: 保存移动过程中的每一个点(x, y),(用对象保存 {x:x,y:y}), 用一个数组保存所有点,

  3. onmouseup: 让猴子按顺序经过所有点
    在这里插入图片描述

在这里插入图片描述

2.代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .pa{
            position: absolute;
        }
    </style>
</head>
<body>
    <script src="./js/animateAction.js"></script>
    <script>
//         6, 移动轨迹:   在页面上点击某处并拖动鼠标,最后松开, 让猴子在你鼠标滑过的地方移动, 如下图
// 思路:  1, onmousedown: 记录点击开始
//          2,  onmousemove: 保存移动过程中的每一个点(x, y),(用对象保存{x:x,y:y}), 用一个数组保存所有点,
//          3,  onmouseup: 让猴子按顺序经过所有点
            document.onmousedown = function(e){
                //初始位置
                 e=e||window.event
                 //获取x位置 y位置
                 var x = e.clientX
                 var y = e.clientY
                 //创建元素 img
                 let img = document.createElement('img')
                 img.src = "./images/a.png"
                 img.className = 'pa'
                 img.style.left = x + 'px'
                 img.style.top = y + 'px'
                 //加到body里面
                 document.body.appendChild(img)
                 //声明数组
                 let pointList = []
                document.onmousemove = function(e){
                    //初始位置
                     e=e||window.event
                     e.preventDefault()
                    //获取x位置 y位置 存入对象
                    let newPoint = new point(e.clientX,e.clientY)
                    //再进入数组
                    pointList.push(newPoint)
                }
                document.onmouseup = function(){
                    //让猴子按顺序经过所有的点
                    pointList.forEach(({x,y})=>{//遍历数组
                        animatedChange(img,{"left":x,"top":y})
                    })
                    setTimeout(()=>{
                        //将图片删除
                        document.body.removeChild(img)
                    },2000)
                    document.onmousemove = null
                    document.onmouseup = null
                }
            }

            //坐标模板
            class point{
                constructor(x,y){
                    this.x = x
                    this.y = y
                }
            }

    </script>
</body>
</html>

五、js实现全选反选

1.要求

  1. 点击全选全选选择框
  2. 点击反选反选选择框

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    全选:<input type="checkbox" id="selectAll">
    反选:<input type="checkbox" id="select"><br>
     <ul>
         <li><input type="checkbox" name="food">1</li>
         <li><input type="checkbox" name="food">2</li>
         <li><input type="checkbox" name="food">3</li>
         <li><input type="checkbox" name="food">4</li>
         <li><input type="checkbox" name="food">5</li>
         <li><input type="checkbox" name="food">6</li>
     </ul>
    <script>
        //获取选择框
        let selectAll = document.getElementById('selectAll')
        let select = document.getElementById('select')
        let checkboxList = Array.from(document.getElementsByName('food'))
        //给选择框加点击事件
        selectAll.onclick = function(){
            //判断是on还是selected
            if(!selectAll.checked){//取消选择
                checkboxList.forEach((checkbox)=>{
                    checkbox.checked = false
                })
            }else{
                checkboxList.forEach((checkbox)=>{
                    checkbox.checked = true
                })
            }
        }
        //给选择框加点击事件
        select.onclick = function(){
            //取消选择
            checkboxList.forEach((checkbox)=>{
                if(checkbox.checked){
                    checkbox.checked = false
                }else{
                    checkbox.checked = true
                }
            })
        }
    </script>
</body>
</html>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在uni-app中,可以使用van-checkbox-group组件实现全选反选和单选的功能。首先,你需要在data中定义一个数组来存储checkbox的选中状态: ```javascript data() { return { checkboxOptions: [ { value: 'option1', text: '选项1', checked: false }, { value: 'option2', text: '选项2', checked: false }, { value: 'option3', text: '选项3', checked: false } ], isCheckedAll: false }; } ``` 然后,在模板中使用van-checkbox-group和van-checkbox组件来展示和操作checkbox: ```html <template> <van-checkbox-group v-model="checkboxOptions"> <van-checkbox v-for="(option, index) in checkboxOptions" :key="index" :name="option.value" @change="onChange"> {{ option.text }} </van-checkbox> </van-checkbox-group> </template> ``` 其中,v-model绑定checkboxOptions数组,使得checkbox的选中状态与数组中的checked属性关联起来。@change事件监听checkbox的变化,通过onChange方法来更新全选按钮的状态: ```javascript methods: { onChange() { this.isCheckedAll = this.checkboxOptions.every(option => option.checked); }, toggleCheckAll() { this.isCheckedAll = !this.isCheckedAll; this.checkboxOptions.forEach(option => { option.checked = this.isCheckedAll; }); } } ``` toggleCheckAll方法用于切换全选按钮的状态,并更新checkboxOptions数组中的每个选项的checked属性。 最后,在模板中添加全选按钮和反选按钮: ```html <template> <div> <van-checkbox v-model="isCheckedAll" @change="toggleCheckAll"> 全选 </van-checkbox> <van-checkbox @change="onChange"> 反选 </van-checkbox> </div> </template> ``` 现在,你可以通过点击全选按钮、反选按钮或每个单选按钮来实现全选反选和单选功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值