整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

使用纯CSS制作一个手风琴组件

本篇文章里,我们一起学习下如何使用 CSS checkbox hack 技巧制作一个响应式的手风琴组件,这个组件完全基于CSS,没有JavaScript脚本,基于窗口大小进行水平和垂直之间进行切换。为了让大家更好理解,我将和大家一起一步步的进行完成。

手风琴样式效果:

下图是我们要制作的手风琴效果

本示例需要你具备一些关于flexbox的知识。

首先,我们先了解下什么是 CSS Checkbox Hack ?

CSS Checkbox Hack 允许你通过复选框(Checkbox)是否选中(或单选按钮radio buttons)来控制某些特定的样式。这里运用的是:checked 伪类选择器,其意思就是”如果选中了表单(复选框、单选按钮),则应用相关样式规则“

我们通常隐藏表单控件,然后结合<lable>来控制复选框或单选框的选择,制作一些特殊的效果,因此用户无法感知复选框的存在。

这是我的最爱,不仅可以完成本文的例子,还会制作一些更有趣例子,稍后会介绍到。

1、创建 HTML 标记结构

在本练习中,我们从维基百科找一些四种不同类型的内容介绍:动物、植物、空间和河流。然后我们创建相应的单选按钮,并为其分配内容关键词:

建立无序列表

接下来,我们设置一个包含4行的无序列表,每行列表<li>包含了标题项<lable>标签和内容项<div>标签:

  1. 首先我们在标题选型卡外层定义标签,这里的关键所在就是这个标签,尤其是 for 这属性,指向对应表单的id的属性,label 标签不会向用户呈现任何特殊效果。不过,它为鼠标用户改进了可用性。如果您在 label 元素内点击文本,就会触发此控件。就是说,当用户选择该标签时,浏览器就会自动将焦点转到和标签相关的表单控件上。这就是这个案例的关键所在。
  2. <li>标签里<div>内容,我们用来定义选项卡里对应的内容。

基于上面的思路,整理后无需列表内容如下:

2、定义相关样式

准备好上述的HTML内容后,我们来定义相关样式,首先我们需要隐藏我们的几个单选按钮,我们可以使用left属性,将其移除屏幕显示区域,示例代码如下:

接下来我们来定义手风琴整体外观布局,让其具有响应式,用到了弹性盒子布局,设置display:flex, 同时又应用到了CSS的自定义变量新属性,方便我们进行统一设置和修改,示例代码如下:

然后我们定义无需列表<li>标签的样式,也设置其为弹性盒子布局,示例代码如下:

为了区分每个<li> 选型,让其有分割的感觉,我们来定义其边框属性,示例代码如下:

每个选项卡容器,让标题默认在纵轴上进行布局,然后设置标题选项卡的宽度为70px,以及定义鼠标经过的外观样式:

由于宽度有限,我们需要旋转标题文字的方向,让其由下往上垂直显示,示例代码如下:

最后我们来定义选项卡内容文本的样式,我们应该默认第一个选项卡的内容出于展示状态,其它选项卡隐藏,这里我们先让所有的选项卡默认隐藏,后面我们会使用 Checkbox Hack 让选中的选项卡内容处于展示状态。示例代码如下:

3、Checkbox Hack: 切换选型内容

这部分代码就像变魔法一般,当我们点击每个标题选型卡内容时就响应显示相关内容,这里我们使用了 :checked 伪类,以及结合 CSS的后续同胞选择器(~)以及 紧邻同胞选择器(+)。

接下来我们来动手实践吧,为了让对应选中的选项卡内容可见,我们使用 display: flex 让其可见,并使用 align-items: center 属性让文本内容垂直居中。同时为了让用户区分选中了哪个选项卡,我们需要定义选项卡出于选中状态时的标题颜色。

最后定义一个可选的外观样式,当每个单选按钮获取焦点时,我们为lable标签定义outline属性,这个细节帮组我们增强组件的可访问性。(accessibility)

以下是完成后的CSS代码内容:


4、响应式处理

接下来我们来处理下,在小屏或可视窗口低于 650px 的情况,幸亏我们使用了弹性盒子布局,在这种情况下,我们让手风琴垂直显示,也就是每个选项卡纵向分布,每个选项卡的标题内容横向分布。示意图效果如下:

对应的代码如何实现呢?首先我们需要更改无序列表让其为纵向分布,flex-direction: column;然后更改选型卡的标题区域布局为横向分布,flex-direction: row,示意代码如下:

