React map渲染列表时CSS nth-child选择器不生效问题求助
异常原因分析
nth-child选择器的匹配规则是:选中「满足当前选择器、且在自身所属的同级兄弟元素中排序符合指定序号规则」的元素,你的四次尝试全部是对选择器的匹配范围理解有误导致的:
- 尝试1、2、3的选择器
.tableBody:nth-child(xxx),匹配的是作为父元素的第xxx个子元素的.tableBody容器本身,而不是容器内的行。
你的页面中.tableBody容器在它自己的父元素内只有一个,序号固定:如果序号是奇数,尝试1会命中整个容器,尝试2匹配不到;如果序号是偶数,尝试2、3会命中整个容器。你看到的所有条目统一变色,本质是容器的背景色透出来的效果,没有命中行元素。 - 尝试4的选择器
.tableBody :nth-child(odd)(注意中间的空格是后代选择器),匹配的是.tableBody内所有后代元素里,在自身同级兄弟中排序为奇数的元素。所以不仅.tableBody的直接子元素(行)的奇数项会被命中,每个行内的.value元素的奇数项(第1、3、5个单元格)也会被命中,就出现了单元格也变色的问题。
正确实现方案
需要精准选中.tableBody下的直接子行元素,再匹配序号:
/* 写法1:更稳妥,限定只选中行元素,不会误伤其他直接子元素 */ .tableBody > .tableRow:nth-child(odd) { background-color: var(--primary-red); } /* 写法2:如果保证.tableBody下只有行元素可以用 */ .tableBody > :nth-child(odd) { background-color: var(--primary-red); }
注意:
nth-child是按实际渲染的DOM节点顺序计算序号,你代码中是先过滤数组再渲染,行元素在DOM中是连续同级的,不需要额外处理过滤带来的索引问题。
内容的提问来源于stack exchange,提问作者Tanishq Vyas
相关产品推荐
相关产品推荐

