tag:crieit.net,2005:https://crieit.net/tags/%E3%83%80%E3%83%BC%E3%82%AF%E3%83%A2%E3%83%BC%E3%83%89/feed 「ダークモード」の記事 - Crieit Crieitでタグ「ダークモード」に投稿された最近の記事 2022-04-28T00:04:15+09:00 https://crieit.net/tags/%E3%83%80%E3%83%BC%E3%82%AF%E3%83%A2%E3%83%BC%E3%83%89/feed tag:crieit.net,2005:PublicArticle/18178 2022-04-28T00:04:15+09:00 2022-04-28T00:04:15+09:00 https://crieit.net/posts/bootstrap5-scroll-margin-top-darkmode-parallax-demo-20220430 Bootstrap 5 + scroll-margin-top + ダークモード + パララックス についてメモ <h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://labor.ewigleere.net/">Bootstrap 5 で JavaScript の記述なしにアンカーリンクへのアニメーション付きスクロールが <code>scroll-behavior</code> で実装されていることを最小限構成で確認した</a>ので、改めて Bootstrap 5 で検証したいと思います。</p> <h2 id="デモ"><a href="#%E3%83%87%E3%83%A2">デモ</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://arm-band.github.io/test-scroll-mt-vault-celestia/">Home - Vault Celestia</a></li> </ul> <p>早速ですがデモを。</p> <h2 id="scroll-margin-top"><a href="#scroll-margin-top">scroll-margin-top</a></h2> <p>上述の通り、 Bootostrap 5 ではアンカーリンクへのアニメーション付きスクロールは <code>scroll-behavior: smooth;</code> で実装されているのでこの部分はそちらに任せて、 <code>scroll-margin-top</code> のみ自前で記述。</p> <pre><code class="scss">// foundation/_variable.scss $navbar-height: 56px; /* css変数 + Scss変数 */ :root { --navbar-height: #{$navbar-height}; } // object/utility/_u-ssnapmt.scss .u-ssnapmt { scroll-margin-top: var(--navbar-height); } </code></pre> <p>今回は css変数 + Scss の併用で記述してみました。</p> <h2 id="css変数 + ページごとのキービジュアル画像の変更"><a href="#css%E5%A4%89%E6%95%B0+%2B+%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%94%E3%81%A8%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%93%E3%82%B8%E3%83%A5%E3%82%A2%E3%83%AB%E7%94%BB%E5%83%8F%E3%81%AE%E5%A4%89%E6%9B%B4">css変数 + ページごとのキービジュアル画像の変更</a></h2> <p>キービジュアル (ページ最上部にある画像 + 見出し + キャッチコピー等のパーツ) の背景画像について、ページごとに異なる画像を表示させたい、というのはよくある話だとは思います。</p> <pre><code class="html"><head> <style> .c-eyecatch { /* css変数で キービジュアル の画像をページごとに切替 */ background-image: var(--img); } </style> </head> <body> <!-- css変数で キービジュアル の画像をページごとに切替 --> <div class="p-3 p-sm-5 c-eyecatch" style="--img:url('https://source.unsplash.com/ROVBDer29PQ/1920x1080')"> <div class="container"> <h1 class="display-4">ほげ</h1> <p class="lead">ふがふが</p> </div> </div> <main class="l-main"> <section class="container py-5"> <h1 class="display-4">ぴよ</h1> <p>ほげら</p> </section> <!-- 流用 --> <div class="p-3 p-sm-5 mb-4 c-eyecatch" style="--img:url('https://source.unsplash.com/lNxMcE8mvIM/1920x1080')"></div> </body> </code></pre> <p>今回は css変数 を使って</p> <ul> <li>予め <code>head</code>タグ 内の <code>style</code>タグ では <code>background-image: var(--img);</code> でcss変数で指定しておく</li> <li>各要素で変数の値を都度差し替える</li> </ul> <p>という形で画像を切り替える形式を採ってみました。</p> <p>なお、今回はデモなので Jumbotron風 の実装で。</p> <h2 id="ダークモード"><a href="#%E3%83%80%E3%83%BC%E3%82%AF%E3%83%A2%E3%83%BC%E3%83%89">ダークモード</a></h2> <pre><code class="scss">// layout/_l-main.scss @charset "utf-8"; @use "../foundation" as f; .l-main { background-color: f.$bg-color; color: f.$color; #dark > & { /* ダークモード対応 */ @media (prefers-color-scheme: dark) { background-color: f.$color; color: f.$bg-color; } } } </code></pre> <p>メディアクエリ <code>@media (prefers-color-scheme: dark)</code> によるダークモードを試しに記述。</p> <p>ブログのような色に対して中立性の高いコンテンツの場合は使えそうですが、ブランドカラーが決まっている場合は難しそうな感。</p> <p>個人的には基本ダークモードの方がありがたいのですが……。</p> <h2 id="パララックス"><a href="#%E3%83%91%E3%83%A9%E3%83%A9%E3%83%83%E3%82%AF%E3%82%B9">パララックス</a></h2> <p>最後はパララックス。これについてはパッケージを利用しました。</p> <pre><code class="json"> "dependencies": { "ukiyojs": "^3.0.0" }, </code></pre> <pre><code class="js">import Ukiyo from 'ukiyojs'; window.addEventListener( 'load', () => { const ukiyoParallaxes = document.querySelectorAll( '.ukiyo' ); ukiyoParallaxes.forEach( ( ukiyoParallax ) => { new Ukiyo( ukiyoParallax, { scale: 1.75, speed: 1.75, } ); }); }); </code></pre> <p>公式のドキュメント通りです。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/yitengjun/ukiyo-js">GitHub - yitengjun\/ukiyo-js: ⛰️Modern parallax library for picture elements and any images</a></li> </ul> <p>検索すると自前実装も出てくるのですが、後々を考えるとパッケージの方が良さそうな気がするので。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <h3 id="scroll-margin-top"><a href="#scroll-margin-top">scroll-margin-top</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://www.aizulab.com/blog/sticky-header-overlap/">アンカーリンクの遷移先が隠れる…。追従ヘッダーの重なりを回避するCSS | 会津ラボ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://tech.arms-soft.co.jp/entry/2020/01/29/090000">アンカーリンクのズレをscroll-snapを使って直せるか試してみた - arms inc. Engineers' Blog</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://wb-hp.com/blog/2021/10/04/google-ie-support-ended.html">scroll-margin-top でヘッダー固定されたページのアンカーリンクの座標を調整する | ホワイトボードオフィシャルブログ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://zenn.dev/catnose99/articles/75d3c69bf71bad">【追記: Safariでも動くようになった!】scroll-margin-topがsafariでうまく効かない問題と現状のワークアラウンド</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://developer.mozilla.org/ja/docs/Web/CSS/scroll-margin-top">scroll-margin-top - CSS: カスケーディングスタイルシート | MDN</a></li> </ul> <h3 id="Bootstrap 5 での jumbotron"><a href="#Bootstrap+5+%E3%81%A7%E3%81%AE+jumbotron">Bootstrap 5 での jumbotron</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://bootstrap-guide.com/sample/jumbotron-bgimage">背景が画像のジャンボトロンの実例~Bootstrap5設置ガイド</a></li> </ul> <h3 id="css変数 で背景画像指定"><a href="#css%E5%A4%89%E6%95%B0+%E3%81%A7%E8%83%8C%E6%99%AF%E7%94%BB%E5%83%8F%E6%8C%87%E5%AE%9A">css変数 で背景画像指定</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sygnas/items/5a08d2462b6fc46850d7">CSS変数でbackground-imageを指定するとChromeとSafariで挙動が異なるのを解決する - Qiita</a></li> </ul> <h3 id="ダークモード"><a href="#%E3%83%80%E3%83%BC%E3%82%AF%E3%83%A2%E3%83%BC%E3%83%89">ダークモード</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://www.webcreatorbox.com/tech/dark-mode">Webサイトをダークモードに対応させよう | Webクリエイターボックス</a></li> </ul> <h3 id="パララックス"><a href="#%E3%83%91%E3%83%A9%E3%83%A9%E3%83%83%E3%82%AF%E3%82%B9">パララックス</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://zenn.dev/nye/articles/b3cbcf347a0291">モダンアニメーションのパララックス(視差効果)背景のライブラリを作った</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/yitengjun/ukiyo-js">GitHub - yitengjun\/ukiyo-js: ⛰️Modern parallax library for picture elements and any images</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.npmjs.com/package/ukiyojs">ukiyojs - npm</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/15419 2019-09-24T04:49:33+09:00 2019-09-24T04:52:06+09:00 https://crieit.net/posts/3196986630826e80e694cf840dd8f493 意外と簡単!自分のサイトをダークモード対応してみた【技術編】 <p><a href="https://crieit.now.sh/upload_images/ab7fe98314e669b78bed589d5154e4b05d89099d3d9f8.PNG" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ab7fe98314e669b78bed589d5154e4b05d89099d3d9f8.PNG?mw=700" alt="IMG_8789.PNG" /></a></p> <p>スプランプ(<a target="_blank" rel="nofollow noopener" href="https://splamp.info">splamp.info</a>)というサイトの管理人をしているウラルです。</p> <p>来ましたよ、ダークモードの時代が。2019年はダークモード元年です。</p> <h1 id="ダークモードの時代が来た"><a href="#%E3%83%80%E3%83%BC%E3%82%AF%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AE%E6%99%82%E4%BB%A3%E3%81%8C%E6%9D%A5%E3%81%9F">ダークモードの時代が来た</a></h1> <p>何を言っているかお分かりでしょうか。<br /> 実は、2019年はWindows・iOS・Androidという三大OSがダークモード対応をするという、大きな時代の節目なのです。</p> <h2 id="OSの更新日とダークモード設定方法"><a href="#OS%E3%81%AE%E6%9B%B4%E6%96%B0%E6%97%A5%E3%81%A8%E3%83%80%E3%83%BC%E3%82%AF%E3%83%A2%E3%83%BC%E3%83%89%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95">OSの更新日とダークモード設定方法</a></h2> <p><strong>2019年5月22日</strong><br /> Windows 10 May 2019 Update配信開始。「個人用設定 > 色」から「既定のアプリモード」を「黒」にする。</p> <p><strong>2019年9月4日</strong><br /> Android10配信開始。「設定 > ディスプレイ」から「ダークテーマ」をオンにする。</p> <p><strong>2019年9月20日</strong><br /> iOS13配信開始。「設定 > 画面表示と明るさ」から「外観モード」を「ダーク」にする。</p> <h1 id="Webが対応しないでどうする"><a href="#Web%E3%81%8C%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%AA%E3%81%84%E3%81%A7%E3%81%A9%E3%81%86%E3%81%99%E3%82%8B">Webが対応しないでどうする</a></h1> <p>個人的な所感ですが、開発者の中でダークモード対応は興味としては薄いように感じます。</p> <p>しかし、Webこそダークモードの流れに乗るべきなのです。なぜなら、ほとんどのWebサイトの背景は真っ白じゃないですか!目が眩むし、夜眠れなくなりそうです。</p> <p>私は、以前からWebサイトでダークモードの対応をしたかったのですが、OSレベルでのダークモード対応が普及していなかったため、ずっと待っていました。サイト内にダークモードボタンを設置しても、ブラウザが真っ白では意味がありませんからね。</p> <p>三大OSが対応した今、もう何も遮るものはありません。</p> <h1 id="CSSだけで実装できる"><a href="#CSS%E3%81%A0%E3%81%91%E3%81%A7%E5%AE%9F%E8%A3%85%E3%81%A7%E3%81%8D%E3%82%8B">CSSだけで実装できる</a></h1> <p>ダークモード対応は、難しい技術が必要なのでしょうか。いいえ、CSSだけでいいんです。</p> <p>CSSのメディアクエリの1つである、<code>prefers-color-scheme</code>を使います。</p> <blockquote> <p><code>prefers-color-scheme</code> は CSS のメディア特性で、ユーザーがシステムに要求したカラーテーマが明色か暗色かを検出するために使用します。<br /> <a target="_blank" rel="nofollow noopener" href="https://developer.mozilla.org/ja/docs/Web/CSS/@media/prefers-color-scheme">prefers-color-scheme - CSS: カスケーディングスタイルシート | MDN</a></p> </blockquote> <p>構文によると、ダークモードがオンになると<code>prefers-color-scheme</code>が<code>dark</code>になり、オフだと<code>light</code>、そもそも機能を持ち合わせていない場合は<code>no-preference</code>という値になります。</p> <p>実際に利用する場合はどう使うのでしょうか。<br /> おすすめは、CSS変数との併用です。既存の構造を崩さずに、ダークモード用の色彩設定を追加することができます。</p> <p><em>例</em></p> <pre><code class="css">:root { --header-bg: white; --body-bg: white; --body-color: black; } @media (prefers-color-scheme: dark) { :root { --header-bg: hsl(212, 38%, 12%); --wrapper-bg: hsl(212, 40%, 17%); --body-color: #e4e4e4; } } header { background: var(--header-bg); } body { background: var(--body-bg); color: var(--body-color); } </code></pre> <p>CSS変数を参照させることで、ダークモードに切り替わると一斉に色が変わります。</p> <p><img src="https://splamp.info/shed/assets/IMG_8788.GIF" alt="gif" /></p> <p>imgタグの画像の切り替えは若干面倒ですが、私はライト用とダーク用の2つを連続で並べて、CSSで<code>display: none</code>と<code>display: inline</code>を入れ替えるようにしました。</p> <h1 id="大変だけど"><a href="#%E5%A4%A7%E5%A4%89%E3%81%A0%E3%81%91%E3%81%A9">大変だけど</a></h1> <p>これまで白ベースで作ってきたサイトにとっては、ダークモードの対応は破壊的な修正にあたります。角丸で四隅が白い画像だとか、色でごまかしていた要素の境目などを、見直さなければいけません。</p> <p>しかし、それはデメリットばかりではありません。それは、負の遺産になりかけていたCSSを直すチャンスかもしれません。(少なくともうちのサイトは構造から改善しました)</p> <p>三大OSがダークモードに対応した今、時代の流れはダークモード対応です。<br /> 実装自体は簡単ではあるものの、色使いの検討や構造の見直しに割と時間がかかるので、早め早めに手を付けたいものです。<br /> アクセシビリティとか言って、やがて対応に迫られてくるのは間違いありません。</p> <p>次回は【デザイン編】として、ダークモードデザインについて記事にしようと思います。</p> ウラル