5、处理内容有限的情况

在我们的案例中,每个选项卡的内容都很多,看起来很漂亮。但是为了确保没有足够内容支撑时,手风琴效果不走样,我们需要进行一些样式上的特殊处理,效果如下图所示:


  • 我们需要在每个当前选中状态的选项卡里添加flex-grow: 1属性,并不是所有的选项卡,让当前选中的选项卡里占据所有剩余宽度,我们需要在li标签上增加用户自定义属性(data-radio)方便我们来定义样式。
  • 接下来我们需要在选项卡的内容部分添加 flex-grow: 1 的规则,让选项卡的内容比较少是也能占满整个父元素容器的宽度。
  • 最后为选项卡的内容定添加内容居中的属性,示意代码如下:justify-content: center

基于以上思路,我们调整后的html代码如下,只是在li标签上增加了自定义属性(data-radio),代码如下:

CSS部分修部分的代码如下:

最终完成的代码

1、HTML代码部分:


2、CSS代码部分:

小节

今天的案例就和大家聊到这里,通过本文,我们一起学习了如何使用 CSS checkbox hack 技术完成了一个纯CSS手风琴效果, CSS checkbox hack 不仅能做手风琴效果,还有更多有趣的效果等待你挖掘,比如实现常见的导航切换、点击按钮弹出层的效果,不用写一行JS代码,是不是觉得CSS很神奇呢,在接下来的文章,我将会给大家继续分享 CSS checkbox hack 的案例,敬请期待。

选按钮

单选按钮主要是让网页浏览者在一组选项里只能选择一个。代码格式如下。

<input type="radio" name=" " value=" " >

其中type="radio"定义单选按钮;name属性定义单选按钮的名称,单选按钮都是以组为单位使用的,在同一组中的单选项都必须用同一个名称;value属性定义单选按钮的值,在同一组中域值必须是不同。

(1)编写代码如下图所示,在<body>标签中加入以下代码。

(2)在浏览器中打开文件,预览效果图如下所示,即可看到5个单选按钮,用户只能同时选择其中一个。

复选框

复选框主要是让网页浏览者在一组选项里可以同时选择多个选项。每个复选框都是一个独立的元素,都必须有唯一的一个名称。代码格式如下。

<input type="checkbox" name=" " value=" " >

其中type="checkbox"定义复选框;name属性定义复选框的名称,在同一组中的复选框都必须用同一个名称;value属性定义复选框的值。

(1)编写代码如下图所示,在<body>标签中加入以下代码。

(2)在浏览器中打开文件,预览效果图如下所示,即可看到5个复选框,其中【人生大事】和【广告专区】复选框被选中。

读本文约需要10分钟,您可以先关注我们,避免下次无法找到。

HTML基础教程上篇介绍了HTML的基础知识及一些常用的标签,本篇文章主要介绍HTML的样式、表单、Table、框架等内容。下面我们就一起来了解吧!

01 HTML样式

所有的HTML可以通过设置其style属性来设置标签的样式,下面我们就来演示几个常用的HTML样式设置。

1)设置标签宽度与高度

我们创建一个div标签,然后设置其高度与宽度,但由于div标签默认没有颜色我们看不到效果,所以在设置其高度与宽度时,同时为其设置一个背景颜色,具体示列如下:

1. <!DOCTYPE html>  
2. <html>  
3. <head>  
4.   <title>HTML基础教程</title>  
5.   <meta charset="utf-8" />  
6. </head>  
7. <body>  
8.   <!-- 给div宽度设置为一个长宽都为400px的正方形块,同时背景色代码块为#46a6ff -->  
9.   <div style="width: 400px; height: 400px; background-color: #46a6ff;"></div>  
10. </body>  
11. </html>  

2)设置字体类型与大小

我们在上面div块中加入文字,并给加入的文字设置字体类型与大小,同时为其加粗,具体示列如下:

1. <!DOCTYPE html>  
2. <html>  
3. <head>  
4.   <title>HTML基础教程</title>  
5.   <meta charset="utf-8" />  
6. </head>  
7. <body>  
8.   <!-- font-family是设置字体类型;font-size是设置字体大小;font-weight是给字体加粗  -->  
9.   <div style="width: 400px; height: 400px;  
10.         background-color: #46a6ff; font-family: 'Microsoft YaHei'; font-size: 40px; font-weight: bold">  
11.     我是div块  
12.   </div>  
13. </body>  
14. </html>  

