Переключение между значками Font-Awesome при наведении курсора - PullRequest
0 голосов
/ 05 августа 2020

Я пытался найти разные решения, но ни одно из них не работает для моего проекта.

Самое дальнее, что у меня было, было с этим;

function onBackButtonHover() {
    const backButton = document.getElementById("page-controls").querySelector(".fas");

    $(backButton).removeClass();
    $(backButton).addClass("fas fa-arrow-left");

    $(backButton).mouseout(function(){
        console.log("Hello.");
    });
}
page-controls .navbar-brand {
    background-color: #54aaff;
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 56px;
    padding: 0;
    margin: 0;
    text-align: center;
    color: #fff;
    transition: transform .25s ease-in-out;
}
#page-controls .navbar-brand:focus, #page-controls .navbar-brand:hover {
    color: #fff;
    transform: scale(.85);
}
#page-controls .navbar-brand .fas {
    font-size: 32px;
    margin: 12px auto;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link href="//dfzlwjdb9r0y9.cloudfront.net/fa/css/all.css" rel="stylesheet">


<a id="backButton intranet" class="navbar-brand" href="/dashboard" onmouseover="onBackButtonHover()">
    <i class="fas fa-user-lock"></i>
</a>

Но проблема здесь в том, что я не знаю, как вернуть значок в нормальное состояние после его изменения без использования stati c класс. Я бы хотел избежать использования класса stati c, потому что один и тот же сценарий будет работать на страницах с разными значками, поэтому классы будут отличаться от страницы к странице.

Другая проблема, похоже, заключается в том, что сценарий запускается несколько раз во время одного наведения мыши, как показывает console.log.

Моя цель - просто изменить текущий значок на fa-arrow-left при наведении курсора мыши и переключить его обратно на исходный значок, как только это будет сделано .

Решение также должно охватывать мобильных пользователей, поэтому ему также придется регистрировать сенсорный ввод - как мне подойти к этому?

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Если я правильно понял, это довольно просто

$('document').ready(function() {
  
  $('#backButton').on( "mouseover", function() {
    $('#backButton > i').removeClass('fa-user-lock').addClass('fa-arrow-left');
  });
  
  $('#backButton').on( "mouseout", function() {
    $('#backButton > i').removeClass('fa-arrow-left').addClass('fa-user-lock');
  });
  
});
<script   src="https://code.jquery.com/jquery-3.5.1.min.js"   integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0="   crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.14.0/css/all.min.css" integrity="sha512-1PKOgIY59xJ8Co8+NE6FZ+LOAZKjy+KY8iq0G4B3CyeY6wYHN3yt9PW0XpSriVlkMXe40PTKnXrLnZ9+fkDaog==" crossorigin="anonymous" />

<a id="backButton" class="navbar-brand" href="/dashboard">
    <i class="fas fa-user-lock"></i>
</a>

Теперь вторая часть вашего вопроса - как не жестко кодировать имена классов? Ну, очевидно, вам нужно сделать что-то вроде этого - прочитать класс активного элемента, запомнить его и использовать при выводе мыши ... Примерно так ... (я меняю backButton ID на класс, чтобы показать пример нескольких значков)

$('document').ready(function() {
  // Remember active class
  let tmpClass;
  
  // On mouse over
  $('.backButton').on( "mouseover", function() {
    // get current class
    tmpClass = $(this).children('i').attr('class').split(/\s+/);
    // Swap
    $(this).children('i').removeClass(tmpClass[1]).addClass('fa-arrow-left');
  });
  
  // On mouse out
  $('.backButton').on( "mouseout", function() {
    $(this).children('i').removeClass('fa-arrow-left').addClass(tmpClass[1]);
  });
  
});
<script   src="https://code.jquery.com/jquery-3.5.1.min.js"   integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0="   crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.14.0/css/all.min.css" integrity="sha512-1PKOgIY59xJ8Co8+NE6FZ+LOAZKjy+KY8iq0G4B3CyeY6wYHN3yt9PW0XpSriVlkMXe40PTKnXrLnZ9+fkDaog==" crossorigin="anonymous" />

<a class="navbar-brand backButton" href="/dashboard">
    <i class="fas fa-user-lock"></i>
</a>
<a class="navbar-brand backButton" href="/dashboard">
    <i class="fas fa-bomb"></i>
</a>
<a class="navbar-brand backButton" href="/dashboard">
    <i class="fas fa-bell-slash"></i>
</a>
0 голосов
/ 05 августа 2020

Вы можете попробовать это, чтобы вы могли вызывать одни и те же функции для разных компонентов с одинаковой функциональностью.

function onBackButtonHover(e) {
    var i = $(e).find('i.fas')
  $(i).removeClass($(i).attr("default")).addClass($(i).attr("hover"))
}

function onBackButtonOut(e) {
    var i = $(e).find('i.fas')
  $(i).removeClass($(i).attr("hover")).addClass($(i).attr("default"))
}
<script   src="https://code.jquery.com/jquery-3.5.1.min.js"   integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0="   crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.14.0/css/all.min.css" integrity="sha512-1PKOgIY59xJ8Co8+NE6FZ+LOAZKjy+KY8iq0G4B3CyeY6wYHN3yt9PW0XpSriVlkMXe40PTKnXrLnZ9+fkDaog==" crossorigin="anonymous" />

<a id="backButton intranet" class="navbar-brand" href="/dashboard" onmouseover="onBackButtonHover(this)" onmouseout="onBackButtonOut(this)">
    <i class="fas fa-user-lock" default="fa-user-lock" hover="fa-arrow-left"></i>
</a>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...