不可点击但可悬停的伪元素
not clickable but hoverable pseudo elements
我正在使用 CSS 构建星级元素。
我制作了一组可点击的单选按钮作为粉红色元素。当我点击这些元素时,它们之后的所有元素都变成灰色,而它们之前的所有元素都变成粉红色。
我想在它们上面设置悬停,所以我将悬停时所有的粉红色设置为灰色。
问题是,当我将鼠标悬停在灰色之间时,它们已经是灰色,所以没有任何变化。
我正在尝试的解决方案是在我的单选按钮顶部设置五个伪元素,这样我就可以在悬停时将它们设置为粉红色。这些伪元素不应该是可点击的,所以不应该从灰色变为粉红色。
问题是我无法点击上面的伪元素。
如果我为伪元素指针事件提供所有 divs:none,将不会有悬停。
如果我设置一个 div 来包裹这些伪元素的 divs,它们会悬停但仍然无法点击。
有办法实现吗?也许有更好的方法?
代码如下:
* {
padding: 0;
margin: 0;
}
.div {
display: flex;
flex-direction: row;
background: orchid;
width: 500px;
height: 200px;
}
.holder-wrapper {
top: 0;
left: 0;
position: absolute;
font-size: 100px;
color: lightpink;
display: flex;
flex-direction: row;
width: 500px;
height: 200px;
}
input {
appearance: none;
font-size: 100px;
color: lightpink;
}
input::before {
position: relative;
content: '02';
}
.holder::before {
content: '01';
}
input:checked ~ ::before {
color: #333;
}
.holder:hover ~ ::before {
color: #333;
}
<div class="div">
<input type="radio" data-rate="1" name="rating" class="rating--star" checked/>
<input type="radio" data-rate="2" name="rating" class="rating--star" />
<input type="radio" data-rate="3" name="rating" class="rating--star" />
<input type="radio" data-rate="4" name="rating" class="rating--star" />
<input type="radio" data-rate="5" name="rating" class="rating--star" />
<div class="holder-wrapper">
<div class="holder"></div>
<div class="holder"></div>
<div class="holder"></div>
<div class="holder"></div>
<div class="holder"></div>
</div>
</div>
codepen => enter link description here
我不明白 jquery 所以如果你想 jquery 请解释一下你在做什么 c:
实际上问题是您尝试使用 css 来实现此目的,这就是您遇到此问题的原因,您应该使用 javascript 或 jquery 来完成此操作,悬停时您应该添加 css 在 rollout 上的元素上,然后如果用户单击则删除,然后应该保留悬停事件。这可以解决您的问题
* {
padding: 0;
margin: 0;
}
.div {
display: flex;
flex-direction: row;
background: orchid;
width: 500px;
height: 200px;
opacity: 1;
}
input {
appearance: none;
font-size: 100px;
color: black;
}
input::before {
position: relative;
content: "02";
color: black;
opacity:1;
transition: opacity 0.3s ease-in-out;
}
input:focus{
outline:none;
}
input:checked ~ ::before {
opacity:0.3
}
input:hover ~ ::before {
opacity:0.2
}
<input type="radio" data-rate="1" name="rating" class="rating--star" checked />
<input type="radio" data-rate="2" name="rating" class="rating--star" />
<input type="radio" data-rate="3" name="rating" class="rating--star" />
<input type="radio" data-rate="4" name="rating" class="rating--star" />
<input type="radio" data-rate="5" name="rating" class="rating--star" />
</div>
我找到了一个方法。我通过删除 holder 元素并使用不透明度值来响应悬停 (0.2) 和单击 (0.3) 来进行简化。
奇怪的是 ':checked' pseudo-selector 实际上影响了鼠标右边的元素。所以我使用它。
我打算尝试 JS 方法,但访问伪元素是一场噩梦!
我正在使用 CSS 构建星级元素。 我制作了一组可点击的单选按钮作为粉红色元素。当我点击这些元素时,它们之后的所有元素都变成灰色,而它们之前的所有元素都变成粉红色。
我想在它们上面设置悬停,所以我将悬停时所有的粉红色设置为灰色。
问题是,当我将鼠标悬停在灰色之间时,它们已经是灰色,所以没有任何变化。
我正在尝试的解决方案是在我的单选按钮顶部设置五个伪元素,这样我就可以在悬停时将它们设置为粉红色。这些伪元素不应该是可点击的,所以不应该从灰色变为粉红色。
问题是我无法点击上面的伪元素。
如果我为伪元素指针事件提供所有 divs:none,将不会有悬停。 如果我设置一个 div 来包裹这些伪元素的 divs,它们会悬停但仍然无法点击。
有办法实现吗?也许有更好的方法?
代码如下:
* {
padding: 0;
margin: 0;
}
.div {
display: flex;
flex-direction: row;
background: orchid;
width: 500px;
height: 200px;
}
.holder-wrapper {
top: 0;
left: 0;
position: absolute;
font-size: 100px;
color: lightpink;
display: flex;
flex-direction: row;
width: 500px;
height: 200px;
}
input {
appearance: none;
font-size: 100px;
color: lightpink;
}
input::before {
position: relative;
content: '02';
}
.holder::before {
content: '01';
}
input:checked ~ ::before {
color: #333;
}
.holder:hover ~ ::before {
color: #333;
}
<div class="div">
<input type="radio" data-rate="1" name="rating" class="rating--star" checked/>
<input type="radio" data-rate="2" name="rating" class="rating--star" />
<input type="radio" data-rate="3" name="rating" class="rating--star" />
<input type="radio" data-rate="4" name="rating" class="rating--star" />
<input type="radio" data-rate="5" name="rating" class="rating--star" />
<div class="holder-wrapper">
<div class="holder"></div>
<div class="holder"></div>
<div class="holder"></div>
<div class="holder"></div>
<div class="holder"></div>
</div>
</div>
codepen => enter link description here
我不明白 jquery 所以如果你想 jquery 请解释一下你在做什么 c:
实际上问题是您尝试使用 css 来实现此目的,这就是您遇到此问题的原因,您应该使用 javascript 或 jquery 来完成此操作,悬停时您应该添加 css 在 rollout 上的元素上,然后如果用户单击则删除,然后应该保留悬停事件。这可以解决您的问题
* {
padding: 0;
margin: 0;
}
.div {
display: flex;
flex-direction: row;
background: orchid;
width: 500px;
height: 200px;
opacity: 1;
}
input {
appearance: none;
font-size: 100px;
color: black;
}
input::before {
position: relative;
content: "02";
color: black;
opacity:1;
transition: opacity 0.3s ease-in-out;
}
input:focus{
outline:none;
}
input:checked ~ ::before {
opacity:0.3
}
input:hover ~ ::before {
opacity:0.2
}
<input type="radio" data-rate="1" name="rating" class="rating--star" checked />
<input type="radio" data-rate="2" name="rating" class="rating--star" />
<input type="radio" data-rate="3" name="rating" class="rating--star" />
<input type="radio" data-rate="4" name="rating" class="rating--star" />
<input type="radio" data-rate="5" name="rating" class="rating--star" />
</div>
我找到了一个方法。我通过删除 holder 元素并使用不透明度值来响应悬停 (0.2) 和单击 (0.3) 来进行简化。 奇怪的是 ':checked' pseudo-selector 实际上影响了鼠标右边的元素。所以我使用它。
我打算尝试 JS 方法,但访问伪元素是一场噩梦!