tag:crieit.net,2005:https://crieit.net/tags/scss/feed 「scss」の記事 - Crieit Crieitでタグ「scss」に投稿された最近の記事 2022-04-28T00:04:15+09:00 https://crieit.net/tags/scss/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/18135 2022-03-05T23:05:27+09:00 2022-03-05T23:05:27+09:00 https://crieit.net/posts/stylelint-adjust-rgb-and-scss-20220305 stylelint 周りのアップデート (Scss対応、 rgb 指定) <p>久々にパッケージガーデニングしたら stylelint から Scss 関連や <code>rgb</code> の指定で怒られるようになってしまったので対処。</p> <h2 id="現象"><a href="#%E7%8F%BE%E8%B1%A1">現象</a></h2> <pre><code class="bash">$ stylelint ./src/scss/**/*.scss src/scss/global/_scssVariables.scss 19:19 ✖ Unexpected unknown function "color.scale" function-no-unknown 21:19 ✖ Unexpected unknown function "color.adjust" function-no-unknown 22:17 ✖ Unexpected unknown function "color.adjust" function-no-unknown 23:19 ✖ Unexpected unknown function "color.scale" function-no-unknown 24:20 ✖ Unexpected unknown function "color.scale" function-no-unknown src/scss/object/component/_c-button.scss 19:31 ✖ Expected modern color-function notation color-function-notation src/scss/_plugins/articlesns/_articlesns.scss 40:16 ✖ Unexpected unknown function "color.scale" function-no-unknown 53:31 ✖ Unexpected unknown function "map.get" function-no-unknown 57:35 ✖ Unexpected unknown function "color.scale" function-no-unknown 57:47 ✖ Unexpected unknown function "map.get" function-no-unknown 57:81 ✖ Unexpected unknown function "map.get" function-no-unknown </code></pre> <p>npmパッケージをアップデートした際に stylelint やそれに関連するパッケージ等をアップデートしたところ、いくつかの項目で怒られるようになってしまいました。</p> <p>この中で特に気になったのが <code>Expected modern color-function notation color-function-notation</code> のエラー。</p> <p><a target="_blank" rel="nofollow noopener" href="https://twitter.com/kaji2/status/1451433868863553536">かじさんはTwitterを使っています 「stylelint-config-standard の 23.0.0 アップデートで、 color-function-notation が 'modern' で追加された。 従来のコンマ区切りだったrgb()、rgba()をスペース区切りに揃えるもの。ついでにrgbaをrgbに揃えている。 https:\/\/t.co\/yHFngFOS8J」 \/ Twitter</a></p> <p>検索したところ、このツイートがヒット。</p> <p><code>stylelint-config-standard</code> のアップデートで色指定が引っかかるようになったようです。これは css level 4 の構文に対応したもののようです。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://triple-underscore.github.io/css-color-ja.html#rgb-functions">CSS Color Module Level 4 (日本語訳)</a></li> </ul> <p>構文としては次のように変更になります。</p> <pre><code class="css">/* 旧来 */ .hoge { background-color: rgba(48, 48, 48, 0.5); } /* 新 */ .hoge { background-color: rgb(48 48 48 / 50%); } </code></pre> <ul> <li><code>rgb()</code> と <code>rgba()</code> から <code>rgb()</code> へ統一</li> <li>RGB値はカンマ区切りからスペース区切りへ</li> <li>RGB値とアルファ値の区切りはカンマからスラッシュへ</li> </ul> <p>一方、 Scss でも独自に <code>rgb()</code> が存在しています。このおかげで、 Scss で次のように色の指定でRGB値ではなく16進数や変数を使用しても問題が発生しないわけですね。</p> <pre><code class="scss">$black: #333; .hoge { background-color: rgba($black, 0.5); } </code></pre> <p>ただ、 Scss 側ではまだカンマ区切りしか対応していなさそうです。そのため、仮に css level 4 の構文を使用して Scss のトランスパイルを走らせると、次のようにエラーになってしまいます。</p> <pre><code class="bash">[hh:ii:ss] gulp-notify: [sass] Error: src\scss\object\component\_c-newscards.scss Error: Missing element $blue. ╷ 128 │ box-shadow: inset 2px 2px 5px 0 rgb(g.$us-main-color 0.5); │ ^^^^^^^^^^^^^^^^^^^^^^^^^ ╵ src\scss\object\component\_c-newscards.scss 128:37 @use src\scss\contents.scss 36:1 root stylesheet 19:31 ✖ Expected modern color-function notation color-function-notation </code></pre> <p>Scss の構文にすると stylelint でコケて、 stylelint のデオフォルトに従って css level 4 の構文にすると Scss のトランスパイルが通らない、と。</p> <h2 id="対処"><a href="#%E5%AF%BE%E5%87%A6">対処</a></h2> <p>仕方ないので、上述引用のツイートと同様に <code>color-function-notation</code> のパラメータを <code>legacy</code> にすることで回避することにしました。</p> <h3 id=".stylelint.json"><a href="#.stylelint.json">.stylelint.json</a></h3> <pre><code class="json"> "rules": { // 略 "color-function-notation": "legacy", // 略 } </code></pre> <h2 id="余談"><a href="#%E4%BD%99%E8%AB%87">余談</a></h2> <p>上述対処の前に他の回避方法がないか試す中で、一通りパッケージをアップデートしたりしましたがかえって Scss の関数等のエラーが出てしまったのは冒頭の通り。</p> <p>そこでそれらへの対応として次のようにしました。</p> <h3 id="package.json"><a href="#package.json">package.json</a></h3> <pre><code class="json"> "devDependencies": { // 略 "stylelint-config-standard-scss": "3.0.0", // 追加 // 略 } </code></pre> <h3 id=".stylelint.json"><a href="#.stylelint.json">.stylelint.json</a></h3> <pre><code class="json"> "extends": [ "stylelint-config-standard", "stylelint-config-standard-scss", // 追加 "stylelint-config-recommended-scss", "stylelint-config-prettier" ], </code></pre> <p>まず <code>stylelint-config-standard-scss</code> を追加。</p> <h3 id=".stylelint.json"><a href="#.stylelint.json">.stylelint.json</a></h3> <pre><code class="json"> "rules": { // 略 "at-rule-no-unknown": null, // Scss関数は stylelint-config-standard-scss に任せるようにしたため独自で追加していた設定は削除 "function-no-unknown": [ true, // map.get や color.scale 等 Dart Sass の関数は引っかかってしまうのでルールを追加 { "ignoreFunctions": [ "/^map\\..+/", "/^color\\..+/" ] } ], "scss/at-rule-no-unknown": true, // Scssのデフォルト関数以外は引っかかるようにする "scss/dollar-variable-pattern": "^(([a-z][a-zA-Z0-9_]+)|([a-z][a-z0-9]*)(-[a-zA-Z0-9_]+)*)$", // 互換性のためケバブケース強制は除去 "scss/at-mixin-pattern": "^(([a-z][a-zA-Z0-9_]+)|([a-z][a-z0-9]*)(-[a-zA-Z0-9_]+)*)$", // 互換性のためケバブケース強制は除去 "scss/at-mixin-argumentless-call-parentheses": "always" // 互換性のため引数なしのmixin呼び出しの際は括弧強制 "stylelint-config-standard-scss": "3.0.0", // 追加 // 略 } </code></pre> <p>その上で <code>.stylelint.json</code> のルールをいくつか変更しました。</p> <p>これで stylelint を走らせてエラーが出なくなったことを確認。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <h3 id="color-function-notation"><a href="#color-function-notation">color-function-notation</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://stylelint.io/user-guide/rules/list/color-function-notation/">color-function-notation | Stylelint</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://twitter.com/kaji2/status/1451433868863553536">かじさんはTwitterを使っています 「stylelint-config-standard の 23.0.0 アップデートで、 color-function-notation が 'modern' で追加された。 従来のコンマ区切りだったrgb()、rgba()をスペース区切りに揃えるもの。ついでにrgbaをrgbに揃えている。 https:\/\/t.co\/yHFngFOS8J」 \/ Twitter</a></li> </ul> <h3 id="css level 4"><a href="#css+level+4">css level 4</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://triple-underscore.github.io/css-color-ja.html#rgb-functions">CSS Color Module Level 4 (日本語訳)</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/questions/66825515/getting-error-in-css-with-rgb0-0-0-15">Getting error in CSS with <code>rgb\(0 0 0 \/ 15%\)</code> - Stack Overflow</a> <ul> <li>似たようなケース</li> </ul></li> </ul> <h3 id="Scss 周りへの対応"><a href="#Scss+%E5%91%A8%E3%82%8A%E3%81%B8%E3%81%AE%E5%AF%BE%E5%BF%9C">Scss 周りへの対応</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/taqumo/items/2ed2cd7e35301d4aed8e">Stylelint 14.0.0 で Sass ファイルを lint させる方法 - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/stylelint-scss/stylelint-config-standard-scss">GitHub - stylelint-scss\/stylelint-config-standard-scss: The standard shareable SCSS config for Stylelint.</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://stylelint.io/user-guide/rules/list/at-rule-no-unknown/">at-rule-no-unknown | Stylelint</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://stylelint.io/user-guide/rules/list/function-no-unknown/">function-no-unknown | Stylelint</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/stylelint-scss/stylelint-scss/blob/master/src/rules/at-mixin-pattern/README.md">stylelint-scss\/README.md at master · stylelint-scss\/stylelint-scss · GitHub</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/shigemaruu/items/2e64fe0a425946a2e4a1">stylelint-config-sass-guidelinesの内容をメモする - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/stylelint-scss/stylelint-scss/blob/master/src/rules/at-mixin-argumentless-call-parentheses/README.md">stylelint-scss\/README.md at master · stylelint-scss\/stylelint-scss · GitHub</a></li> </ul> <h3 id="marked"><a href="#marked">marked</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://marked.js.org/">Marked Documentation</a></li> </ul> <p>パースする関数が <code>marked</code> から <code>marked.parse</code> メソッドに変更になっていた。</p> arm-band tag:crieit.net,2005:PublicArticle/17979 2022-02-06T21:41:13+09:00 2022-02-06T21:41:13+09:00 https://crieit.net/posts/bootstrap5-paint-in-variable-20220206 Bootstrap 5 の変数やマップを上書きする <p>Bootstrap 5 が去年5月にリリースされてからかなり経ってしまいましたが、 4 とは変数の上書きや追加の方法が変わっていると知ったので実験をしてみました。</p> <h2 id="検証結果"><a href="#%E6%A4%9C%E8%A8%BC%E7%B5%90%E6%9E%9C">検証結果</a></h2> <ul> <li>ページ: <a target="_blank" rel="nofollow noopener" href="https://arm-band.github.io/test_bootstrap5_blackout/">Black in me - Black! - Blackout</a></li> <li>リポジトリ: <a target="_blank" rel="nofollow noopener" href="https://github.com/arm-band/test_bootstrap5_blackout">GitHub - arm-band\/test_bootstrap5_blackout: Bootstrap5 の変数を上書きできるかテスト。</a></li> </ul> <h2 id="コード"><a href="#%E3%82%B3%E3%83%BC%E3%83%89">コード</a></h2> <h3 id="ディレクトリ (関連する部分のみ)"><a href="#%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA+%28%E9%96%A2%E9%80%A3%E3%81%99%E3%82%8B%E9%83%A8%E5%88%86%E3%81%AE%E3%81%BF%29">ディレクトリ (関連する部分のみ)</a></h3> <pre><code> / └ src/ └ scss/ └ foundation/ ├ bootstrap/ │ └ _import.scss │ ├ _append.scss ├ _index.scss ├ _mixin.scss └ _variables.scss </code></pre> <p>ひとまずこんな形に。今回はデモ用なので <code>global</code>ディレクトリ を用意しませんでしたが、実際には <code>global</code>ディレクトリ で運用しようかな、と思います。</p> <h3 id="src/scss/foundation/bootstrap/_import.scss"><a href="#src%2Fscss%2Ffoundation%2Fbootstrap%2F_import.scss">src/scss/foundation/bootstrap/_import.scss</a></h3> <pre><code class="scss">@charset "utf-8"; // color custom (override) @import "../variables"; // Configuration @import "node_modules/bootstrap/scss/functions"; @import "node_modules/bootstrap/scss/variables"; @import "node_modules/bootstrap/scss/mixins"; @import "node_modules/bootstrap/scss/utilities"; // color custom (add to map) @import "../append"; // Layout & components @import "node_modules/bootstrap/scss/root"; @import "node_modules/bootstrap/scss/reboot"; // 略 </code></pre> <p>元々の Bootstrap 5 の <code>bootstrap/scss/bootstrap.scss</code> のパスを調整したコピーを用意。</p> <p>このコピーに2箇所手を加えます。</p> <ol> <li>Configuration の読み込みの<strong>前</strong>に <code>src/scss/foundation/_variables.scss</code> を読み込む</li> <li>Configuration の読み込みの<strong>後</strong>に <code>src/scss/foundation/_append.scss</code> を読み込む</li> </ol> <h3 id="src/scss/foundation/_index.scss"><a href="#src%2Fscss%2Ffoundation%2F_index.scss">src/scss/foundation/_index.scss</a></h3> <pre><code class="scss">@charset "utf-8"; //@forward "variables"; @forward "bootstrap/import"; @forward "mixin"; </code></pre> <p>元々同じディレクトリにあった <code>_variable.scss</code> の読み込みを削除。これは先の <code>src/scss/foundation/bootstrap/_import.scss</code> で <code>_variable.scss</code> を読み込んでいるためです。</p> <h3 id="src/scss/foundation/_variables.scss (既存変数の上書き)"><a href="#src%2Fscss%2Ffoundation%2F_variables.scss+%28%E6%97%A2%E5%AD%98%E5%A4%89%E6%95%B0%E3%81%AE%E4%B8%8A%E6%9B%B8%E3%81%8D%29">src/scss/foundation/_variables.scss (既存変数の上書き)</a></h3> <pre><code class="scss">@charset "utf-8"; @use "sass:color"; $m-color: #333; $m-main-color: #666; $m-main-color_d: color.scale($m-main-color, $lightness: -8%); $m-main-color_l: color.scale($m-main-color, $lightness: 8%); $m-accent-color: color.adjust($m-main-color, $hue: 150deg); $m-link-color: color.adjust($m-main-color, $hue: 210deg); $m-link-v-color: color.scale($m-link-color, $lightness: -8%); $m-link-ha-color: color.scale($m-link-color, $lightness: 8%); $m-bg-color: #fff; // override $primary: $m-main-color; $secondary: $m-bg-color; </code></pre> <p>変数宣言。前半は自分用の変数なのでお好みで。ただし <code>$link-color</code> 等は Bootstrap 側の変数とバッティングするのでそういった変数名は避けます。</p> <p>その上で、今回は最後の部分に Bootstrap5 の変数の値を上書きするための <code>$primary</code> や <code>$secondary</code> を用意。このように Bootstrap 5 の変数より前に定義することで既存変数の上書きができます。</p> <h3 id="src/scss/foundation/_append.scss"><a href="#src%2Fscss%2Ffoundation%2F_append.scss">src/scss/foundation/_append.scss</a></h3> <pre><code class="scss">@charset "utf-8"; $custom-colors: ( "blackout": #000 ); // blackout をマップ $theme-colors に追加 $theme-colors: map-merge($theme-colors, $custom-colors); </code></pre> <p>一方、マップ <code>$theme-colors</code> に新たな要素を追加するためには先程の変数上書きとは異なり、 Bootstrap 5 の変数等の後でマップに追加する必要があります。</p> <p>……確かに <code>map-merge</code> で合体するマップを指定する都合上、予め指定するマップが存在していなければならないですよね。</p> <p>これで既存のマップ <code>$theme-colors</code> に要素 <code>blackout</code> を追加できました。</p> <h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2> <p><a href="https://crieit.now.sh/upload_images/d1a0f6ba9f3afd27485f516c65bd2f6d61ffc13a60151.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d1a0f6ba9f3afd27485f516c65bd2f6d61ffc13a60151.jpg?mw=700" alt="ボタンの色を上書きしたり追加したり" /></a></p> <p>Bootstrap のボタンで検証。左から2つの <code>primary</code> と <code>secondary</code> は上書きしたのでカスタマイズした色に、3つ目はオリジナルの <code>blackout</code> です。4つ目以降はデフォルトの <code>success</code> や <code>info</code> 等が続いており、上述のようにマップに一部の色のみを指定して <code>map-merge</code> しても他の色が影響を受けていないことを確認しました。</p> <p>これで大丈夫そうですね。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://bootstrap-guide.com/customize/sass">Sassのカスタマイズ~Bootstrap5設置ガイド</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://getbootstrap.jp/docs/5.0/customize/sass/">Sass · Bootstrap v5.0</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/shouchida/items/2c3fc4586de66a067dfd">Bootstrap(v5)をカスタマイズして必要な機能だけ利用する - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/questions/67592367/unable-to-customize-bootstrap-5-theme-colors">reactjs - Unable to customize Bootstrap 5 theme colors - Stack Overflow</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/16786 2021-03-28T18:20:44+09:00 2021-08-08T16:13:11+09:00 https://crieit.net/posts/VSCode-Web 【VSCode】拡張機能一覧(主にWeb系システム開発用) <p>個人用メモ。<br /> 主にPHPを使用して開発する環境で使用している拡張機能一覧。<br /> (他のも混じっているけど)<br /> (後で追加・変更・削除するかも)</p> <h1 id="VSCode"><a href="#VSCode">VSCode</a></h1> <ul> <li><p>Bookmarks<br />  あらかじめソースコード中にブックマークを設定しておくと、他の場所からブックマークまで一瞬で移動することが出来る。</p></li> <li><p>indent-rainbow<br />  インデントを色付きで表示してくれる。</p></li> <li><p>Japanese Language Pack for Visual Studio Code<br />  VSCodeの日本語化。</p></li> </ul> <h1 id="HTML"><a href="#HTML">HTML</a></h1> <ul> <li><p>Auto Close Tag<br />  自動的に閉じタグを追記してくれる。</p></li> <li><p>Auto Rename Tag<br />  タグを変更すると、対応する閉じタグを自動的に変更してくれる。</p></li> <li><p>HTML Snippets<br />  HTMLの予測変換を表示してくれる。</p></li> <li><p>HTMLHint<br />  HTMLの文法チェックをしてくれる。</p></li> </ul> <h1 id="PHP(Laravel)"><a href="#PHP%28Laravel%29">PHP(Laravel)</a></h1> <ul> <li><p>Bracket Pair Colorizer 2<br />  メソッドやArrayなどで、対となるカッコを色付きで表示してくれる。</p></li> <li><p>php cs fixer<br />  PHPソースを自動整形してくれる。<br />  ※別途、「php-cf-fixer.phar」のインストールが必要。</p></li> <li><p>PHP Debug<br />  PHPをステップ実行してデバッグできるようになる。</p></li> <li><p>PHP IntelliSense<br />  PHPの予測変換を表示してくれる。</p></li> </ul> <p>【2021.8.8 追加】<br /> * Laravel Blade Snippets<br />  Laravelのbladeファイル内のタグやディレクティブを色付きで表示してくれる。</p> <ul> <li>Laravel Blade formatter<br />  Laravelのbladeファイル用のフォーマッタ。<br />  blade独自のディレクティブもインデントしてくれる(これ重要)。</li> </ul> <h1 id="JavaScript(Node.js,Vue.js)"><a href="#JavaScript%28Node.js%2CVue.js%29">JavaScript(Node.js,Vue.js)</a></h1> <ul> <li><p>ESLint<br />  JavaScriptの構文チェックをリアルタイムで実行してくれる。<br />  ※Vue.jsで使用するには設定が必要。</p></li> <li><p>JavaScript (ES6) code snippets<br />  JavaScriptの予測変換を表示してくれる。</p></li> <li><p>Vetur<br />  Vue.jsコードのシンタックスハイライトやコード補完、リント、フォーマットを行ってくれる。</p></li> </ul> <h1 id="CSS(Sass,SCSS)"><a href="#CSS%28Sass%2CSCSS%29">CSS(Sass,SCSS)</a></h1> <ul> <li><p>IntelliSense for CSS class names in HTML<br />  CSSクラス名を入力するときに、入力補完してくれる。</p></li> <li><p>SCSS Formatter<br />  SCSSコードを自動整形してくれる。</p></li> </ul> <h1 id="その他"><a href="#%E3%81%9D%E3%81%AE%E4%BB%96">その他</a></h1> <ul> <li><p>Log File Highlighter<br />  ログファイルの内容を色付きで表示してくれる。</p></li> <li><p>MySQL<br />  VSCodeでMySQLを使用可能にする。</p></li> <li><p>Rainbow CSV<br />  CSVファイルをカラムごとに色分けして表示してくれる。</p></li> <li><p>Regex Previewer<br />  正規表現の実行結果をプレビュー表示してくれる。</p></li> <li><p>SFTP<br />  サーバへ自動的にソースファイルをアップロードしてくれる。</p></li> </ul> <h1 id="【参考】"><a href="#%E3%80%90%E5%8F%82%E8%80%83%E3%80%91">【参考】</a></h1> <p>「Visual Studio Code」をインストールしてPHPコードのデバッグ環境を設定する方法<br /> <a target="_blank" rel="nofollow noopener" href="https://incloop.com/visualstudiocodeのデバッグ設定/">https://incloop.com/visualstudiocodeのデバッグ設定/</a></p> <p>Visual Studio Codeで作るPHP開発環境のおすすめ拡張機能17選<br /> <a target="_blank" rel="nofollow noopener" href="https://wonwon-eater.com/vscode-php-plugin/">https://wonwon-eater.com/vscode-php-plugin/</a></p> <p>VScodeの日本語化ができない 変わらない時の対処法[Visual Studio Code]<br /> <a target="_blank" rel="nofollow noopener" href="https://rabotiku-sato.com/vscode-japanese-setting">https://rabotiku-sato.com/vscode-japanese-setting</a></p> <p>vscodeでVue.jsを書くときに使っているプラグインとか<br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/dayoshix/items/c61a75a971331418c348">https://qiita.com/dayoshix/items/c61a75a971331418c348</a></p> <p>【HTML編】Visual Studio Code おすすめプラグイン紹介 #02<br /> <a target="_blank" rel="nofollow noopener" href="https://so-da.tech/tech/vscode/vscd3/">https://so-da.tech/tech/vscode/vscd3/</a></p> <p>VSCodeのAuto Rename Tagで閉じタグも自動変更<br /> <a target="_blank" rel="nofollow noopener" href="https://tech.pjin.jp/blog/2020/04/27/vscode_extension_auto_rename_tag/">https://tech.pjin.jp/blog/2020/04/27/vscode_extension_auto_rename_tag/</a></p> <p>VSCode で HTML の文法チェックを行う拡張機能 HTMLHint<br /> <a target="_blank" rel="nofollow noopener" href="https://loumo.jp/archives/26229">https://loumo.jp/archives/26229</a></p> <p>VSCode拡張機能『indent-rainbow』でインデントを虹色にする方法<br /> <a target="_blank" rel="nofollow noopener" href="https://onedarling.site/programming/tool/vscode-indent-rainbow/">https://onedarling.site/programming/tool/vscode-indent-rainbow/</a></p> <p>【2020年版】VSCodeでhtml/css/jsの拡張機能おすすめ<br /> <a target="_blank" rel="nofollow noopener" href="https://uetani33.net/vscode-web-extensions/#toc_id_3_2">https://uetani33.net/vscode-web-extensions/#toc_id_3_2</a></p> <p>VSCode使い必見!?使って便利な Visual Studio Code 拡張機能10選<br /> <a target="_blank" rel="nofollow noopener" href="https://www.geekfeed.co.jp/geekblog/vscode_extension">https://www.geekfeed.co.jp/geekblog/vscode_extension</a></p> <p>【超便利】VSCodeでMySQLを利用する方法<br /> <a target="_blank" rel="nofollow noopener" href="https://newmtube07.com/vscode-mysql/">https://newmtube07.com/vscode-mysql/</a></p> <p>[Visual Studio Code] PHPのコードを整形する「php cs fixer」の設定<br /> <a target="_blank" rel="nofollow noopener" href="https://www.searchlight8.com/visual-studio-code-php/">https://www.searchlight8.com/visual-studio-code-php/</a></p> <p>VSCode(Visual Studio Code)でSFTP・FTP経由でファイルを自動アップロードや同期できる拡張機能「SFTP」が超便利<br /> <a target="_blank" rel="nofollow noopener" href="https://www.karelie.net/vscode-sftp/">https://www.karelie.net/vscode-sftp/</a></p> <p>Windows10でVisual Studio Code + vue-cliの開発環境構築メモ<br /> <a target="_blank" rel="nofollow noopener" href="https://belhb.hateblo.jp/entry/2020/08/08/142540">https://belhb.hateblo.jp/entry/2020/08/08/142540</a></p> <p>【2021.8.8 追加】<br /> LaravelでVisual Studio Codeを使う時に入れておきたい拡張機能3選<br /> <a target="_blank" rel="nofollow noopener" href="https://biz.addisteria.com/laravel-vscode/">https://biz.addisteria.com/laravel-vscode/</a></p> <p>Laravel blade formatter VSCode Extensionを作った<br /> <a target="_blank" rel="nofollow noopener" href="https://shufo.dev/2020/10/03/published-vscode-blade-formatter/">https://shufo.dev/2020/10/03/published-vscode-blade-formatter/</a></p> <p>VSCodeでBladeテンプレートを整形する<br /> <a target="_blank" rel="nofollow noopener" href="https://blog.nplpl.com/310">https://blog.nplpl.com/310</a></p> acmz tag:crieit.net,2005:PublicArticle/16652 2021-01-26T23:55:22+09:00 2021-01-26T23:55:22+09:00 https://crieit.net/posts/gulp-sass-pseudo-dynamic-import-scss-20210120 gulp-sass から Scss を疑似的な動的読み込みを行う <h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2> <p>Scss で <code>@import</code>, <code>@use</code>, <code>@forward</code> のような他のファイルを読み込む機能は、 @ディレクティブ 内では使用できないません。そのため、例えば以下のようなことができません。</p> <pre><code class="scss">$flag: true; @if ($flag) { @use "parts1.scss"; } </code></pre> <p>あるフラグ変数(ここでは <code>$flag</code> ですが、実際はファイル中ではなく Gulp タスク内で管理)が <code>true</code> のときのみ <code>parts1.scss</code> を読み込む。</p> <pre><code class="scss">$flag: true; @if ($flag) { @use "parts1.scss"; } @else { @use "parts2.scss"; } </code></pre> <p>あるいは、フラグ変数の値によって読み込む Scss ファイルを切り替える。</p> <p>この部分について、どうにかできないか(本当にやりたいのは最初の例ですが、代替案として2つ目の例でブランクの <code>parts2.scss</code> をダミーとして用意する方法を考える)、と。</p> <h2 id="対処"><a href="#%E5%AF%BE%E5%87%A6">対処</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/questions/63803090/sass-dynamic-import-based-on-environment">css - Sass dynamic import based on environment - Stack Overflow</a></li> </ul> <p>色々検索した結果、 <code>gulp-sass</code> の <code>includePaths</code> オプションを使えばそれらしいことができそうだ、ということが分かりました。</p> <p>今回はたまたま自分も <code>gulp-sass</code> を使用している前提で、しかも Scss 本体の変数ではなく Gulp タスク内で管理しているフラグによって、というのが希望だったのでこの形はぴったりでした (この方法でなければ、上記スレの上の方にあるように、フラグをいったん Scss ファイルに変数として出力し、それを読み込むことで伝播させようと考えていました)。</p> <pre><code class="javascript">const { src, dest } = require('gulp'); const plumber = require('gulp-plumber'); const notify = require('gulp-notify'); const sass = require('gulp-sass'); sass.compiler = require('sass'); const Fiber = require('fibers'); const autoprefixer = require('gulp-autoprefixer'); // dynamic import test const flag = true; // scssコンパイルタスク const scss = () => { let opt = { fiber: Fiber, outputStyle: 'compressed' }; // dynamic import test if (flag) { opt.includePaths = [ `src/scss/parts/enable` ] } else { opt.includePaths = [ `src/scss/parts/disable` ] } return src('src/scss/**/*.scss') .pipe(plumber({ errorHandler: notify.onError({ message: 'Error: <%= error.message %>', title: 'scss' }) })) .pipe(sass(opt).on('error', sass.logError)) .pipe(autoprefixer({ cascade: false })) .pipe(dest('dist/css')); }; module.exports = scss; </code></pre> <p>Scss のコンパイルタスクはこのような感じで。</p> <pre><code>src/  └ scss/ ├ .scssファイル やディレクトリ ├ import/ │ └ _index.scss │ └ parts/ ├ disable/ │ └ parts_hoge.scss └ enable/ └ parts_hoge.scss </code></pre> <p>このようなディレクトリ構造で、 <code>src/scss/import/_index.scss</code> から <code>src/scss/parts</code> の中の<code>enable</code> または <code>disable</code> のどちらかの <code>parts_hoge.scss</code> を読み込む、とした場合。</p> <pre><code class="scss">// dynamic import test @use "parts_hoge"; </code></pre> <p><code>src/scss/import/_index.scss</code> の記述はこれだけですが、 Scss のコンパイルタスクに記述されている変数 <code>flag</code> によって読み込む元のディレクトリの候補が <code>src/scss/parts/enable</code> または <code>src/scss/parts/disable</code> のどちらかに切り替わる、ということです。</p> <p>あとは <code>src/scss/parts/disable/parts_hoge.scss</code> は中身のないブランクのファイルにしておけば、 <code>flag</code> が <code>true</code> の場合のみ css が当たる、ということになります。</p> <p>出力される css の切り分けはできたので、とりあえずはこの方法でしょうかね。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/questions/63803090/sass-dynamic-import-based-on-environment">css - Sass dynamic import based on environment - Stack Overflow</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.npmjs.com/package/sass">sass - npm</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/sass/node-sass#includepaths">sass/node-sass: Node.js bindings to libsass</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/16363 2020-12-14T21:10:33+09:00 2020-12-14T21:10:33+09:00 https://crieit.net/posts/mouse-stalker-sample-20201214 カーソルを特定要素にホバーすると画像を表示するマウスストーカーのサンプル <p>マウスストーカーが盛んに取り上げられるようになって早数年。さすがにそろそろやり方くらいは……と思い、試してみることにしました。</p> <h2 id="コード"><a href="#%E3%82%B3%E3%83%BC%E3%83%89">コード</a></h2> <p>まずは成果物を。</p> <ul> <li>要素ホバーで拡大: <a target="_blank" rel="nofollow noopener" href="http://scrunchy56.starfree.jp/vampire_stoker_first/">Home - Vampire Stoker</a></li> <li>要素ホバーで背景画像表示: <a target="_blank" rel="nofollow noopener" href="http://scrunchy56.starfree.jp/vampire_stoker_last/">Home - Vampire Stoker</a></li> </ul> <p>最初の方(要素ホバーで拡大)は参考コードほぼそのままです。次のものはマウスストーカーが大きくなるだけでなく、背景画像をスポットライト的に切り抜いて表示する機能も付けたものになります。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/arm-band/test_vampire_stoker">arm-band/test_vampire_stoker</a></li> </ul> <p>リポジトリ。</p> <h3 id="HTML"><a href="#HTML">HTML</a></h3> <pre><code class="html"><div class="c-mouseStalker_wrapper"> <div class="c-mouseStalker"> <div class="c-mouseStalker_cursor" id="c-mouseStalker_cursor"></div> <div class="c-mouseStalker_delay" id="c-mouseStalker_delay"></div> </div> </div> </code></pre> <p>HTMLはいたってシンプル。カーソル用の要素とディレイがかかって追いかけてくる要素の2つの <code>div</code> を用意します。</p> <p>今回はさらにラッパーで覆って <code>overflow: hidden;</code> をかけることで、画面端にカーソルが移動した際にディレイ要素の大きさ分だけはみ出てスクロールバーが表示されないようにしました。</p> <pre><code class="html"><script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/latest/TweenMax.min.js" defer></script> </code></pre> <p>それから、今回はサクッと試すために CDN で TweenMax を読み込むようにしました。</p> <h3 id="css(Scss)"><a href="#css%28Scss%29">css(Scss)</a></h3> <pre><code class="scss">body { position: relative; // 元々のマウスカーソルを消す cursor: none; } .c-mouseStalker { // イベント反応させなくする pointer-events: none; width: 100%; height: 100%; position: absolute; top: 0; left: 0; &_wrapper { // イベント反応させなくする pointer-events: none; width: 100%; height: 100%; position: absolute; top: 0; left: 0; // 端にカーソルを持って行ったときにディレイの部分だけはみ出てスクロールバーが表示されてしまうのを抑止 overflow: hidden; } &_cursor, &_delay { position: absolute; top: 0; left: 0; pointer-events: none; // イベント反応させなくする } &_cursor { width: 0.5rem; height: 0.5rem; background-color: f.$color; z-index: 10001; border-radius: 50%; } &_delay { $delayRadius: 100px / 4; width: 100%; height: 100%; background-color: f.$main-color; z-index: 10000; transition: clip-path ease 0.1s; // 遅くするともっさりした感じになる opacity: 0.4; // at 以降は円の中心の定義 clip-path: ellipse($delayRadius $delayRadius at 50% 50%); &.active { $activeTimes: 4; background: { image: url("../img/img.jpg"); attachment: fixed; size: cover; position: center center; } opacity: 1; clip-path: ellipse($delayRadius * $activeTimes $delayRadius * $activeTimes at 50% 50%); } } } </code></pre> <ul> <li><code>body</code> の <code>cursor: none;</code>: デフォルトのマウスカーソルを非表示に</li> <li><code>.c-mouseStalker</code> と <code>.c-mouseStalker_wrapper</code>: <ul> <li><code>pointer-events: none;</code></li> <li>どちらも表示画面サイズいっぱいまで拡大</li> </ul></li> <li><code>.c-mouseStalker_wrapper</code>: <code>overflow: hidden;</code> で端にカーソルを持って行ったときにディレイの部分だけはみ出てスクロールバーが表示されてしまうのを抑止</li> <li><code>.c-mouseStalker_delay</code>: 肝 <ul> <li>要素自体は透明。 <code>clip-path</code> で切り取った円形の範囲のみ見える状態にする <ul> <li>デフォルトは単色半透明のマスク</li> <li>特定要素にホバーしたとき、 jQuery でクラス付与 (ホバー解除時にクラスも削除) <ul> <li>クラスが付与されたとき、背景を単色から <code>background-image</code> で指定した画像にする <ul> <li>背景画像は <code>background-attachment</code>, <code>background-size</code>, <code>background-position</code> 指定あり</li> </ul></li> </ul></li> </ul></li> <li><code>transition: clip-path ease 0.1s;</code> でホバー時の拡大縮小等の切り替えを easing <ul> <li><code>0.3s</code> にすると TweenMax のディレイも相まってもっさりした動きになってしまうので、 <code>0.1s</code> で</li> </ul></li> </ul></li> </ul> <h3 id="JavaScript (jQuery + TweenMax)"><a href="#JavaScript+%28jQuery+%2B+TweenMax%29">JavaScript (jQuery + TweenMax)</a></h3> <pre><code class="javascript">// mouse stalker const mouseStalker = () => { const $cursor = $('#c-mouseStalker_cursor'); const $delay = $('#c-mouseStalker_delay'); const paramsArray = { cursor: { width: $cursor.outerWidth(), coorX: 0, coorY: 0, delay: 0.001, }, delay: { width: $delay.outerWidth(), coorX: 0, coorY: 0, delay: 6, }, }; const activeClass = 'active'; let clipRadius = 100 / 4; let clipScale = 1; let clipPathCoor = `ellipse(${clipRadius * clipScale}px ${clipRadius * clipScale}px at 50% 50%)`; // カーソルの遅延アニメーション // ほんの少しだけ遅延させる (0.001秒) TweenMax.to( {}, paramsArray.cursor.delay, { repeat: -1, onRepeat: function() { paramsArray.delay.coorX += (paramsArray.cursor.coorX - paramsArray.delay.coorX) / paramsArray.delay.delay; paramsArray.delay.coorY += (paramsArray.cursor.coorY - paramsArray.delay.coorY) / paramsArray.delay.delay; clipPathCoor = `ellipse(${clipRadius * clipScale}px ${clipRadius * clipScale}px at ${paramsArray.delay.coorX}px ${paramsArray.delay.coorY}px)`; // delay TweenMax.set( $delay, { css: { clipPath: clipPathCoor, } } ); // cursor TweenMax.set( $cursor, { css: { left: paramsArray.cursor.coorX - (paramsArray.cursor.width / 2), top: paramsArray.cursor.coorY - (paramsArray.cursor.width / 2), } } ); } } ); // mouse hover $('#hoverElmID').on({ mouseenter: function () { $cursor.addClass(activeClass); $delay.addClass(activeClass); clipScale = 4; }, mouseleave: function () { $cursor.removeClass(activeClass); $delay.removeClass(activeClass); clipScale = 1; }, }); // get mouse coordinate $(document).on('mousemove', function (e) { paramsArray.cursor.coorX = e.pageX; paramsArray.cursor.coorY = e.pageY; }); }; window.addEventListener('load', () => { mouseStalker(); }); </code></pre> <ul> <li>だいたいサンプルコードに則ったコード</li> <li>カーソルとディレイ要素の各種パラメータは別の変数で持っていると個人的に分かりづらかったのでオブジェクトにまとめました</li> <li>変数 <code>clipPathCoor</code> で指定した値が実際の <code>clip-path</code> で切り取られるディレイ要素の指定 <ul> <li>カーソル用はほぼ弄らず</li> <li>ディレイ要素の方は TweenMax の <code>to</code> で指定するパラメータが <code>top</code>, <code>left</code> から <code>clip-path</code> のみに変更</li> </ul></li> <li>特定要素のホバー時に上述 Scss の指定が反映されるようにクラスの付け外しを実施 <ul> <li>同時に <code>clip-path</code> で切り取られる範囲を拡大縮小(拡大率の数値を変更している)</li> </ul></li> </ul> <hr /> <p>今回はこれで望んだ挙動になりました。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <h3 id="マウスストーカー"><a href="#%E3%83%9E%E3%82%A6%E3%82%B9%E3%82%B9%E3%83%88%E3%83%BC%E3%82%AB%E3%83%BC">マウスストーカー</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://www.evoworx.co.jp/blog/mouse-stoker-gsap/">イケてるマウスカーソルを簡単に実装する | 株式会社 エヴォワークス -EVOWORX-</a></li> <li><a target="_blank" rel="nofollow noopener" href="http://un-tech.jp/tweenmax-started/">Googleも推奨!アニメーションライブラリTweenMaxの使い方 入門編 | un-Tech</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://greensock.com/licensing/">Licensing - GreenSock</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://greensock.com/standard-license/">Standard License - GreenSock</a></li> </ul> <h3 id="背景画像切り抜き"><a href="#%E8%83%8C%E6%99%AF%E7%94%BB%E5%83%8F%E5%88%87%E3%82%8A%E6%8A%9C%E3%81%8D">背景画像切り抜き</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://teratail.com/questions/246261">JavaScript - マウスストーカーを透明のマスクにして背景を動的に切り取りたいのですが、どうすれば良いでしょうか?|teratail</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://developer.mozilla.org/ja/docs/Web/CSS/basic-shape"> - CSS: カスケーディングスタイルシート | MDN</a></li> <li><a target="_blank" rel="nofollow noopener" href="http://www.htmq.com/css/clip-path.shtml">clip-path-CSSリファレンス</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/duka/items/e65354f103ebc9280959">CSS animation で遊び倒す - CSS Clip Path- - Qiita</a></li> </ul> <h3 id="要素内座標(未使用)"><a href="#%E8%A6%81%E7%B4%A0%E5%86%85%E5%BA%A7%E6%A8%99%28%E6%9C%AA%E4%BD%BF%E7%94%A8%29">要素内座標(未使用)</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://muumv.com/grid/">要素内のマウスカーソルの座標を取得する!スマホ対応【Javascript】 | MUUMV</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/16250 2020-12-02T23:50:23+09:00 2020-12-21T23:35:58+09:00 https://crieit.net/posts/bootstrap-paint-in-variable-20201202 Dart Sass (@use, @forward 使用)で Bootstrap 4 の変数やマップを上書きする <p>Dart Sass (<code>@use</code>, <code>@forward</code> 使用)で Bootstrap 4 の変数・マップを上書きしたくなったので実験してみました。</p> <h2 id="今まで (node-sass / LibSass)"><a href="#%E4%BB%8A%E3%81%BE%E3%81%A7+%28node-sass+%2F+LibSass%29">今まで (node-sass / LibSass)</a></h2> <h3 id="前提"><a href="#%E5%89%8D%E6%8F%90">前提</a></h3> <pre><code class="bash"> / └ src/ ├ html/ │ └ index.html │ └ scss/ ├ assets/ │ └ bootstrap/ │ │ └ bootstrap/ │ │ └ 略 │ └ bootstrap.scss │ ├ foundation/ │ ├ _index.scss │ ├ _mixin.scss │ └ _variables.scss │ ├ layout/ │ ├ _l-footer.scss │ ├ _l-header.scss │ └ _l-main.scss │ ├ object/ │ ├ component/ │ │ └ 略 │ ├ project/ │ │ └ 略 │ └ utility/ │ └ 略 │ └ index.scss </code></pre> <p>今回の検証で使用するプロジェクトのディレクトリ構造は、このような状態とします。</p> <h3 id="src/html/index.html"><a href="#src%2Fhtml%2Findex.html">src/html/index.html</a></h3> <pre><code class="html"><div class="mt-4"> <a href="#" class="btn btn-primary m-3">プライマリーボタン</a><!-- プライマリーカラーのボタン --> <a href="#" class="btn btn-main m-3">メインボタン</a><!-- デフォルトにはないボタン --> </div> </code></pre> <p>例として、こんな HTML があったとして。</p> <h3 id="src/scss/foundation/_scss_variable.scss"><a href="#src%2Fscss%2Ffoundation%2F_scss_variable.scss">src/scss/foundation/_scss_variable.scss</a></h3> <pre><code class="scss">$theme-colors: ( /* 上書き */ primary: $own-color, /* デフォルトにないカラーの追加 */ main: $own-main-color, ); </code></pre> <p>マップの定義を上書きするコードを書きます。</p> <h3 id="src/scss/foundation/_index.scss"><a href="#src%2Fscss%2Ffoundation%2F_index.scss">src/scss/foundation/_index.scss</a></h3> <pre><code class="scss">@import "variables"; //変数(Bootstrap の変数上書きのコードあり) @import "mixin"; @import "../assets/bootstrap/bootstrap"; //bootstrap </code></pre> <p>同じ <code>foundation</code> の中に読み込み用の Scss を用意します。</p> <p>注意する点としては、「 Bootstrap の Scss を読み込むより前に、 Bootstrap の変数(マップ)を上書きするための自前の定義が書かれた Scss を読み込む」ということ。</p> <h3 id="src/scss/index.scss"><a href="#src%2Fscss%2Findex.scss">src/scss/index.scss</a></h3> <pre><code class="scss">@import "./foundation/index"; //読み込み </code></pre> <p>最後に、実際に <code>index.css</code> にコンパイルされる <code>src/scss/index.scss</code> で <code>src/scss/foundation/_index.scss</code> を読み込みます。</p> <p>今までは、これで変数の上書きができました。</p> <h2>Dart Sass での検証1 (失敗 / 単純に <code>@import</code> を <code>@use</code>, <code>@forward</code> に書き換え)</h2> <p>さて、ここで単純に今まで <code>@import</code> で記述していたのを <code>@use</code>, <code>@forward</code> に書き換えてみます。</p> <h3 id="src/scss/foundation/_scss_variable.scss"><a href="#src%2Fscss%2Ffoundation%2F_scss_variable.scss">src/scss/foundation/_scss_variable.scss</a></h3> <pre><code class="scss">$theme-colors: ( /* 上書き */ primary: $own-color, /* デフォルトにないカラーの追加 */ main: $own-main-color, ); </code></pre> <p>上書きしたい変数(マップ)の定義はそのまま。</p> <h3 id="src/scss/foundation/_index.scss"><a href="#src%2Fscss%2Ffoundation%2F_index.scss">src/scss/foundation/_index.scss</a></h3> <pre><code class="scss">@forward "scss_variables"; //変数(Bootstrap の変数上書きのコードあり) @forward "mixin"; @forward "../assets/bootstrap/bootstrap"; //bootstrap </code></pre> <p>今度は <code>@import</code> ではなく、 <code>@forward</code> に書き換えます。</p> <h3 id="src/scss/layout/_l-header.scss"><a href="#src%2Fscss%2Flayout%2F_l-header.scss">src/scss/layout/_l-header.scss</a></h3> <pre><code class="scss">@use "../foundation" as f; .l-header { .navbar-brand { &, &:link, &:visited { color: f.$own-main-color; } &:hover, &:active, &:focus { color: f.$own-main-color_l; } } } // 略 </code></pre> <p>実際に <code>src/scss/foundation/_index.scss</code> を読み込んで使用する Scss で <code>@use</code> による読み込みを行います。</p> <h3 id="src/scss/index.scss"><a href="#src%2Fscss%2Findex.scss">src/scss/index.scss</a></h3> <pre><code class="scss">@use "layout/l-header"; //_l-header.scss の中で @use を使って src/scss/foundation/_index.scss を読み込み、使用 @use "layout/l-main"; @use "layout/l-footer"; </code></pre> <p>こんな形に書き換えます。</p> <p>流れとしては、「<code>src/scss/index.scss</code> -(<code>@use</code>)-> <code>src/scss/layout/_l-header.scss</code> -(<code>@forward</code>)-> <code>src/scss/foundation/_index.scss</code>」という関係。</p> <p>この状態で Dart Sass によるコンパイルを実行すると、<code>$theme-colors</code> の変数名が重複しているのでエラーになってしまいます。</p> <pre><code class="bash">Error: src/scss/foundation/_index.scss Error: Two forwarded modules both define a variable named $theme-colors. ╷ 3 │ @forward "variables"; │ ━━━━━━━━━━━━━━━━━━━━ original @forward ... │ 5 │ @forward "../assets/bootstrap/bootstrap"; //bootstrap │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ new @forward ╵ src/scss/foundation/_index.scss 5:1 @use src/scss/layout/_l-header.scss 3:1 @use src/scss/index.scss 8:1 root stylesheet </code></pre> <p>回避するためにはいくつかの方法が考えられますが、 Bootstrap 4 の <code>@import</code> を書き換えていくのは大変な上に既存ライブラリに手を入れるのはできれば避けたいので今回は不採用。</p> <p>他の方法としては <code>with</code> を使う方法が考えられます。</p> <p>ただし、これもいくつか工夫が必要です。</p> <h2>Dart Sass での検証2 (失敗 / <code>@foward</code> ~ <code>with</code>)</h2> <p>安直に <code>with</code> を使おうかと考えましたが、構文的に <code>with</code> は <code>@use</code> でしか使えません。</p> <p>そのため、以下のような書き換えは不可です。</p> <h3 id="src/scss/foundation/_index.scss"><a href="#src%2Fscss%2Ffoundation%2F_index.scss">src/scss/foundation/_index.scss</a></h3> <pre><code class="scss">@forward "../assets/bootstrap/bootstrap" with ( /* with の中では use で読み込んだファイルのスコープは使えない */ $theme-colors: ( /* 上書き */ primary: #333, /* デフォルトにないカラーの追加 */ main: red, ), ); //bootstrap </code></pre> <h2 id="Dart Sass での検証3 (失敗 / ファイルスコープ)"><a href="#Dart+Sass+%E3%81%A7%E3%81%AE%E6%A4%9C%E8%A8%BC3+%28%E5%A4%B1%E6%95%97+%2F+%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%29">Dart Sass での検証3 (失敗 / ファイルスコープ)</a></h2> <p><code>@use</code> とセットで使うということが分かったので、今度は <code>@use</code> で読み込んでいる場所で <code>with</code> を付けたそうと思いました。</p> <h3 id="src/scss/layout/_l-header.scss"><a href="#src%2Fscss%2Flayout%2F_l-header.scss">src/scss/layout/_l-header.scss</a></h3> <pre><code class="scss">@use "../foundation" as f with ( $theme-colors: ( /* 上書き */ primary: f.$own-color, /* デフォルトにないカラーの追加 */ main: f.$own-main-color, ), ); .l-header { .navbar-brand { &, &:link, &:visited { color: f.$own-main-color; } &:hover, &:active, &:focus { color: f.$own-main-color_l; } } } // 略 </code></pre> <p>ただし、このような既述をすると以下のエラーが発生します。</p> <pre><code class="bash">Error: src/scss/layout/_l-header.scss Error: There is no module with the namespace "f". ╷ 7 │ primary: f.$own-color, │ ^^^^^^^^^^^^^ ╵ src/scss/layout/_l-header.scss 7:18 @use src/scss/index.scss 8:1 root stylesheet </code></pre> <p><code>with</code> の中では、その直前で既述した名前空間はまだ使えません。</p> <p>「独自に定義したメインカラーでプライマリーカラーを上書きしたい」というケースが多いと思われるので、 <code>with</code> で上書きするときにメインカラーが変数で指定できないのは困ります。</p> <p>そこで、独自定義の変数読み込みと Bootstrap 4 の読み込み部分を分けることにしました。</p> <h2 id="最終形"><a href="#%E6%9C%80%E7%B5%82%E5%BD%A2">最終形</a></h2> <h3 id="ディレクトリ構造"><a href="#%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E6%A7%8B%E9%80%A0">ディレクトリ構造</a></h3> <pre><code class="bash"> / └ src/ ├ html/ │ └ index.html │ └ scss/ ├ assets/ │ └ bootstrap/ │ │ └ bootstrap/ │ │ └ 略 │ └ bootstrap.scss │ ├ foundation/ │ ├ _index.scss │ ├ _mixin.scss │ └ _variables.scss │ ├ global/ │ └ _index.scss # 追加 │ ├ layout/ │ ├ _l-footer.scss │ ├ _l-header.scss │ └ _l-main.scss │ ├ object/ │ ├ component/ │ │ └ 略 │ ├ project/ │ │ └ 略 │ └ utility/ │ └ 略 │ └ index.scss </code></pre> <h3 id="src/scss/foundation/_scss_variable.scss"><a href="#src%2Fscss%2Ffoundation%2F_scss_variable.scss">src/scss/foundation/_scss_variable.scss</a></h3> <p>先程まであった上書き用のコードは削除。</p> <h3 id="src/scss/foundation/_index.scss"><a href="#src%2Fscss%2Ffoundation%2F_index.scss">src/scss/foundation/_index.scss</a></h3> <pre><code class="scss">@forward "variables"; @forward "mixin"; </code></pre> <p>Bootstrap 4 を読み込む <code>@forward</code> を削除。</p> <h3 id="src/scss/global/_index.scss"><a href="#src%2Fscss%2Fglobal%2F_index.scss">src/scss/global/_index.scss</a></h3> <pre><code class="scss">@forward "../assets/bootstrap/bootstrap"; //bootstrap </code></pre> <p>Bootstrap 4 を読み込む部分を切り出したのを、 <code>src/scss/global/_index.scss</code> とします。</p> <h3 id="src/scss/layout/_l-header.scss"><a href="#src%2Fscss%2Flayout%2F_l-header.scss">src/scss/layout/_l-header.scss</a></h3> <pre><code class="scss">@use "../foundation" as f; @use "../global" as g with ( $theme-colors: ( /* 上書き */ primary: f.$own-color, /* デフォルトにないカラーの追加 */ main: f.$own-main-color, ), ); .l-header { .navbar-brand { &, &:link, &:visited { color: f.$own-main-color; } &:hover, &:active, &:focus { color: f.$own-main-color_l; } } } // 略 </code></pre> <p>実際に使う部分。変数は <code>foundation</code>, Bootstrap 4 は <code>global</code> で読み込み、 <code>foundation</code> を先に読み込むことで、 <code>with</code> の中で使用できるようにしました。</p> <h3 id="src/scss/index.scss"><a href="#src%2Fscss%2Findex.scss">src/scss/index.scss</a></h3> <pre><code class="scss">@use "layout/l-header"; @use "layout/l-main"; @use "layout/l-footer"; </code></pre> <p><code>index.css</code> になる部分は読み込みだけ。</p> <p>この形にすることでようやく当初意図していた形にすることができました。</p> <h2 id="備考1"><a href="#%E5%82%99%E8%80%831">備考1</a></h2> <p>今回の方法では Bootstrap 4 の中身は一切触れない方向で実装しました。そのため、 Bootstrap 4 の中は以前として <code>@import</code> で読み込まれており、変数はグローバルスコープに定義されるようです。</p> <p>そのため、今回は <code>src/scss/layout/_l-header.scss</code> でしか <code>with</code> を使用していませんが……</p> <p><a href="https://crieit.now.sh/upload_images/3415ce329faf1c572815489dd4a732555fc7a9865a365.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3415ce329faf1c572815489dd4a732555fc7a9865a365.jpg?mw=700" alt="デフォルト状態のサンプル" /></a></p> <p>デフォルト状態ではこのような状態になります(プライマリーカラーがデフォルト、右側はデフォルト状態では存在しない <code>btn-main</code> クラスが付与されているため背景色なし)。</p> <p><a href="https://crieit.now.sh/upload_images/bf9bc07305297db9738d5598f4d950bd5fc7a98f8206f.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/bf9bc07305297db9738d5598f4d950bd5fc7a98f8206f.jpg?mw=700" alt="適用状態のサンプル" /></a></p> <p><code>src/scss/layout/_l-header.scss</code> に <code>with</code> を適用しただけで、メイン部分のボタンも影響を受けます。今回の場合は「全体で色を変更したい」のでこれで良いのですが、 <code>@use</code> や <code>@forward</code> の位置付けからすると役割を発揮できていない状態なので微妙なところ。</p> <p>今後、 Bootstrap が <code>@use</code>, <code>@forward</code> に変更した場合にこの辺りの挙動は変わると思われます。</p> <p>※ちなみに、v5.0.0-alpha3 でもまだ <code>@import</code> でした。</p> <h2 id="備考2"><a href="#%E5%82%99%E8%80%832">備考2</a></h2> <p>備考1と関連しますが、グローバルスコープに定義されるということは……</p> <h3 id="src/scss/layout/_l-header.scss"><a href="#src%2Fscss%2Flayout%2F_l-header.scss">src/scss/layout/_l-header.scss</a></h3> <pre><code class="scss">@use "../foundation" as f; @use "../global" as g; .l-header { .navbar-brand { &, &:link, &:visited { color: f.$own-main-color; } &:hover, &:active, &:focus { color: f.$own-main-color_l; } } } // 略 </code></pre> <p><code>src/scss/layout/_l-header.scss</code> は普通に <code>src/scss/global/_index.scss</code> を読み込み……</p> <h3 id="src/scss/layout/_l-main.scss"><a href="#src%2Fscss%2Flayout%2F_l-main.scss">src/scss/layout/_l-main.scss</a></h3> <pre><code class="scss">@use "../foundation" as f; @use "../global" as g with ( $theme-colors: ( /* 上書き */ primary: f.$own-color, /* デフォルトにないカラーの追加 */ main: f.$own-main-color, ), ); .l-main { background-color: f.$own-bg-color; color: f.$own-color; .btn-main { color: f.$own-color; } } // 略 </code></pre> <p><code>src/scss/layout/_l-header.scss</code> の後に読み込まれる <code>src/scss/layout/_l-main.scss</code> で <code>with</code> を使用した場合、以下のエラーが発生します。一度読み込んだモジュールが <code>with</code> 使用で再度読み込まれている、という旨のエラーですね。</p> <pre><code class="bash">Error: This module was already loaded, so it can't be configured using "with". ┌──> src/scss/layout/_l-main.scss 4 │ ┌ @use "../global" as g with ( 5 │ │ $theme-colors: ( 6 │ │ /* 上書き */ 7 │ │ primary: f.$own-color, 8 │ │ /* デフォルトにないカラーの追加 */ 9 │ │ main: f.$own-main-color, 10│ │ ), 11│ │ ); │ └─^ new load ╵ ┌──> src/scss/layout/_l-header.scss 4 │ @use "../global" as g; │ ━━━━━━━━━━━━━━━━━━━━━ original load ╵ src/scss/layout/_l-main.scss 4:1 @use src/scss/index.scss 9:1 root stylesheet Error: src/scss/layout/_l-main.scss Error: This module was already loaded, so it can't be configured using "with". ┌──> src/scss/layout/_l-main.scss 4 │ ┌ @use "../global" as g with ( 5 │ │ $theme-colors: ( 6 │ │ /* 上書き */ 7 │ │ primary: f.$own-color, 8 │ │ /* デフォルトにないカラーの追加 */ 9 │ │ main: f.$own-main-color, 10│ │ ), 11│ │ ); │ └─^ new load ╵ ┌──> src/scss/layout/_l-header.scss 4 │ @use "../global" as g; │ ━━━━━━━━━━━━━━━━━━━━━ original load ╵ src/scss/layout/_l-main.scss 4:1 @use src/scss/index.scss 9:1 root stylesheet </code></pre> <p>そのため、 <code>with</code> を使用するならば全体を通して <code>src/scss/global/_index.scss</code> が最初に <code>@use</code> で読み込まれる部分に既述する必要があります。</p> <hr /> <p>以上、知らないと全体的に嵌まり所が多い感じだったのでメモしておきます。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <h3 id="with"><a href="#with">with</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://www.boel.co.jp/tips/vol114/">Sassの新しいモジュールシステム | BOEL Inc. | ブランディング&デザインファーム</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://kojika17.com/2020/05/next-generation-sass-module-system.html">Sassを@importから@useに置き換えるための手引き | Web Design KOJIKA17</a></li> </ul> <h3 id="今までのやり方 (参考)"><a href="#%E4%BB%8A%E3%81%BE%E3%81%A7%E3%81%AE%E3%82%84%E3%82%8A%E6%96%B9+%28%E5%8F%82%E8%80%83%29">今までのやり方 (参考)</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://homupedia.com/bootstrap4-how-to-customize-theme.html">Bootstrap4のテーマをカスタマイズする3つの簡単な方法 | ホムペディア</a></li> </ul> <h3 id="Bootstrap (v5.0.0-alpha3)"><a href="#Bootstrap+%28v5.0.0-alpha3%29">Bootstrap (v5.0.0-alpha3)</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/twbs/bootstrap/tree/v5.0.0-alpha3">twbs/bootstrap at v5.0.0-alpha3</a></li> </ul> arm-band