点击右上方红色按钮关注“小郑搞码事”,每天都能学到知识,搞懂一个问题!
谢谢你点开来阅读,小郑希望您阅读完有所获。
先解释一下标题的歧义,之所以叫不需要使用JavaScript的意思不是让你放弃它,更不是说有个横空出世的脚本可以替换它。说的是前端在处理交互的时候,好多场景是可以不用JavaScript干预的。而直接借助标签特性,CSS属性特点,选择器灵活应用就能很好的完成一个你所需要的交互效果。这里会用实例的方式,详细的给大家讲一些交互是如何弃JavaScript而实现的。希望大家从中有所获。
先来复习一下几个长的相似的选择器。这些选择器不是每天都会用,可能一个星期甚至几个月才会用一次,如此,容易忽略或者易混淆它们的作用。所以借此机会来一起复习一下,因为本文讲解的实例中也会用到。
如上图所示:
1. 逗号指的是相同的CSS样式,class值为a的对象和class值为b的对象所使用的样式值是完全一样的。
2. 空格指的是后代元素,定义class值为a的对象的所有后代元素中class值为b的对象的样式值。
3. 大于号叫子选择器,作用于第一代子元素而不是所有,与空格选择器区分开来。
4. 加号是相邻兄弟选择器,只作用于后出现的相邻元素,如上,紧接着class值为a的对象出现的class值为b的对象。
4. 破浪号定义class值为a的元素同级下所有符合class值为b的元素的样式。
选择器复习完了,下面我们来讲解一些实例。
一、传送带效果实现
这种效果经常出现在焦点图区域,点击左右按钮或者点击圆点区域来切换图片。如下图所示:
如果你认为这种效果只能借助脚本语言JS来实现的话,那今天你也就能学会不用JS实现的方法。还记得HTML元素中,label标签中的for属性吗?对,没错,传送带效果就是利用label标签的for属性来实现的。
【非JavaScript实现技术】for属性规定label与哪个表单元素绑定。
举个例子:
Male
注意label里的for属性值,和input里的id属性值是对应的,当点击label时,单选项input就被选中状态。进一步我们就可以利用样式选择器来设置选中input的同级元素状态,从而实现我们想要的效果。
来对照传送带效果的源代码,看看具体怎么实现:
这是传送带效果实现的代码,如上图所示,实现原理就是利用设置选中input元素同级元素样式来搞的。需要用的样式选择器有相邻元素选择器+,有同级元素选择器~。对着上面代码图,下面我在具体说一下实现过程。
1. 当用户点击左右箭头(labler标签)时,对应与其for属性相同的id属性的input元素被选中,利用相邻元素选择器,设置其相邻元素class=carousel-item的显示。
2. 利用同级元素选择器~。设置所有同级元素label的class=control-1的UI状态,这样就能实现点击左右箭头时,切换到对应的图片。
二、计算复合选择效果
从标题上不好理解,我们就直接上一张动效图来看看(搞个GIF图)。
就是这样的效果,每当我们点击选择一个选项时,会在下面结果栏中计数加1,一个都不选择时,就不显示结果。
如果你认为这个效果只能借助脚本JavaScript来实现时,那么今天你又学到了一种非脚本实现方式。
还记得我之前写过一篇文章:《使用CSS计数器动态生成且自动递增数字》。里面我讲过三个重要属性,其中就有应用计数器属性(counter-increment)和显示计数(counter)。对此还不是很熟悉的同学可以翻到之前的过一下,非常好理解。
好了,回到计算复合选择效果的实现上,其实现原理就是利用计数器功能。
【非JavaScript实现技术】计数器两个属性counter-increment和counter 。
如果对计数器足够了解的话,这段代码也是非常好理解的。利用counter来统计选中的input元素的个数。对照上面代码具体来分析一下:
1. 首先在选择input元素上应用计数器(counter-increment),在class=result元素上显示计数数值。
2. 默认class=result元素不显示,利用同级选择器~来控制,当有选中的input元素时显示class=result元素。
三、移入和点击翻动效果
类似于翻牌的效果,在动作上有所不同,这里主要强调的是鼠标移入和点击触发时的动效,如下面这张gif图所示:
来看一下,这个效果不用JS是如何实现的。
【非JavaScript实现技术】利用input(checkbox)选中时设置相邻元素的样式。
DOM结果很简单:
Front
Back
如这个结构所示,实现的关键代码就是在checkbox选中之后设置相邻元素class=card的样式值(rotate属性)。细心的同学可能发现了,在鼠标移入时有一个小的转动角度和边框阴影,这个是利用label标签hover时给class=card元素加rotateX(20deg)和box-shadow值。鼠标移入label后,点击input选中后,使用+号选择器设置class=card元素的rotateX值即可实现上面的效果。这个比较简单,不深入说了,总之在不使用JS的情况下也能轻松搞定上面这个交互效果。
四、补充说明效果
这个效果大家一定非常熟悉,鼠标移入的时候展示对应文字说明的浮层,其意义大部分就是进一步说明。同样先来看一下效果演示。
对CSS熟悉的同学应该都知道,CSS有一些函数Function,也都是比较通用的,比如:
attr()函数
calc()函数
linear-gradient()函数
radial-gradient()函数
等等。
补充说明这个效果也无需JS来实现,纯CSS就能搞定。
【非JavaScript实现技术】鼠标hover时,使用attr函数获取属性内容到before的content中。
关键代码:
data-info是放在标签dfn上的一个自定义属性,dfn标签可标记那些特殊术语或短语的定义,关于该标签需要注意的是能不用的时候尽量不要用。总之,关于补充说明的效果,大家清楚了纯CSS是怎么实现的就行了。
五、页卡切换效果
最后要说的是Tab切换效果,其非JS处理原理就是和上面说的传送带效果是一样的,使用label标签的for属性来搞。
对照源代码来讲一下它的基本实现思路。
【非JavaScript实现技术】设置选中的input元素同级内容的样式。
这里在详细说明一下实现原理:当点击label时,其对应的input元素被选中,然后利用同级选择器~让其对应的内容(class=tab_content)显示,同时利用相邻元素选择器+设置其相邻label的显示状态,简单吧。
本文最后总结一下
本文开头部分,我给大家复习了一些选择器的用法,这里在强调三个重要的组件选择器的用法。
>:子选择器(ul > li)。
~:相邻兄弟选择器(ul + p)。
+:通用兄弟选择器(ul ~ p)。
对照这张图,在理解一下就一目了然了。
紧接着讲了五个实例,这里在归纳一下实例中使用到的技术实现思路。
1. label的for属性规定与哪个表单元素(id属性)对应,点击label时,就相当于是选择了其对应的input元素,然后在使用CSS选择器设置其它元素的样式。
2. CSS中计数器的用法,主要学会三个属性的配合使用,counter-reset(建立计数器),counter-increment(应用计数器),counter(显示计数),搞懂可能解决很多交互问题,更多可以参考我之前的文章。
3. 注意CSS里函数的用法。如attr(), calc()等都是比较常用的。
4. 最后可以要说的一个点是伪元素的用法,尤其是after/before。
这些效果你不需要使用JavaScript。以上实例如果需要源代码可以给我发私信哈。