IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> JavaScript-day14------->主要内容包括选项卡,简易轮播;DOM新增,删除,替换,找父元素,找子元素,找同级;克隆节点;查找元素,以及文档碎片;留言板。 -> 正文阅读

[JavaScript知识库]JavaScript-day14------->主要内容包括选项卡,简易轮播;DOM新增,删除,替换,找父元素,找子元素,找同级;克隆节点;查找元素,以及文档碎片;留言板。

1.选项卡

css样式

    <style>
        p{
            display: none;
        }
        .active{
            color: red;
        }
        .show{
            display: block;
        }
    </style>
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

主体内容:

<body>

    <button class="active">1</button>
    <button>2</button>
    <button>3</button>
    <p class="show">111</p>
    <p>222</p>
    <p>333</p>


    <script>

        // 
        var oBtns = document.querySelectorAll('button') ;
        var oPs = document.querySelectorAll('p') ;

        // 按钮绑定事件
        for(var i = 0 ; i < oBtns.length ; i++) {
            // 给对象添加自定义属性
            // oBtns[i].index = i ;
            // 给标签添加自定义属性
            oBtns[i].setAttribute('index' , i)
            oBtns[i].onclick = function () {  
                
                // 清除所有
                for(var j = 0 ; j < oBtns.length ; j++) {
                    oBtns[j].classList.remove('active') ;
                    oPs[j].classList.remove('show') ;
                }
                // 给当前添加
                this.classList.add('active') ;
                // oPs[this.index].classList.add('show') ;
                oPs[this.getAttribute('index')].classList.add('show') ;
            }
        }

    </script>
    
</body>
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

2.简易轮播

css样式:

    <style>
        *{
            padding: 0;
            margin: 0;
        }
        .banner {
            width: 600px;
            height: 400px;
            margin: 40px auto;
            position: relative;
        }
        .banner p{
            width: 600px;
            height: 400px;
            border: 1px solid #000;
            text-align: center;
            line-height: 400px;
            display: none;
            background-color: #ff0;
        }
        .banner .show{
            display: block;
        }
        .banner div{
            position: absolute;
            bottom: 10px;
            width: 100%;
            display: flex;
            justify-content: center;
        }
        .banner div button{
            width: 20px;
            height: 20px;
            background-color: #eee;
            margin: 10px;
            border: 0;
        }
        .banner div .active{
            background-color: #f00;
        }
        .banner span{
            width: 20px;
            height: 20px;
            background-color: rgba(0,0,0,.5);
            position: absolute;
            top: 50%;
            transform: translateY(-50%);
            color: #fff;
            text-align: center;
            line-height: 20px;
        }
        .next{
            right: 0;
        }
        .prev{
            left: 0;
        }
    </style>

主要内容:

<body>

    <div class="banner">
        <span class="prev">&lt;</span>
        <span class="next">&gt;</span>
        <div>
            <button class="active"></button>
            <button></button>
            <button></button>
        </div>
        <p class="show">111</p>
        <p>222</p>
        <p>333</p>
    </div>

    <script>

        // 
        var oBtns = document.querySelectorAll('button') ;
        var oPs = document.querySelectorAll('p') ;
        var oPrev = document.querySelector('.prev') ;
        var oNext = document.querySelector('.next') ;
        var oBanner = document.querySelector('.banner') ;


        // 自动播放
        var count = 0 ;  // 控制播放第几张图片
        var t ;   // 定时器

        autoPlay()

        function autoPlay() {  
            t = setInterval(function () {  
                count++ ;
                // 播放到最后一张的时候,回到第一张
                if(count >= oPs.length) {
                    count = 0 
                }
                // 清除所有
                for(var i = 0 ; i < oBtns.length ; i++) {
                    oBtns[i].classList.remove('active');
                    oPs[i].classList.remove('show') ;
                }
                // 给count添加
                oBtns[count].classList.add('active') ;
                oPs[count].classList.add('show')
            },1000)
        }



        // 上翻页
        oPrev.onclick = function () {
            clearInterval(t)  
            count-- ;
            if(count < 0) {
                count = oPs.length - 1 ;
            }
            // 清除所有
            for(var i = 0 ; i < oBtns.length ; i++) {
                oBtns[i].classList.remove('active');
                oPs[i].classList.remove('show') ;
            }
            // 给count添加
            oBtns[count].classList.add('active') ;
            oPs[count].classList.add('show') ;
        }

        // 下翻页可以自己写吗?




        // 点击小点切换
        for(var i = 0 ; i < oBtns.length ; i++) {
            // 给对象添加自定义属性
            // oBtns[i].index = i ;
            // 给标签添加自定义属性
            oBtns[i].setAttribute('index' , i)
            oBtns[i].onclick = function () { 
                // 让播放的张数从点击的这一张继续向下播放
                count = this.getAttribute('index') ; 
                clearInterval(t)
                
                // 清除所有
                for(var j = 0 ; j < oBtns.length ; j++) {
                    oBtns[j].classList.remove('active') ;
                    oPs[j].classList.remove('show') ;
                }
                // 给当前添加
                this.classList.add('active') ;
                // oPs[this.index].classList.add('show') ;
                oPs[this.getAttribute('index')].classList.add('show') ;
            }
        }


        // mouseover 鼠标移入事件
        oBanner.onmouseover = function () {  
            clearInterval(t)
        }

        // mouseout 鼠标移出事件
        oBanner.onmouseout = function () {  
            autoPlay()
        }

    </script>
    
