Vivliostyle.jsにおけるWeb標準、CSSサポートの大改善

2022-11-20
Shinyu Murakami
Vivliostyle Foundation

目次

  1. Web標準CSSサポートの大改善の取り組み
    1. CSS組版ならWeb標準CSSは使えて当然
    2. Vivliostyle.jsはブラウザのCSS機能を拡張
    3. 最新のCSS機能が使えなかった問題を解消
    4. ブラウザで使えるCSSプロパティと値は基本的にすべて利用可能に (v2.17~)
    5. CSS変数をサポート (v2.17~)
    6. :has()、:is()、:not()、:where() 擬似クラスをフルサポート (v2.19~)
    7. まだ残っているCSS標準サポートの課題
  2. 組版に役に立つCSS機能の追加実装
    1. これまで実装してきたCSS組版機能
    2. まだできてないCSS組版機能と改善課題
  3. Vivliostyleとそれ以外のCSS組版ツールの比較

Web標準CSSサポートの大改善の取り組み

CSS組版ならWeb標準CSSは使えて当然

Vivliostyle.jsはブラウザのCSS機能を拡張

最新のCSS機能が使えなかった問題を解消

ブラウザで使えるCSSプロパティと値は基本的にすべて利用可能に (v2.17~)

これでCSSグリッドレイアウトが使える

CSS Grid Layout の例:

.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: 50px;
}
.box1 { grid-column: 1 / 4; }
.box2 { grid-row: 2 / 4; }
.box3
.box4
.box5

CSS変数をサポート (v2.17~)

:root {
  --page-width: 148mm;
  --page-height: 210mm;
}
@page {
  size: var(--page-width) var(--page-height);}

:has()、:is()、:not()、:where() 擬似クラスをフルサポート (v2.19~)

:has() 擬似クラスの使用例:

section:has(section) {
  /* 内側にもsectionが存在するsectionのスタイル */
}
h1:has(+ p) {
  /* 段落pがあとに続く見出しh1のスタイル */
}

まだ残っているCSS標準サポートの課題

最新のブラウザで使えるのにVivliostyleでサポートできてないCSSの機能はまだあります。以下のものなど:

もうすぐ標準になる最新CSS仕様対応も

  • CSS Nesting (#1032)
    • CSSルールをネストできる(SCSSと似てる)
  • lh and rlh units (#1035)
    • lh は行高(line-height)を基準にした長さの単位。
    • rlh はルート要素のline-heightが基準。
p { /* 段落間を1行分あける */
  margin-block: 1lh;
}
header { /* 見出しブロックを3行どりに */
  block-size: 3rlh;
}

組版に役に立つCSS機能の追加実装

これまで実装してきたCSS組版機能

Vivliostyle.jsでは、ブラウザでは未サポートのページメディア用CSS仕様など組版に必要なCSS機能の実装を進めてきた。以下は主なもの:

まだできてないCSS組版機能と改善課題

以下はページメディア用CSS機能でまだできてない主なもの:

組版処理の改善の課題

  • 段組の指定がルート要素またはbody要素以外にあるとき、段組のページ分割処理がうまくいかない (#579)
  • テーブル内で脚注が機能しない (#438)
  • ページフロートの改良 (#543)
  • Mac以外の環境でハイフネーションが無効になる (#569)
    • Vivliostyle CLIをWindows、LinuxあるいはDockerで使う場合(Chromiumの問題)。

Vivliostyleとそれ以外のCSS組版ツールの比較

CSS組版ツールを比較評価してるサイト

print-css.rocksというサイトで、いくつかのCSS組版ツールをいろいろテストしての比較一覧が公開されている:

Vivliostyleまだまだ開発途上なのでどうぞよろしく!