应使用语义化HTML结构:用<article>包裹单个房源,<section>包裹整体区域,<h2>作标题,<dl><dt><dd>表达属性,图片带具体alt;CSS Grid布局配合minmax()实现响应式;图片启用loading="lazy"和srcset/WebP优化。
房源展示页本质是「列表型内容聚合」,不是视觉堆砌。直接写 <div class="card"> 容易后期维护混乱,也影响 SEO 和可访问性。应该用 <article> 包裹单个房源,用 <section> 包裹整个房源区域,标题用 <h2>(非 <h1>,页面主标题应唯一),价格、户型等关键信息用 <dl><dt><dd> 组合表达属性关系。
常见错误:把所有房源塞进一个大 <div> 里,后续加筛选或分页时 DOM 操作困难;或者滥用 <table> 布局,导致响应式断裂、屏幕阅读器识别异常。
<article>,带 id 或 data-id 便于 JS 操作<dt> + <dd>,别写成一堆 <p>
alt,例如 alt="上海浦东新区两居室主卧实拍",不能留空或写“图片”用 float 或 inline-block 做多列房源,在小屏断点下容易错行或留白失控。CSS Grid 是目前最稳的方案,尤其配合 minmax() 和 auto-fit 可以自动适配列数。
典型问题:在 iPad 上显示 3 列,手机上强行缩成 2 列导致文字挤在一起;或用了 flex-wrap 但没设 flex-basis,卡片宽度不一致。
立即学习“前端免费学习笔记(深入)”;
display: grid,推荐写法:grid-template-columns: repeat(auto-fit, minmax(300px, 1fr))
align-items: start 防止底部对齐拉伸@media (max-width: 480px) 覆盖为 grid-template-columns: 1fr,确保单列阅读流房源图体积大,首屏加载慢直接影响跳出率。单纯靠 JS 懒加载有竞态风险(比如用户滚动太快,图片还没注册监听就划过去了)。现代浏览器原生支持 loading="lazy",必须直接写在 <img> 标签里。
容易被忽略的是:没有 <picture> + <source> 适配 WebP,也没提供 <img> 的 srcset,导致高分辨率屏加载模糊图,或低配机强解高清 JPG 卡顿。
<img src="room-1.jpg" srcset="room-1.webp 1x, [email protected] 2x" type="image/webp" loading="lazy" alt="..."><picture> 内部嵌套 <source> + <img> 作降级background-image 加懒加载,它无法被搜索引擎索引,也不支持 alt
有人习惯用 JS 拼字符串生成房源卡片,例如 html += `<div class="price">¥${item.price}</div>`,这会导致 XSS 风险(价格字段若含 <script> 就执行了)、难以调试、无法服务端渲染(SSR)。
更隐蔽的问题是:用 style="width: ${w}px" 这类内联样式,后期改主题色或间距时要全局搜索替换,且无法用 CSS 变量统一控制。
class="price--highlight",而非 style="color: #e63946"
textContent 赋值,禁用 innerHTML
<article> 是否包裹完整、loading="lazy" 是否存在、alt 是否描述具体场景。