</body>

3.DOM

新增:

?DOM新增

? ? ? ? ? 1 innerHTML

? ? ? ? ? 2 创建一个文本节点 ? createTextNode()

? ? ? ? ? 创建标签节点 ? createElement()

? ? ? ? ? 插入 ?

? ? ? ? ? ? ?在最后面插入 appendChild()

? ? ? ? ? ? ?在指定的元素前面插入 ?insertBefore(要插入的元素 , 指定的元素)


?

? ? ? ? 两种方法的区别:

? ? ? ? oP 在创建标签的时候,是一个对象

? ? ? ? innerHTML 只能解析字符串

        var oDiv = document.querySelector('.a') ;
        // oDiv.innerHTML = '<p>666</p>'


        // 1 创建一个标签  createElement
        var oP = document.createElement('p') ;
        console.log(oP);

        // 2 创建一个文本节点
        var oText = document.createTextNode('666');
        console.log(oText);

        // 3 添加子元素  把文本插入标签中
        oP.appendChild(oText) ;

        // 4 把p插入div中
        // oDiv.appendChild(oP)

        // 同一个标签只能操作一次 --- 标签是对象,对象都有唯一的地址
        // oDiv.appendChild(oP)

        // oDiv.innerHTML = oP ;   // 无法解析?


        var oSpan = document.querySelector('span') ;
        oDiv.insertBefore(oP , oSpan)

删除

? ? ? ? DOM删除

? ? ? ? ? remove() ?删除自己和所有的子元素

? ? ? ? ? removeChild() ?删除指定的子元素,只能删除儿子,不能删除孙子

? ? ? ? ? innerHTML = '' ?删除所有的子元素

    <div class="a">
        <p>11</p>
        <span>22</span>
        <h2>
            <i>888</i>
        </h2>
    </div>

    <script>

      

        var oDiv = document.querySelector('.a') ;
        // oDiv.remove()

        var oP = document.querySelector('p') ;
        oDiv.removeChild(oP)

        // oDiv.innerHTML = ''


        // var oI = document.querySelector('i') ;
        // 报错 --- removeChild() 只能删除儿子,不能删除孙子
        // oDiv.removeChild(oI)


    </script>

替换

? ? ? ? 替换子元素

? ? ? ? ?replaceChild(new , old)

    <div class="a">
        <p>11</p>
        <span>22</span>
        <h2></h2>
    </div>


    <script>

        // 替换子元素

        //  replaceChild(new , old)

        var oDiv = document.querySelector('.a') ;
        var oSpan = document.querySelector('span') ;

        var oStrong = document.createElement('strong') ;
        oStrong.innerHTML = '888'

        oDiv.replaceChild(oStrong , oSpan)

    </script>

找父元素

? ? ? ? ?找父元素 ? parentNode

    <ul>
        <li>
            <p>11</p>
            <button>111</button>
        </li>
        <li>
            <p>22</p>
            <button>222</button>
        </li>
        <li>
            <p>33</p>
            <button>333</button>
        </li>
    </ul>

    <script>

        // 找父元素   parentNode

        var oBtns = document.querySelectorAll('button') ;
        for(var i = 0 ; i < oBtns.length ; i++) {
            oBtns[i].onclick = function () {  
                console.log(this.parentNode);
                
            }
        }

    </script>
    

