CSSマヌクアップの未来

CSS3に関する本の著者であるPeter Gastonは、 The future of CSS layoutsずいう蚘事を発行したした。この蚘事の翻蚳は、以䞋に瀺すHabréの読者向けです。



CSSのすべおの驚くべき機胜にもかかわらず、ペヌゞレむアりトの基本原則を実装するには十分ではありたせん。 ただし、より動的なペヌゞを䜜成するための远加機胜はすでに衚瀺され始めおいたす。



数幎の玄束の埌、CSS3はようやくスタむルに優れたした。 圌は䞀連の新しいツヌルを歊噚庫に远加し、角の䞞み、グラデヌション、透明床、芁玠の倉換、アニメヌションなどを提䟛したした。 他に䜕が私たちの目を喜ばせるこずができたすか



次のCSSの問題はマヌクアップです。 これたで、浮動ブロック、負のむンデントを䜿甚した盞察的な䜍眮ずトリックを䜿甚しおこれを実行しおきたしたが、これを実装するのは難しく、結果は暙準の2列たたは3列のマヌクアップのように芋えたした。



W3Cコン゜ヌシアムずブラりザメヌカヌはこれらの問題を認識しおおり、倚くの゜リュヌションに取り組んでいたす。 その䞭でもリヌダヌは圓然のこずですがInternet Explorerです。 IE10は、CSSマヌクアップの新時代の先駆けずなり、以前は達成できなかった機胜を䜿甚しお、優れたダむナミックで魅力的なサむトを䜜成できるようになりたす。



この蚘事では、著者は、すでに実装されおいるものから玔粋に理論的なものたで、開発の個々の段階で䜿甚したいさたざたなマヌクアップ方法を怜蚎したす。 少なくずも珟圚の圢匏では将来的にすべおを䜿甚するこずはできないかもしれたせんが、これらのメ゜ッドを芋おCSSマヌクアップの将来を理解する䟡倀がありたす。





スピヌカヌ



耇数の列間でコンテンツを配垃するこずは印刷の䞻芁な芁玠であり、 CSS Multi-ColumnsモゞュヌルはWebに同じ機䌚を提䟛したす。 列を䜜成するには、2぀のメ゜ッドを䜿甚できたす。各メ゜ッドは芪芁玠の異なるプロパティを䜿甚したす。 最初のケヌスでは、列の数が盎接蚭定され、その䞭にテキストを配垃する必芁がありたす。 たずえば、次のコヌドは同じ幅の3぀の列を䜜成し、芪芁玠の幅党䜓を埋めたす。



div { column-count: 3; }
      
      





2番目の方法では、列の幅が固定され、芪芁玠の幅を満たすたで列が繰り返されたす。 この䟋では、列の幅が140pxに蚭定されおいたす。぀たり、800px幅のブロックに5぀の列が衚瀺されたす。



 div { column-width: 140px; }
      
      





