両方またはdisplay: grid/-ms-grid
を1つのスタイルシートに使用する方法はありますか。HTMLハックまたはJavaScriptを使用して、グリッドレイアウトでページが表示されているブラウザーの種類を照会する必要がありますか。
例:
次のスタイリングは機能しないようです
.container {
display: grid -ms-grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(150px, 50px);
grid-gap: 1vw;
-ms-grid-columns: repeat(4, 1fr);
-ms-grid-rows: repeat(150px, 50px);
-ms-grid-gap: 1vw;
}
新しいCSSグリッドレイアウト構文を時代遅れのIEに変換することは、本当に難しいことです。ベンダープレフィックスを追加するだけではありません。
IEは、CSSグリッドレイアウトの新しいバージョンに存在するもののサポートを非常に限定しています。 IEのサポートはありません
grid-auto-flow
_ CSSプロパティ);repeat
関数、および_auto-fill
_や_auto-fit
_などの特別な値)。これは、場合によっては、grid-template-columns: repeat(4, 1fr)
を_-ms-grid-columns: 1fr 1fr 1fr 1fr
_に置き換えることができ、これが完全に機能するように、明示的な値に置き換える必要があることを意味します。しかし、grid-template-columns: repeat(auto-fill, 1fr)
のようなものがある場合、IEでこれを実装することは不可能です。grid-row-gap
_、_grid-column-gap
_、_grid-gap
_ CSSプロパティ)。追加のグリッドトラックを使用してギャップを偽造できます。grid-auto-columns
_、_grid-auto-rows
_ CSSプロパティ);grid-area
_、_grid-template-areas
_ CSSプロパティ)。IEのこの可能性を忘れてください。
また、サポートされているIEプロパティの値はサポートされていません
IE実装では自動配置の動作はありません。つまり、グリッドの自動配置機能を使用するのではなく、すべてを配置する必要があります。
アイテムを配置しない場合、グリッドの最初のセルにアイテムが積み重ねられます。つまり、グリッドアイテムごとに明示的に位置を設定する必要があります。そうしないと、最初のセルに配置されます。このようなマークアップがある場合:
_.wrapper {
display: -ms-grid;
display: grid;
grid-gap: 10px;
-ms-grid-columns: 50px 50px;
grid-template-columns: 50px 50px;
-ms-grid-rows: 50px 50px;
grid-template-rows: 50px 50px;
background-color: #fff;
color: #444;
}
.box {
border-radius: 5px;
padding: 20px;
font-size: 150%;
}
_
_<div class="wrapper">
<div class="box a">A</div>
<div class="box b">B</div>
<div class="box c">C</div>
<div class="box d">D</div>
</div>
_
IEでこれが表示されます
したがって、IE(ケースのレイアウトを変換できることがわかっている場合)のCSSグリッドを開発する場合、基本的に2つのオプション(方法論)があります。
IE browser and other browsersに異なるマークアップを生成します。この場合、マークアップの類似性は気にしません(grid-template-rows: repeat(150px, 50px)
の値は無効なので、 _grid-template-rows: 150px 50px
_)が必要でした。
_.container {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: 150px 50px;
grid-gap: 1vw;
display: -ms-grid;
/* also faking 1vw grid-gap */
-ms-grid-columns: 1fr 1vw 1fr 1vw 1fr 1vw 1fr;
/* also faking 1vw grid-gap */
-ms-grid-rows: 150px 1vw 50px;
}
.grid-item {
/* style just for demo */
background-color: yellow;
}
/* Explicit placement for IE */
/* Omitting default value of -ms-grid-column: 1 and -ms-grid-row: 1 where possible */
.grid-item:nth-child(2) {
-ms-grid-column: 3;
}
.grid-item:nth-child(3) {
-ms-grid-column: 5;
}
.grid-item:nth-child(4) {
-ms-grid-column: 7;
}
.grid-item:nth-child(5) {
-ms-grid-row: 3;
}
.grid-item:nth-child(6) {
-ms-grid-row: 3;
-ms-grid-column: 3;
}
.grid-item:nth-child(7) {
-ms-grid-row: 3;
-ms-grid-column: 5;
}
.grid-item:nth-child(8) {
-ms-grid-row: 3;
-ms-grid-column: 7;
}
_
_<div class="container">
<div class="grid-item">1,1</div>
<div class="grid-item">1,2</div>
<div class="grid-item">1,3</div>
<div class="grid-item">1,4</div>
<div class="grid-item">2,1</div>
<div class="grid-item">2,2</div>
<div class="grid-item">2,3</div>
<div class="grid-item">2,4</div>
</div>
_
IEブラウザに対して非常に似たマークアップを生成します。この場合、すべてのブラウザに対するマークアップは非常に似ています。異なるアプローチを気にする必要はないため、これはより保守性があります。
_.container {
display: -ms-grid;
display: grid;
/* also faking 1vw grid-gap */
-ms-grid-columns: 1fr 1vw 1fr 1vw 1fr 1vw 1fr;
grid-template-columns: 1fr 1vw 1fr 1vw 1fr 1vw 1fr;
/* also faking 1vw grid-gap */
-ms-grid-rows: 150px 1vw 50px;
grid-template-rows: 150px 1vw 50px;
}
.grid-item {
/* style just for demo */
background-color: yellow;
}
.grid-item:nth-child(2) {
-ms-grid-column: 3;
grid-column: 3;
}
.grid-item:nth-child(3) {
-ms-grid-column: 5;
grid-column: 5;
}
.grid-item:nth-child(4) {
-ms-grid-column: 7;
grid-column: 7;
}
.grid-item:nth-child(5) {
-ms-grid-row: 3;
grid-row: 3;
}
.grid-item:nth-child(6) {
-ms-grid-row: 3;
grid-row: 3;
-ms-grid-column: 3;
grid-column: 3;
}
.grid-item:nth-child(7) {
-ms-grid-row: 3;
grid-row: 3;
-ms-grid-column: 5;
grid-column: 5;
}
.grid-item:nth-child(8) {
-ms-grid-row: 3;
grid-row: 3;
-ms-grid-column: 7;
grid-column: 7;
}
_
_<div class="container">
<div class="grid-item">1,1</div>
<div class="grid-item">1,2</div>
<div class="grid-item">1,3</div>
<div class="grid-item">1,4</div>
<div class="grid-item">2,1</div>
<div class="grid-item">2,2</div>
<div class="grid-item">2,3</div>
<div class="grid-item">2,4</div>
</div>
_
display
ルールを正しく構成する必要があります。あなたが持っているものは無効です。
_display: grid -ms-grid;
_
また、_grid-template-rows
_ルールは無効です。最初の引数は、繰り返し回数を指定する整数であると想定されています。
_grid-template-rows: repeat(150px, 50px);
_
また、repeat()
表記が older specs に存在するとは思わない。 現在の仕様 で導入されたように見えるので、IEはサポートしません。
_-ms-grid-columns: repeat(4, 1fr);
-ms-grid-rows: repeat(150px, 50px);
_
最後に、公式の(W3C)プロパティを接頭辞付きのバージョンの後に配置して、カスケードで優先されるようにするのが最善です( more details )。
これを試して:
_.container {
display: -ms-grid;
display: grid;
-ms-grid-columns: 1fr 1fr 1fr 1fr;
grid-template-columns: repeat(4, 1fr);
-ms-grid-rows: 150px 50px;
grid-template-rows: 150px 50px;
-ms-grid-gap: 1vw;
grid-gap: 1vw;
}
_
Vadimによる答えは、あなたがすべきことである。しかし、痛みを和らげるために使用できるCSSトリックがいくつかあります。
。 IEをサポートするWebサイトにグリッドを使用するかどうかを決定するには、このブログ投稿を必ず読んでください: https://rachelandrew.co.uk/archives/2016/11/26/should-i-try-to -use-the-ie-implementation-of-css-grid-layout /
前の質問に対する答えが「はい」の場合は、次をお読みください。
仕様に準拠したCSSを作成したいが、それでもIEが@supports()
at-ruleである場合に使用します。より高度なものを使用するために使用します。 grid-gaps
などのグリッドプロパティ:
.card-list {
grid-row: 4;
grid-column: 1 / 3;
padding: 1.5vh 1vh;
display: grid;
grid-template-rows: 1fr 1fr;
grid-template-columns: 1fr 1fr;
}
.card {
margin-bottom: 1vh;
}
.card:nth-of-type(odd) { /* takes care of IE */
margin-right: 1vh;
grid-column: 1;
}
.card:nth-of-type(even) {
grid-column: 2;
}
@supports(grid-gap: 1vh) { /* still using standard code! */
.card-list {
grid-gap: 1vh;
}
.card {
margin-right: 0;
margin-bottom: 0;
}
}