js高級—tab欄切換(面向對象做法)

    <main><h4>Js 面向對象 動態添加標簽頁</h4><div class="tabsbox" id="tab"><!-- tab 標簽 --><nav class="fisrstnav"><ul><li class="liactive"><span>測試1</span><span class="iconfont icon-guanbi"></span></li><li><span>測試2</span><span class="iconfont icon-guanbi"></span></li><li><span>測試3</span><span class="iconfont icon-guanbi"></span></li></ul><div class="tabadd"><span>+</span></div></nav><!-- tab 內容 --><div class="tabscon"><section class="conactive">測試1</section><section>測試2</section><section>測試3</section></div></div></main>
        * {margin: 0;padding: 0;
}ul li {list-style: none;
}main {width: 960px;height: 500px;border-radius: 10px;margin: 50px auto;
}main h4 {height: 100px;line-height: 100px;text-align: center;
}.tabsbox {width: 900px;margin: 0 auto;height: 400px;border: 1px solid lightsalmon;position: relative;
}nav ul {overflow: hidden;
}nav ul li {float: left;width: 100px;height: 50px;line-height: 50px;text-align: center;border-right: 1px solid #ccc;position: relative;
}nav ul li.liactive {border-bottom: 2px solid #fff;z-index: 9;
}#tab input {width: 80%;height: 60%;
}nav ul li span:last-child {position: absolute;user-select: none;font-size: 12px;top: 0px;right: 0;display: inline-block;width: 20px;height: 20px;background-color: red;cursor: pointer;
}.tabadd {position: absolute;/* width: 100px; */top: 0;right: 0;
}.tabadd span {display: block;width: 20px;height: 20px;line-height: 20px;text-align: center;border: 1px solid #ccc;float: right;margin: 10px;user-select: none;cursor: pointer;
}.tabscon {width: 100%;height: 300px;position: absolute;padding: 30px;top: 50px;left: 0px;box-sizing: border-box;border-top: 1px solid #ccc;
}.tabscon section,
.tabscon section.conactive {display: none;width: 100%;height: 100%;
}.tabscon section.conactive {display: block;
}
<script type="text/javascript">//定義一個that變量,讓實例對象中的this進行賦值var that;class Tab{constructor(id){//將實力對象中的this賦值到that中that = this;//首先獲取最大父盒子的元素 , 此處的this指向實力對象//獲取需要操作的標簽this.main = document.querySelector(id);// //獲取最大父盒子中的所有li// this.lis = this.main.querySelectorAll('li');// // 獲取最大父盒子中的所有section// this.sections = this.main.querySelectorAll('section');/*動態創建li和section 可以將選擇器更換為*/// //獲取最大父盒子中的所有li// this.lis = this.main.getElementsByTagName('li');// // 獲取最大父盒子中的所有section// this.sections = this.main.getElementsByTagName('section');// 因為getElementsByTagName具有隱式遍歷的作用//獲取最大父盒子中的tabaddthis.add = this.main.querySelector('.tabadd');//獲取最大父盒子中的fisrstnav下的第一個元素標簽 (li的父元素)this.ul = this.main.querySelector('.fisrstnav ul:first-child');//獲取最大父盒子中的tabscon的元素標簽 (tabscon父元素)this.fsection = this.main.querySelector('.tabscon');// //獲取最大盒子中的icon-guanbi// this.remove = this.main.querySelectorAll('.icon-guanbi')this.init();}//設置一個初始化的函數,讓相關元素綁定事件(主要就是添加相關的綁定事件)init(){//一初始化的時候就調用新的li和section(重新調用切記寫在最前面,要不然添加時,最后一個li沒有效果)this.updateNode();//循環li,進行添加綁定事件,此處的長度設置為實例對象中的寫法//this.lis.lengthfor (var i = 0; i < this.lis.length; i++) {// 此處為了后期與section進行綁定,利用實力對象形式設置一個變量保存每次遍歷的索引this.lis[i].index = i;//會給每個li設置點擊事件//此處測試li是否已經可以點擊,拿到索引號// this.lis[i].onclick = function(){//     console.log(this.index);// }//每個li設置點擊事件,觸發toggleTab的函數效果this.lis[i].onclick = this.toggleTab;//給每個icon-guanbi按鈕進行綁定事件this.remove[i].onclick = this.removeTab;//給每個span設置鼠標雙擊事件this.spans[i].ondblclick = this.editTab;//給每個sections綁定一個雙擊事件(此處因為所需要用到的方法跟span設置的事件方法一樣,所以此處直接調用span的雙擊方法)this.sections[i].ondblclick = this.editTab;}//添加事件不需要進行遍歷this.add.onclick = this.addTab;}//重新獲取所有的小li和sectionupdateNode(){//獲取最大父盒子中的所有lithis.lis = this.main.querySelectorAll('li');// 獲取最大父盒子中的所有sectionthis.sections = this.main.querySelectorAll('section');//獲取最大盒子中的icon-guanbithis.remove = this.main.querySelectorAll('.icon-guanbi')//獲取所有的li下的第一個spanthis.spans = this.main.querySelectorAll('.fisrstnav li span:first-child')}/*****************************************************************************************************/ //1.切換功能toggleTab(){//在此處調用清楚樣式的函數,此處的this修改為that,因為this的話只能理解為li調用了此方法//其中還有sections的存在,因此用that進行包含that.clearClass();//測試li是否已經可以點擊,拿到索引號// console.log(this.index);//此處的this指向的是li這個標簽(誰調用了我,我就指向誰)this.className = 'liactive';//因為this指向的是li,li中沒有conactive這個類名屬性,所以this.sections[thsi.index] = 'conactive';// 不管用,因此可以得到此conactive為constructor(實例對象)中的元素// this.sections[thsi.index] = 'conactive';//設置一個全局變量taht,對實例對象中的this進行賦值,進行調用//因此此處的this,修改為thatthat.sections[this.index].className = 'conactive';  }//設置一個清楚樣式的函數(清除所有li和section中的類)clearClass(){for (let i = 0; i < this.lis.length; i++) {//清除li和sections下的所有類(此處用到排他思想處理)this.lis[i].className = '';//此處sections可以用that或者this,在調用方法時用that就可以了that.sections[i].className = '';  }}
/*****************************************************************************************************/ //2.添加功能addTab(){//進行排他思想,讓創建的標簽類達到比較好的效果that.clearClass();//綁定測試// alert(123)//為了生成的效果好看,添加個生成隨機數var random = Math.random();//(1) 創建li元素和section元素var li = '<li class="liactive"><span>新選項卡</span><span class="iconfont icon-guanbi"></span></li>'var section = ' <section class="conactive">新內容'+ random +'</section>';//(2) 將以下的兩個元素添加到父元素中(利用insertAdjacentHTML方法進行子元素的添加,因為insertAdjacentHTML不局限于文字添加,方法中的beforeend,是將標簽等信息放在盒子里面的最后一個)//因為addTab指向的實例對對象,因此此處用thatthat.ul.insertAdjacentHTML('beforeend',li);that.fsection.insertAdjacentHTML('beforeend',section);//此處在重新調用一次init方法;that.init();}// 已經設置了 updateNode() 函數重新調用li和section的個數/*****************************************************************************************************/ //3.刪除功能//給當前函數添加事件對象(事件參數),阻止事件冒泡行為removeTab(e){e.stopPropagation(); //利用事件參數阻止冒泡,防止出發li的點擊事件//此時會出現新增li中的刪除按鈕跟當前索引取不到一起,因此將獲取關閉按鈕的元素放到 updateNode()方法中重新獲取即可//引用父元素的索引號var index = this.parentNode.index;// 測試console.log(index);// remove() 方法則可以直接刪除指定的元素that.lis[index].remove();that.sections[index].remove();//此處調用init方法,為了讓init方法執行 updateNode() 方法,即可拿到新的元素進行遍歷使用that.init();//當我們刪除的不是選中狀態的li的時候,原來的選中狀態li保持不變//如果當前的標簽存折liactive這個標簽狀態,就直接返回值,不必執行下面的代碼if(document.querySelector('.liactive'))return;//當我們刪除了選中狀態的這個li的時候,讓它的前一個li處于選定狀態//讓index--;從而讓前一個li為選中狀態index--;//index--;于此同時自動調用lis的點擊事件,讓sections也屬于選中狀態// that.lis[index].click();//利用 && 對前后的效果進行判斷 (&& 與)that.lis[index] && that.lis[index].click();}/*****************************************************************************************************/ //4.修改功能editTab(){//先獲取原來的文本文字var str = this.innerHTML;//雙擊禁止選定文字;window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty()//測試// alert(123)//使鼠標雙擊到的標簽設置為文本標簽this.innerHTML = '<input type="text" />';//獲取input標簽,將原來的文本文字賦值給inputvar input = this.children[0];input.value = str;//讓文本框內的文字處于選定狀態input.select();//當我們離開文本框,將文本框內的值設置給spaninput.onblur = function(){this.parentNode.innerHTML = this.value;};input.onkeyup = function(e){if(e.keyCode === 13){//手動調用表單失去焦點事件 不需要鼠標離開操作this.blur();}   }}}//創建的實力對象必須存在實例函數的下面,不然執行結果為undeiful//首先過去最大的父盒子元素/*var a =  */ new Tab('#tab');// a.init();</script>

