背景

在做一个刷题小程序时,需要实现一个答题卡界面——用网格展示所有题目状态(未答/已答/当前题),支持点击跳转。在 Web 上几行 CSS 搞定,在小程序里却踩了不少坑。

问题一:gap 属性在小程序里不生效

这是最常见的问题。CSS gap 属性用于设置网格/弹性盒子的间距,在主流浏览器都支持,但在微信小程序、支付宝小程序里均不支持。解决方案:

/* ❌ 小程序不支持 */
.grid { display: grid; gap: 16px; }

/* ✅ 改用 margin 模拟 */
.grid { display: grid; }
.grid-item { margin-right: 16px; margin-bottom: 16px; }
/* 最后一项去掉右边距 */
.grid-item:last-child { margin-right: 0; }

问题二:display: grid 在某些机型的兼容情况

iOS 微信大部分版本支持 grid,但 Android 端部分机型(尤其是低端机)的 UC/QQ 浏览器内核不支持。推荐降级方案:用 flex + 百分比宽度实现网格。

/* ✅ 兼容写法:flex 模拟网格 */
.row { display: flex; flex-wrap: wrap; }
.cell { width: 48px; height: 48px; margin: 0 4px 8px 0; }

问题三::nth-child 在某些场景下失效

nth-child 在动态列表(数据来自接口)时表现正常,但在用 v-for 遍历固定数量的数字时,微信开发者工具和部分真机行为不一致。解决方案是改用 v-if 或加辅助 class。

实战答题卡组件代码

const AnswerCard = ({ questions, currentIndex, onJump }) => {
  return (
    <View className='answer-card'>
      <View className='row'>
        {questions.map((q, i) => (
          <View
            key={q.id}
            className={`cell ${i === currentIndex ? 'current' : ''} ${q.answered ? 'done' : 'undone'}`}
            onClick={() => onJump(i)}
          >
            {i + 1}
          </View>
        ))}
      </View>
    </View>
  )
}

小结

小程序开发的本质是与 CSS 兼容层打交道。遇到 display、gap、nth-child 等属性,先查 caniuse,再想降级方案。开发阶段多用真机调试,开发者工具的结果不一定准确。

来源:https://www.dnote.cn

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注