LoginSignup
2
1

More than 1 year has passed since last update.

<dt><dd>要素をグリッドに配置したい、IE11で!

Last updated at Posted at 2022-03-05

<dl>要素の項目を定義リスト風に整列して表示する例が、MDNのガイド — CSS グリッドレイアウトでの自動配置に載っています。各<dt>要素にぶら下げる<dd>要素の個数がバラバラでも対応できるので便利です。
dl_1.png
このレイアウト、IE11でも表示できるでしょうか?
IE11の場合、CSSのgrid関連プロパティについてはベンダープレフィックス-ms-が必要になりますが、MDNのサンプルのCSSを単純にIE11用に書き換え、IE11で表示してみました。残念ながら(案の定?)下図のとおりレイアウトが崩れてしまいます。
dl_2.png
そこで今回は、このサンプルをIE11でも表示できるようにする方法のメモです。

まず、MDNのサンプルで使われているマークアップはこれです。

html
<div class="wrapper">
   <dl>
       <dt>哺乳類</dt>
       <dd></dd>
       <dd></dd>
       <dd></dd>
       <dt>魚類</dt>
       <dd>グッピー</dd>
       <dt>鳥類</dt>
       <dd>ハクセキレイ</dd>
       <dd>フクロウ</dd>
   </dl>
</div>

次にCSS。装飾や書式を除いてグリッドレイアウトに関わるコードのみ示します。コードはとてもシンプルで、セレクターdtとddにgrid-columnを指定するだけで自動配置できるというのがポイントです。

css
dl {
  display: grid;
  grid-template-columns: auto 1fr;
}
dt {
  grid-column: 1;
}
dd {
  grid-column: 2;
}

このCSSをIE11にも対応させてみましょう。こちらのブログ記事を参考にさせていただきました。

参考: CSS GridをIE11、EDGEに対応させるために注意する点

grid-*プロパティをベンダープレフィックス-ms-付きのものに書き換えます。

css
dl {
  display: grid;
  display: -ms-grid;  /* IE11 */
  grid-template-columns: auto 1fr;
  -ms-grid-columns: auto 1fr; /* IE11 */
}
dt {
  grid-column: 1;
  -ms-grid-column: 1; /* IE11 */
}
dd {
  grid-column: 2;
  -ms-grid-column: 2; /* IE11 */
}

このCSSで一旦IE11に適用した状態が冒頭に示した画面キャプチャです。 <dt>要素と<dd>要素の配置先の列は正しいですが、全部1行目に表示が重なってしまいました。IE11の場合、アイテムの配置先となるグリッドセルの行番号もプロパティ-ms-grid-rowで指定してやらないといけません。おまけに-ms-grid-rowauto値を認識しないようです。

CSS Grid auto placement in IE/EDGE

ならば、HTMLのソースに対応させて「何番目のddは何行目に配置」という情報をもとにセレクターddを:nth-of-type()を使って必要な分だけ書き下すという方法も考えられます。しかし、IE11だけのためにそんなことするのは、元々のシンプルなCSSで書ける利点が台無しになりバカげています。

そこで、-ms-grid-rowについてはJavaScriptから値を設定してやることにします。コードの最初にブラウザがIEかどうかをチェックし、IE以外の場合はそれ以降のコードを実行しないようにしてあります。ブラウザの判定にはUAParser.jsを使用しました。

javascript
function fixIEGrid() {
  // ブラウザ判定
  const parser = new UAParser();
  const ua = parser.getResult();
  if (ua.browser.name != 'IE') {
    return;
  }

  // for IE11
  const dl = document.querySelector('.wrapper dl');
  let row = 1;
  let el = dl.firstElementChild;
  while (el) {
    if (el.localName == 'dt') {
      el.style.msGridRow = row;
    } else if (el.localName == 'dd') {
      el.style.msGridRow = row++;
    }
    el = el.nextElementSibling;
  }
}

fixIEGrid();

結果、IE11でも定義リストのレイアウトを正しく表示できました。

dl_3.png

完成したコードはこちら: https://codepen.io/kaz_hashimoto/pen/rNYqmVd

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1