成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

用純css實現(xiàn)Tab切換

hizengzeng / 769人閱讀

摘要:所以當(dāng)我們思考能否用來實現(xiàn)時還應(yīng)考慮到的結(jié)構(gòu),能不能構(gòu)造出滿足已存在的選擇器的布局。用來實現(xiàn)的好處就是可以盡量大的把組件功能和業(yè)務(wù)邏輯分離開來,真正做一個組件該做的事,希望越來越好

我們今天用css來實現(xiàn)一個常見的tab切換效果

查看原文可以有更好的排版效果哦

先看效果

https://codepen.io/xboxyan/pe...

前言

哪些簡單的效果可以考慮用css來實現(xiàn)呢,目前css能夠做的交互有

鼠標(biāo)經(jīng)過/離開:hover

鼠標(biāo)點擊::cheked

那是不是上述所有的交互都可以用css來實現(xiàn)呢?顯然不是的,css實現(xiàn)依賴于html結(jié)構(gòu),因為css選擇器有限,有子選擇器,沒有父選擇器,有后選擇器,沒有前選擇器,所以局限性很大。所以當(dāng)我們思考能否用css來實現(xiàn)時還應(yīng)考慮到html的結(jié)構(gòu),能不能構(gòu)造出滿足css已存在的選擇器的html布局。

先從html結(jié)構(gòu)說起

一般在碰到tab類型的組件時,一般會有如下的html

tab01
tab02
tab03
111
222
333

大致就是這種布局吧,暫且稱作分離模式吧,足夠靈活,就是導(dǎo)航部分和內(nèi)容結(jié)構(gòu)分開,需要什么動畫效果都可以分別實現(xiàn)。

還有一種布局,大概是這樣的

tab01
111
tab01
111
tab01
111

這里每一個tab里面的導(dǎo)航和內(nèi)容是一起的,我們稱為合并模式吧,這種在組件化里面很常見,比如在react里面,一個tab組件,一般會寫成這樣

ReactDOM.render(
  
    Content of Tab Pane 1
    Content of Tab Pane 2
    Content of Tab Pane 3
  ,
mountNode);

是不是很像?

相信用js只要是一名合格的前端都能輕易的實現(xiàn)吧,這里我們主要是研究如何用css來實現(xiàn)

第一種布局(分離模式)

這里有兩種思路

錨點實現(xiàn) herf + :target

css3 nth-child(n) 選擇器

錨點實現(xiàn)主要是在a標(biāo)簽加上href屬性,然后目標(biāo)元素上添加相同的id,當(dāng)點擊a標(biāo)簽時,目標(biāo)元素的:target就生效了


跳轉(zhuǎn)
內(nèi)容

這種方式可以將導(dǎo)航和內(nèi)容鏈接到一塊,但是在瀏覽器中有一個很不友好的地方,就是當(dāng)點擊帶有錨點的a鏈接的時候,瀏覽器會自動定位到目標(biāo)位置,很影響體驗,需要去掉這種效果估計還得借助js來實現(xiàn),故不太推薦用這種方式

nth-child(n) 選擇器,這種方式就比較傳統(tǒng)了,不過導(dǎo)航切換部分還是用到label+input[type=radio],實現(xiàn)基本和js是同一個思路,甚至還不如js方便,因為你有多少個tab選項就得寫多少個nth-child樣式

.tab-nav input:nth-of-type(1):checked ~ .tab-content :nth-of-type(1),
.tab-nav input:nth-of-type(2):checked ~ .tab-content :nth-of-type(2),
.tab-nav input:nth-of-type(3):checked ~ .tab-content :nth-of-type(3),
...
{
  z-index:1
}

你大概會看到這樣的樣式,如果選項卡比較固定,基本是靜態(tài)的,比較少,可以一一寫出來,如果比較多,或者是js生成的,那么建議這一部分樣式也通過js生成出來。

下面著重來實現(xiàn)第二種布局

第二種布局(合并模式)

如果是這樣一種布局,那么導(dǎo)航和內(nèi)容就可以通過相鄰選擇器+聯(lián)系上了,重點是如何實現(xiàn)選項卡的樣式,當(dāng)然,我們也需要改一下html

111
222
333

然后我們通過樣式美化一下

.tabs{
  position:relative;
  width:400px;
  height:300px;
}
.tab-pane{
  display:inline-block;
}
.tabs input[type="radio"]{
  position:absolute;
  clip:rect(0,0,0,0)
}
.tab-item{
  display:block;
  height:34px;
  line-height:34px;
  cursor:pointer;
  padding:0 10px
}

.tab-content{
  position:absolute;
  border:1px solid #eee;
  padding:20px;
  left:0;
  top:36px;
  bottom:0;
  right:0;
  background:#fff;
}

然后加入交互,主要就是相鄰選擇器+:checked選擇器,

.tabs input[type="radio"]:checked+.tab-item{/**導(dǎo)航選中狀態(tài)**/
  background:orangered;
  color:#fff
}
.tabs input[type="radio"]:checked+.tab-item+.tab-content{/**當(dāng)前內(nèi)容切換**/
  z-index:1
}

我們這里只用了z-index:1就實現(xiàn)了隱藏顯示,當(dāng)然還可以實現(xiàn)更多的效果,比如淡入淡出等

下面是演示效果

https://codepen.io/xboxyan/pe...

