CSSを使用して不均等にDIVを中央に配置する


23

フレックスボックスを使用して、DIVを別のDIVの中央に配置しています。必要に応じて画面の中央にポップアップするダイアログウィンドウを考えてみてください。

正常に機能しますが、ダイアログの上下のスペースが完全に等しくなく、ダイアログの上下に残りのスペースの40%と60%があると、見栄えがよくなります。内部のテキストの量によってダイアログの高さが変わるため、注意が必要です。

たとえば、ブラウザの高さが1000ピクセルで、ダイアログウィンドウの高さが400ピクセルの場合、残りの垂直方向のスペース(600ピクセル)をダイアログの上240ピクセル、下360ピクセルにしたいとします。私はJavaScriptでそれを行うことができますが、CSSでいくつかの巧妙な方法があるかどうか知りたいです。#dialogBox DIVに下マージンを追加しようとしましたが、ダイアログの高さがブラウザーの高さに近づくと機能しません。

#dialogBoxPanel
  {
  position:absolute;
  display:flex;
  align-items:center;
  justify-content:center;
  left:0px;
  top:0px;
  width:100%;
  height:100%;
}
#dialogBox
  {
  width:350px;
}
<div id="dialogBoxPanel">
  <div id="dialogBox">Text</div>
</div>


ビューポート全体をカバーするために外部パネルが必要ですか?そうでない場合は、css-tricks.com / centering-css-complete-guideのセクション「水平方向と垂直方向の両方/要素の幅と高さが不明ですか?」の解決策を使用して、変換率の値を変更します。(そして、親の完全なビューポートサイズ[背景]が必要な場合でも、両方を組み合わせることができるはずです-フレックススタッフを排除し、残りはとどまります。)
04FS

ええ、外側のパネルには減光効果があるので、ビューポート全体を覆う必要があります。しかし、その中に別のDIVを追加することもできます。そうすれば、ソリューションは正常に機能します。ありがとう04FS!
ビョルンモレン

正確を期すために、中央揃えではなく、垂直方向の配置について話しています。
マイケルベンジャミン

回答:


11

擬似要素と列の方向を使用して、空白をシミュレートします。flex-grow疑似要素のを調整するだけで、それぞれが必要とする空き容量を制御できます。等しいflex-growは等しいスペースを与えます:

2およびも使用できます3。同じ比率を維持する必要があるだけです。

別のアイデアは、トップ値に等しい値を使用し40%、位置を移動で修正することです(心合わせ50%時と同じロジック)。

#dialogBoxPanel {
  position: absolute;;
  left: 0px;
  top: 0px;
  width: 100%;
  height: 100%;
  /* the center */
  background:linear-gradient(red,red) center/100% 1px no-repeat;
}

#dialogBox {
  position:relative;
  top:40%;
  width: 350px;
  transform:translateY(-40%);
  margin:auto;
  border:1px solid;
}
<div id="dialogBoxPanel">
  <div id="dialogBox">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc hendrerit diam eu nisl fringilla ornare. Pellentesque aliquam quam et tellus egestas sodales. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin bibendum,</div>
</div>


テマニさん、ありがとうございました!どちらのソリューションも完全に機能し、ダイアログがブラウザよりも高い特別な場合を除いて、まったく同じように見えます。最初の解決策は、ダイアログの上部をブラウザの上部に揃え、下部でトリミングします。2番目は、下部と上部の両方をトリミングします。好みの問題。
ビョルンモレン

5

このソリューションの用途はdisplay: grid、それは新機能ですので、必ず確認してブラウザのサポートをしてこちらをクリックより学ぶこと。

これは、上部と下部のスペースを制御する行です。

grid-template-rows: 40fr [content-start] auto [content-end] 60fr;

スニペットのテキストコンテンツを編集して、高さが変わってもボックスが中央に配置されていることを確認できます。

#dialogBoxPanel {
    display: grid;
    place-content: center;
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    grid-template-rows: 40fr [content-start] auto [content-end] 60fr;
}
#dialogBox {
    border: 1px solid;
    width: 350px;
    grid-area: content;
}
<div id="dialogBoxPanel">
   <div id="dialogBox" contenteditable>Text</div>
</div>


1
の使用を検討します4fr auto 6fr。あなたが持っているものは機能しますが、40%+ 60%+ 1frが常に100%より大きくなり、オーバーローが上部と下部から均等に分割されるように、オーバーフローが発生します:jsfiddle.net/cobutn0e/2。また、予想とは100%異なることにも気づくでしょう
Temani Afif

1frをautoに変更しました。質問の値と一致させるために、%のままにしておきます。エラーを指摘してくれてありがとう!
rafaelcastrocouto

autoと1frはあなたのケースで同じ結果を与えます、問題はパーセンテージの使用です。1fr=minmax(auto,1fr)そして、あなたの場合auto、40%+ 60%= 100%(それゆえ、常にオーバーフローが発生するのはそのためです)なので、空き領域がないために低下します
Temani Afif

1
ここに私のポイントを説明する別のフィドルがあります:jsfiddle.net/cobutn0e/3 最初の3は同じで、3番目は0に下がり、最後の1つは私が提案したものです
Temani Afif

今では理解できます。1日の終わりは同じなので、40frと60frを使用します。時間を割いて教えてくれてありがとう!
rafaelcastrocouto

4

スペーサーdivを追加して、4:6の比率でフレックスグローを設定できます。

#dialogBoxPanel {
  position: absolute;
  display: flex;
  flex-direction: column;
  align-items: center;

  left: 0px;
  top: 0px;
  width: 100%;
  height: 100%;
}

#dialogBox {
  width: 350px;
  border: 1px solid black;
}

.spacer-top{
  flex-grow: 4;
}
.spacer-bottom{
  flex-grow: 6;
<div id="dialogBoxPanel">
  <div class="spacer-top"></div>
  <div id="dialogBox">Text</div>
  <div class="spacer-bottom"></div>
</div>


今だけ@Temani Afifの答えを見ましたが、それは「後」と「前」でも同じように機能します
Itay Gal

0

位置とマージンを使用した簡単な方法、ダイアログの高さは常にブラウザーの高さの40%であると想定しました。

.modal{
            max-height:50%;
            width:400px;
            margin: 10% auto 5% auto;
            position:absolute;
            top:0;
            bottom:0;
            right:0;
            left:0;
            overflow-y: auto
        }
        .modal-body{
            background-color: beige;
            padding: 20px;
            line-height: 21px
        }

HTML

<div class="modal">
 <div class="modal-body">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea </div>
</div>

こんにちは、次回は質問を注意深く読んでください。「ダイアログの高さは内部のテキストの量によって異なります。」
rafaelcastrocouto

1
@rafaelcastrocouto-高さなしでそのままにしても、上部と下部の空間の美しさの目的を解決できないため、最大高さをパーセントで制御するようになりました。
Anshul Chaurasia
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.