實現效果:

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248154.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248154.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248154.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MFC的sendmessage和postmessage 以及sendmessagetimeout

PostMessage只負責將消息放到消息隊列中&#xff0c;不確定何時及是否處理&#xff0c;相當于異步操作&#xff0c;執行后馬上返回SendMessage要等到受到消息處理的返回碼&#xff08;DWord類型&#xff09;后才繼續&#xff0c;相當于同步操作&#xff0c;一直在等待&#xff…

python PIL圖像處理-框選

框選圖中位置 代碼 from PIL import Image,ImageDraw,ImageFont,ImageFilter import random#------------------------------------- #filepath,[837,103][942,208]#圖片處理&#xff0c;框選 def pic_rectangle(filepath,bound):image Image.open(filepath)draw ImageDraw.D…

Win10卸載python總是提示error2503失敗各種解決辦法

最近win10的電腦裝了python的3.4&#xff0c;然后想卸載&#xff0c;就總是提示error 2053&#xff0c;類似于這種&#xff1a; 下面是我的坎坷解決之路&#xff1a; 1、網上說&#xff0c;任務管理器 --> 詳細信息 --> explorer.exe結束任務&#xff0c;結束資源管理器&…

js高級—查詢商品案例

<div class"search">按照價格查詢&#xff1a;<input type"text" class"start"> - <input type"text" class"end"><button class"search-price">搜索</button> 按照商品名稱查詢&a…

