【JS】CSS変数の全ての値を取得しJSオブジェクトに変換-1
こんにちは!今日はCSS変数の取得についてです。
任意のCSS変数の値を取得
はじめに任意の値を取得してみます。
こっちはCSS変数の名前が分かっていれば取得は簡単です:) 例えば富士山(3776m)の高さを取得する時は...
:root{
--mount-fuji: 3776000mm;
}
const height = document.documentElement.style.getPropertyValue("--mount-fuji")
console.log(height) // 3776000mm
このようにシンプルに書けます。富士山の高さをミリで書くってなかなかないわね
なおCSS変数は基本的には:rootで宣言するため、今回のコードもそれを前提にしています。
複数のCSS変数の値を取得
では、複数のCSS変数を取得したい場合はどうでしょう?
:root{
--mount-fuji: 3776000mm;
--everest: 8848000mm;
}
これを配列で取得すると...
const getCSSValues = keys =>
keys.map(key =>
document.documentElement.style.getPropertyValue(key))
const heightList = getCSSValues(['--mount-fuji', '--everest'])
console.dir(heightList)
// 3776000mm
// 8848000mm
できなくもないですが、変更に非常に弱い:( 変数を変更、追加する時に絶対ミスる。
「getPropertyAll」みたいなメソッドがあれば楽なんだけど...
全てのCSS変数の値を取得(getPropertyAll)
というわけでgetPropertyAllを1つの関数で作ってみました。
:root{
--mount-fuji: 3776000mm;
--everest: 8848000mm;
}
const getPropertyAll = () =>
[... document.styleSheets].reduce((pre, cur) =>
pre
|| ([... cur.cssRules].some(sheet =>
sheet.selectorText === ':root'
)
? [... cur.cssRules].reduce((pre, cur) =>
pre
|| (cur.selectorText === ':root'
? cur.cssText.split(/:root\s*{|;|}/).reduce((pre, cur) =>
cur.trim()
? {
... pre,
[cur.match(/.*?(?=:)/)[0].replace(/-/g, '_').trim()]:
cur.match(/(?<=:)(.*)/)[0].trim()
}
: pre
, {})
: pre)
, null)
: pre)
, null)
console.dir(getPropertyAll())
// {
// __mount_fuji: 3776000mm,
// __everest: 8848000mm,
// }
なお、JSでは変数にハイフンを使えないのでCSS変数--foo-barを__foo_barにしています。
また、[... hogehoge]みたいな記述に関してはこちらの記事をご覧ください。
カオス
なぜ1つの関数で書こうと思ったのか。
近日中にもう少し分かりやすいコードを書きます。
最後に
そもそもCSS変数って使う?
私は使います(小声)
【追記】(2019/04/25)続き書きました:)
PREV
2019-04-22
【JS】HTMLCollectionをループ処理可能にする
NEXT
2019-04-25
【JS】CSS変数の全ての値を取得しJSオブジェクトに変換-2
LINK
リンク
Twitter
GitHub
TAGS
タグ
LATESTS
最新の記事
POPULAR
人気の記事
- CSS2021/04/29【CSS】右寄せの方法は結局flexが一番良さそう
- React2020/07/13【JS】Reactのstyleの使い方、書き方いろいろ
- Payment2021/10/16GooglePayでVisaタッチを使う時に知っておきたい過酷な現実【追記あり】
- Others2021/07/11Slackに予約投稿機能ができて嬉しいけどそれでもまだ少し不満な理由【追記あり】
- CSS2020/04/30【CSS】tailwind.cssでよく使うデザインパターン
- CSS2019/03/30【CSS】100vhは「一画面」ではないという罠
- CSS2020/06/09【CSS】max-font-sizeやmin-font-sizeを使いたくなったら
- Vue2019/06/29【JS】Vueの:classの書き方3通り
- JavaScript2020/09/02【JS】yarnの長所とyarnからnpmに戻ってきた理由
- React2020/06/04【JS】ReactのclassNameの色々な書き方紹介