首頁>技術>

前端是網頁或者app的前臺部分,通俗地說是使用者瀏覽網站或者使用app的時候,看到的頁面或者介面,是直接呈現給使用者的。因此前端對使用者體驗至關重要。

那麼在有限的頁面空間裡,前端如何保持良好的使用者體驗,又儘量多地展現內容以滿足業務需求呢?上圖是某寶官網首頁的區域性,通過觀察可以看出通過選項卡切換,在同一個區域實現了三個不同內容的切換展示。選項卡切換是怎麼實現的呢?

現在我們來搭建簡易版本的選項卡頁面結構,以小見大,拆解選項卡切換的功能實現。

選項卡切換功能,就是當我們選中某個選單的時候,頁面只顯示對應選單的內容。這個功能可以拆解成以下六個步驟:

第一步:1.獲取需要操作的所有元素;

第二步:2.宣告一個變數儲存前一個選中的選項卡選單的索引值;

第四步:4.清除前一個選中的選項卡選單和內容的樣式;

第五步:5.設定當前選項卡選單和內容的樣式;

第六步:6.儲存當前選項卡選單的索引值。

//1.獲取需要操作的所有元素//1.1獲取所有的選項卡選單let oItems = document.querySelectorAll(".tab-item");//1.1獲取所有的選項卡內容let oContents = document.querySelectorAll(".tab-content");//2.宣告一個變數儲存前一個選中的選項卡選單的索引值let previousIndex = 0;//3.給每個選項卡選單新增滑鼠點選事件for (let i = 0; i < oItems.length; i++) {  //3.1獲取當前的選項卡選單和內容  let currentItem = oItems[i];  let currentContent = oContents[i];  //3.2給當前的選項卡選單新增滑鼠點選事件  currentItem.onclick = function () {    //4.清除前一個選中的選項卡的樣式    //4.1獲取前一個選中的選項卡選單和內容    let preItem = oItems[previousIndex];     let preContent = oContents[previousIndex];    //4.2刪除前一個選中的選項卡選單和內容的樣式    preItem.className = preItem.className.replace("selected", "");    preContent.className = preContent.className.replace("current", "");    //5.設定當前選項卡的樣式    this.className = this.className + " selected";    currentContent.className = currentContent.className + " current";     //6.儲存當前選項卡選單的索引值    previousIndex = i;  }}

選項卡切換功能實現如下圖:

上面的程式碼雖然實現了選項卡切換功能,但是有侷限性。因為只實現了滑鼠點選切換,無法滿足業務需求,要實現其他切換方式,需要重新寫程式碼,不利於維護。面向物件的程式設計思想是軟體開發的方法,可以擴充套件到前端開發的互動式介面。應用面向物件的思想,拆解成九個步驟:

第一步:1.定義一個類,通過這個類可以建立選項卡;

第二步:2.獲取選項卡選單和內容;

第三步:3.宣告變數儲存前一個選中選項卡選單的索引值;

第六步:6.設定當前選項卡選單和內容的樣式,新增類名,注意類名前面要留空格;

第七步:7.儲存當前選項卡選單的索引值;

第八步:8.通過定義的類建立選項卡,需要傳入選項卡選單和內容的類名;

由於點選切換和移入切換實現樣式改變的程式碼是一樣的,所以可以進一步優化,把設定樣式的程式碼抽出來作為一個私有方法,這樣點選切換和移入切換選項卡,內部設定樣式的時候呼叫同一個方法即可,優化頁面效能,提高使用者體驗。

// 應用面向物件的思想重寫的選項卡切換程式碼//1.定義一個類,通過這個類可以建立選項卡class Tab {  //注意:形式引數oItemsSelector和oContentsSelector,用來傳入選項卡選單和內容的類名  constructor(oItemsSelector, oContentsSelector) {    //2.獲取選項卡選單和內容    this.oItems = document.querySelectorAll(oItemsSelector);    this.oContents = document.querySelectorAll(oContentsSelector);    //3.宣告變數儲存前一個選中選項卡選單的索引值    this.previousIndex = 0;  }  //4.新增事件  //4.1新增點選事件  addClickEvent() {    for (let i = 0; i < this.oItems.length; i++) {      //4.1.1獲取當前的選項卡選單和內容      let item = this.oItems[i];      //4.1.2給當前的選項卡新增滑鼠點選事件      item.onclick = () => {        //4.2.3呼叫設定樣式的方法        this._change(i);      }    }  }  //4.2新增滑鼠移入事件  addEnterEvent() {    for (let i = 0; i < this.oItems.length; i++) {      //4.2.1獲取選項卡選單      let item = this.oItems[i];      //4.2.2給選項卡新增滑鼠移入事件      item.onmouseenter = () => {        //4.2.3呼叫設定樣式的方法        this._change(i);      }    }  }  //注意:優化程式碼,設定樣式的程式碼是一樣的,可以抽出  _change(i) {    //5.獲取當前的選項卡選單和內容    let currentItem = this.oItems[i];    let currentContent = this.oContents[i];    //6.刪除前一個選中的選項卡選單和內容的樣式    //6.1獲取前一個選項卡的選單和內容    let preItem = this.oItems[this.previousIndex];    let preContent = this.oContents[this.previousIndex];    //6.2清除前一個選項卡選單和內容的樣式,刪除類名    preItem.className = preItem.className.replace("selected", "");    preContent.className = preContent.className.replace("current", "");    //7.設定當前選項卡選單和內容的樣式,新增類名,注意類名前面要留空格    currentItem.className = currentItem.className + " selected";    currentContent.className += " current";    //8.儲存當前選項卡選單的索引值    this.previousIndex = i;  }}//9.通過定義的類建立選項卡,需要傳入選項卡選單和內容的類名let tab = new Tab(".tab-item", ".tab-content");//9.1執行建立好的選項卡的滑鼠點選事件,實現滑鼠點選切換選項卡tab.addClickEvent();//9.2執行建立好的選項卡的滑鼠移入事件,實現滑鼠移入切換選項卡tab.addEnterEvent();

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 超級詳細圖文講解python的django框架