手写穿梭框

成品展示(css只写了一点点)程序和程序员有一个能跑就行

 

html部分

<!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>穿梭框</title>
    <link rel="stylesheet" href="./index.css">
</head>
<body>
    <div id="warp">
        <ul id="left">
            <div id="left-head">
                <input type="checkbox"  id="checkallleft">全选
                <span id="leftnum">选中个数0</span>
            </div>
            <div id="leftlist">

                <li>
                    <input type="checkbox" id="check1">
                    <p>列表1</p> 
                </li>
                <li>
                    <input type="checkbox" id="check1">
                    <p>列表2</p> 
                </li>
                <li>
                    <input type="checkbox" id="check1" >
                    <p>列表3</p> 
                </li>
                <li>
                    <input type="checkbox" id="check1">
                    <p>列表4</p> 
                </li>
                <li>
                    <input type="checkbox" id="check1">
                    <p>列表5</p> 
                </li>
                <li>
                    <input type="checkbox" id="check1">
                    <p>列表6</p> 
                </li>
                <li>
                    <input type="checkbox" id="check1">
                    <p>列表7</p> 
                </li>
                <li>
                    <input type="checkbox" id="check1">
                    <p>列表8</p> 
                </li>
                <li>
                    <input type="checkbox" id="check1">
                    <p>列表9</p> 
                </li>
                <li>
                    <input type="checkbox" id="check1">
                    <p>列表10</p> 
                </li>
                <li>
                    <input type="checkbox" id="check1">
                    <p>列表11</p> 
                </li>
                <li>
                    <input type="checkbox" id="check1">
                    <p>列表12</p> 
                </li>
                <li>
                    <input type="checkbox" id="check1">
                    <p>列表13</p> 
                </li>
                <li>
                    <input type="checkbox" id="check1">
                    <p>列表14</p> 
                </li>
                <li>
                    <input type="checkbox" id="check1">
                    <p>列表15</p> 
                </li>
                <li>
                    <input type="checkbox" id="check1"> 
                    <p>列表16</p> 
                </li>
                <li>
                    <input type="checkbox" id="check1">
                    <p>列表17</p> 
                </li>
                <li>
                    <input type="checkbox" id="check1">
                    <p>列表18</p> 
                </li>
                  
                <li>
                    <input type="checkbox" id="check3" disabled="disabled">
                    <p>禁用1</p> 
                </li>
            </div>
        </ul>
        <div id="center">
            <span id="centerL">></span>
            <span id="centerR"><</span>
        </div>
        <ul id="right">
            <div id="right-head">
                <input type="checkbox"  id="checkallright">全选
                <span id="rightnum">选中个数0</span>
            </div>
            <div id="rightlist">
                <li>
                    <input type="checkbox" id="check3" disabled="disabled">
                    <p>禁用2</p> 
                </li>
            </div>
        </ul>
    </div>
 <script src="./index2.js"></script>
</body>
</html>

一点点css

*{
    margin: 0;
    padding: 0;
    list-style: none;
}
#warp{
    width: 600px;
    height: 600px;
    display: flex;
}
#left,#right,#center{
    text-align: center  ;
    width: 200px;
    height: 600px;
    border: solid 1px #ccc;
}
#left-head,#right-head{
    width: 200px;
    height: 30px;
    line-height: 30px;
    background-color: aqua;
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
    align-items: center;
    justify-content: space-around;
}
#left li,#right li{
    width: 180px;
    height: 30px;
    margin-top: 5px;
    background-color: aquamarine;
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
    justify-content: space-around;
    align-items: center;
  
}
#center span{
    font-size: 24px;
    background-color: antiquewhite;
    line-height: 600px;
}
#leftlist,#rightlist{
    height: 570px;
    overflow-y: scroll
}

js部分

/***
 * 
 * data:2022年02月09日
 * name:@是前端小白? || 蓝藻门
 * 
 * ***/
checkallleft.addEventListener("click",()=>{
    chekes=document.querySelectorAll("#leftlist>li>#check1")
    // 主动全选
    chekesAll(chekes)  
})
// 单选框勾选事件
var chekeListL=document.querySelectorAll("#check1")
for (let i = 0; i < chekeListL.length; i++) {
   chekeListL[i].addEventListener("change",()=>{
    var nums=document.querySelectorAll("#check1:checked") 
    num1(nums)  
    //勾选高亮 
    fun(nums,centerL)
    checkChange(nums)
    // 获取数据
    var arrLeft=checkValues(nums)
    // 被动全选
    var checks1=document.querySelectorAll("#check1")
    selfchekesAll(nums,checks1,checkallleft)
   }) 
}
centerL.addEventListener("click",()=>{
    var list1=document.querySelectorAll("#check1:checked")
    show(list1,rightlist)
    checkallleft.checked=false
    leftnum.innerHTML=`选中个数0`
    centerL.style. backgroundColor="antiquewhite"
})
checkallright.addEventListener("click",()=>{
    chekes=document.querySelectorAll("#check2")
    // 主动全选
    chekesAll2(chekes)  
})
 centerR.addEventListener("click",()=>{
    var list1=document.querySelectorAll("#check2:checked")
    show2(list1,leftlist)
    checkallright.checked=false
    rightnum.innerHTML=`选中个数0`
    centerR.style. backgroundColor="antiquewhite"
})



