meのcdnに関して質問なのですが 以下のようなc...
FontAwesomeは、アイコンを表示させるライブラリで、
JavaScriptのjsファイルではSVGという画像形式でアイコンを表示(バージョン5から)し、CSSではウェブフォントというフォントファイルを使ってアイコンを表示させます。
目的は同じアイコンを表示させることで、アイコンを表示させる方法や利用しているファイル形式が異なります。
次に、jsファイルを使った時に動作がうまいくいかない原因について説明します。
このfontawsomeのバージョン5以降のjsファイルでアイコン表示させた場合、
ブラウザのデベロッパーツール「Element」で確認するとわかるのですが、
<svg> ....(アイコンの情報が記載) ... </svg>
<!-- <i class="fa fa-angle-right slider__nav slider__next js-slide-next" aria-hidden"true"=""></i> -->
と、index.htmlで記載していたiタグの要素をjsファイルがコメントアウトして非表示にします。
その代わり、svgタグの要素を挿入してアイコンを表示させます。
そして、app.jsはここではfontawesomeのall.jsより先に実行されています。
よって、app.jsの
$('.js-slide-next').on('click', function(){
や
app.jsの$('.js-slide-prev').on('click', function(){
では、そのjs-slide-nextクラスの「iタグ」に対してイベントを設定していたことなります。
したがって、その状態でブラウザの矢印アイコンをクリックすると、
ブラウザのデベロッパーツール「Element」のDOM構成からわかるように「svgタグ」の要素をクリックしたことになり、そのsvg要素にはイベントを設定していないため、何も動かなかったということです。
よって対策方法は、FontAwesomeの公式サイトに記載があります(英文ですが)。
https://fontawesome.com/how-to-use/on-the-web/using-with/jquery
具体的には、htmlのheadタグ内の
<script src="https://use.fontawesome.com/releases/v5.6.3/js/all.js"></script>
のscriptタグの中にこの属性
data-auto-replace-svg="nest"
を書いて、
<script src="https://use.fontawesome.com/releases/v5.6.3/js/all.js" data-auto-replace-svg="nest"></script>
としましょう。
そうすれば、iタグを残したまま、iタグの中にsvgタグ要素を入れる形でアイコンを表示させることができます。ブラウザのデベロッパーツール「Element」で確認してください。
このDOM構成で、ブラウザの矢印アイコンをクリックすれば、
iタグがクリックされたことになり、iタグに設定されていたクリックのイベントが動いて画像が正しくスライドします。
たしかに、この問題はcssとjsと拡張子を変えたためアイコン生成のDOMの仕組みが変わったことが原因ですが、
jsのスクリプトが実行されるタイミングについて理解が十分でないことも、つまずいた原因の一つだと考えています。
ここでそのタイミングについても解説します。
jsのスクリプトが実行されるタイミングは、下記3つがあり、いつ行うか指定することができます。
1.そのjsファイルが読み込まれた直後に実行される
2.画像以外のDOMの読み込みが終えたら実行する
3.すべての要素、つまり画像などがすべてロードされたら実行する
2と3のタイミングで実行するには、jsファイルのコードのはじめと終わりに決まりのフレーズを書く必要があります。
その記載方法は下記の記事が参考になります。
https://qiita.com/8845musign/items/88a8c693c84ba63cea1d
このjsのスクリプトが実行されるタイミングの違いを理解した上で先程の問題を考え直します。
今回はapp.jsの書き方からわかるように、1のタイミングで処理するように動いていて、
app.js->FontAwesomeのall.js
の順番で処理されていたわけです。そのため、クラスjs-slide-nextで設定したセレクタに齟齬が生じました。
一方で、もし2か3の方法で書いた場合には、
FontAwesomeのall.js->app.js
の順で処理されます。
この場合、
<script src="https://use.fontawesome.com/releases/v5.6.3/js/all.js"></script>
のdata-auto-replace-svg属性をつけなくても、
app.jsの$('.js-slide-next').on('click', function(){
の$('.js-slide-next')のセレクタには、Fontawsomeのall.jsで生成され、コメントアウトされるiタグのクラスを引き継いで同じjs-slide-nextクラスを持つsvgタグの要素が選ばれます。
したがって、このsvgタグの要素に画像スライドのクリックイベントを設定されることになります。
その結果、ブラウザの矢印アイコンをクリックすると、svg要素がクリックされ、そこにイベントがうまく設定できているので正しくスライドが動きます。
>また以下のサイトでFontAwesome 5 は公式のCDNでCSS配布をやめるらしいということが書かれています。
>https://tadtadya.com/html-css-fontawesome-quit-official-cdn/
>実際にfontawesomeの公式サイトに行ってもCDNの配布ページを見つけることができませんでした。
>現場では一体どこからCDNを手に入れているのでしょうか?
このブログに記載の通りjsファイルは配布を続けられます。
先程の解説で、cssでjsでもやっていることは同じでアイコンの表示であり、jsファイルも問題なく使える以上心配する必要はありません。
cssよりjsの方が負荷が少なくブラウザに表示できるため、ユーザーフレンドリのため一本化しようとしています。悪い情報ではありません。
>調べた所cdnにはいくつか種類があり、拡張子も(all.css,all.min.css,brands.min.css)など複数ある状態です。
これはアイコンの種類です。全てを使えるallを選んでおけば良いと思います。
したがって、公式ページで登録などしなくても利用できる
https://use.fontawesome.com/releases/v5.10.3/js/all.js
の「5.10.3」のバージョンの数字を状況に応じて選び、
全てのアイコンが利用できるall.jsファイルを使うようにしておけば、基本的に問題なく使い続けられるでしょう。
ただし、バージョン変更時には先程のscriptタグの属性について書いたように、細かいルールが変更されることがあります。
その場合は、FontAwesomeの公式や他の方が書いた関連記事を読むようにしてください。
FontAwesomeについてや、今までなんとなくおまじないのように使っていた$(function(){ ... } の理解が深まりました。
回答でもありましたが、
>>jsのスクリプトが実行されるタイミングについて理解が十分でないことも、つまずいた原因の一つだと考えています。
自分の理解が中途半端なことが原因だと思うのでしっかり本質を理解できるように練習や勉強など日々努力していきたいと思います。
部活の学習一覧
Lesson 01
「Ajax通信と非同期処理」
Lesson 02
「JSONってなに?データの形式」
Lesson 03
「Ajaxを実装してみよう!その1」
Lesson 04
「Ajaxを実装してみよう!その2」
Lesson 05
「Ajaxを実装してみよう!その3」
Lesson 06
「Ajax通信でemail重複チェックをしてみよう!その1」
Lesson 07
「Ajax通信でemail重複チェックをしてみよう!その2」
Lesson 08
「フォームが入力されるまでボタンを押せないようにしてみよう!」
Lesson 09
「モーダルを作ろう!」
Lesson 10
「javascriptの言語仕様〜基本の書き方〜」
Lesson 11
「javascriptの言語仕様〜データ型〜」
Lesson 12
「javascriptの言語仕様〜演算子〜」
Lesson 13
「javascriptの言語仕様〜条件分岐・繰り返し処理〜」
Lesson 14
「javascriptの言語仕様〜オブジェクトとnew演算子〜」
Lesson 15
「javascriptの言語仕様〜独自コンストラクタ〜」
Lesson 16
「javascriptの言語仕様〜色々なオブジェクト〜」
Lesson 17
「javascriptの言語仕様〜関数〜」
Lesson 18
「javascriptの言語仕様〜this〜」
Lesson 19
「javascriptの言語仕様〜prototype(プロトタイプ)〜」
Lesson 20
「javascriptの言語仕様〜クロージャーその1〜」
Lesson 21
「javascriptの言語仕様〜クロージャーその2〜」
Lesson 22
「javascriptの言語仕様〜クロージャーその3〜」
Lesson 23
「ドロップダウンメニューを作ろう!」
Lesson 24
「画像スライダーを作ろう!part1」
Lesson 25
「画像スライダーを作ろう!part2」
Lesson 26
「JSでCookieをいじってみよう!part1」
Lesson 27
「JSでCookieをいじってみよう!part2」
Lesson 28
「npmを使ってみよう!〜コンソールとシェルの書き方〜」
Lesson 29
「npmを使ってみよう!〜npmでライブラリをインストール〜」
Lesson 30
「npmを使ってみよう!〜browserifyでファイル結合〜」
Lesson 31
「gulpを使ってみよう!〜gulpとは?〜」
Lesson 32
「gulpを使ってみよう!〜gulpの書き方〜」
Lesson 33
「gulpを使ってみよう!〜画像圧縮とファイル監視〜」
コーヒーブレイク
「はたらくプログラミング 第7話」
ご意見箱
以下のようなcdnを設定しているのにも関わらず画像スライダーが動かず
<script src="https://use.fontawesome.com/releases/v5.6.3/js/all.js"></script>
困っていたところ以下のようなサイトを見つけ
http://bayashi.hatenablog.jp/entry/2018/02/06/231051
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous">
このように設定した所画像スライダーが動くようになりました。
原因は拡張子がall.jsではなくall.cssに直したことで解決したものだと思うのですが、この二つの違いがいまいち理解できません。
調べた所cdnにはいくつか種類があり、拡張子も(all.css,all.min.css,brands.min.css)など複数ある状態です。
https://cdnjs.com/libraries/font-awesome
調べたのですがどれを使うのがいいのかわかりませんでした。
また以下のサイトでFontAwesome 5 は公式のCDNでCSS配布をやめるらしいということが書かれています。
https://tadtadya.com/html-css-fontawesome-quit-official-cdn/
実際にfontawesomeの公式サイトに行ってもCDNの配布ページを見つけることができませんでした。
現場では一体どこからCDNを手に入れているのでしょうか?
ファイルをダウンロードするか公式のアカウントを作ればいいのでしょうか?
どうぞよろしくお願いいたします。