JQuery-アコーディオン、メッセージボード

1.アコーディオン

<!DOCTYPE html>
<html>

<head lang="en">
  <meta charset="UTF-8">
  <title></title>
  <style>
    ul {
    
    
      list-style: none
    }

    * {
    
    
      margin: 0;
      padding: 0;
    }

    div {
    
    
      position: relative;
      width: 1200px;
      height: 400px;
      margin: 50px auto;
      border: 1px solid red;
      overflow: hidden;
    }

    div li {
    
    
      width: 1200px;
      height: 400px;
      /*float: left;*/
      position: absolute;
    }

    div ul {
    
    
      width: 1200px;
    }
  </style>
</head>

<body>
  <div id="box">
    <ul>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
    </ul>
  </div>
  <script src="../jquery-1.12.4.min.js"></script>
  <script>
    /*
    功能分析:
      - 事件: mouseover()  mouseout()
      - 结构的初始设置
        - 设置默认背景图
        - 设置初始的left值:以240为间隔
      - 移入功能
        - 根据当前元素的索引分为前后两组运动
          - 由于修改的是left,需要使用animate()
          - 第一组
            - 当前元素和前面的元素,索引小于等于当前元素索引
          - 第二组
            - 后续元素,索引大于当前元素索引
      - 移出功能
        - 设置给大盒子
        - 设置每个元素的left还原为240的间隔即可


      小结:
        - 之前说过设置操作可以进行隐式迭代
          - 有时候我们虽然进行设置操作,但是可能不想使用隐式迭代
          - 例如要设置的样式值不同时、要设置的运动值不同时
  */

    $(function () {
    
    
      // 实现:
      var $box = $('#box');
      var $lis = $('li');
      // 设置初始样式: 背景图、left
      $lis.each(function (i, ele) {
    
    
        $(ele).css({
    
    
          backgroundImage: 'url(images/' + (i + 1) + '.jpg)',
          left: i * 240
        });
      });
      // 设置移入事件
      $lis.mouseover(function () {
    
    
        // 根据当前元素的索引区分两组元素,并设置运动
        var index = $(this).index();
        // 遍历所有li,分别设置运动
        $lis.each(function (i, ele) {
    
    
          // 比较i和index的关系
          //  记得加stop()哦
          if (i <= index) {
    
    
            $(ele).stop().animate({
    
    
              left: i * 100
            });
          } else {
    
    
            $(ele).stop().animate({
    
    
              left: i * 100 + 700
            });
          }
        });
      });

      // 给box设置移出,让所有元素的left还原即可
      $box.mouseout(function () {
    
    
        // 所有元素的left都不一样,需要遍历后设置
        $lis.each(function (i, ele) {
    
    
          $(ele).stop().animate({
    
    
            left: i * 240
          });
        });
      });
    });
  </script>
</body>

</html>

2.メッセージボード

<!DOCTYPE html>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
    <title>ToDoList—最简单的待办事项列表</title>
    <script src="http://10.2.18.96:8011/assets/js/jquery-3.2.1.min.js"></script>
    <style>
        body {
    
    
            margin: 0;
            padding: 0;
            font-size: 16px;
            background: #CDCDCD;
        }

        header {
    
    
            height: 50px;
            background: #333;
            background: rgba(47, 47, 47, 0.98);
        }

        section {
    
    
            margin: 0 auto;
        }

        label {
    
    
            float: left;
            width: 100px;
            line-height: 50px;
            color: #DDD;
            font-size: 24px;
            cursor: pointer;
            font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
        }

        header input {
    
    
            float: right;
            width: 60%;
            height: 24px;
            margin-top: 12px;
            text-indent: 10px;
            border-radius: 5px;
            box-shadow: 0 1px 0 rgba(255, 255, 255, 0.24), 0 1px 6px rgba(0, 0, 0, 0.45) inset;
            border: none
        }

        input:focus {
    
    
            outline-width: 0
        }

        h2 {
    
    
            position: relative;
        }

        span {
    
    
            position: absolute;
            top: 2px;
            right: 5px;
            display: inline-block;
            padding: 0 5px;
            height: 20px;
            border-radius: 20px;
            background: #E6E6FA;
            line-height: 22px;
            text-align: center;
            color: #666;
            font-size: 14px;
        }

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

        li input {
    
    
            position: absolute;
            top: 2px;
            left: 10px;
            width: 22px;
            height: 22px;
            cursor: pointer;
        }

        p {
    
    
            margin: 0;
        }

        li p input {
    
    
            top: 3px;
            left: 40px;
            width: 70%;
            height: 20px;
            line-height: 14px;
            text-indent: 5px;
            font-size: 14px;
        }

        li {
    
    
            height: 32px;
            line-height: 32px;
            background: #fff;
            position: relative;
            margin-bottom: 10px;
            padding: 0 45px;
            border-radius: 3px;
            border-left: 5px solid #629A9C;
            box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07);
        }

        ol li {
    
    
            cursor: move;
        }

        ul li {
    
    
            border-left: 5px solid #999;
            opacity: 0.5;
        }

        li a {
    
    
            position: absolute;
            top: 2px;
            right: 5px;
            display: inline-block;
            width: 14px;
            height: 12px;
            border-radius: 14px;
            border: 6px double #FFF;
            background: #CCC;
            line-height: 14px;
            text-align: center;
            color: #FFF;
            font-weight: bold;
            font-size: 14px;
            cursor: pointer;
        }

        footer {
    
    
            color: #666;
            font-size: 14px;
            text-align: center;
        }

        footer a {
    
    
            color: #666;
            text-decoration: none;
            color: #999;
        }

        @media screen and (max-device-width: 620px) {
    
    
            section {
    
    
                width: 96%;
                padding: 0 2%;
            }
        }

        @media screen and (min-width: 620px) {
    
    
            section {
    
    
                width: 600px;
                padding: 0 10px;
            }
        }
    </style>
