<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body {
            font-family: "Microsoft YaHei", serif;
        }

        body, dl, dd, p, h1, h2, h3, h4, h5, h6 {
            margin: 0;
        }

        ol, ul, li {
            margin: 0;
            padding: 0;
            list-style: none;
        }

        img {
            border: none
        }
        #wrap{
            width: 300px;
            padding-top: 20px;
            margin: 50px auto;
            border:1px solid #bbb;
            border-radius: 15px;
            user-select: none;
        }
        #wrap ul.list li{
            width: 100%;
            height: 50px;
            line-height: 50px;
            font-size: 14px;
            background-image: url("img/checked1.png");
            background-repeat: no-repeat;
            background-size: 30px;
            background-position: 5px;
            text-indent: 70px;
            cursor: pointer;
            color: #fff;
        }
        #wrap ul.list li.click{
            background-image: url("img/checked2.png");
            text-indent: 50px;
        }
        #wrap .btn{
            overflow: hidden;
            width: 100%;
            height: 50px;
        }
        #wrap .btn p{
            float: left;
            line-height: 50px;
            margin-left: 50px;
            background-image: url("img/checked1.png");
            background-repeat: no-repeat;
            background-size: 30px;
            background-position: 0;
            text-indent: 45px;
            font-size: 14px;
            cursor: pointer;
        }
        #wrap .btn p.click{
            background-image: url("img/checked2.png");
        }
    </style>
</head>
<body>
<div id="wrap">
    <ul class="list">
        <!--<li>项目一</li>-->
        <!--<li>项目二</li>-->
    </ul>
    <div class="btn">
        <p class="all">全选</p>
        <p class="fan">反选</p>
    </div>
</div>
<script>
    (function (data) {
        let oUl = document.querySelector("#wrap .list");
        let aLi = oUl.getElementsByTagName("li");
        let oAll = document.querySelector("#wrap .btn .all");
        let oFan = document.querySelector("#wrap .btn .fan");
        let len = data.length;


        new Image().src = "img/checked2.png";
        //解决图片加载问题  提前加载图片  点击时加载图片如果请求慢的话会暂时空白

        // num发生变化后必须要做的事情
        function ifFullNum() {
            oAll.classList[num===len?"add":"remove"]("click");
            // if (num === len) {
            //     oAll.classList.add("click");
            // }else {
            //     oAll.classList.remove("click");
            // }
        }

        // 通过数据生成html结构
        (function () {
            let html="";
            let color = ["#000","#555","#aaa"];
            let colorLen = color.length;
            for (let i=0;i<len;i++){
                html += `<li style="background-color:${color[i%colorLen]}">${data[i].TXT}</li>`;
            }
            console.log(html);
            oUl.innerHTML = html;
        })();


        //给Li添加点击事件
        (function () {
            let num = 0;
            for (let i=0;i<len;i++) {
                aLi[i].onclick = function () {
                    // 切换选中状态
                    this.classList.toggle("click");

                    // this.classList.contains("click");
                    // // 检测是否包含这个属性名字,返回bool

                    if (this.classList.contains("click")) {
                        num ++;
                    }else{
                        num --;
                    }

                    // 判断num是否全部被选中

                    if(num===len){
                        oAll.classList.add("click");
                    }else{
                        oAll.classList.remove("click")
                    }

                    // 全选和反选

                    (function () {
                        // 全选的点击
                        oAll.onclick = function () {
                            this.classList.toggle("click");
                            // 判断被点击之后的选中状态

                            let bool = this.classList.contains("click");
                            let attr = bool?"add":"remove";
                            for (let i=0;i<len;i++){
                                aLi[i].classList[attr]("click");
                            }
                            num = bool?len:0;
                            // if (this.classList.contains("click")){
                            //
                            //
                            //     for (let i=0;i<len;i++){
                            //         aLi[i].classList.add("click");
                            //     }
                            //     num = len;
                            //
                            //
                            // }else{
                            //
                            //
                            //     for (let i=0;i<len;i++){
                            //         aLi[i].classList.remove("click");
                            //     }
                            //     num = 0;
                            //
                            //
                            // }
                        };

                        // 反选的点击
                        oFan.onclick = function () {
                            for (let i=0;i<len;i++){
                                aLi[i].classList.toggle("click");
                            }
                            num = len-num;
                        }
                    })();

                }
            }
        })();


    })(
        //假设这个数据是后台给的数据
        [
            {
                TXT:"项目1",
                //在每一项中可能还有其他数据
            },
            {
                TXT:"项目2",
            },
            {
                TXT:"项目3",
            },
            {
                TXT:"项目4",
            },
            {
                TXT:"项目5",
            },
            {
                TXT:"项目6",
            },
            {
                TXT:"项目7",
            },
            {
                TXT:"项目8",
            },
        ]
    );


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