flexbox - всплывающее окно "Святой Грааль" на странице "Святой Грааль" - PullRequest
0 голосов
/ 08 июня 2018

Вчера, после того, как я наконец-то правильно заработал макет «Святой Грааль» на своей главной странице ... Я попытался вставить «Святой Грааль» во всплывающее окно без особого успеха.У меня две основные проблемы.

1) Всплывающий Святой Грааль не будет занимать 100% высоты, несмотря на то, что родитель имеет определенную высоту.

2) Это, вероятно, относится ко всем всплывающим окнам, но если я установлю свое всплывающее окно на 100% ширины и 100% высоты, то попытаюсь применить к нему заполнение ... оно просто смещает всплывающее окно вправо, но делаетне принимать во внимание правильную ширину.Это раздражает ... Я нашел этот хак с использованием translate: (-50%, -50%) .. но это не совсем то же самое ... Я хотел бы иметь возможность установить поле / отступ32px на моем всплывающем окне, и оно работает (как нормальный человек, предположите, что это будет работать).Код ниже демонстрирует проблему.Всплывающая версия Святого Грааля не будет распространяться на дно и, если вы попытаетесь установить поля, она не будет вести себя так, как ожидал бы здравомыслящий человек.

Я хочу, чтобы это работало, потому что, по сути,каждая страница, которую я когда-либо хотел сделать, была бы вариацией этого, плюс или минус разные части.Если я смогу сделать это, то теоретически смогу сделать что-нибудь с макетом.

Заранее спасибо!

Код:

body {
  display: flex;
  flex-direction: column;
  color: white;
  background-color: black;
}

.flexcolumncontainer {
  display: flex;
  flex-direction: column;
}

.flexrowcontainer {
  display: flex;
  flex-direction: row;
}

.absolutepositioned {
  left: 0;
  top: 0;
  position: absolute;
  background-color: #00ffff;
  color: black;
}

.layout__body {
  display: flex;
  flex: 1;
}

.layout__content {
  flex: 1;
  overflow: auto;
}

.layout__columns {
  flex: 0 0 12em;
}

.layout__nav {
  order: -1;
  position: relative;
}

.layout__aside {
  position: relative;
}


/*assign this style to a flex item to fix STUUUPID positioning problems with relative positions*/


/*you can set style="somestyle someotherstyle flexfixpos"*/

.fixflex {
  position: relative;
}

.layout__content {
  background: orange;
  position: relative;
}

.layout__columns {
  background: green;
}

header,
footer {
  background: #000;
  color: #fff;
  padding: 10px;
  position: relative;
}

footer a {
  flex: 1;
}

h1 {
  margin: 0;
  font-size: 15px;
}

body.fillbrowser,
html.fillbrowser {
  height: 100%;
  margin: 0;
  font-family: Helvetica;
}

.popup {
  display: block;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 80%;
  height: 80%;
  padding: 32px 32px 32px 32px;
}
<!DOCTYPE html>
<![p]template="none" />
    <html>
    <head>
        <link rel="stylesheet" type="text/css" href="HolyGrail.css">
    </head>
    <body>
    <style>
        body, html {
          height: 100%;
          margin: 0;
          font-family: Helvetica;
        }
    </style>
      <header>
        <h1>FLEXBOX LAYOUT PROOF OF CONCEPT</h1>
      </header>
      <div class="layout__body">
        <main class="layout__content">
           	<div class="absolutepositioned">For the body</div>
            <div style="color: #00FFFF;"><b>absolute positioned stuff</b></div>
        </main>
        <nav class="layout__nav layout__columns">
            NAV ITEMS<br>
            NAV ITEMS<br>
            NAV ITEMS<br>
            NAV ITEMS<br>
            NAV ITEMS<br>
            NAV ITEMS<br>
            NAV ITEMS<br>
            NAV ITEMS<br>
            NAV ITEMS<br>
            NAV ITEMS<br>
           	<div class="absolutepositioned">For the NaV</div>
        </nav>
        <aside class="layout__aside layout__columns">YOUR VIAGRA ADS HERE
           	<div class="absolutepositioned">absolute right bar</div>
        </aside>
      </div>
      <footer> <div class="absolutepositioned">FOOTER</div>
      </footer>
        <div class="popup">
            <div class="fillpopup">
                <div class="flexcontainer">
                  <header>
                    <h1>THIS IS A POP-UP THAT IS ALSO FLEX BUT SHOULD TAKE UP ENTIRE HEIGHT</h1>
                  </header>
                  <div class="layout__body">
                    <main class="layout__content">
                        <div class="absolutepositioned">For the body</div>
                        <div style="color: #00FFFF;"><b>the blue box should be here</b></div>
                    </main>
                    <nav class="layout__nav layout__columns">
                        NAV ITEMS<br>
                        NAV ITEMS<br>
                        NAV ITEMS<br>
                        NAV ITEMS<br>
                        NAV ITEMS<br>
                        NAV ITEMS<br>
                        NAV ITEMS<br>
                        NAV ITEMS<br>
                        NAV ITEMS<br>
                        NAV ITEMS<br>
                        <div class="absolutepositioned">For the NaV</div>
                    </nav>
                    <aside class="layout__aside layout__columns">YOUR VIAGRA ADS HERE
                    <div class="absolutepositioned">absolute right bar</div>
                    </aside>
                  </div>
                  <footer> <div class="absolutepositioned">FOOTER</div>
                  </footer>
                </div>
            </div>
        </div>
    </body>
    </html>

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

