20210504のCSSに関する記事は9件です。

レンダリングブロックに配慮したリソースの読み込み(CSS編)

はじめに こちらの記事はレンダリングブロックに配慮したリソースの読み込み(レンダリングの基本編)の続きです。 前述の記事を読んでおくと、当記事の内容も理解しやすいかもしれません。 やるべきこと CSSファイルが読み込まれるとパース後にCSSOM(CSS版のDOMのようなもの)の構築が行われます。 CSSOMの構築中はJavaScriptの実行やページのレンダリングがブロックされます。(DOMの構築はブロックしません。) しかし、以下の対策を行うことでこのような問題が解消されます。 1. CSSを非同期で読み込み 2. クリティカルCSSをインラインで記述 具体的にどのような記述をすれば良いのか紹介していきます。 CSSを非同期で読み込み CSSを非同期で読み込むとCSSOMの構築も非同期になり、JavaScriptの実行やレンダリングがブロックされるといった問題が解消されます。 CSSの非同期読み込みには2パターンあります。 注意 非同期の特性上CSSの適用遅れが発生し、スタイルが適用されていないコンテンツが表示されることがあります。(いわゆるFOUC) またJavaScriptにはCSSOMを取得・変更する機能があるため、原則としてCSSOMの構築が完了してから実行されるようになっています。 CSSやJavaScriptのどちらか、または両方を非同期で読み込むと実行順序が担保できなくなってしまい、JavaScriptでスタイルの制御をしている場合などは処理に影響が出る可能性があります。 レンダリングブロック対策に注力するあまり正しい処理が行われないのは本末転倒なので状況によって使い分けてください。 rel=preload属性を使った非同期読み込み <head> <link rel="preload" href="foo.css" as="style"> </head> <body>...</body> 特徴 IEなど一部ブラウザは非対応のためpolyfillが必要になります。 media・onload属性を使った非同期読み込み <head> <link rel="stylesheet" href="foo.css" media="print" onload="this.media='all'"> </head> <body>...</body> 特徴 media属性をprintに設定することで非同期でロードするようになります。 そのままでは印刷の際にしかスタイルが適用されないためonload属性を使い、読み込み完了後にmedia属性をallに変更します。 IEなどでも使用可能です。 クリティカルCSSをインラインで記述 ファーストビューに必要なCSSをインラインで、それ以外のCSSを非同期で読み込むようにします。 これによってFOUCを抑えつつ、CSSOM構築に伴うレンダリングブロックの影響を最小限にすることができます。 <head> <style>/* クリティカルCSSを記述 */</style> <link rel="preload" href="foo.css" as="style"> </head> <body>...</body> 特徴 クリティカルCSSの抽出はCritical Path CSS Generatorやnpmパッケージのcriticalなどのツールを使うと便利です。 以上がレンダリングブロックに配慮したCSSの読み込み方法になります。 また、レンダリングブロックの視点から考えたアンチパターン・おすすめできない方法についてもまとめました。 アンチパターン サイズの大きいCSSファイルをそのまま読み込み <head> <link href="foo.css" rel="stylesheet"> <script src="foo.js"></script> </head> <body>...</body> 推奨しない理由 ファイルの読み込みからCSSOMの構築が完了するまでレンダリングがブロックされます。(DOMの構築はブロックしません。) 読み込みが完了するまでは何も表示されないため、クライアントの回線状況によってはUXに影響が出ます。 CSSの直後に読み込んでいるJavaScriptは直前までのCSSOM構築が完了してから実行されます。(scriptタグにasync・defer属性を付与した場合はこの影響を受けず非同期で実行されます。) インラインCSSでも同様です。 <body>内で読み込み HTML5.2からbody内でも外部CSSを読み込めるようになりました。 ※特に有用な場面が思いつきませんでしたがピックアップしました。 <head>...</head> <body> <p>テキスト1</p> <link href="foo.css" rel="stylesheet"> </body> 推奨しない理由 ファイルの読み込みからCSSOMの構築が完了するまでレンダリングがブロックされます。(DOMの構築はブロックしません。) 読み込みが完了(CSSOM構築)するまでは何も表示されないため、クライアントの回線状況によってはUXに影響が出ます。 CSS-injectedでの読み込み CSS-injectedは外部リソース読み込みのソースコードを出力するインラインJSです。(以下の記述を参照) CSS-injected 実行前 <head> <script> const link = document.createElement('link'); link.href = 'foo.css'; link.rel = 'stylesheet'; const head = document.getElementsByTagName('head')[0]; head.appendChild(link); </script> </head> <body>...</body> CSS-injected 実行後 <head> <link href="foo.css" rel="stylesheet"> </head> <body>...</body> 推奨しない理由 読み込みとCSSOM構築が非同期で行われますが、JavaScriptの実行からCSSの読み込み・CSSOM構築が完了するまではスタイルが適用されていないページが表示されます。 レンダリングブロック対策のまとめとポイント 外部CSSは非同期で読み込む。 サイズの大きいCSSファイルを同期的に読み込まない。 クリティカルなCSSはその他のCSSと切り離してインラインで記述する。 非同期の読み込みはJavaScriptの処理も考慮して指定する。 参考URL ページの生成:ブラウザーはどのように動作するか https://developer.mozilla.org/ja/docs/Web/Performance/How_browsers_work フロントエンドのパフォーマンスを徹底解説!ブラウザの気持ちで理解するHTML/Javascript/CSSの話 https://techblog.raccoon.ne.jp/archives/53180280.html rel=”preload”を極めるために必要な2種類のプリロード機能 https://techblog.raccoon.ne.jp/archives/1575956867.html
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails6でカスタムフォントを使用する方法

