css 新手最容易写错的选择器有哪些_避免混用 id 与 class

发布时间 - 2026-01-13 00:00:00    点击率:
class 和 id 选择器必须严格对应:. 对应 class 属性,# 对应 id 属性;多 class 元素 CSS 中需连写无空格(如 .a.b);id 仅用于 JS 或锚点,样式应统一用 class。

class 和 id 选择器写反了,浏览器不会报错但样式不生效

这是新手最常踩的坑:把 class="header" 写成 id="header",却在 CSS 里用 .header 去选;或者反过来,HTML 用了 class="btn-primary",CSS 却写成 #btn-primary。浏览器完全不报错,只是默默忽略匹配失败的选择器。

关键判断点:. 开头一定对应 class 属性,# 开头一定对应 id 属性,二者不能交叉使用。

  • 检查 HTML 中的属性名是 class 还是 id
  • 检查 CSS 选择器开头是 . 还是 #
  • 用浏览器开发者工具(F12)看元素是否被该 CSS 规则“击中”——没被列在“Styles”面板里,大概率就是选错了

误以为 class 可以用 # 选,或 id 可以用 . 选

有人觉得“反正都唯一”,就用 #my-class 去选 class="my-class",或者用 .my-id 去选 id="my-id"。这是无效的——CSS 选择器语法严格区分语义:# 只认 id 属性值,. 只认 class 属性值,和内容是否重复、是否唯一无关。

哪怕你只用了一次 class="logo",也必须写成 .logo;哪怕你给某个元素加了 id="wrapper",也不能靠 .wrapper 拿到它。

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

  • #logo → 只匹配 id="logo"
  • .logo → 只匹配 class="logo"(可多个元素)
  • [id="logo"][class="logo"] 是属性选择器,能绕过语法限制,但没必要,且性能略差

混淆 class 多值写法与空格分隔的后代选择器

HTML 中 class="btn btn-primary disabled" 是合法的,但新手常误写成 CSS 里的 .btn .btn-primary .disabled(带空格),结果变成“找 .btn 里面的 .btn-primary 里面的 .disabled”,而不是“同时有这三个 class 的元素”。

要选同时具备多个 class 的元素,必须连写无空格:.btn.btn-primary.disabled

.btn.btn-primary.disabled {
  opacity: 0.6;
  cursor: not-allowed;
}
  • 空格 = 后代选择器(层级关系)
  • 紧挨着的点 = 同时满足多个 class(逻辑与)
  • 多 class 元素在 HTML 中用空格分隔,在 CSS 中用连续点连接

用 id 当作样式钩子,导致难以复用和维护

虽然 #nav-bar 能生效,但 id 在页面中必须唯一,且优先级远高于 class(#id 的 specificity 是 100,.class 是 10),容易引发样式覆盖冲突。新手常为每个按钮、标题都配一个 id,结果后期改一个样式要满页找 id 修改。

正确做法:id 仅用于 JS 锚点、getElementById 或 ARIA 关联(如 aria-labelledby),纯样式一律用 class。

  • 需要复用?→ 用 class
  • 需要 JS 精准控制单个元素?→ 用 id,但别在 CSS 里依赖它做样式
  • 想提高 specificity?用多个 class(如 .btn.btn--large.btn--primary),别靠 #

真正难的不是记住 .# 的区别,而是习惯性地把语义和用途分开:id 是“这个东西叫什么名字”,class 是“这个东西属于哪一类”。混用一次不报错,混用十次就难定位。


# css  # html  # js  # go  # 浏览器  # app  # 工具  # 区别  # 属性选择器  # class 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在宝塔面板创建新站点?  如何实现建站之星域名转发设置?  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  Python自动化办公教程_ExcelWordPDF批量处理案例  网站制作价目表怎么做,珍爱网婚介费用多少?  音乐网站服务器如何优化API响应速度?  如何快速搭建虚拟主机网站?新手必看指南  韩国服务器如何优化跨境访问实现高效连接?  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  LinuxCD持续部署教程_自动发布与回滚机制  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  Linux系统命令中screen命令详解  Laravel如何配置Horizon来管理队列?(安装和使用)  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  详解Oracle修改字段类型方法总结  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Windows Hello人脸识别突然无法使用  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  如何快速生成高效建站系统源代码?  在线教育网站制作平台,山西立德教育官网?  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  简历在线制作网站免费版,如何创建个人简历?  大同网页,大同瑞慈医院官网?  Laravel如何实现模型的全局作用域?(Global Scope示例)  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  JavaScript如何操作视频_媒体API怎么控制播放  JavaScript如何实现类型判断_typeof和instanceof有什么区别  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  JavaScript模板引擎Template.js使用详解  nginx修改上传文件大小限制的方法  Laravel如何处理文件下载请求?(Response示例)  如何快速查询网站的真实建站时间?  详解Huffman编码算法之Java实现  Python文件流缓冲机制_IO性能解析【教程】  🚀拖拽式CMS建站能否实现高效与个性化并存?  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  智能起名网站制作软件有哪些,制作logo的软件?  如何在Windows虚拟主机上快速搭建网站?