百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

强大而好用的选择器:focus-within

zhezhongyun 2025-05-30 19:01 39 浏览

伪类和伪元素

在开发网页样式中,选择器必不可少,而且选择器也是在开发css中非常重要的内容,包括常用的类选择器,id选择,同时还有伪类,伪类选择器最大的特点就是冒号开头。平时也经常会有小伙伴问到,在使用的时候有伪类,也有伪元素,有些添加单冒号,有些添加双冒号,有没有什么区别?

在网上总结的比较多的一个特点就是,其实在使用的时候,无论是伪类还是伪元素都是可以用单冒号的。但是伪元素可以用双冒号,而伪类只能用单冒号。符合标准而言,单冒号(:)用于 CSS3 伪类,双冒号(::)用于 CSS3 伪元素。

:focus-within伪类

上面简单讲解一下伪元素选择器和伪类选择器,本文的主角是一个新的伪类选择器::focus-within。

:focus-within选择器其实跟:focus是很相似的,但是也有很大的区别,:focus设置之后,是当前元素触发焦点状态后的样式。而:focus-within,通过名字可以猜到,它是当前元素或者后的元素获取焦点后的样式。

举个例子:

<style>
	form{
		width: 500px;
		min-height: 300px;
		padding: 10px;
	}
	/* 第一种情况 */
	input:focus{
		outline: solid red;
	}
	/* 第二种情况 */
	form:focus-within{
		outline: solid red;
	}
</style>

<form action="">
	<input type="text" id="txt">
</form>
12345678910111213141516171819

第一种情况是input元素获取焦点的时候触发,让input自身设置outline的样式;第二种情况,当input获取焦点后,form设置outline的样式。

通过这一点我们可以制造出一些常用的交互样式,简化JavaScript的代码。

兼容性

虽然是新选择器,但是兼容性还是挺友好的。

:focus-within 的冒泡性

这个属性有点类似 Javascript 的事件冒泡,从可获焦元素开始一直冒泡到根元素 html,都可以接收触发 :focus-within 事件,在上面的示例中就是如此。

那么它可以有哪些实际应用呢?

感知用户聚焦位置

跟上面示例一样,当用户触发之后,向父级进行传递,我们可以指定用户的聚焦位置,利用这一点,可以设置增加用户体验的交互效果。

举个例子:

<style>
	*{
		padding: 0;
		margin: 0;
		border: none;
	}
	form{
		width: 200px;
		min-height: 300px;
		padding: 10px;
		border: 1px solid rgba(204,204,204,1);
		margin: 100px auto;
		transition: 0.2s;
	}
	.username,.password{
		height: 80px;
		margin: 50px 0 ;
	}
	input{
		box-sizing: border-box;
		outline: none;
		display: block;
		width: 100%;
		height: 100%;
		border: 1px solid rgba(204,204,204,1);
		transition: 0.2s;
	}
	input:focus{
		border: 1px solid rgba(55,55,210,1);
	}
	form:focus-within{
		border: 1px solid rgba(55,55,210,1);
		box-shadow: 0 0 10px rgba(0,0,0,0.3);
		transform: translateY(-4px);
	}
</style>

<form action="">
	<div class="username">
		<input type="text" placeholder="Your name" id="usr">
	</div>
	<div class="password">
		<input type="password" placeholder="Your password" id="pwd">
	</div>
</form>
123456789101112131415161718192021222324252627282930313233343536373839404142434445

效果如下图所示:

运用上面思想,我们可以把效果做的更炫一点点,在某些场景制作一些增强用户体验的效果。

也可以实现掘金网登录动效切换,掘金网的登录有一个小彩蛋,最上面的熊猫在你输入帐号密码的时候会有不同的状态。

以上两个效果,大家可以自行尝试进行书写。

本文主要是引出这一个伪元素,大家可以发挥自己的创意,开发出更炫酷的效果。

相关推荐

perl基础——循环控制_principle循环

在编程中,我们往往需要进行不同情况的判断,选择,重复操作。这些时候我们需要对简单语句来添加循环控制变量或者命令。if/unless我们需要在满足特定条件下再执行的语句,可以通过if/unle...

CHAPTER 2 The Antechamber of M de Treville 第二章 特雷维尔先生的前厅

CHAPTER1TheThreePresentsofD'ArtagnantheElderCHAPTER2TheAntechamber...

CHAPTER 5 The King&#39;S Musketeers and the Cardinal&#39;S Guards 第五章 国王的火枪手和红衣主教的卫士

CHAPTER3TheAudienceCHAPTER5TheKing'SMusketeersandtheCardinal'SGuard...

CHAPTER 3 The Audience 第三章 接见

CHAPTER3TheAudienceCHAPTER3TheAudience第三章接见M.DeTrévillewasatt...

别搞印象流!数据说明谁才是外线防守第一人!

来源:Reddit译者:@assholeeric编辑:伯伦WhoarethebestperimeterdefendersintheNBA?Here'sagraphofStea...

V-Day commemorations prove anti-China claims hollow

People'sLiberationArmyhonorguardstakepartinthemilitaryparademarkingthe80thanniversary...

EasyPoi使用_easypoi api

EasyPoi的主要特点:1.设计精巧,使用简单2.接口丰富,扩展简单3.默认值多,writelessdomore4.springmvc支持,web导出可以简单明了使用1.easypoi...

关于Oracle数据库12c 新特性总结_oracle数据库12514

概述今天主要简单介绍一下Oracle12c的一些新特性,仅供参考。参考:http://docs.oracle.com/database/121/NEWFT/chapter12102.htm#NEWFT...

【开发者成长】JAVA 线上故障排查完整套路!

线上故障主要会包括CPU、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题...

使用 Python 向多个地址发送电子邮件

在本文中,我们将演示如何使用Python编程语言向使用不同电子邮件地址的不同收件人发送电子邮件。具体来说,我们将向许多不同的人发送电子邮件。使用Python向多个地址发送电子邮件Python...

提高工作效率的--Linux常用命令,能够决解95%以上的问题

点击上方关注,第一时间接受干货转发,点赞,收藏,不如一次关注评论区第一条注意查看回复:Linux命令获取linux常用命令大全pdf+Linux命令行大全pdf为什么要学习Linux命令?1、因为Li...

linux常用系统命令_linux操作系统常用命令

系统信息arch显示机器的处理器架构dmidecode-q显示硬件系统部件-(SMBIOS/DMI)hdparm-i/dev/hda罗列一个磁盘的架构特性hdparm-tT/dev/s...

小白入门必知必会-PostgreSQL-15.2源码编译安装

一PostgreSQL编译安装1.1下载源码包在PostgreSQL官方主页https://www.postgresql.org/ftp/source/下载区选择所需格式的源码包下载。cd/we...

Linux操作系统之常用命令_linux系统常用命令详解

Linux操作系统一、常用命令1.系统(1)系统信息arch显示机器的处理器架构uname-m显示机器的处理器架构uname-r显示正在使用的内核版本dmidecode-q显示硬件系...

linux网络命名空间简介_linux 网络相关命令

此篇会以例子的方式介绍下linux网络命名空间。此例中会创建两个networknamespace:nsa、nsb,一个网桥bridge0,nsa、nsb中添加网络设备veth,网络设备间...