Відцентруйте DIV нерівномірно за допомогою CSS


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 , розділ "І по горизонталі, і по вертикалі / Чи є елемент невідомої ширини та висоти?", І змінити значення перекладу відсотків. (І навіть якщо вам потрібен повний розмір огляду для батьків [фоном?], Ви маєте змогу поєднати обидва
відірвіться

Так, я маю ефект затемнення на зовнішній панелі, тому вона повинна охоплювати весь вікно перегляду. Але я можу додати ще один DIV всередині нього, і ваше рішення спрацювало б чудово. Дякую 04FS!
Бьорн Морен

Для точності ви говорите про вертикальне вирівнювання, а не по центру.
Майкл Бенджамін

Відповіді:


11

Використовуйте псевдоелемент та напрямок стовпчика для імітації білого простору. Просто налаштуйте 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>


Велике спасибі Темані! Обидва рішення працюють ідеально і здаються однаковими, за винятком особливого випадку, коли діалогове вікно вище, ніж браузер. Перше рішення тримає верхню частину діалогового вікна врівні з вершиною браузера, обрізаючи внизу. Другі посіви як нижньої, так і верхньої. Просто питання переваги.
Бьорн Морен

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 перші однакові, третій падає на 0, а останній - те, що я запропонував
Temani Afif

Тепер я це розумію, має сенс. Ви повинні використовувати 40fr і 60fr, оскільки це так само в кінці дня. Ще раз дякую, що знайшли ваш час, щоб навчити мене!
rafaelcastrocouto

4

Ви можете додати пробіли девайсів і встановити зігнутий зріст зі співвідношенням 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 Чаурасія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.