找子元素

? ? ? ? childNodes ?子节点 ?--- ?包含所有的文本,换行,标签,注释等等

? ? ? ? children ? 子元素 ?--- ?只包含标签

? ? ? ? ? firstElementChild

? ? ? ? ? lastElementChild

    <div class="a">
        <!-- 这里是注释 -->
        <p>11</p>
        <span>222</span>
        <h3>333</h3>
    </div>


    <script>


        var oDiv = document.querySelector('.a') ;
        console.log(oDiv.childNodes);

        console.log(oDiv.children);


        // console.log(oDiv.firstElementChild);

        // console.log(oDiv.lastElementChild);   // 标签

        // console.log(oDiv.firstChild);   // 节点


        console.log(oDiv.children[0]);

    </script>

找同级元素

? ? ? ? previousElementSibling ?前一个标签兄弟元素

? ? ? ? nextElementSibling ?后一个标签兄弟

? ? ? ? previousSibling ? 前一个兄弟节点

? ? ? ? nextSibling ? ? ? 后一个兄弟节点

    <div class="a">
        <h1>00</h1>
        <span>11</span>
        <p>22</p>
        <strong>333</strong>
    </div>


    <script>


        var oDiv = document.querySelector('.a') ;

        var oP = document.querySelector('p') ;

        console.log(oP.previousElementSibling);  // span

        console.log(oP.previousSibling);  // 换行

        console.log(oP.nextElementSibling); // strong

        console.log(oP.nextSibling);  // 换行


        console.log(oP.previousElementSibling.previousElementSibling);

    </script>

克隆节点

? ? ? ? cloneNode() ?克隆节点 , 默认只复制标签

? ? ? ? ?cloneNode(true) ?克隆节点,包含子元素

    <div class="a">
        <p>222</p>
    </div>


    <script>


        var oDiv = document.querySelector('.a') ;

        var oDiv2 = oDiv.cloneNode(true) ;
        console.log(oDiv2);


        document.body.appendChild(oDiv2)


    </script>

查找父元素:

css样式:

    <style>

        .title{
            color: red;
        }
        .title span {

        }

    </style>
   <div class="a">
        <ul>
            <li>
                <div>
                    <h3 class="title">
                        <span></span>
                    </h3>
                </div>
            </li>
        </ul>
    </div>
    <h1></h1>
    <br>
    <div class="b"></div>
    <div class="c"></div>

    <div class="a">
        <p>11</p>
        <span>322</span>
        <h3>333</h3>
    </div>

    <script>

        var oDiv = document.querySelector('.a');

        var oDiv = document.getElementsByClassName('.a')[0] ;


        // 选择器是从右向左查找的
        //   后代选择器酌情使用
        var oP = document.querySelector('.a p') ;

        // 从指定的父元素中查找
        var oP = oDiv.querySelector('p') ;

    </script>

4.文档碎片

? ? ? ? 重绘 ?回流

? ? ? ? 重绘:重新绘画 ? ?比如颜色的改变会引发页面重绘

? ? ? ? 回流: ? ? ? ? ? 比如插队 ?display:none / block

? ? ? ? 重绘和回流都影响页面的响应速度

? ? ? ? 回流必引发重绘,但是重绘不一定引发回流

? ? ? ? 回流的代价大于重绘

? ? ? ? 重绘和回流是无法避免的

? ? ? ? 这个问题只能优化,不能解决

? ? ? ? 任何的DOM操作都会引发回流

