可点击的fa-heart-o fontawsome无法正常工作

时间:2019-03-25 17:15:38

标签: javascript css html5

以下代码创建了一个没有填充的心脏,必须通过用户单击来填充,但这对我不起作用:

<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<style>
.fa {
  font-size: 50px;
  cursor: pointer;
  user-select:none ;
}

.fa:hover {
  color: darkblue;
}
</style>
</head>
<body>

<p>Click on the icon to toggle between heart </p>

<i onclick="myFunction(this)" class="fa fa-heart-o"></i>

<script>
function myFunction(x) {
  x.classList.toggle("fa-heart");
}
</script>

</body>
</html>

但是如果更改

<i onclick="myFunction(this)" class="fa fa-heart-o"></i>
...
x.classList.toggle("fa-heart");

对此

<i onclick="myFunction(this)" class="fa fa-heart"></i>
...
x.classList.toggle("fa-heart-o");

有效。 我想先显示fa-heart-o,然后在用户单击它后填充并更改为fa-heart

1 个答案:

答案 0 :(得分:1)

ClassList toggling实际上仅打算在使用单个类时使用。切换时,如果指定的类存在,则将其删除,否则将添加。当前,您的元素将始终具有fa-heart-o类,并且您正在尝试添加fa-heart类来覆盖它。

在FontAwesome中,fa-heart-o类是在fa-heart类之后定义的。因此fa-heart-o将始终覆盖fa-heart,因为否则它们具有相同的特异性。有关更多信息,请参见MDN article

在您的情况下,您无需删除一个类,而是添加一个类,而不是切换一个类。

您的脚本可能如下所示:

function myFunction(x) {
    if ( x.classList.contains( "fa-heart") ) {
        x.classList.remove( "fa-heart" );
        x.classList.add( "fa-heart-o" );
    }
    else {
        x.classList.remove( "fa-heart-o" );
        x.classList.add( "fa-heart" );
    }
}