[Codeforces702F]T-Shirts——非旋轉treap+貪心

題目鏈接&#xff1a; Codeforces702F 題目大意&#xff1a;有$n$種T恤&#xff0c;每種有一個價格$c_{i}$和品質$q_{i}$且每種數量無限。現在有$m$個人&#xff0c;第$i$個人有$v_{i}$元&#xff0c;每人每次會買他能買得起的品質最高的一件T恤(當兩件T恤品質相同時優先買價格…

js高級第二天

構造函數和原型 構造函數和原型 在典型的OOP 的語言中&#xff08;如Java&#xff09;&#xff0c;都存在類的概念&#xff0c;類就是對象的模板&#xff0c;對象就是類的實例&#xff0c;但在ES6之前&#xff0c;JS 中并沒用引入類的概念。ES6&#xff0c;全稱ECMAScript6.0…

操作系統原理之文件系統(第五章)

一、文件 1、?件系統的?戶接?包括?件的命名、類型、屬性和對?件的操作 2、?件命名&#xff1a;所有操作系統都允許?1&#xff5e;8個字?組成的字符串 3、?件擴展名&#xff1a;多數操作系統都?持?件名?圓點隔開分為兩部分&#xff0c;圓點后?的部分稱為?件擴展名…

第三次作業------52李金鎮

---恢復內容開始--- 習題1&#xff1a; **1.初始化一個數據集&#xff0c;包括5-10位同學的成績數據&#xff08;數據類型不限&#xff09;&#xff0c;數據格式如下&#xff1a; **學號 姓名 Java C語言 Python2017XXXX 小白 87 68 922017XXXX 小黃 80 76 832017XXXX 小王 75 …

js高級第三天

原型鏈 作用&#xff1a;提供一個成員的查找機制&#xff0c;或者查找規則含義&#xff1a;由原型所串聯起來的鏈裝結構JavaScript 的成員查找機制(規則) 當訪問一個對象的屬性&#xff08;包括方法&#xff09;時&#xff0c;首先查找這個對象自身有沒有該屬性。如果沒有就查…

