搜尋
首頁web前端css教學CSS中一些利用偽類、偽元素和鄰近元素選擇器的技巧

前幾天遇到頁面需求是這樣的:

CSS中一些利用偽類、偽元素和鄰近元素選擇器的技巧

一個評論框,後面的按鈕有點讚或者發送評論兩種狀態,其中發送按鈕有根據輸入框中是否有字分為可點擊和不可點選兩種狀態。

需求:
沒有文字,沒有聚焦——點讚
沒有文字,聚焦——灰色發送
有文字——紅色發送

如果用JS實現,需要監聽輸入框的change和focus事件,比較麻煩。但是用CSS中的偽類就可以實現相近效果。

<input type="text" class="input" required>
<div class="like">点赞</div>
<div class="send">发送</div>
.send {
  display: none;
}

.input:focus ~ .send {
  display: block;
}

.input:valid ~ .send {
  display: block;
  color: red;
}


.input:focus ~ .like, .input:valid ~ .like {
  display: none;
}

(如果評論框用contenteditable屬性的div元素實現,可以用:empty偽類代替:valid。)

所以CSS3中的偽類和偽元素非常多,其中一些如果用的巧妙,可以實現很多原本需要JS才可以達成的效果。

contenteditable屬性的div的placeholder

因為某些原因,我們有時候用帶有contenteditable屬性的div而不是input或textarea來作為輸入框。例如,div可以根據內容自動調整高度。但是div元素不支援placeholder屬性。怎麼在div內容為空的時候顯示一個預設文字呢?可以利用:empty偽類。

  <div class="input" contenteditable placeholder="请输入文字"></div>
.input:empty::before {
  content: attr(placeholder);
}

畫格子

這個是在美團的行動端頁面上看到的:

CSS中一些利用偽類、偽元素和鄰近元素選擇器的技巧

我們需要在城市列表這個區域畫一個格子。我們當然首先想到的是用border屬性,但設計師有個要求是,如果最後一行只有一個或兩個城市,為了美觀後面也要有空白的格子。像這樣子:

CSS中一些利用偽類、偽元素和鄰近元素選擇器的技巧

美團的頁面中,格子的垂直線是怎麼畫的呢?是用::after和::before元素畫的。

.table:before {
  content: &#39;&#39;;
  position: absolute;
  width: 25%;
  left: 25%;
  height: 100%;
  border-left: 1px solid #ddd8ce;
  border-right: 1px solid #ddd8ce;
}

.table:after {
  content: &#39;&#39;;
  position: absolute;
  width: 10%;
  left: 75%;
  height: 100%;
  border-left: 1px solid #ddd8ce;
  border-right: none;
}

分別創造了兩個高度為100%的偽元素,利用它們的邊框作為表格的垂直線。這種方案可以實現設計師的要求,又不會增加空白的頁面元素,破壞語意。但是限制就是最多只能畫四條垂直線,也就是說表格最多有5列。

Tab切換

純CSS實現Tab切換也是可以的。主要是利用了單選框元素的:checked偽類和相鄰選擇器。因為是單選框,所以保證了同一時間只有一個tab處於啟動狀態。如果不要求更複雜的效果,這樣純CSS實現的tab切換效果,要比JS簡單可靠很多。

  <input id="tab1" type="radio" name="tabs" checked>
  <label for="tab1">TAB1</label>
  <input id="tab2" type="radio" name="tabs">
  <label for="tab2">TAB2</label>

  <div id="content1" class="tab-content">CONTENT1<div>  
  <div id="content2" class="tab-content">CONTENT2</div>
  input, .tab-content{
    display: none;
  }
  #tab1:checked ~ #content1,
  #tab2:checked ~ #content2 {
    display: block;
  }

另外利用表單元素的偽類,可以label元素來取代單選框、複選框等表單元素的本身,因為為表單元素本身定義樣式十分困難。

感知子元素的個數

這個是我看過的最複雜的一個技巧之一,來自這篇文章,不依靠JS實現了根據子元素的個數來應用不同的樣式。

例如這樣的CSS:

.list li:nth-last-child(n+4) ~ li,
.list li:nth-last-child(n+4):first-child {
  color: red
}

可以實現這樣的效果:如果.list裡面li元素個數大於等於4,則顯示為紅色。

這是怎麼實現的呢?

:nth-last-child(n+4)這一個選擇器的意思就是倒數第四個以及之前的元素,後面加了~ li,就是表示符合前面條件的元素之後的li元素。

如果元素總數不足4,則不會存在符合:nth-last-child(n+4)的元素(總共沒有四個,也就不存在倒數第四個),那麼li:nth-last-child( n+4) ~ li就不會選擇任何的元素了。

但是如果只用~ li,是不會配對到第一個li的,所以又加上了li:nth-last-child(n+4):first-child。

這樣也就實現了根據元素個數的多少來應用不同的樣式。


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
利用CSS怎么创建渐变色边框?5种方法分享利用CSS怎么创建渐变色边框?5种方法分享Oct 13, 2021 am 10:19 AM

利用CSS怎么创建渐变色边框?下面本篇文章给大家分享CSS实现渐变色边框的5种方法,希望对大家有所帮助!

css ul标签怎么去掉圆点css ul标签怎么去掉圆点Apr 25, 2022 pm 05:55 PM

在css中,可用list-style-type属性来去掉ul的圆点标记,语法为“ul{list-style-type:none}”;list-style-type属性可设置列表项标记的类型,当值为“none”可不定义标记,也可去除已有标记。

css与xml的区别是什么css与xml的区别是什么Apr 24, 2022 am 11:21 AM

区别是:css是层叠样式表单,是将样式信息与网页内容分离的一种标记语言,主要用来设计网页的样式,还可以对网页各元素进行格式化;xml是可扩展标记语言,是一种数据存储语言,用于使用简单的标记描述数据,将文档分成许多部件并对这些部件加以标识。

css3怎么实现鼠标隐藏效果css3怎么实现鼠标隐藏效果Apr 27, 2022 pm 05:20 PM

在css中,可以利用cursor属性实现鼠标隐藏效果,该属性用于定义鼠标指针放在一个元素边界范围内时所用的光标形状,当属性值设置为none时,就可以实现鼠标隐藏效果,语法为“元素{cursor:none}”。

rtl在css是什么意思rtl在css是什么意思Apr 24, 2022 am 11:07 AM

在css中,rtl是“right-to-left”的缩写,是从右往左的意思,指的是内联内容从右往左依次排布,是direction属性的一个属性值;该属性规定了文本的方向和书写方向,语法为“元素{direction:rtl}”。

css怎么设置i不是斜体css怎么设置i不是斜体Apr 20, 2022 am 10:36 AM

在css中,可以利用“font-style”属性设置i元素不是斜体样式,该属性用于指定文本的字体样式,当属性值设置为“normal”时,会显示元素的标准字体样式,语法为“i元素{font-style:normal}”。

css怎么实现英文小写转为大写css怎么实现英文小写转为大写Apr 25, 2022 pm 06:35 PM

转换方法:1、给英文元素添加“text-transform: uppercase;”样式,可将所有的英文字母都变成大写;2、给英文元素添加“text-transform:capitalize;”样式,可将英文文本中每个单词的首字母变为大写。

怎么设置rotate在css3的旋转中心点怎么设置rotate在css3的旋转中心点Apr 24, 2022 am 10:50 AM

在css3中,可以用“transform-origin”属性设置rotate的旋转中心点,该属性可更改转换元素的位置,第一个参数设置x轴的旋转位置,第二个参数设置y轴旋转位置,语法为“transform-origin:x轴位置 y轴位置”。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
2 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
2 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境