はじめに Rails5では簡単にカスタムフォントを追加できたのですが、Rails6で追加するのに手こずりましたので、私が実際に試した方法を簡単にご紹介します。 環境 Ruby 3.0.1 Rails 6.1.3.1 ① カスタムフォントの配置 まずカスタムフォントを GoogleFonts などから使用する素材をダウンロードし /app/assets/fonts 内にカスタムフォントファイルを配置します。 ※ /app/assets/fontsフォルダがない場合は、/app/assets/内にfontsフォルダを作成してください。 ② application.css の編集 application.cssにカスタムフォントの情報を記述していきます。 application.css /* * This is a manifest file that'll be compiled into application.css, which will include all the files * listed below. * * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's * vendor/assets/stylesheets directory can be referenced here using a relative path. * * You're free to add application-wide styles to this file and they'll appear at the bottom of the * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS * files in this directory. Styles in this file should be added after the last require_* statement. * It is generally better to create a new file per style scope. * *= require_tree . *= require_self */ @font-face { font-family: "NotoSansJP"; font-style: normal; src: asset_url('NotoSansJP-Regular.otf') ; } .css のままだと Rails がカスタムフォントを認識してくれないので、.scssに拡張子を変更します。 Rails6からは、/app/assets/stylesheets 内の applicationファイルの拡張子が .cssで生成されるようになったようです。 ③ assets:precompile の実行 コマンドで、rails assets:precompile を実行し変更を反映させます。 rails assets:precompile 無事反映ができていれば、コマンドの結果にコンパイルされたカスタムフォントのファイル名が表示されます。 最後に カスタムフォントの反映ができず、インターネットで調べましたが、Rails6の情報が少なく解決しませんでした。 カスタムフォントがコンパイルされなかったので、ファイルを調べていると、applicationファイルの拡張子が .cssなのに気づき.scssに変更したところ上手く反映できました。 この事象に悩まされていた方のお役に立てれば幸いです。 以上、Rails6でカスタムフォントを使用する方法のご紹介でした。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【初心者でも簡単】CSSで再生ボタンを作る

