CREATOR BLOG

【CSS3】Firefoxでwriting-modeが使えなくて困ったのでどうにかした話

2014/09/08
atsuko.a
  • このエントリーをはてなブックマークに追加

こんにちはフロントエンドエンジニアのあつこです(ΦωΦ)
前回の記事の流れ的にAPIの話をするのかと思いきや、早速しません。
先日Firefoxでドはまりしたのでその時の対処方を備忘録的に。
(APIの話の続きは次に書きます、多分・・・)

ちなみに8月中に滑りこみでスイカを食べました。唯一の夏体験…

事の発端

私は主に自社サービス開発のチームにおりまして、先日もサービスの管理画面のコーディングをしておりました。
で、表組の表示切り替えにタブっぽい表現を使うことになりました。
tab1
ソースはこんな感じ

縦タブと横タブの判別はクラス名のclass="tablink1"/class="tablink2"でしています。
CSSはこちら

tablink2の縦書はCSS3のwriting-modeで実装しています。
ちなみに日本語が入るとこんな感じ。
tab2
英字→横書きが縦になる、日本語→フォント自体が立つ、という表示になっていますがこれもその他のプロパティで変えることが出来るようです。

そしてこれをFirefoxで開くと
tab3
ファッ!?
横並びはよしとして、縦書が何だか面白いことになっています。
どうやらwriting-modeが有効になっていないようです。

writing-modeとは

そもそもwriting-modeとはIEの独自プロパティで5.5から実装されていたようです。
値はlr-tb/lr-bt/rl-tb/rl-bt/tb-lr...など実は結構あるのですがあくまでもIEの独自実装です

それとは別にWC3が出している「CSS Writing Modes Level 3」というものがありまして、多文化の筆記様式をサポートするためにCSSの機能を定義しています。
筆記様式というのは例えば英語と日本語とアラビア語、等言葉を表記した際の向きや読み順の方法を指しています。
2014/3/20時点で勧告候補となっていて、Webkit系のブラウザにベンダープレフィクス付きで先行実装されているようです(・ω・)

その中の1つにwriting-modeプロパティがありまして、指定出来る値はIEのwriting-modeと異なります

writing-modeに指定出来る値
horizontal-tb 上から下へ読む横書き デフォルト
vertical-rl 右から左へ読む縦書き
vertical-lr 左から右へ読む縦書き

上でも書いたようにWebkitの先行実装+IEの独自実装だったためFirefoxでは再現できなかったという訳ですね。

Firefoxでどうにか縦書にしたい

さて、CSSのみで縦書実装が出来ないことが判明したわけでどうにかしないといけません。

  1. 縦書を諦める(横並びのタブだけで何とかする)
  2. JS(jQuery)のプラグインでどうにかする
  3. CSSの回転で無理やり何とかする

選択肢は↑の3択になりました。
画面の構成上1(諦める)は出来なかったので、大人しくプラグインを探し始めたのですが中々しっくり来るものが無く結局CSSの回転とJSを使ってごにょごにょすることにしました。
また、その他要素との兼ね合いでulごとごそっと回す方法が出来ないので、子要素をグリグリ回したいと思います。

考えた手順はこう

  1. Firefoxだけ横並びにする
  2. それぞれのタブの縦横の大きさを取得する
  3. タブの中身(a/span)を90度回転させる
  4. タブの外側(li)を元のタブの大きさにする
  5. ↑を全てのタブにやったら縦に並べる

1.CSS側の準備

まず、縦タブの見た目をFirefoxだけ横に戻します

Firefox用のCSSハックなんて初めて使いました。(いつもIEばっかりだから…)
するとこうなります
tab5
角丸等含め、liの中身が横に並んでおります。
謎のmargin30pxは後で解説します。

2.jQueryでごにょごにょする

これは簡単

何故大きさを取得してから回転させているかというと、CSSのプロパティtransformは親要素に干渉しないので子要素が回転したとしても回転する前の大きさを保持するんですね。
transformの結果子要素がはみ出そうが小さくなろうが親要素は全く反応しません、すごい。
なので、わざわざ子要素の大きさをお知らせしてあげるために、一旦大きさを取得しています(`・ω・´)シャキーン
ちなみに、CSSの方で指定している謎のmargin30pxもtransformの調節のために使っています。
tab6
図解してみました。

そうしてできたのがこちら

Firefoxで開いてみます…ドキドキ
tab7
わーい!タブが縦になってるよー!!!ワーイヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノワーイ
ちなみに日本語を入れるとこうなる。
tab8
ポイントとしてはこちら

  • CSSとJSの併用なので処理が重すぎない
  • FirefoxのみCSSとイベントが発火するので、その他ブラウザはもっと早い
  • 横書きの要素を回転させているので、Firefoxでは文字が立たない(WEBフォントでどうにかなるかも…)

文字が立たないのはどうしようもなかったのですが、WEBフォントを入れるほどの優先度ではなかったのでそのままにしました。
タブの量が多くなると処理的にulごと回した方がよくなるかな、と思います。
あと、Operaは見てない。

おまけ:CSS Writing Modes Level 3について

前述の通りこれは様々な文化圏の筆記様式をサポートするためのCSSの機能群ですが、これにはwriting-modeの他にも以下のものが勧告候補として含まれています。

direction 文字の表記方向を指定する。右→左/左→右
unicode-bidi ユニコードの表記方向を上書きする 上書きの方向はdirectionで指定する
caption-side 表に対して付けるキャプションの位置を指定する
(値の一部が勧告対象)
text-combine-upright 縦中横(縦書の文中にある横書き文字)の指定

CSS Writing Modes Level 3が正式に勧告されると、多文化圏への適応以外にも、今回のようなレイアウトもCSSのみで実装できるようになりそうですね٩(๑❛ᴗ❛๑)۶
それでは今日はこのへんで!

Recent Entry

CSSの単位まとめ pxからvm/vh/vmin/vmaxまで

レスポンシブHTMLメールを作ってみての感想

CSSのリファクタリングでした5つのこと

大人が読んでも頭を使う絵本の紹介

サイト内にうまくInstagramを取り入れてるサイト11選

Category

Archive