0

0

css项目实战_搭建一个基本的FAQ问答页面

P粉602998670

P粉602998670

发布时间:2026-01-10 13:18:52

|

781人浏览过

|

来源于php中文网

原创

FAQ 页面可用纯 CSS 实现展开收起交互,核心是使用原生 + 标签,它语义清晰、可访问性强、无需 JavaScript,但不支持 IE;通过 ::marker 和 ::-webkit-details-marker 重置默认箭头,用 ::before 添加 ± 符号,结合 border-bottom 和负边距控制紧凑间距,移动端需扩大热区并适配可读性与操作性。

css项目实战_搭建一个基本的faq问答页面

FAQ 页面的核心不是堆砌样式,而是让问题可折叠、答案能显隐、交互不卡顿、语义结构清晰——用纯 CSS 实现基础交互是可行的,但必须依赖

+ ,否则就得引入 JS。

为什么不用 JavaScript 也能做展开收起

现代浏览器(Chrome 12+、Firefox 49+、Safari 6.1+、Edge 79+)原生支持

元素,它自带展开/收起状态和默认箭头,且天然可访问(支持键盘 Enter / Space 切换)。这是目前唯一无需 JS 即可实现语义化 FAQ 交互的 HTML 方案。

  • 默认收起,加 open 属性可默认展开
  • 必须是
    的第一个子元素,点击即触发切换
  • 所有内容(除 外)自动被包裹在展开区域中,无需额外容器
  • 不支持 IE,若需兼容 IE11 及更早版本,此方案不可用

如何用 CSS 覆盖默认箭头并控制样式

浏览器对

的默认三角箭头是伪元素 ::marker::-webkit-details-marker 渲染的,不同内核写法不同。要统一控制,得分别重置,并用自定义图标替代。

summary {
  list-style: none;
  padding: 12px 24px 12px 40px;
  position: relative;
  cursor: pointer;
}

summary::marker {
  content: "";
}

summary::-webkit-details-marker {
  display: none;
}

summary::before {
  content: "+";
  position: absolute;
  left: 16px;
  top: 50%;
  transform: translateY(-50%);
  font-weight: bold;
  transition: transform 0.2s;
}

details[open] > summary::before {
  content: "−";
}

details[open] > summary::before {
  transform: translateY(-50%) rotate(0);
}
  • list-style: none 是清除 Firefox 下的默认圆点或符号的前提
  • ::marker 在 Chrome/Firefox 中生效,::-webkit-details-marker 专用于 Safari/旧版 Chrome
  • ::before 插入 ± 符号比用字体图标更轻量,且无加载风险
  • 动画仅作用于 transform,避免触发布局重排(left / width 变更会引发重排)

怎么让多个 FAQ 条目垂直紧凑又留有呼吸感

直接给

margin-bottom 容易在展开时造成相邻条目跳动(因高度突变),更稳妥的方式是用 border-bottom 分隔 + 内部 padding 控制间距。

立即学习前端免费学习笔记(深入)”;

Morph Studio
Morph Studio

Morph Studio是一款领先的文字转视频AI平台,可以将用户输入的文字转化为精美视频。

下载
details {
  border-bottom: 1px solid #eee;
}

details:last-child {
  border-bottom: none;
}

details > summary {
  padding: 16px 24px 16px 48px;
}

details > *:not(summary) {
  padding: 0 24px 24px;
  margin-top: -1px;
}
  • margin-top: -1px 是为了抵消 border-bottom 带来的视觉缝隙,让内容紧贴上一条的底边
  • 所有非 子元素(即答案区域)统一设 padding,避免漏掉多段

    • 不依赖 margin 控制条目间距,可防止展开时页面抖动
    • 若需悬停高亮,建议只作用于 summary,而非整个 details,否则展开后鼠标移入答案区会意外触发 hover

    响应式下怎么让 FAQ 更易操作

    小屏设备手指点击精度低,需要扩大点击热区;同时默认箭头太小,必须放大或改用更明显的图标。另外,避免在移动端出现横向滚动。

    • summarypadding-left 提高到 60px 左右,确保图标与文字之间有足够缓冲
    • @media (max-width: 768px) 单独增大 ::before 字体尺寸(如 font-size: 20px
    • 答案区域的 padding 在移动端建议不小于 16px,防止文字贴边
    • 禁用 user-select: none —— 否则用户无法在答案中长按复制文本
    • 如果答案含代码块或表格,务必加 overflow-x: automax-width: 100% 防止溢出

    真正难的不是让 FAQ 动起来,而是让每个

    在屏幕阅读器里正确播报“已展开/已折叠”,以及确保焦点顺序不跳脱。这些靠 CSS 做不了,得靠 HTML 结构本身是否合规 —— 所以别删 ,也别用 div 模拟它。

    相关专题

    更多
    js获取数组长度的方法
    js获取数组长度的方法

    在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

    551

    2023.06.20

    js刷新当前页面
    js刷新当前页面

    js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

    374

    2023.07.04

    js四舍五入
    js四舍五入

    js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

    730

    2023.07.04

    js删除节点的方法
    js删除节点的方法

    js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

    475

    2023.09.01

    JavaScript转义字符
    JavaScript转义字符

    JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

    394

    2023.09.04

    js生成随机数的方法
    js生成随机数的方法

    js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

    990

    2023.09.04

    如何启用JavaScript
    如何启用JavaScript

    JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

    656

    2023.09.12

    Js中Symbol类详解
    Js中Symbol类详解

    javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

    551

    2023.09.20

    c++主流开发框架汇总
    c++主流开发框架汇总

    本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

    25

    2026.01.09

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    Sass 教程
    Sass 教程

    共14课时 | 0.7万人学习

    Bootstrap 5教程
    Bootstrap 5教程

    共46课时 | 2.8万人学习

    CSS教程
    CSS教程

    共754课时 | 18.4万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号