// 工具函数
// 状态守卫
var falg1=1
// 主动全选
let chekesAll=function(_chekes){
    if (falg1!=0) {
        for (let i = 0; i < _chekes.length; i++) {
            _chekes[i].checked=true; 
            falg1=0
            num1(_chekes)
                _chekes[i].parentNode.style. backgroundColor="#acfae0"
                centerL.style. backgroundColor="#f2d6b0"
            }
        }else{
            for (let i = 0; i < _chekes.length; i++) {
                _chekes[i].checked=false; 
                falg1=1
                leftnum.innerHTML=`选中个数0`
                _chekes[i].parentNode.style. backgroundColor="aquamarine"
                centerL.style. backgroundColor="antiquewhite"
            }   
        }
      
}
var falg2=1
let chekesAll2=function(_chekes){
    if (falg2!=0) {
        for (let i = 0; i < _chekes.length; i++) {
            _chekes[i].checked=true; 
            falg2=0
            num2(_chekes)
            _chekes[i].parentNode.style. backgroundColor="#acfae0"
            centerR.style. backgroundColor="#f2d6b0"
            }
        }else{
            for (let i = 0; i < _chekes.length; i++) {
                _chekes[i].checked=false; 
                falg2=1
                rightnum.innerHTML=`选中个数0`
                _chekes[i].parentNode.style. backgroundColor="aquamarine"
                centerR.style. backgroundColor="antiquewhite"
            }   
        }
      
}
// 计数器
const num1=function(_chekes){
    leftnum.innerHTML=`选中个数${_chekes.length}`
}
const num2=function(_chekes){
    rightnum.innerHTML=`选中个数${_chekes.length}`
}
// 勾选高亮
const checkChange=function(_nums){
    var nums=document.querySelectorAll("#check1") 
    if (!_nums.length<=0) {
        for (let i = 0; i < nums.length; i++) {
            nums=document.querySelectorAll("#check1:checked")
            console.log(nums);
            nums[i].parentNode.style. backgroundColor="aquamarine"
        }
    }else{
        for (let i = 0;  i<_nums.length; i++) {
           _nums[i].parentNode.style. backgroundColor="#acfae0"
        }
    }
}
const checkChanges=function(_nums){
    if (!_nums.length<=0) {
        var nums=document.querySelectorAll("#check2") 
        for (let i = 0; i < nums.length; i++) {
            nums=document.querySelectorAll("#check2:checked")
            nums[i].parentNode.style. backgroundColor="aquamarine"
        }
    }else{
        for (let i = 0;  i<_nums.length; i++) {
           _nums[i].parentNode.style. backgroundColor="#acfae0"
        }
    }
}
var arrLeft=[]
// 获取数据
const checkValues=function(_nums){  
    for (let i = 0; i < _nums.length; i++) {
        arrLeft.push(_nums[i].nextElementSibling.innerHTML)
    }
    return arrLeft
}
// 被动全选  勾选   所以单选框  改变那个单选框
const selfchekesAll=function(_nums,_checks,_str){
  if (_nums.length==_checks.length) {
      _str.checked=true
      falg1=0
      checkChange(_nums)
  }else{
    _str.checked=false
    falg1=1
  }
}
// 渲染页面  数据  在哪里添加节点
var arr= []
const show=function(_arr,_str){
    // 获取数据
    for (let i = 0; i < _arr.length; i++) {

       arr.push( _arr[i].nextElementSibling.innerHTML)
    }
    arr=arr.sort()
    // 删除节点
    for (let j = 0; j < _arr.length; j++) {
      _arr[j].parentNode.remove()
    }
    // 创建节点
    
    var tt=_str.querySelectorAll("#check2")
    for (let o = 0; o < tt.length; o++) {
    tt[o].parentNode.remove()
    }
    console.log(arr);
    for (let k = 0; k < arr.length; k++) {
        let li=document.createElement('li')
        li.innerHTML=` 
        <input type="checkbox" id="check2">
        <p>${arr[k]}</p> 
       `
       _str.appendChild (li)
   }
   arr=[]
  
   myfun()
}
var arr1=[]
const show2=function(_arr,_str){
    // 获取数据
    for (let i = 0; i < _arr.length; i++) {
       arr1.push( _arr[i].nextElementSibling.innerHTML)
    }
   
    // 删除节点
    for (let j = 0; j < _arr.length; j++) {
      _arr[j].parentNode.remove()
    }
    // 创建节点
    var vv=document.querySelectorAll("#check1")
    var bb=[]
    for (let index = 0; index < vv.length; index++) {
        bb.push(vv[index].nextElementSibling.innerHTML)
       
    }
    for (let rr = 0; rr < vv.length; rr++) {
        vv[rr].parentNode.remove()
    }
    arr1=arr1.concat(bb)
    arr1=arr1.sort()
    for (let k = 0; k < arr1.length; k++) {
        let li=document.createElement('li')
        li.innerHTML=` 
        <input type="checkbox" id="check1">
        <p>${arr1[k]}</p> 
       `
       _str.appendChild (li)
   }

   myfun()
}
// 右边渲染页面
const myfun=function(){
    var chekeListR=document.querySelectorAll("#check2")
    for (let i = 0; i < chekeListR.length; i++) {
        chekeListR[i].addEventListener("change",()=>{
         var nums=document.querySelectorAll("#check2:checked") 
         num2(nums)  
         //勾选高亮 
         fun(nums,centerR)
         checkChanges(nums)
         // 获取数据
         var arrLeft=checkValues(nums)
         // 被动全选
         var checks1=document.querySelectorAll("#check2")
         selfchekesAll(nums,checks1,checkallright)
        }) 
     }
}
// 勾选 穿梭案例高亮
const fun=function(_arr,_str){
    if (_arr.length>0) {
        _str.style. backgroundColor="#f2d6b0"
    }else{
        _str.style. backgroundColor="antiquewhite"
    }
}

写的很喽,大佬们见笑了

运用知识点:创建节点、添加节点、删除节点、获取父级节点、获取下一个兄弟节点、状态守卫、以及array的一些api

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值