3)设置字体水平与垂直居中

上面我们给div加了字体样式但并没有居中,现在我们来看看怎么设置字体居中

1. <!DOCTYPE html>  
2. <html>  
3. <head>  
4.   <title>HTML基础教程</title>  
5.   <meta charset="utf-8" />  
6. </head>  
7. <body>  
8.   <!-- text-align给文字设置水平居中;line-height将其值设为与height一致,文字内容就可以垂直居中   -->  
9.   <div style="width: 400px; height: 400px;  
10.         background-color: #46a6ff; font-family: 'Microsoft YaHei';  
11.         font-size: 40px; font-weight: bold;  
12.         text-align: center; line-height: 400px">  
13.     我是div块  
14.   </div>  
15. </body>  
16. </html>  

02 HTML Table

在HTML页面开发时我们经常会用到表格进行数据展示,HTML的表格是由标签<table>来定义的,每个表格均有若干行(<tr> 标签定义),每行被分割为若干单元格(由<td> 标签定义)。表格中常用的标签与样式属性如下:

下面我们创建两个表格示列,分别设置上述属性具体如下

1. <!DOCTYPE html>  
2. <html>  
3. <head>  
4.   <title>HTML基础教程</title>  
5.   <meta charset="utf-8" />  
6. </head>  
7. <body>  
8.   <!-- 表格示列1 -->  
9.   <table border="1" bordercolor="black" width="450" height="100">  
10.      <caption>表格示列1</caption>  
11.      <tr bgcolor="red" > <!-- tr为一行的起始与结束 -->  
12.        <th>Column 1</th> <!-- 表格头 -->  
13.        <th>Column 2</th>  
14.        <th>Column 3</th>  
15.      </tr>  
16.   
17.     <tr bgcolor="cyan"> <!-- 设置表格背景色 -->  
18.       <td>Data 1</td> <!-- td单元格 -->  
19.       <td>Data 2</td>  
20.       <td>Data 3</td>  
21.     </tr>  
22.   
23.     <tr bgcolor="yellow">  
24.       <td colspan="2">New Data 1</td> <!-- 设置该单元格合并这一行上的两列 -->  
25.       <td>New Data 2</td>  
26.     </tr>  
27.   </table>  
28.   
29.   <!-- 表格示列2 -->  
30.   <table border="1" bordercolor="black" width="80%" height="100"> <!-- 设置单元格宽与高为百分比 -->  
31.      <caption> 表格示列2</caption>  
32.       <tr bgcolor="red" >  
33.         <th>Column 1</th>  
34.         <th>Column 2</th>  
35.         <th>Column 3</th>  
36.      </tr>  
37.   
38.      <tr>  
39.        <td rowspan="2">Data 1</td> <!-- 设置该单元格合并这一列上的两行 -->  
40.        <td>Data 2</td>  
41.        <td>Data 3</td>  
42.      </tr>  
43.   
44.      <tr>  
45.       <td>Data 2</td>  
46.       <td>Data 3</td>  
47.      </tr>  
48.   </table>  
49. </body>  
50. </html>  

03 HTML表单

HTML 表单是一个包含表单元素的区域,用于搜集不同类型的用户输入。HTML表单在我们日常浏览网页时很常见,比如各网站的登录页面,就是典型的HTML表单应用。HTML表单常用的标签元素有如下几种:

1)Text input:字符输入框,一般账户与密码输入都是用的该标签

2)Text area:文本输入框,一般需要输入较多文本内容使用

3)Radio button:单选框

4)Checkbox:多选框

5)Select box:选择框

6)File select:文件选择框

7)Buttons:按钮

表单元素常用的属性及值设置如下表所示:

结合上表我们创建一个表单示列,按照上表的属性值进行设置,具体操作如下

