CSS中一些利用伪类、伪元素和相邻元素选择器的技巧

前几天遇到一个页面需求是这样的:

一个评论框,后面的按钮有点赞或者发送评论两种状态,其中发送按钮有根据输入框中是否有字分为可点击和不可点击两种状态。

需求:

没有文字,没有聚焦——点赞

没有文字,聚焦——灰色发送

有文字——红色发送

如果用JS实现,需要监听输入框的change和focus事件,比较麻烦。但是用CSS中的伪类就可以实现相近效果。


  1. <input type="text" class="input" required> 
  2.  
  3. <div class="like">点赞</div> 
  4.  
  5. <div class="send">发送</div>  

  1. .send { 
  2.   display: none; 
  3.  
  4. .input:focus ~ .send { 
  5.   display: block; 
  6.  
  7. .input:valid ~ .send { 
  8.   display: block; 
  9.   color: red; 
  10.  
  11.  
  12. .input:focus ~ .like, .input:valid ~ .like { 
  13.   display: none; 

(如果评论框用contenteditable属性的div元素实现,可以用:empty伪类代替:valid。)

所以CSS3中的伪类和伪元素非常多,其中一些如果用的巧妙,可以实现很多原本需要JS才可以实现的效果。

contenteditable属性的div的placeholder

因为一些原因,我们有时候用带有contenteditable属性的div而不是input或者textarea来作为输入框。比如,div可以根据内容自动调整高度。但是div元素不支持placeholder属性。怎么在div内容为空的时候显示一个默认文字呢?可以利用:empty伪类。


  1. <div class="input" contenteditable placeholder="请输入文字"></div>  

  1. .input:empty::before { 
  2.  
  3.   content: attr(placeholder); 
  4.  
  5. }  

画格子

这个是在美团的移动端页面上看到的:

我们需要在城市列表这个区域画一个格子。我们当然首先想到的是用border属性,但是设计师有个要求是,如果最后一行只有一个或者两个城市,为了美观后面也要有空白的格子。像这样子:

美团的页面中,格子的竖线是怎么画的呢?是用::after和::before元素画的。


  1. .table:before { 
  2.   content: ''; 
  3.   position: absolute; 
  4.   width: 25%; 
  5.   left: 25%; 
  6.   height: 100%; 
  7.   border-left: 1px solid #ddd8ce; 
  8.   border-right: 1px solid #ddd8ce; 
  9.  
  10. .table:after { 
  11.   content: ''; 
  12.   position: absolute; 
  13.   width: 10%; 
  14.   left: 75%; 
  15.   height: 100%; 
  16.   border-left: 1px solid #ddd8ce; 
  17.   border-right: none; 
  18. }  

分别创造了两个高度为100%的伪元素,利用它们的边框作为表格的竖线。这种方案可以实现设计师的要求,又不会增加空白的页面元素,破坏语义。但是局限性就是最多只能画四条竖线,也就是说表格最多有5列。

Tab切换

纯CSS实现Tab切换也是可以的。主要是利用了单选框元素的:checked伪类和相邻选择器。因为是单选框,所以保证了同一时间只有一个tab处于激活状态。如果不要求更复杂的效果,这样纯CSS实现的tab切换效果,要比JS简单可靠很多。


  1. <input id="tab1" type="radio" name="tabs" checked> 
  2.   <label for="tab1">TAB1</label> 
  3.   <input id="tab2" type="radio" name="tabs"> 
  4.   <label for="tab2">TAB2</label> 
  5.  
  6.   <div id="content1" class="tab-content">CONTENT1<div>   
  7.   <div id="content2" class="tab-content">CONTENT2</div>  

  1. input, .tab-content{ 
  2.     display: none; 
  3.   } 
  4.   #tab1:checked ~ #content1, 
  5.   #tab2:checked ~ #content2 { 
  6.     display: block; 
  7.   }  

另外利用表单元素的伪类,可以label元素来代替单选框、复选框等表单元素的本身,因为为表单元素本身定义样式十分困难。

感知子元素的个数

这个是我看过的最复杂的一个技巧之一,来自这篇文章,不依靠JS实现了根据子元素的个数来应用不同的样式。

比如这样的CSS:


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

可以实现这样的效果:如果.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。

这样也就实现了根据元素个数的多少来应用不同的样式。

作者:王成

来源:51CTO

时间: 2024-11-08 19:16:16

CSS中一些利用伪类、伪元素和相邻元素选择器的技巧的相关文章

css伪类伪元素域高级选择器的介绍

 给链接定义样式 a:link 表示尚未访问的链接,鼠标未划过和点击 a:visited 表示已经访问的链接 a:hover 表示鼠标划入的链接 a:active 表示激活的链接,也就是鼠标点击链接的一瞬间 注意上面这四个链接的伪类在使用的时候要有一定的顺序,即上面列举的顺序,否则看不到效果.可以简单记为LOVE(包含link和visited首字母)和HATE(包含hover和active的首字母). 给段落定义样式 :first-letter 为一行中的第一个字符创建样式 :first-lin

css的伪类和伪元素理解

伪类和伪元素的理解 官方解释 伪类一开始单单只是用来表示一些元素的动态状态,典型的就是链接的各个状态(LVHA).随后CSS2标准扩展了其概念范围,使其成为了所有逻辑上存在但在文档树中却无须标识的"幽灵"分类. 伪元素则代表了某个元素的子元素,这个子元素虽然在逻辑上存在,但却并不实际存在于文档树中. 我自己的理解: 伪类,类,class是一个类,就类似class这样,表示一些元素的状态的,但是无须标识的分类. 伪元素,就是一个元素,类似p标签元素,等等,逻辑上存在,但是实际并不存在在文

利用CSS3的checked伪类实现OL的隐藏显示

网页制作Webjx文章简介:纯CSS打造可折叠树状菜单. 随着CSS3的发布,国外研究正如火如荼,但在国内还有很多人抱着IE不支持CSS3的想法,始终无动于衷不肯去学习.但是历史告诉我们,好的东西必将盛行,CSS3也终将也会替代CSS2,下面就和大家分享一个用CSS3打造的可折叠树状菜单. 直接上图: 树状菜单相信大家都不会陌生,我们一般用css+JS 的方式来实现.而css3的到来,让我们摆脱JS的束缚,直接运用CSS3的"选择器"就能实现可折叠树状菜单. 整体的代码很多,就不逐句逐

IE中伪类:hover的使用及BUG

:hover是我们在CSS设计中最常运用的伪类之一,许多绚丽效果的实现离不开伪类:hover,比如我们常见的纯CSS菜单.相册效果等等. 或许用了这么久的伪类:hover,还有部分朋友还不完全了解hover的规则: 引用:在CSS1中此伪类仅可用于a对象.且对于无href属性(特性)的a对象,此伪类不发生作用.在CSS2中此伪类可以应用于任何对象. 但目前IE5.5.IE6仅支持CSS1中的:hover,不过新出的IE7是支持CSS2中的:hover. 当我们用伪类:hover做某些特殊效果时,

《HTML 5与CSS 3权威指南(第3版·下册)》——19.3结构性伪类选择器

19.3 结构性伪类选择器 本节介绍CSS 3中的结构性伪类选择器,在介绍结构性伪类选择器之前,先来介绍一下CSS中的伪类选择器及伪元素. 19.3.1 CSS中的伪类选择器及伪元素 1.伪类选择器概述 我们知道,在CSS中,可以使用类选择器把相同的元素定义成不同的样式,如针对一个p元素,我们可以做如下所示定义.p.right{text-align:right}p.center{text-align:right} 然后在页面上对p元素使用class属性,把定义好的样式指定给具体的p元素,代码如下

谈谈一些有趣的CSS题目(十)-- 结构性伪类选择器

开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉到生僻的 CSS 属性,赶紧去补习一下吧. 不断更新,不断更新,不断更新,重要的事情说三遍. 谈谈一些有趣的CSS题目(一)-- 左边竖条的实现方法 谈谈一些有趣的CSS题目(二)-- 从条纹边框的实现谈盒子模型 谈谈一些有趣的CSS题目(三)-- 层叠顺序与堆栈上下文知多少 谈谈一些有趣

CSS中的元素定位方法详解

  1.盒模型 盒模型,就是 浏览器为页面中的每个 HTML 元素生成的矩形盒子. 这些盒子们都要按照 可见版式模型(visual formatting model)在页面上排布.可见的页面版式主要由三个属性控制: position 属性. display 属性和 float 属性.其中,position 属性控制页面上元素间的位置关系, display 属性控制元素是堆叠.并排,还是根本不在页面上出现, float 属性提供控制的方式,以便把元素组成成多栏布局. 盒子属性分三组: 边框(bor

深入学习网页技术CSS中选择符的应用

css|网页 一.选择符模式 模式/含义/内容描述 * 匹配任意元素.(通用选择器) E 匹配任意元素 E (例如一个类型为 E 的元素).(类型选择器) E F 匹配元素 E 的任意后代元素 F .(后代选择器) E > F 匹配元素 E 的任意子元素 F .(子选择器) E:first-child 当元素 E 是它的父元素中的第一个子元素时,匹配元素 E .(:first-child 伪类) E:link E:visited 如果 E 是一个目标还没有访问过(:link)或者已经访问过(:v

css display:inline 防止html元素变成块元素

 css中,display:none; 的作用是让html元素隐藏,反之让其显示,通常使用 display:block;.但 display:block; 的另一个作用是,让当前html元素变成块元素.  像 <select>/<input>/<span> 等元素都属于占位元素,也就是说,这几个元素写在一起,但只占一行.而 <div>/<h1>/<h2>/ 等,都会独自占用一行.  现在有这么一个需求:在使用 display:none