當(dāng)然,這種方式也有一定的不足,由于這里內(nèi)容區(qū)域用到了絕對定位,所以整個tab容器就不能根據(jù)里層的內(nèi)容來自適應(yīng),也需要給外層一個固定的高度,不然整個tab容器就只有頂部導(dǎo)航區(qū)域才占據(jù)空間,這明顯就不合常理。

添加一點動畫效果
/**給導(dǎo)航添加橫條的縮放效果**/
.tab-item:after{
  position:absolute;
  content:"";
  height:3px;
  width:100%;
  background:orangered;
  left:0;
  bottom:2px;
  transition:.3s;
  transform:scaleX(0)
}

.tabs input[type="radio"]:checked+.tab-item:after{
  transform:scaleX(1)
}
/**給內(nèi)容區(qū)域添加一個淡入淡出的效果**/
.tab-content{
  position:absolute;
  background:#eee;
  padding:20px;
  left:0;
  top:36px;
  bottom:0;
  right:0;
  transition:.3s;
  opacity:0;
  transform:translateY(50px)
}

.tabs input[type="radio"]:checked+.tab-item+.tab-content{
  z-index:1;
  opacity:1;
  transform:translateY(0)
}

https://codepen.io/xboxyan/pe...

小節(jié)

通過css我們也能實現(xiàn)導(dǎo)航效果,而且更容易復(fù)用,只需要復(fù)制html結(jié)構(gòu)就行(當(dāng)然這里肯定也是需要改一下nameid的)。這就有點類似組件的意思了,給你一個html結(jié)構(gòu),你不需要關(guān)系切換邏輯,只需要根據(jù)接口取到數(shù)據(jù),然后塞到每個tab標(biāo)簽頁里面去,事實上現(xiàn)在react實現(xiàn)的組件也一般都是這種思路,只需關(guān)注業(yè)務(wù)邏輯,但這些都是大工程,哪里有css直接來的快。

這就讓我想到了剛進(jìn)公司那會,每碰到一個tab,那就要取一個id,然后用jquery實現(xiàn)一遍tab切換邏輯,后來放聰明了,把tab封裝成一個插件,碰到一個tab就調(diào)用一次插件...看著代碼變少了,其實也沒什么本質(zhì)區(qū)別。

用css來實現(xiàn)的好處就是可以盡量大的把組件功能和業(yè)務(wù)邏輯分離開來,真正做一個UI組件該做的事,希望css越來越好

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/116912.html

相關(guān)文章

  • 用純CSS實現(xiàn)優(yōu)雅的tab

    摘要:部分如上,四個區(qū)塊,四大名著,嘎嘎代碼如上,寫的很爛,輕噴用來控制元素的顯示和隱藏,實際上是為了實現(xiàn)動畫效果此處有裝逼的嫌疑,因為會阻礙,而不會,另外也可以用來代替。 說明 又是一個練手的小玩意兒,本身沒什么技術(shù)含量,就是幾個不常用的CSS3特性的結(jié)合而已。 要點 Label標(biāo)簽的for屬性 單選框的:checked偽類 CSS的加號[+]選擇器 效果圖 showImg(https...

    lavnFan 評論0 收藏0
  • 用純CSS實現(xiàn)優(yōu)雅的tab

    摘要:部分如上,四個區(qū)塊,四大名著,嘎嘎代碼如上,寫的很爛,輕噴用來控制元素的顯示和隱藏,實際上是為了實現(xiàn)動畫效果此處有裝逼的嫌疑,因為會阻礙,而不會,另外也可以用來代替。 說明 又是一個練手的小玩意兒,本身沒什么技術(shù)含量,就是幾個不常用的CSS3特性的結(jié)合而已。 要點 Label標(biāo)簽的for屬性 單選框的:checked偽類 CSS的加號[+]選擇器 效果圖 showImg(https...

    Ali_ 評論0 收藏0
  • CSS實現(xiàn)Tab切換效果

    摘要:綁定和這個不用說和屬性綁定隱藏按鈕這個方法有很多充分發(fā)揮你們的想象力就可以了,我見過的方法有設(shè)置隱藏的設(shè)置絕對定位,將設(shè)置為很大的負(fù)值,移動到頁面外達(dá)到隱藏效果設(shè)置絕對定位使元素脫離文檔流,然后設(shè)置為透明來達(dá)到隱藏效果。 用CSS實現(xiàn)Tab切換效果 最近切一個頁面的時候涉及到了一個tab切換的部分,因為不想用js想著能不能用純CSS的選擇器來實現(xiàn)切換效果。搜了一下大致有下面三種寫法。 ...

    dayday_up 評論0 收藏0
  • CSS實現(xiàn)Tab切換效果

    摘要:綁定和這個不用說和屬性綁定隱藏按鈕這個方法有很多充分發(fā)揮你們的想象力就可以了,我見過的方法有設(shè)置隱藏的設(shè)置絕對定位,將設(shè)置為很大的負(fù)值,移動到頁面外達(dá)到隱藏效果設(shè)置絕對定位使元素脫離文檔流,然后設(shè)置為透明來達(dá)到隱藏效果。 用CSS實現(xiàn)Tab切換效果 最近切一個頁面的時候涉及到了一個tab切換的部分,因為不想用js想著能不能用純CSS的選擇器來實現(xiàn)切換效果。搜了一下大致有下面三種寫法。 ...

    Warren 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<