久久精品国产99国产精品免费看_中文成人在线_日本在线播放视频_精品国产一区二区三区在线观看

怎么用純css實現Tab切換? - css筆記

當我們思考能否用css來實現時還應考慮到html的結構,能不能構造出滿足css已存在的選擇器的html布局,這一節和大家分享怎么用純css實現Tab切換

css實現依賴于html結構,因為css選擇器有限,有子選擇器,沒有父選擇器,有后選擇器,沒有前選擇器,所以局限性很大。所以當我們思考能否用css來實現時還應考慮到html的結構,能不能構造出滿足css已存在的選擇器的html布局

前言

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

  • 鼠標經過/離開:hover
  • 鼠標點擊::cheked

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

效果展示;

111 222 333

先從html結構說起

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

<div class="tabs">
  <div class="tab-nav">
    <div class="tab-item">tab01</div>
    <div class="tab-item">tab02</div>
    <div class="tab-item">tab03</div>
  </div>
  <div class="tab-content">
    <div>111</div>
    <div>222</div>
    <div>333</div>
  </div>
</div>

大致就是這種布局吧,暫且稱作分離模式吧,足夠靈活,就是導航部分和內容結構分開,需要什么動畫效果都可以分別實現。

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

<div class="tabs">
  <div class="tab-pane">
    <div class="tab-item">tab01</div>
    <div class="tab-content">111</div>
  </div>
  <div class="tab-pane">
    <div class="tab-item">tab01</div>
    <div class="tab-content">111</div>
  </div>
  <div class="tab-pane">
    <div class="tab-item">tab01</div>
    <div class="tab-content">111</div>
  </div>
</div>

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

ReactDOM.render(
  <Tabs defaultActiveKey="1" onChange={callback}>
    <TabPane tab="Tab 1" key="1">Content of Tab Pane 1</TabPane>
    <TabPane tab="Tab 2" key="2">Content of Tab Pane 2</TabPane>
    <TabPane tab="Tab 3" key="3">Content of Tab Pane 3</TabPane>
  </Tabs>,
mountNode);

是不是很像?

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

第一種布局(分離模式)

這里有兩種思路

  1. 錨點實現?herf?+?:target
  2. css3?nth-child(n)?選擇器

錨點實現主要是在a標簽加上href屬性,然后目標元素上添加相同的id,當點擊a標簽時,目標元素的:target就生效了

<style>
#item01:target{ background:red }
</style>
<a href="#item01">跳轉</a>
<div id="item01">內容</div>

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

nth-child(n)?選擇器,這種方式就比較傳統了,不過導航切換部分還是用到label+input[type=radio],實現基本和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
}

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

下面著重來實現第二種布局

第二種布局(合并模式)

如果是這樣一種布局,那么導航和內容就可以通過相鄰選擇器+聯系上了,重點是如何實現選項卡的樣式,當然,我們也需要改一下html

<div class="tabs">
  <div class="tab-pane">
    <input type="radio" name="tab" id="tab01"/>
    <label class="tab-item" for="tab01">tab01</label>
    <div class="tab-content">111</div>
  </div>
  <div class="tab-pane">
    <input type="radio" name="tab" id="tab02"/>
    <label class="tab-item" for="tab02">tab02</label>
    <div class="tab-content">222</div>
  </div>
  <div class="tab-pane">
    <input type="radio" name="tab" id="tab03"/>
    <label class="tab-item" for="tab03">tab03</label>
    <div class="tab-content">333</div>
  </div>
</div>

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

.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{/**導航選中狀態**/
  background:orangered;
  color:#fff
}
.tabs input[type='radio']:checked+.tab-item+.tab-content{/**當前內容切換**/
  z-index:1
}

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

演示效果見頁底Demo2

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

添加一點動畫效果

/**給導航添加橫條的縮放效果**/
.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)
}
/**給內容區域添加一個淡入淡出的效果**/
.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)
}