????????css样式:

    <style>
        li{
            /* box-sizing: border-box; */
            /* border: 1px solid transparent; */
            /* display: none;    不占位置*/
            /* visibility: hidden; 占位置 */ 
        }
        li:hover{
            color: red;
            /* border: 1px solid #000; */
            /* box-shadow: 0 0 0 1px red; */
        }
    </style>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>

    <script>

        // 重绘  回流
 
        // 重绘:重新绘画    比如颜色的改变会引发页面重绘

        // 回流:           比如插队  display:none / block 

        // 重绘和回流都影响页面的响应速度

        // 回流必引发重绘,但是重绘不一定引发回流

        // 回流的代价大于重绘

        // 重绘和回流是无法避免的

        // 这个问题只能优化,不能解决


        // 任何的DOM操作都会引发回流



        // for(var i = 0 ; i < 100 ; i++) {
        //     var oP = document.createElement('p') ;
        //     oP.innerHTML = i ;
        //     // DOM操作有100次
        //     document.body.appendChild(oP)
        // }


        // var res = '' ;
        // for(var i = 0 ; i < 100 ; i++) {
        //     res += '<p>' + i + '</p>'
        // }
        // // DOM实际上只有一次
        // document.body.innerHTML += res ;



        // 文档碎片 fragment
        var fragment = document.createDocumentFragment() ;
        console.log(fragment);

        for(var i = 0 ; i < 1000 ; i++) {
            var oP = document.createElement('p') ;
            oP.innerHTML = i ;
            fragment.appendChild(oP)
        }
        document.body.appendChild(fragment)



    </script>

5.留言板

css样式:

    <style>
  * {
    padding: 0;
    margin: 0;
  }

  body {
    width: 100%;
    height: 100%;
    background: rgb(65, 65, 63);
  }

  .back {
    width: 700px;
    height: 100%;
    background: white;
    margin: auto;
    margin-top: 20px;
  }

  .header,
  .pop-head {
    height: 50px;
    font-size: 20px;
    text-align: center;
    line-height: 50px;
  }

  .name {
    width: 640px;
    height: 40px;
    font-size: 20px;
    margin: 10px 28px;
    line-height: 50px;
    border-radius: 8px;
    border: 2px solid rgb(139, 137, 137);
    outline: none;
  }

  .main,
  .pop-reply {
    width: 640px;
    height: 150px;
    font-size: 22px;
    margin: 10px 28px;
    border: 2px solid rgb(139, 137, 137);
    outline: none;
    border-radius: 8px;
    resize: none;
  }

  .btn,
  .pop-btn {
    float: right;
    height: 30px;
    margin-right: 28px;
    border-radius: 6px;
    outline: none;
    font-size: 20px;
    padding: 0 20px;
    background: rgb(169, 238, 255);
  }

  h3 {
    font-size: 20px;
    color: rgb(102, 102, 102);
    background: rgb(205, 221, 248);
    margin-top: 50px;
    line-height: 50px;
    text-indent: 30px;
    font-weight: 545;
  }

  li {
    list-style: none;
    width: 640px;
    font-size: 22px;
    margin: 15px 30px;
  }

  .message-head {
    display: flex;
  }

  .message-head .photo {
    width: 70px;
    height: 70px;
    background: rgb(6, 109, 134);
    display: inline-block;
    border-radius: 50%;
    text-align: center;
    line-height: 70px;
    overflow: hidden;
  }

  .message-head .time {
    margin-left: 12px;
  }

  .liuyan,
  .reply p {
    width: 560px;
    /* height: 76px; */
    line-height: 50px;
    display: block;
    background: rgb(205, 221, 248);
    font-size: 20px;
    margin-left: 80px;
    border-radius: 8px;
    text-indent: 15px;
  }

  .delete {
    width: 60px;
    height: 30px;
    display: block;
    line-height: 30px;
    margin-left: 580px;
    /* margin-bottom: 0px; */
    border-radius: 6px;
    outline: none;
    font-size: 15px;
    background: rgb(169, 238, 255);
  }

  .answer {
    width: 60px;
    height: 30px;
    display: block;
    line-height: 30px;
    margin-top: -29px;
    margin-left: 515px;
    border-radius: 6px;
    outline: none;
    font-size: 15px;
    background: rgb(169, 238, 255);
  }

  .popup {
    width: 100vw;
    height: 100vh;
    position: fixed;
    background: rgba(0, 0, 0, .3);
    left: 0;
    top: 0;
    z-index: 10;
    display: flex;
    align-items: center;
    justify-content: center;
    display: none;
  }

  .pop-content {
    width: 700px;
    background: #fff;
    border-radius: 10px;
    overflow: hidden;
    padding-bottom: 20px;
  }

  .reply p {
    margin-top: 10px;
    background: rgba(100, 100, 100, .1);
  }
</style>