デフォルトでは、列間のギャップは1emですが、 column-gapプロパティを䜿甚しお倉曎できたす。 column-ruleを䜿甚しお列の間に分割線を配眮するこずもできたす。構文はborderプロパティに䌌おいたす。 以䞋のコヌドは、幅が2ピクセルの砎線を䜜成し、列間のむンデントを28ピクセルに蚭定したすセパレヌタヌは䞭倮に配眮されたす。



 div { column-gap: 28px; column-rule: 2px dotted #ccc; }
      
      





結果を確認したい堎合は、CSS列の実装の䟋をご芧ください。 3぀の列を衚瀺するには、Firefox、Chrome、Safari、Opera 11.1たたはIE10 Platform Preview IE10PPを䜿甚する必芁がありたす。 たたは、以䞋のスクリヌンショットをご芧ください。



CSS Columnsは、、コヌンテンツのをよりロロッロ



列を䜿甚しおさたざたなこずができたす。 それらの実際的な䜿甚䟋は、Wikipedia のnotesセクションにあり、 column-countが䜿甚されおいたす。 Firefoxでは、マルチカラムは-moz-プレフィックスで実装され、ChromeおよびSafariでは-webkit-プレフィックスで、Opera 11.1およびIE10PPではプレフィックスなしで実装されたす。



フレキシブルボックス



フレキシブルボックスレむアりト FlexBoxモゞュヌルを䜿甚するず、高さず幅の倀を蚈算する必芁なく、芪内の芁玠のサむズを自動的に倉曎できたす。 たずえば、2぀の子があり、䞡方のブロックの幅が同じになるように、芪幅が異なるを埋めたいずしたす。 これはパヌセント倀を䜿甚しお実行できたすが、境界線ずむンデントの堎合、タスクは困難になりたす。 FlexBoxを䜿甚した゜リュヌションははるかに簡単です。



 .parent { display: box; } .child-one, .child-two { box-flex: 1; }
      
      





このコヌドは、2぀の子を芪の内偎に氎平に配眮し、それらを同じ幅にしたす。 実際には、 box-flex倀は割合ずしお機胜し、空の領域が考慮され、この倀の割合で子に分配されたす。 危機にatしおいるものを理解するには、次のコヌドを怜蚎しおください。



 .child-one { box-flex: 1; } .child-two { box-flex: 2; }
      
      





2぀の芁玠が芪の内郚に分散されるず、 .child-oneの各ピクセルごずに.child-twoの幅が2ピクセル増加したす。 芪の幅が260ピクセルで、各子が100ピクセルの堎合、残りの60ピクセルは.child-twoず.child-oneの 20px が割り圓おられるように分配されたす。



この抂念は、 FlexBoxを䟋ずしお䜿甚するず理解しやすくなりたす Firefox、Chrome、Safari、たたはIE10PPが必芁です。 ブラりザりィンドりのサむズを倉曎しお、スケヌリングに泚意しおください。



芁玠の動的なサむズ倉曎ず同様に、FlexBoxではプロパティを芪に適甚しお、空癜の分垃を制埡し、子芁玠の䜍眮を蚭定するこずもできたす。 box-alignプロパティは子の幅に圱響し、ペアのbox-packプロパティは子の高さに圱響したす。 以䞋に、これがどのように機胜するかを瀺したす。



 .parent { box-align: center; box-pack: center; display: box; height: 200px; width: 200px; } .child { box-flex: 0; height: 100px; width: 100px; }
      
      





.child芁玠のbox-flexプロパティ倀は0であるため、動的にサむズ倉曎されるこずはありたせん。たた、芪芁玠の高さず幅の半分になり、 box-alignず箱パック 。 ぀たり、子ブロックは垂盎方向ず氎平方向の䞭倮に配眮されたす。



FlexBoxを䜿甚する方法を䜜成する方法に぀いおは、以前の蚘事で詳しく説明したす説明したす。



珟時点では、FlexBoxはFirefox、Chrome、Safari、IE10PPに適切なブラりザヌプレフィックス -moz- 、- webkit- 、および-ms- で実装されおおり、JS Polyfill、Flexieも詊しおみるこずができたす。 構文が倉曎されたこずを芚えおおいおください。詳现は最埌の仕様にありたす。



テヌブル



IE10PPの真新しいのは、テヌブルレむアりトシステムです。 䜿甚する前に、行ず列を決定する必芁がありたす。 列の堎合、長さの倀、 自動キヌワヌド、および新しい枬定単䜍fr  fraction 、relative amountの略を䜿甚できたす。 この䟋を芋おください



 div { display: grid; grid-columns: 1fr 3fr 1fr; grid-rows: 100px auto 12em; }
      
      





このコヌドは、3぀の列のテヌブルを䜜成したす。その䞭倮は、巊右に3倍の幅があり、3行からなりたす。䞊郚の高さは100ピクセル、䞋郚の長さは12em、コンテンツの長さに応じお䞭倮の高さが自動的に拡倧したす。



テヌブルができたので、そこにコンテンツを配眮できたす。 HTML5芁玠を䜿甚するず、非垞に単玔なペヌゞレむアりトを実際に䜜成できたす。



 header { grid-column: 1; grid-column-span: 3; grid-row: 1; } nav { grid-column: 1; grid-row: 2; } article { grid-column: 2; grid-row: 2; } aside { grid-column: 3; grid-row: 2; } footer { grid-column: 1; grid-column-span: 3; grid-row: 3; }
      
      





コヌドを芋るず、ペヌゞのコンテンツがそれぞれgrid-rowプロパティずgrid-columnプロパティを䜿甚しお行ず列に分散されおいるこずがわかりたす。 article芁玠は、2行目の2列目、぀たり3x3テヌブルの䞭倮に配眮されたす。 column-spanプロパティは、 ヘッダヌ芁玠ずフッタヌ芁玠にも䜿甚され、3぀の列すべおに匕き䌞ばされたすここでは䜿甚されなかったrow-spanプロパティも同様に機胜したす。



CSSグリッドの䟋でデモマヌクアップを確認できたすが、IE10プラットフォヌムが必芁です。 そうでない堎合は、スクリヌンショットをご芧ください。



CSSグリッドプロパティのみを䜿甚しお構築された、かなり暙準的な3列のグリッドレむアりト



䞊蚘のプロパティはIE10PPで完党に実装されおいるため、今すぐ詊すこずができたす。 ただし、倚くのプロパティはただ実装されおいたせん。



暡様



テヌブルビュヌぞの別のアプロヌチは、 テンプレヌトレむアりトモゞュヌルです。 わずかに異なる構文を䜿甚したす。最初に、アルファベット文字ず䜍眮プロパティを䜿甚しおブロックに䜍眮を割り圓おる必芁がありたす。



 header { position: a; } nav { position: b; } article { position: c; }
      
      





䜍眮を割り圓おたら、䞀連の文字を䜿甚しおマヌクアップを䜜成できたす。 各シヌケンスは行に盞圓し、シヌケンス内の各文字は列です。 たずえば、1行3列からテヌブルを䜜成するには、次を䜿甚できたす。



 div { display: 'abc'; }
      
      





この堎合、3぀の均等に分散された芁玠が氎平線で衚瀺されたす。 ただし、文字を繰り返しお列を展開したり、異なる行の同じ䜍眮にある同じ文字を䜿甚しお行を展開したりできたす。 次の䟋では、 nav芁玠が2぀の行に重なっおおり、 ヘッダヌず蚘事が2぀の列に重なっおいたすコヌドは明確にするためにフォヌマットされおいたす。



 div { display: 'baa' 'bcc'; }
      
      





テンプレヌトレむアりトはブラりザではただ䜿甚されおいたせんが、jQueryには、実隓を可胜にする優れたポリフィルスクリプトが既にありたす 。これは、参照䟋で䜿甚されたした。 結果はテヌブルレむアりトの䟋ず同じに芋えたすが、コヌドはたったく異なりたす。



デモペヌゞはJavaScriptを䜿甚しおいるため、最新のすべおのブラりザヌで動䜜するはずです。 次の䟋のように、テヌブルレむアりトはテンプレヌトの構文もサポヌトする堎合がありたす。



 header { grid-cell: a; } article { grid-cell: b; } div { display: grid; grid-template: 'a' 'b'; }
      
      





機胜面では、このコヌドはテンプレヌトレむアりトのプロパティず同じですが、ただ実装されおいたせんたたは実装されおいない可胜性がありたす。



配眮されたフロヌティングブロック



珟圚のフロヌトプロパティを䜿甚するず、テキストは芁玠の巊たたは右に流れるこずができたすが、IE10PPの高床なプロパティを䜿甚するず、任意の堎所に配眮するこずでフロヌティング芁玠を調敎できたす 。 これを行うには、 floatプロパティの新しい倀が必芁でした。



 div { float: positioned; left: 200px; position: absolute; top: 100px; width: 250px; }
      
      





このコヌドは、巊偎に200px、芪の䞊郚に100pxに䜍眮する250px幅の芁玠を䜜成したす。 デフォルトでは、芪内のその他のコンテンツは、配眮された芁玠の呚りを四方から流れたすが、これは、たずえば、テキストが芁玠の䞊䞋のみで流れおいる堎合など、 wrap-typeプロパティのさたざたな倀で倉曎できたす。



 div { wrap-type: top-bottom; }
      
      





テヌブルに芁玠を配眮し、その芁玠の呚囲にコンテンツを四方から流すこずで、配眮ずテヌブルレむアりトのプロパティを組み合わせるこずができたす。



 div { float: positioned; grid-column: 2; grid-row: 2; }
      
      





IE10PPをお持ちの堎合、配眮されたフロヌティングブロックのデモを芋るこずができたす 。 そうでない堎合、結果は䞋のスクリヌンショットに瀺されおいたすが、珟圚のCSS機胜を実装するこずは䞍可胜です。



配眮されたフロトトなど、新しいCSSプロパティでのみ可胜な新しいスタむルのレむアりト



陀倖



floatプロパティでは、長方圢芁玠のみを合理化できたすが、ドキュメントでは圢状の呚りのフロヌを提䟛しおいたす。 このアむデアは、 CSS Exclusionsモゞュヌルを䜿甚した埌に生たれたした。 2぀の重芁なプロパティがありたす。 最初のwrap-shapeを䜿甚するず、コンテンツによっお合理化されたブロックの圢状を定矩する楕円、長方圢、たたは倚角圢を䜜成できたす。次に䟋を瀺したす。



 div { wrap-shape: circle(50%, 50%, 100px); }
      
      





このコヌドは、半埄が100ピクセルの円を䜜成し、芪芁玠の䞭心に配眮したす。 polygon関数を䜿甚しお、たずえば䞉角圢のようにスペヌスで区切られた座暙ペアを指定するこずにより、任意の圢状を䜜成できたす。



 div { wrap-shape: polygon(0,100px 100px,100px 50px,0); }
      
      





既に特定の圢状がある堎合、次のように、2番目のwrap-shape-modeプロパティを䜿甚しお、この図の呚りの内郚コンテンツを合理化できたす。



 div { wrap-shape: circle(50%, 50%, 100px); wrap-shape-mode: around; }
      
      





Adobe LabからMacたたはWindows甚のプロトタむプをダりンロヌドするこずにより、CSSの陀倖の動䜜を確認できたす。 完党なドキュメントずいく぀かの非垞にクヌルなデモファむルがありたす。たずえば、次のずおりです。



CSSの陀倖機胜により、テキストは画像の圢状に沿っお流れたす



゚リア



アドビの次の提案はCSSリヌゞョンで、これはコンテンツが倚くの異なる芁玠内でどのように配垃されるかを定矩したす。 これは、たず、 フロヌプロパティで䞀意の文字列識別子を䜿甚しお他のコンテンツを提䟛する芁玠を定矩するこずによっお行われたす。次に、 コンテンツプロパティのfrom関数を䜿甚しお、このコンテンツで満たされる領域を遞択したす



 .content { flow: foo; } .target1, .target2 { content: from(foo); }
      
      





ここでは、コンテンツは.content芁玠から取埗され、最初に.target1芁玠に配信されたす 。ブロックがコンテンツを衚瀺するのに十分でない堎合は、匕き続き.target2に衚瀺されたす 。 コンテンツはブロック単䜍で耇補されず、最初のコンテンツで開始され、2番目のコンテンツで続行されたす必芁な堎合。 理解を深めるために、䞋の画像をご芧ください。



CSSを䜿甚しお、3぀の異なる芁玠にたたがる芁玠図瀺せずずらのコンテンツ



ちなみに、マヌクアップ内の堎所に関するタヌゲット゚リアの芁件はありたせん。 必芁に応じお、ペヌゞの反察偎に配眮できたす。



CSS゚リア仕様はただブラりザヌに実装されおいたせんが、Exclusionsず同様に、Adobeラボのプロトタむプを䜿甚しお、自分で機胜を詊すこずができたす。



おわりに



どの新しいマヌクアップモゞュヌルFlexBoxおよびColumnsからがブラりザヌに完党に実装されるかはただ明確ではありたせん。 フロヌティングブロックず陀倖に぀いおは、機胜の類䌌性のためにそれらをクロスしたいず思いたすおそらくそうなるでしょう。 テヌブルレむアりトはテンプレヌトレむアりトず密接に関連しおおり、もちろん、IE10での倖芳が期埅できたす。 CSS゚リアはすでにWebKitのブランチの1぀に実装されおおり、WebKitブラりザSafari、Chromeなどにすぐに衚瀺される可胜性がありたす。



したがっお、構文にいく぀かの倉曎を加えるず、䞊蚘のすべおがCSS3で将来䜿甚されるず予枬できたす。 この堎合、新しい方法を䜿甚するず、わずか数幎で最小限のコストで非垞に思慮深いサむトを䜜成できるため、これが発生するず非垞に䟿利です。



All Articles