Material UI Slider自定义标记:nth-child(odd/even)失效原因咨询
Material UI Slider标记nth-child(odd/even)失效原因分析
核心问题:DOM结构的特殊性
Material UI的Slider组件渲染后,标记元素(.MuiSlider-mark)和标记标签(.MuiSlider-markLabel)是交替作为兄弟元素排列的,简化后的DOM结构如下:
<div class="MuiSlider-root"> <span class="MuiSlider-mark"></span> <!-- 数组索引0的标记 --> <span class="MuiSlider-markLabel"></span> <!-- 对应索引0的标签 --> <span class="MuiSlider-mark"></span> <!-- 数组索引1的标记 --> <span class="MuiSlider-markLabel"></span> <!-- 对应索引1的标签 --> <!-- ... 以此循环所有标记和标签 --> </div>
你想区分的是数组中奇偶索引的标记,但这些标记在父容器里的位置全是奇数位(第1、3、5...个元素),标签则占据偶数位。这就导致:
&:nth-child(odd)/&:nth-child(2n+1)会选中所有标记元素(因为它们本来就都在奇数位置),自然看不到区分效果;&:nth-child(even)根本选不到任何标记,因为没有标记处于偶数位置。
为什么你测试的选择器有效?
&:nth-child(n)是匹配父容器中所有子元素,所以能选中所有标记,样式生效;&:nth-child(4n+1)匹配第1、5、9...位的元素,这些位置刚好对应数组索引0、2、4...的标记,所以能看到部分标记样式变化,生效。
正确的实现方式
如果要按数组中标记的奇偶索引区分样式,有两种思路:
按父容器位置规律写选择器:
- 数组偶数索引的标记 → 父容器
nth-child(4n+1)(位置1、5、9...) - 数组奇数索引的标记 → 父容器
nth-child(4n+3)(位置3、7、11...)
- 数组偶数索引的标记 → 父容器
使用
:nth-of-type()选择器(更直观,因为它按同类型元素计数):
同类型元素中,标记元素会按1、2、3...排序,对应数组的0、1、2...索引,所以:- 数组偶数索引标记 →
&:nth-of-type(odd) - 数组奇数索引标记 →
&:nth-of-type(even)
- 数组偶数索引标记 →
修改后的代码示例:
const marks = []; for (let v = 0; v < 11; v++) { marks.push({ value: v * 10, label: (v * 10).toString() }); } const MSlider8 = () => { return ( <Slider marks={marks} sx={{ "& .MuiSlider-mark": { backgroundColor: "green", height: 30, width: 2, top: 34, // 数组偶数索引的标记(对应同类型第1、3、5...个) "&:nth-of-type(odd)": { backgroundColor: "red", top: -4, }, // 数组奇数索引的标记(对应同类型第2、4、6...个) "&:nth-of-type(even)": { backgroundColor: "blue", }, }, "& .MuiSlider-markLabel": { top: 54, color: "purple", // 对应偶数索引标记的标签 "&:nth-of-type(odd)": { color: "red", top: -38, }, }, }} /> ); };
内容的提问来源于stack exchange,提问作者Ramesh B
相关产品推荐
相关产品推荐

