新しいFontAwesome SVGフレームワークを使用しながら、Javascriptでアイコンを切り替えることができるようにしたいと考えています。
以前の古いWebFontメソッドでは、タグのクラスを切り替えたり変更したりすることでこれを実現していましたが、これらはソースコードでSVGとしてレンダリングされるため、機能しなくなりました。
ソースコードでSVGアイコンの両方をレンダリングする必要なく、追加のクラス/ CSSを使用して表示を切り替えることなくこれを行う方法はありますか?
Font Awesome 5.0.0がリリースされたばかりで、4.7から5.0への移行によりjavascript/jqueryが破壊され、ユーザーがクリックすると「fa-star-o」アイコンが「fa-star」に変わりました。
私はそれを修正することができたので、次の2つのヒントを共有したいと思いました。
HTMLのアイコン:
<i class="foo fas fa-star"></i>
1)jQueryでアイコンを変更(「星」から「目覚まし時計」、およびその逆):
var icon = $('.foo');
var icon_fa_icon = icon.attr('data-icon');
if (icon_fa_icon === "alarm-clock") {
icon.attr('data-icon', 'star');
} else {
icon.attr('data-icon', 'alarm-clock');
}
2)jQueryでアイコンスタイルを変更(「fas」から「far」に変更):
var icon = $('.foo');
var icon_fa_prefix = icon.attr('data-prefix');
if (icon_fa_prefix === 'fas') {
icon.attr('data-prefix', 'far');
} else {
icon.attr('data-prefix', 'fas');
}
同じ問題を抱えている人に役立つことを願っています。
FA 5.0.2で検証済み
Font-AwesomeのWebサイトにある元のドキュメントを変更しました here 。彼らのウェブサイトのセレクターは適切な要素を選択していなかったので、属性を変更する必要があります。
[〜#〜] html [〜#〜]
<div class='icon'><i class='far fa-minus-square'></i></div>
Divのクラスは、変更できるほど重要ではありません。 JavaScriptを見て、この要素を使用してsvgを見つけています。具体的には、data-icon属性を探しています。データ属性がわかれば、クリックするたびに変更できます。
したがって、この場合、マイナス二乗から始まります。アイコンがマイナスの正方形の場合、プラスの正方形に変わります。プラスの正方形ではない場合、マイナスの正方形に変更します。
JQuery
document.addEventListener('DOMContentLoaded', function () {
$('.icon').on('click', function () {
if ($(this).find('svg').attr('data-icon') == 'minus-square' ) {
$(this).find('svg').attr('data-icon', 'plus-square');
} else {
$(this).find('svg').attr('data-icon', 'minus-square');
};
});
});
fontawesome.jsシートで推奨される方法を使用していると仮定すると、これは 公式ドキュメント で見つかりました:
クラスを変更してアイコンを変更する:
<button>Open up <i class="fa fa-angle-right"></i></button>
<script>
document.addEventListener('DOMContentLoaded', function () {
$('button').on('click', function () {
$(this)
.find('[data-fa-i2svg]')
.toggleClass('fa-angle-down')
.toggleClass('fa-angle-right');
});
});
</script>
私も同じ問題を抱えていて、(最後まで右にスクロールした後) FontAwesome website には次のように書かれていることがわかりました:
Nest
<svg>
タグを置き換える代わりに
<i>
タグの置換が必要なように機能しない場合があります。Font Awesomeを構成して、タグ内にネストすることができます。
そのためには、FontAwesomeConfig
オブジェクトのみを設定し、autoReplaceSvg: 'nest'
を設定します。
<script>
FontAwesomeConfig = { autoReplaceSvg: 'nest' }
</script>
これに関するドキュメントは見つかりませんでした。公式にはまだリリースされていないため、この回避策(jQuery)を使用できます。
$('svg.fa-toggle-off').replaceWith('<i class="fas fa-toggle-on"></i>');
アイコンをロードするために推奨されるJSメソッドを使用してFA 5.0.0で検証済み
HTML
<div id='icon'><i class='far fa-eye-slash'></i></div>
これは、クリックする前にページがレンダリングされると、HTMLコードがどのように見えるかです。
<div id="icon"><svg class="svg-inline--fa fa-eye-slash fa-w-18" aria-hidden="true" data-fa-processed="" data-prefix="far" data-icon="eye-slash" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path fill="currentColor" d="M272.702 359.139c-80.483-9.011-136.212-86.886-116.93-167.042l116.93 167.042zM288 392c-102.556 0-192.092-54.701-240-136 21.755-36.917 52.1-68.342 88.344-91.658l-27.541-39.343C67.001 152.234 31.921 188.741 6.646 231.631a47.999 47.999 0 0 0 0 48.739C63.004 376.006 168.14 440 288 440a332.89 332.89 0 0 0 39.648-2.367l-32.021-45.744A284.16 284.16 0 0 1 288 392zm281.354-111.631c-33.232 56.394-83.421 101.742-143.554 129.492l48.116 68.74c3.801 5.429 2.48 12.912-2.949 16.712L450.23 509.83c-5.429 3.801-12.912 2.48-16.712-2.949L102.084 33.399c-3.801-5.429-2.48-12.912 2.949-16.712L125.77 2.17c5.429-3.801 12.912-2.48 16.712 2.949l55.526 79.325C226.612 76.343 256.808 72 288 72c119.86 0 224.996 63.994 281.354 159.631a48.002 48.002 0 0 1 0 48.738zM528 256c-44.157-74.933-123.677-127.27-216.162-135.007C302.042 131.078 296 144.83 296 160c0 30.928 25.072 56 56 56s56-25.072 56-56l-.001-.042c30.632 57.277 16.739 130.26-36.928 171.719l26.695 38.135C452.626 346.551 498.308 306.386 528 256z"></path></svg><!-- <i class="far fa-eye-slash"></i> --></div>
JQUERY(クリック時に使用)
$("#icon").click(function() {
// Change the child svg attribute data-icon to the new icon (remove fa-)
$("#icon > svg").attr('data-icon','eye');
});
これにより、アイコンがeye-slashからeyeに変わります。
編集:2017年12月20日
Font Awesome 5.0.1では、Javascriptバージョンを使用する場合、以前と同様にクラスを追加/削除できるようになりました。svg元の要素ではなく要素(iと仮定)。
更新されたコード:
$("#icon").click(function() {
// Change the child svg attribute data-icon to the new icon (remove fa-)
$("#icon > svg").addClass('fa-eye').removeClass('fa-eye-slash');
});
また、フォントawesome要素に適用されたidsまたはclassesはsvgに引き継がれることに注意してください。したがって、<i id='eyecon' class='eyecon fa fa-eye'>
その後、<svg id='eyecon' class='eyecon'>
。
これが私にとって最も効果的であることがわかりました。セルフホストのFontawesome v5.7.1を使用していました
HTML(2つのアイコンに注意してください。1つは.hiddenクラスです)
<a id="delete_btn" href="#">
<i class="icon fas fa-trash"></i>
<i class="spinner fas fa-spinner fa-spin hidden"></i>
<div class="caption">Delete</div>
</a>
CSS
.hidden {
display: none;
}
jQuery
$('#delete_btn').click( function() {
var fa_icon = $('#delete_btn .icon');
var fa_spin = $('#delete_btn .spinner');
fa_icon.addClass('hidden');
fa_spin.removeClass('hidden');
//do something
fa_spin.addClass('hidden');
fa_icon.removeClass('hidden');
});