主要内容:

 <div class="back">
        <div class="header">留言板</div>
        <input type="text" class="name" placeholder="请输入您的昵称">
        <!-- 输入的内容 -->
        <textarea  class="main"  placeholder="请保持言论文明......"></textarea>

        <button class="btn">留言</button>

        <h3>大家在说</h3>
        <ul class="text">
          <!-- <li>
            <div class="message-head">
              <span class="photo">系统</span>
              <p class="time">2019-9-27 0:47:38</p>
            </div>
            <p class="liuyan">测试留言</p>
            <div class="reply">
              <p>测试回复</p>
            </div>
            <button class="delete">Delete</button>
            <button class="answer">Answer</button>
          </li> -->
        </ul>
    </div>

    </div>
    <div class="popup">
        <div class="pop-content">
            <div class="pop-head">回复板</div>
            <textarea class="pop-reply" placeholder="请保持言论文明......"></textarea>
            <button class="pop-btn huifu">回复</button>
            <button class="pop-btn quxiao">取消</button>
        </div>
    </div>

    <script>
        //拿到对象
        var oBtn = document.querySelector('.btn') ;
        var oName = document.querySelector('.name');
        var oContent = document.querySelector('.main') ;

        //点击留言

        
        oBtn.onclick = function () {

            // 10s的倒计时----回复
            // 点击回复后剩余倒计时
            oBtn.disabled = true ;
            var count = 5 ;
            var t ;
            oBtn.innerHTML = '剩余' + count +'s';
            var t = setInterval(function () {
                // clearInterval(t) ;
                oBtn.innerHTML = '剩余' + --count + 's' ;
                if(count === 0) {
                    clearInterval(t);
                    oBtn.disabled = false ;
                    oBtn.innerHTML = '回复' ;

                }
            } , 1000)

            //   获取昵称和留言的内容
            var n = oName.value ;

            var c = oContent.value ;
            if(n == ''){
                alert('输入昵称为空,请重新输入');
                
            }
            else if(c == ''){
                alert('输入的内容为空');
                
            }

            var oLi = document.createElement('li');
            oLi.innerHTML = 
            `
                 <div class="message-head">
                 <span class="photo">${n}</span>
                 <p class="time">${formatDate() }</p>
                 </div>
                 <p class="liuyan">${c}</p>
                 <div class="reply">
                
                 </div>
                 <button class="delete">Delete</button>
                 <button class="answer">Answer</button>
            `
            //在ul中添加
            var oText = document.querySelector('.text');
            oText.appendChild(oLi);

            //删除一定是在留言了以后才有的
            //它只能删除一个

            //拿到所有的删除按钮,然后循环绑定事件
            var oDels = document.querySelectorAll('.delete') ;
            for(var i = 0 ; i < oDels.length ; i++) {
                oDels[i].onclick = function () {
                    //删除这个子元素的父元素
                    this.parentNode.remove() ;
                }
            } 

            //回复----回复事件
            var oAnswers = document.querySelectorAll('.answer') ;
            for(var i = 0 ; i < oAnswers.length ; i++) {
                oAnswers[i].onclick = function () {
                    //显示弹窗
                    var oPopup = document.querySelector('.popup') ;

                    oPopup.style.display = 'flex' ;

                    //取消
                    var oQuxiao = document.querySelector('.quxiao') ;
                    oQuxiao.onclick = function () {
                        oPopup.style.display = 'none' ;
                    }

                    //回复
                    var oHuifu = document.querySelector('.huifu') ;
                    //回复内容
                    oHuifu.onclick = function () {
                        var oPop_reply = document.querySelector('.pop-reply') ; 
                        var hfcontent = oPop_reply.value ;
                        if(hfcontent) {
                            var oP = document.createElement('p') ;
                            oP.innerHTML = hfcontent ;
                            var oReply = document.querySelector('.reply');
                            oReply.appendChild(oP);
                        }   
                        oPopup.style.display = 'none' ;
                    }
                }
            }

        }

        

        //日期
         function formatDate() {
             //年月日,时分秒获取
             var res = '';
             var date = new Date() ;
             var y = date.getFullYear() ;
             var m = date.getMonth();
             var d = date.getDate();

             var h = date.getHours();
             var m2 = date.getMinutes();
             var s = date.getSeconds();
             res += y + '年' + m + '月' + d +'日' + ' ' + h + '时' + m2 + '分' + s + '秒' ;
            return res ;
         }
    </script>

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-24 18:23:15  更:2021-12-24 18:25:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:01:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码