為什么大學的計算機老師技術那么厲害,卻不愿意當程序員?

不知道大家有多少是從事跟計算機有關的工作的&#xff0c;每次想到大學時的計算機考試&#xff0c;都能令小小編心驚膽戰呀&#xff0c;各式代碼和計算機語言&#xff0c;真的是很令人頭痛了。不過呢&#xff0c;也有很多大神&#xff0c;大學學著其他的專業&#xff0c;卻在畢…

DDG全家桶之3022

本篇文章主要根據360Netlab新出的DDG分析文檔來復現新變種3022&#xff0c;會涉及部分分析和清除的方法&#xff0c;本篇文章只用于學習交流&#xff0c;為廣大受害者提供清除思路 &#xff0c;請勿用于非法用途&#xff0c;產生一切后果與作者無關 詳情請參考文檔&#xff1a;…

js高級第四天

課程回顧&#xff1a; ? 原型鏈&#xff1a;由原型構成鏈狀結構&#xff0c;提供成員查找機制 ? 繼承&#xff1a;組合繼承&#xff1a;構造函數和原型對象 ? 屬性&#xff1a;調用父構造函數的時候用call改變this指向 ? 方法&#xff1a;父實例對象賦值給子原型對象&a…

d3.js 制作簡單的俄羅斯方塊

d3.js是一個不錯的可視化框架&#xff0c;同時對于操作dom也是十分方便的。今天我們使用d3.js配合es6的類來制作一個童年小游戲--俄羅斯方塊。話不多說先上圖片。 1. js tetris類 由于方法拆分的比較細所以加上了一些備注&#xff08;這不是我的風格&#xff01;&#xff09; c…

Flask中路由系統以及藍圖的使用

一、Flask的路由系統 1.app.route()裝飾器中的參數 methods:當前URL地址&#xff0c;允許訪問的請求方式 app.route("/info", methods["GET", "POST"]) def student_info():stu_id int(request.args["id"])return f"Hello Old b…

js高級第五天

課程回顧&#xff1a; ? 原型鏈&#xff1a;由原型構成鏈狀結構&#xff0c;提供成員查找機制 ? 繼承&#xff1a;組合繼承&#xff1a;構造函數和原型對象 ? 屬性&#xff1a;調用父構造函數的時候用call改變this指向 ? 方法&#xff1a;父實例對象賦值給子原型對象&a…

d3.js 制作簡單的貪吃蛇

d3.js是一個不錯的可視化框架&#xff0c;同時對于操作dom也是十分方便的。今天我們使用d3.js配合es6的類來制作一個童年小游戲–貪吃蛇。話不多說先上圖片。 1. js snaker類 class Snaker {constructor() {this._size 30;this._len 3;this._width 900;this._height 690;th…

js高級第六天

Q課程回顧&#xff1a; ? 閉包&#xff1a;有權訪問另外一個函數的局部變量的函數&#xff0c;作用&#xff1a;延伸變量使用范圍 ? mdn&#xff0c;w3c function fn1 () {var n 3;return function () {console.log(n);} }? 遞歸&#xff1a;函數調用其本身 function f…

Chrome 75 lazy-loading

Chrome 75 & lazy-loading https://addyosmani.com/blog/lazy-loading/ https://chromestatus.com/feature/5645767347798016 Chrome 75 將默認啟用延遲加載功能 自 Chrome 75 起&#xff0c;將原生支持圖片的延遲加載&#xff0c;在代碼中編寫 <img loading"lazy&…

d3.js 實現煙花鮮果

今天在d3.js官網上看到了一個煙花的DEMO&#xff0c;是canvas制作的&#xff0c;于是我想用d3.js來實現它&#xff0c;js代碼只有幾行。好了廢話不多說&#xff0c;先上圖。 1 js 類 因為煙花要有下落的效果&#xff0c;所以里面用到了一些簡單的數學和物理知識來模擬重力&…

阿里Sentinel控制臺源碼修改-對接Apollo規則持久化

改造背景 前面我們講解了如何對接Apollo來持久化限流的規則&#xff0c;對接后可以直接通過Apollo的后臺進行規則的修改&#xff0c;推送到各個客戶端實時生效。 但還有一個問題就是Sentinel控制臺沒有對接Apollo&#xff0c;Sentinel控制臺本來就可以修改限流的規則&#xff0…