演示效果見頁底Demo3

小節

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

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

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

下載權限
查看
  • 免費下載
    評論并刷新后下載
    登錄后下載
  • {{attr.name}}:
您當前的等級為
登錄后免費下載登錄 小黑屋反思中,不準下載! 評論后刷新頁面下載評論 支付以后下載 請先登錄 您今天的下載次數(次)用完了,請明天再來 支付積分以后下載立即支付 支付以后下載立即支付 您當前的用戶組不允許下載升級會員
您已獲得下載權限 您可以每天下載資源次,今日剩余

給TA贊賞
共{{data.count}}人
人已贊賞
??
Npcink上的部份代碼及教程來源于互聯網,僅供網友學習交流,若您喜歡本文可附上原文鏈接隨意轉載。
無意侵害您的權益,請發送郵件至 1355471563#qq.com 或點擊右側 私信:Muze 反饋,我們將盡快處理。
?
購物車
優惠劵
搜索
久久精品国产99国产精品免费看_中文成人在线_日本在线播放视频_精品国产一区二区三区在线观看

    9000px;">

      一区二区国产视频| 亚洲免费资源在线播放| 亚洲精品乱码久久久久久久久 | 在线观看免费一区| 亚洲国产精品人人做人人爽| 欧美videossexotv100| 成人手机在线视频| 一区二区三区中文在线观看| 欧美午夜精品电影| 国产精品888| 亚洲一卡二卡三卡四卡| 久久久国产精品麻豆| 亚洲国产精品久久久男人的天堂| 欧美一级视频精品观看| 精品欧美久久久| 国产丝袜在线精品| 亚洲色图另类专区| 亚洲综合视频在线| 日本午夜精品一区二区三区电影| 久久精品国产999大香线蕉| 国产自产视频一区二区三区| 国产iv一区二区三区| 成人美女视频在线观看18| aaa欧美日韩| 欧美年轻男男videosbes| 欧美电影免费观看高清完整版在| 久久久美女艺术照精彩视频福利播放| 中文字幕不卡三区| 一区二区三区四区五区视频在线观看| 午夜欧美一区二区三区在线播放| 美国一区二区三区在线播放| 国产精品一区二区不卡| 色视频欧美一区二区三区| 91精品一区二区三区在线观看| 欧美tk丨vk视频| 亚洲欧美日韩电影| 日本特黄久久久高潮| 成人免费毛片app| 91麻豆精品国产91久久久久| 中文字幕av一区二区三区高 | 成人av在线资源网站| 另类人妖一区二区av| 日一区二区三区| 午夜不卡av免费| 五月婷婷综合网| 亚洲丶国产丶欧美一区二区三区| 综合激情成人伊人| 欧美国产乱子伦 | 91亚洲精品久久久蜜桃网站| 91精品国产乱码久久蜜臀| 国产精品国产三级国产aⅴ原创 | 成人欧美一区二区三区1314| 精品视频色一区| 欧美一卡在线观看| 亚洲视频你懂的| 免费人成精品欧美精品| 91啪在线观看| 久久久不卡网国产精品一区| 午夜激情一区二区三区| 欧美少妇一区二区| 美女mm1313爽爽久久久蜜臀| 免播放器亚洲一区| 精品一区二区三区视频在线观看 | 555夜色666亚洲国产免| 欧美日韩国产123区| 日韩一区二区三区免费看 | 欧美久久久久久久久久| 色综合久久天天综合网| 在线亚洲一区二区| 欧美日韩免费观看一区二区三区| 91网页版在线| 欧美性猛交xxxx乱大交退制版| 成人网在线播放| 91在线免费视频观看| 亚洲大尺度视频在线观看| 亚洲国产日日夜夜| 国产剧情一区二区三区| 亚洲精品在线免费观看视频| 中文字幕日韩欧美一区二区三区| 欧美极品aⅴ影院| 一级中文字幕一区二区| 欧美日韩国产乱码电影| 亚洲1区2区3区4区| 欧美精品在线观看播放| 亚洲国产视频在线| 欧美一区午夜精品| 美国十次了思思久久精品导航| 欧美理论在线播放| 免费日韩伦理电影| 国产视频在线观看一区二区三区| 高清免费成人av| 成人欧美一区二区三区视频网页| 色妹子一区二区| 亚洲午夜av在线| 日韩欧美电影在线| 欧美一区二区三区男人的天堂| 欧美在线不卡一区| 国产人伦精品一区二区| 奇米影视在线99精品| 成人午夜伦理影院| 日韩精品在线看片z| 欧美日产国产精品| 成人免费在线视频观看| 欧美影院一区二区三区| 免费精品99久久国产综合精品| 精品剧情v国产在线观看在线| 国产成人精品亚洲777人妖| 亚洲靠逼com| 欧美大片免费久久精品三p| 国产mv日韩mv欧美| 亚洲成人av在线电影| 欧美v亚洲v综合ⅴ国产v| 成人一级视频在线观看| 亚洲va韩国va欧美va| 国产亚洲综合在线| 91黄色小视频| 麻豆国产欧美一区二区三区| 日本一二三不卡| 欧美电影在线免费观看| 成人av第一页| 美女精品自拍一二三四| 亚洲靠逼com| 欧美国产日韩一二三区| 欧美精品乱码久久久久久| 处破女av一区二区| 视频一区二区三区中文字幕| 国产日产精品一区| 欧美蜜桃一区二区三区| 91麻豆精东视频| 国产一区在线观看视频| 亚洲精品乱码久久久久| 久久综合九色综合97婷婷 | 国产情人综合久久777777| 欧美日韩高清一区二区三区| 国产91精品精华液一区二区三区| 午夜欧美视频在线观看| 亚洲三级在线免费| 亚洲女同ⅹxx女同tv| aa级大片欧美| 亚洲一区二区av在线| 91精品国产aⅴ一区二区| 另类成人小视频在线| 国产欧美日韩不卡免费| 91丨porny丨首页| 亚洲综合清纯丝袜自拍| 欧美高清hd18日本| 国产一区不卡在线| 国产一区二区精品久久99| 亚洲少妇屁股交4| 国产精品免费免费| 久久久www免费人成精品| 久久综合九色综合97婷婷| 日韩免费福利电影在线观看| 欧美一区二区国产| 欧美精品99久久久**| 欧美日韩国产在线观看| 欧美精品九九99久久| 欧美日韩黄色一区二区| 色婷婷一区二区| 色天使色偷偷av一区二区| 一本大道久久a久久综合| 91原创在线视频| 91视频免费观看| 色哟哟日韩精品| 欧美日韩在线直播| 国产精品嫩草影院av蜜臀| 成人福利视频在线看| 免费亚洲电影在线| 亚洲综合网站在线观看| 久久久久久久久久久黄色| 色综合 综合色| 国产精品一区免费视频| 日本午夜一本久久久综合| 国产精品成人午夜| 久久人人97超碰com| 欧美日韩一区二区三区四区五区| 国产精品夜夜嗨| 美女尤物国产一区| 亚洲成人av一区二区三区| 亚洲精品视频一区| 国产精品大尺度| 国产欧美一区二区三区沐欲 | 亚洲国产高清aⅴ视频| 日韩欧美一区二区在线视频| 在线看国产一区二区| 成人午夜免费电影| 福利一区在线观看| 国产精品自在在线| 久久精品国产久精国产爱| 日韩电影在线一区二区三区| 亚洲无线码一区二区三区| 粉嫩av一区二区三区| 在线观看91视频| 国产午夜精品福利| 一区二区三区四区在线免费观看| 亚洲超丰满肉感bbw| 国产精品456| 欧美日韩激情一区二区| 国产欧美一区二区精品忘忧草 | 欧美一区二区三区不卡|