1. <!DOCTYPE html>  
2. <html>  
3. <head>  
4.   <title>HTML基础教程</title>  
5.   <meta charset="utf-8" />  
6. </head>  
7. <body>  
8. <form>  
9.   <h4>Input输入框</h4>  
10.   用户名 : <input type="text" name="user_name" size="4" value="成哥" maxlength="10"><br>  
11.   密码 : <input type="password" name="user_pass" ><br>  
12.   <h4> Radio单选框:(name值设置时必须一致)</h4>  
13.     <input type="radio" name="r_gender"> Male  
14.     <input type="radio" name="r_gender"> Female  
15.     <input type="radio" name="r_gender" checked> Infant  
16.   <h4> Check box多选框 :(name值设置时必须不一样)</h4>  
17.     <input type="checkbox" name="c_male" checked> Male  
18.     <input type="checkbox" name="c_female"> Female  
19.     <input type="checkbox" name="c_infant"> Infant  
20.   <h4> Select box :选择框(单选)</h4>  
21.     <select name="s_box">  
22.       <option value="s_male">Male</option>  
23.       <option value="s_female" selected>Female</option>  
24.       <option value="s_infant">Infant</option>  
25.     </select>  
26.   <h4> Select box :择框(多选)</h4>  
27.   <!-- 选择项默认展示4个,其它的选择内容需要通过鼠标滚动 -->  
28.   <select name="s_box" size="4" multiple>  
29.     <option value="s_male" selected>Male</option>  
30.     <option value="s_female" selected>Female</option>  
31.     <option value="s_infant">Infant 1</option>  
32.     <option value="s_infant" selected>Infant 2</option>  
33.     <option value="s_infant">Infant 3</option>  
34.     <option value="s_infant">Infant 4</option>  
35.   </select>  
36.   <h4> Text文本输入框</h4>  
37.     <textarea rows="10" cols="80" name="txt_area">文本框  
38.        HTML基础教程  
39.        表单示列  
40.     </textarea>
41.   </form>
42. </body>
43. </html>

下面我们再创建一个button的表单示列,具体如下

1. <!DOCTYPE html>  
2. <html>  
3. <head>  
4.   <title>HTML基础教程</title>  
5.   <meta charset="utf-8" />  
6. </head>  
7. <body>  
8.   
9.   <!-- 设置表单提交方式为get, 跳转的url为"http://www.baidu.com" -->  
10.   <form method="get" action="http://www.baidu.com">  
11.     <h4> Buttons按钮表单示列</h4>  
12.     用户名 : <input type="text" name="user_name" size="4" value="成哥" maxlength="16"><br>  
13.     密码 : <input type="password" name="user_pass" ><br>  
14.     <!-- 点击在游览器上方显示Say Hello -->  
15.     <input type="button" onclick="alert('Hello')" name="b_alert" value="Say Hello"/><br>  
16.     <!-- 点击跳转到百度 -->  
17.     <input type="submit" name="b_submit" value="百度走起"/>  
18.     <!-- 点击重置会重置表单内输入的内容 -->  
19.     <input type="reset" name="b_reset" value="重置"/><br>  
20.   </form>  
21.   
22. </body>  
23. </html>  

04 HTML框架iframe

使用HTML框架可以在同一个浏览器窗口中显示多个页面,iframe的语法格式如下所示

1. <iframe src="URL">  
2.   <!-- URL指向不同的页面 -->  
3. </iframe>  
我们现在创建一个iframe框架使用示列具体如下
1. <!DOCTYPE html>  
2. <html>  
3. <head>  
4.   <title>HTML基础教程</title>  
5.   <meta charset="utf-8" />  
6. </head>  
7. <body>  
8.   
9.   <h4>iframe使用示列一(简单的iframe使用)</h4>  
10.   <!-- 给iframe显示区域设置宽度为800,高度为200,同时去掉其边框 -->  
11.   <iframe src="http://www.baidu.com" width="800" height="200" frameborder="0"></iframe>  
12.   
13.   <br/>  
14.   <br/>  
15.   
16.   <h4>iframe使用示列二(通过点击指定链接在iframe中显示)</h4>  
17.   <!-- a标签中的target名称必须与iframe的name一致都为qq -->  
18.   <a href="http://www.qq.com" target="qq">点击我在iframe中显示qq页面</a>  
19.   <iframe name="qq" width="800" height="200" frameborder="0"></iframe>  
20. </body>  
21. </html>  

05 总结

至此我们《HTML基础教程》就全部讲完了,有任何问题都可以在文章后面留言。最后如果喜欢本篇文章不要忘了点赞、关注与转发哦!

-END-

@IT管理局专注计算机领域技术、大学生活、学习方法、求职招聘、职业规划、职场感悟等类型的原创内容。期待与你相遇,和你一同成长。

文章推荐:

  • 程序员都必掌握的前端教程之HTML基础教程(上)