Так что, если я вас правильно понимаю, что я не уверен, вы хотите всплывающее окно над макетом страницы, которое будет заполнять область просмотра и прокручивать, если содержимое становится слишком длинным?

ЕслиПравильно, тогда, возможно, что-то подобное поможет вам начать:

html,
body {
  margin: 0;
}

.wrapper {
  display: flex;  
  flex-flow: row wrap;
}

.wrapper > * {
  padding: 10px;
  flex: 1 100%;
}

.header {
  background: tomato;
}

.footer {
  background: lightgreen;
}

.main,
.aside {
  min-height: calc( 100vh - 100px );
}

.main {
  background: deepskyblue;
}

.aside-1 {
  background: gold;
}

.aside-2 {
  background: hotpink;
}

.popup {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  overflow: auto;
}

@media all and (min-width: 600px) {
  .aside { flex: 1 0; }
}

@media all and (min-width: 800px) {
  .main    { flex: 3 0px; }
  .aside-1 { order: 1; } 
  .main    { order: 2; }
  .aside-2 { order: 3; }
  .footer  { order: 4; }
}
<!doctype html>
<html>
<head>
    <link rel="stylesheet" type="text/css" href="whatever.css" />
</head>

<body>

<!-- Bottom layer -->
<div class="wrapper">

    <header class="header">
        Header
    </header>

    <article class="main">
        <p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p>  
    </article>

    <aside class="aside aside-1">
        Aside 1
    </aside>

    <aside class="aside aside-2">
        Aside 2
    </aside>

    <footer class="footer">
        Footer
    </footer>

</div>
	
<!-- Popup -->
<div class="wrapper popup">

    <header class="header">
        Popup Header
    </header>

    <article class="main">
        <p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p>  
    </article>

    <aside class="aside aside-1">
        Popup Aside 1
    </aside>

    <aside class="aside aside-2">
        Popup Aside 2
    </aside>

    <footer class="footer">
        Popup Footer
    </footer>

</div>
	
</body>

</html>

Это основано на примере Криса Койера на этой странице , поэтому дизайн также отзывчивый.Все, что я сделал, это применил position: fixed к всплывающему окну, прикрепил его ко всем сторонам области просмотра и установил overflow: auto.Если вы хотите использовать position: absolute, тогда вы все равно можете использовать bottom: 0, top: 0, left: 0, right: 0, чтобы растянуть его, чтобы заполнить его контейнер.

Если вам нужны фиксированные высоты для верхнего и нижнего колонтитула, вы можете сделать это (как я использовалв приведенном выше примере):

.main, aside {
  min-height: calc(100vh - 100px);
}
0 голосов
/ 09 июня 2018
.popup {
  display: block;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 80%;
  height: calc(100% - 64px);
  padding: 32px;
  box-sizing: border-box;
}

работает для меня, но вы должны дать всем детям

height: 100%;

, что делает div.popup полноэкранным, за исключением заполнения 32 пикселя сверху и снизу для меня.И я думаю, это то, что вы хотели, верно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...