</head>

<body>
    <header>
        <section>
            <label for="title">ToDoList</label>
            <!-- 进行操作的输入框 -->
            <input type="text" id="title" name="title" placeholder="添加ToDo" required="required" autocomplete="off" />
        </section>
    </header>
    <section class="container">
        <h2>正在进行 <span id="todocount"></span></h2>
        <ol id="todolist" class="demo-box">

        </ol>
        <h2>已经完成 <span id="donecount"></span></h2>
        <ul id="donelist">

        </ul>
    </section>
    <footer>
        Copyright &copy; 2014 todolist.cn
    </footer>

    <script>
        /*
  当案例完成后我们会发现,实际上操作步骤大体如下:
    - 1 获取存储的数据
    - 2 根据需求修改数据
    - 3 设置回本地存储保存
    - 4 根据本地存储的数据进行结构创建

  功能分析:
    - 1 输入框中输入内容,点击了回车
        - e.keyCode === 13
    - 2 将数据保存到本地存储中
        - 根据本地存储中是否具有数据进行对应设置
        - 2.1 获取本地存储中的数据
        - 2.2 将新数据放入到本地存储保存
    - 3 根据本地存储中的数据进行页面结构设置
*/
        $(function () {
    
    

            // 1 获取元素
            var $title = $('#title'); // 输入框
            var $todolist = $('#todolist'); // 放置没有完成的内容的ol
            var $donelist = $('#donelist'); // 放置已完成的内容的ul
            var $todocount = $('#todocount');
            var $donecount = $('#donecount');
            var $container = $('.container');

            // 2 设置输入框的输入操作
            //   - keydown时检测是否点击了回车键
            $title.on('keydown', function (e) {
    
    
                if ($(this).val() === '') {
    
    
                    return;
                }

                // 3 检测keyCode是否为13
                if (e.keyCode !== 13) {
    
    
                    return;
                }
                // 4 将输入保存到本地存储中
                //  - 获取本地存储中的数据(最终处理结果为一个数组)
                var datas = getDatas();

                //  - 添加数据
                //    - 数据的形式:必须有内容content,还需要有完成状态
                //       - status 状态,值为布尔类型,true表示完成了
                datas.push({
    
    
                    content: $(this).val(),
                    status: false
                });
                //  - 设置本地存储中的数据
                setDatas(datas);

                //  - 操作完毕,将输入框内容清空
                $(this).val('');

                //  - 进行结构创建操作
                createHTML();
            });

            // 5 页面加载时,进行结构创建
            createHTML();

            // 6 给复选框设置事件(由于可能具有动态创建的元素,需要采用事件委托)
            $container.on('click', 'input', function () {
    
    
                // 数据操作
                //   - 获取本地存储中的数据
                var datas = getDatas();

                //   - 根据当前元素的data-index, 修改datas中对应元素的status
                var index = $(this).data('index');
                datas[index].status = $(this).prop('checked');

                //   - 设置本地存储中的数据
                setDatas(datas);

                // 结构操作
                createHTML();
            });


            // 7 给删除按钮设置事件(由于可能具有动态创建的元素,需要采用事件委托)
            $container.on('click', 'a', function () {
    
    
                // 数据操作
                //   - 获取本地存储中的数据
                var datas = getDatas();

                //   - 根据当前元素的data-index, 删除datas中对应元素
                var index = $(this).data('index');
                datas.splice(index, 1);

                //   - 设置本地存储中的数据
                setDatas(datas);

                // 结构操作
                createHTML();
            });



            function getDatas() {
    
    
                var datas = localStorage.getItem('todoDatas'); // 没有获取到数据时为null
                if (datas !== null) {
    
    
                    // 说明存在旧的数据,将JSON格式的数据进行转换
                    datas = JSON.parse(datas);
                } else {
    
    
                    datas = [];
                }
                return datas;
            }

            function setDatas(datas) {
    
    
                //    - 将复杂数据转换为JSON后放入
                localStorage.setItem('todoDatas', JSON.stringify(datas));
            }

            function createHTML() {
    
    
                //  - 根据本地存储中的数据进行结构创建(为了确保数据准确和功能可合并,推荐先获取一次然后再操作)
                //    - 获取本地存储中的数据
                var datas = getDatas();

                // 创建后发现,旧结构还是存在,应当先清空再设置
                $donelist.empty();
                $todolist.empty();

                //    - 根据datas中的数据生成li
                //      - 需要判断datas中每个对象的status属性,分别放入到ul和ol中
                //      - $.each()可以对数组和对象进行统一的遍历操作
                $.each(datas, function (i, ele) {
    
    
                    // 判断ele.status的值,设置不同的结构
                    if (ele.status) {
    
    
                        // 已完成的内li放入到ul中
                        $donelist.prepend(
                            '<li>\
                    <input type="checkbox" checked="checked" data-index="' + i + '">\
                    <p>' + ele.content + '</p>\
                    <a href="javascript:;" data-index="' + i + '"></a>\
                </li>');
                    } else {
    
    
                        // 未完成的li放入到ol中
                        $todolist.prepend(
                            '<li>\
                    <input type="checkbox" data-index="' + i + '">\
                    <p>' + ele.content + '</p>\
                    <a href="javascript:;" data-index="' + i + '"></a>\
                </li>');
                    }
                });

                //    - 设置对应的计数展示
                $todocount.text($todolist.children().length);
                $donecount.text($donelist.children().length);

            }
        });
    </script>
</body>

</html>

おすすめ

転載: blog.csdn.net/weixin_45176415/article/details/104440939
おすすめ