どうも7noteです。動画が流行っているので再生ボタンを作ってみました。 動画の再生ボタンを独自で作成したい時用に、「再生ボタン」を作ってみました。 クリックで再生停止も操作できるようにクリックしたら一時停止の見た目に変わるようにします。 ソース index.html <div class="btn"></div> style.css .btn { width: 100px; /* 幅を指定 */ height: 60px; /* 高さを指定 */ background: #F00; /* 背景色を赤に指定 */ border-radius: 10px; /* 角を丸くする */ position: relative; /* 基準位置とする */ cursor: pointer; /* マウスカーソルを指(?)の形にする */ } .btn::after { content: ''; /* 疑似要素に必須 */ width: 0; /* 幅を0に指定 */ height: 0; /* 高さを0に指定 */ border-style: solid; /* 線の種類を指定 */ border-width: 15px 0 15px 30px; /* 線の幅を指定して三角を作る */ border-color: transparent transparent transparent #fff; /* 左のみ線の色を指定 */ position: absolute; /* 相対位置に指定 */ top: 50%; /* 上から50%の位置に配置 */ left: 50%; /* 左から50%の位置に配置 */ transform: translate(-50%,-50%); /* 要素の半分ぶんだけ左上方向に移動。 */ } .btn.playback::after { width: 15px; /* 幅を指定 */ height: 30px; /* 高さを指定 */ border-width: 0 4px 0 4px; /*線を左右に指定*/ border-color: transparent #fff transparent #fff; /* 左右に線の色を指定 */ transition: .5s; /* アニメーションの秒数を指定 */ } script.js $(function () { $('.btn').on('click', function(){ // クリックされた時 $(this).toggleClass('playback'); // クラスを 付与する or 外す }); }); まとめ 背景を使わずに、▶と||だけでも十分利用できると思います。 movieタグなどで利用する場合はデフォルトの再生ボタンは非表示にしておきましょう。 【iosのデフォルト再生ボタンを非表示にする方法】 https://qiita.com/YukiYuki0508/items/651e70b50c278b16cfa1 おそまつ! ~ Qiitaで毎日投稿中!! ~ 【初心者向け】WEB制作のちょいテク詰め合わせ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

@import

CSSでよく見る@￰importの仕様をあまり考えず使っていたが、調べる機会が訪れたのでメモ。 @￰importは複数の外部CSSファイルを読み込む時に使うため、その分HTTPリクエスト数が発生するらしい。 common.css @import url('https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@1,100&display=swap'); /*font*/ /* CSS Import --------------------------------- */ /*ローカルファイル*/ @import url(layout.css); @import url(reset.css); @import url(flame.css); @import url(page.css); こうやってCSSをまとめてhtmlのheaderをすっきりさせることもできるわけだが、HTTPリクエストを行うため、読み込みが遅れてします。 web制作の時に、ページが開くと同時に何かの関数を発火させることをあまりしなかったので気遣ったが、これのせいで、Lazyロードが全然うまくいかなかった。 @￰importの使用は極力避けることにした。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

TSで簡単なアニメーション

サーバーサイド言語ばかりをやっていると、たまにはhtml, css, typescriptで遊びたくなる今日この頃。 Vue.jsしか使わない私がTSだとアニメーションがわからなくなったのでメモ。 vue.jsのcreatedでAjax通信の関数を呼び出し、返ってきたときに画面が描画されるような仕様にしたかった。 index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link rel="stylesheet" href="./index.css"> <script src="./index.js" defer></script> </head> <body> <div id="wrapper" class="none"> <span>hello</span> <button onclick="hello()">Hello world</button> </div> </body> </html> index.css .none{ opacity:0; visibility: hidden; transition: all 3s } .show{ opacity:1; visibility: visible; /*おそらくopacityだけだと隠れている時でもイベントが発火する*/ transition: all 3s } index.ts const wrapper = document.getElementById("wrapper") as HTMLDivElement; //右側にasをつけて型注釈することでこれはHTMLDivElementだと確定させる(アサーション) //左側だとnullの可能性があると怒られる。下記でもよし //<HTMLDivElement>document.getElementById("wrapper") function ready(){ wrapper.classList.add('show') } function hello(){ console.log('Hello world') }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Bootstrap 5のレンジが、Safariで表示がおかしくなる原因と対処法

Bootstrap5で開発していたアプリを、Safariで表示したところレンジのスタイルが適用されなかったので、その原因と対処法をご紹介します。 Sassでの読み込み時に発生 CDNやbootstrap.min.css、bootstrap.cssからBootstrapを読み込んでいる場合は、この不具合は発生しません。 ※Bootstrapは頻繁に更新されているので、今後、このような環境でも不具合が発生する恐れがあります。 bootstrap.scssから読み込んだ場合に、この不具合が見られました。 どういうことなのか bootstrapのレンジのスタイルが、Safariで反映されない。 Chrome(正常)↓ Safari↓ 原因 Safariなどのブラウザでは、デフォルトのスタイルを無効化するCSSのプロパティである、appearanceにベンダープレフィックス1をつけなくてはならないが、Bootstrap 5のSassではベンダープレフィックスがついていないため。 ちなみに、appearanceはMDNによれば、まだ「実験的な機能」とのことです。 Experimental これは実験的な機能です。 本番で使用する前にブラウザー互換性一覧表をチェックしてください。 appearance (-moz-appearance, -webkit-appearance) by MDN contributors is licensed under CC-BY-SA 2.5 現時点での対応状況は以下リンクから見られます。 2021/05/04時点では、 Chrome、Firefox、Edgeではappearance単独でも機能する Safariはベンダープレフィックスが必要 IEは、11も含めて完全に非対応 とのことです。 IEが完全に非対応とのことですが、最近はEdgeがChromiumを採用したことなどから、IEのサポートを打ち切るサイトも増えてきているので、あまり気にしなくても良いと思われます。 対処法 以下のCSSをBootstrapを読み込ませた後に追記します。 mystyle.scss input[type="range"]{ /*レンジ全体のスタイルを整える*/ appearance: none; /*デフォルトのスタイルを無効にする*/ -webkit-appearance: none;/*Webkitの古いブラウザでデフォルトのスタイルを無効にする*/ -moz-appearance: none;/*古いFirefoxでデフォルトのスタイルを無効にする*/ } input[type="range"]::-webkit-slider-thumb { /*Webkitブラウザでのレンジのツマミ部分のスタイル*/ -webkit-appearance: none; appearance: none; } input[type="range"]::-moz-range-thumb { /*Firefoxでのレンジのツマミ部分のスタイル*/ -moz-appearance: none; appearance: none; } 対処後は、Safariでも正常に表示されました。 Bootstrap側でこの問題は修正されるのか この問題を修正したというPull Requestがあったので、近いうちにこの不具合が修正されたものがリリースされると思われます。 (2021/05/04時点での最新版はv5.0.0-beta3なので、v5.0.0-beta4で修正されると思われます。) そのため、Bootstrapのアップデートがないか定期的にチェックされることをおすすめします。 ちなみに、GitHubでコードを管理している場合は、Dependabotを使うとBootstrapなどのパッケージ2のアップデートを自動で確認し、Pull Requestを出してくれます。 Dependabotの設定方法についての記事を書きましたので、合わせてご覧ください。 フロントエンド強化月間 5/31まで、Qiitaでは「フロントエンド強化月間」を行っています。この記事も、「フロントエンド強化月間」に合わせて執筆されたものです。 参考 CSSのappearanceについて Bootstrap (GitHub) 特定のブラウザでしか使えない、試験段階のプロパティの頭につく-webkit-や-moz-などの識別子のこと。将来的にCSSの正式な仕様となれば不要になりますが、ベンダープレフィックス付きのプロパティにしか対応していない古いブラウザに対応させるため、ベンダープレフィックス付きのプロパティを併記することがあります。 ↩ Bootstrapなどの、サードパーティのソフトウェアを指します。package.jsonなどのようなファイルには、インストールされたパッケージの名称・バージョンなどが記載されています。 ↩
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

サイドバーやヘッダーなどを追従させたい場合はstickyを使えば最強という話。

サイドバーやヘッダーの追従などをjqueryなどを使って、高さを取得して、スクロール毎にイベントを発生させて、、、としている人が結構いると思います。 しかし、そんなのは今は昔の話。 今はstickyを使えば追従は簡単に表現できます。 stickyは少し特殊なプロパティではありますが、慣れれば超便利アイテムです。 position:sticky;top:0;などのように高さを指定してあげればそれだけで親要素の範囲内で追従します。 本当に便利なので是非使ってみてください。 これで終わりです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ウルトラ簡単に導入できてしまうBootstrap

こんにちは。 当記事ではBootstrap導入と簡単な使用例について記していきます。 対象はプログラミングhtmlやcssは触ったことある初学者向けです。 ※検証環境:Eclipse・GoogleChrome(Java8・PostgreSQL・SpringBoot・Thymeleaf) 1.以下サイトからBootstrap本体をダウンロード https://getbootstrap.com/docs/5.0/getting-started/download/ 2.ダウンロードしたzipを解凍後cssとjsファイルを自分の環境にコピーする。 私の開発環境のSpringbootアプリだとここにドラッグ&ドロップしました。 3.HTMLファイルに以下を追記する 3.1 <head></head>の中に以下2行をコピー sample.html <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> 3.2 <body></body>の中に以下3行をコピー(私はbody部の最後に書きました) sample.html <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> BootStrapの導入は以上で終わりです。pomに追記するなどの別の方法もありますが、今回は割愛します。 後は実際にHTMLのタグにclassを追加して試してみると良いと思われます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

JavaScriptで入力チェックする方法(修正版)

スペースが入ると入力チェックを通過してしまうのと、入力漏れメッセージを配列に変えたほうが良いとのアドバイスを頂きましたので修正いたします。また修正前の記事でタグに誤りがあったのを発見したのでその部分も修正済みです。修正前の記事も勉強のため残します。 <!DOCTYPE html> <html lang="ja"> <style> body { padding:50px; background-color: greenyellow; } body #title { color:red; font-size : 50px; } body #name { width:200px; } body #mail { width:400px; } body #button1 { background-color: blue; } </style> <head> <meta charset="utf-8"> <title>sample</title> </head> <body> <h1 id = "title">送信フォーム</h1> <form action = "index4.html" method="POST"> Name:<input type="text" id="name"><br> Mail:<input type="email" id="email"><br> Detail:<textarea id="detail" value="detail" cols="50" rows="3" maxlength="150"></textarea><br> year:<select id = "year"> <option value="2021" id="2021">2021年</option> <option value="2022" id="2022">2022年</option> <option value="2023" id="2023">2022年</option> </select> month:<select id = "month"> <option value="1" id="1">1月</option> <option value="2" id="2">2月</option> <option value="3" id="3">3月</option> <option value="4" id="4">4月</option> <option value="5" id="5">5月</option> <option value="6" id="6">6月</option> <option value="7" id="7">7月</option> <option value="8" id="8">8月</option> <option value="9" id="9">9月</option> <option value="10" id="10">10月</option> <option value="11" id="11">11月</option> <option value="12" id="12">12月</option> </select> <input type="button" id="button1" value="送信" onclick="func1()"> </form> <div id="div1"></div> <script language="javascript" type="text/javascript"> //変数の定義 const name = document.getElementById('name'); const mail = document.getElementById('email'); const detail = document.getElementById('detail'); const button1 = document.getElementById('button1'); //入力チェック処理 const func1 = () => { const unfilledItems = []; if(name.value.replace(/\s+/, '').length === 0) { unfilledItems.push('名前'); } if(mail.value.replace(/\s+/, '').length === 0) { unfilledItems.push('メールアドレス'); } if(detail.value.replace(/\s+/g, '').length === 0) { unfilledItems.push('詳細'); } if(unfilledItems.length > 0) { alert(`${unfilledItems.join('、')}が入力されていません。`); } else { if (window.confirm('送信してもよろしいですか?')) { div1.innerText = `Name:${name.value}、Mail:${mail.value}、Detail:${detail.value}、year:${year.value}、month:${month.value}`; } } } </script> </body> </html>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む