Адаптивный нижний колонтитул отображается поверх частей содержимого при сжатии браузера - PullRequest
0 голосов
/ 28 апреля 2018

Я довольно новичок в CSS и HTML.

И я понимаю, что этот вопрос задавался несколько раз, но я не могу решить мою текущую проблему.

Я работал над небольшими небольшими проектами, например пытался воссоздать другие веб-сайты с дополнительными функциями.

Моя текущая задача - воссоздать область поиска на главной странице, например, Google.

Реализация и выпуск

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

Осуществление

Основной div с идентификатором контейнера, минимальной высотой 100% и относительной позицией.

Внутри div контейнера находятся элементы nav (#nav), center (#center) и footer (#footer) и их соответствующие идентификаторы.

  • nav : гибкий дисплей, базовые элементы выравнивания и минимальная высота 9vh.
  • центр : ширина 100% и минимальная высота 10vh;
  • нижний колонтитул : абсолютное положение, снизу 0 , ширина 100%

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

Выпуск

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

Как вы увидите из блока фрагментов кода в ссылке JSbin, у меня проблема с нижним колонтитулом.

Текущие файлы HTML + CSS и вывод : JSBin

*{
    margin: 0px;
    padding: 0px;
}
html, body {
    height: 100%;  
}

#container {
    min-height:100%;
    position:relative;

}

a:visited{
    color: #609;
}

/* ----- Navigation Styling ----- */

#nav {
    display: flex;
    border: 10px solid  goldenrod;               /*Colourful Borders*/
    min-height:9vh;
    justify-content:flex-end;
    align-items: baseline;
    background:#ff0;
    padding:10px;
}

/*Nav Content*/

/* ----- Center Styling ----- */

#center {
    width: 100%;
    background-color: white;
    min-height:10vh;     
}

.ctr_img {
    height: 92px;
    width: 272x;
    padding-top: 20px;
    
}
.ctr_img:hover {
    -webkit-filter: invert(100%);
}

.img_mic {
    padding: 0 8px;
    float: right;
    display:inline-block;
    top: -30px;
    position: relative;
}

.srch_bx {
    border-style: hidden;
    box-shadow: 0 2px 2px 0 rgba(0,0,0,0.16), 0 0 0 1px rgba(0,0,0,0.08);
    max-width: 40%;
    min-height: 40px;
}

.srch_in {
    width: 100%;
    border-radius: 2px;
    border: none;
    overflow: auto;
    outline: none;
    left: 0px;
    background: url(data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw%3D%3D) transparent;
    font: 16px arial,sans-serif;
    display: inline-block;
    text-align: start;
}

.mic_set {
    background-size: 30px 30px;
    height: 100%;
    width: 26px;
}

.btn_sbmt {
    padding: 20px 50%;
    min-height: 20px;
    display: flex;
    justify-content: center;
}

.btn_srch, .btn_lcky {
    background-color: #f2f2f2;
    border: 1px solid #f2f2f2;
    border-radius: 2px;
    color: #757575;
    font-family: arial,sans-serif;
    font-size: 1vw;
    font-weight: bold;
    margin: 11px 4px;
    padding: 0 16px;
    height: 36px;
}
    
.lang_diff{
    max-height: 28px;
    font-size: 0.9vw;
    margin-bottom: 24px;
    font-family: arial,sans-serif;
}

/* Footer Styling */

#footer {
    position:absolute;
    bottom:0;
    height: 5.2em; /* Height of the footer */
    width: 100%;
    min-height: 10vh;
    background-color: #f2f2f2;
    line-height: 40px; /*Specifies the line height.*/
    min-width: 400px;


}

.ctry {
    display: flex;
    margin-left: 30px;
    text-align: left;
    color: rgba(0,0,0,.54);
    border-top: 1px solid #e4e4e4;
    max-width: 150px;
}

.ctry_ftr {
    font-size: 1vw;
}

.opt_ftr {
    display: flex;
    justify-content:space-between;
    border:  1px solid #e4e4e4;
}

span.blft_ftr a, span.brght_ftr a, span.brght_stg a {
    text-decoration: none;
    color: #666;
    margin-left: 16px;
    font-size: 1vw;
}

.brght_ftr{
    margin-right: 30px;
    float: right;
}

.adv_ftr {
    padding: 0 16px;
    text-decoration: none;
    display: inline-block;
}
<!DOCTYPE html>
<html>
    <head>
        <title>Testing Ground</title>
        <link rel="stylesheet" type="text/css" href="style.css" />
        <link rel="stylesheet" type="text/css" href="reset.css" />
        <link rel="icon" href="http://www.favicon.cc/logo3d/53653.png" />
        <meta charset="UTF-8">
    </head>
    <body>  <!--FLEX-->
        <div id="container"> <!-- Added New for Footer behaviour -->
            <nav id="nav" class="nav_cls">
                <!--Currently at work-->
                <p>Navigation Bar Content</p> 
            </nav>
            <center id="center">
                <a class="img_link" href="">
                    <img class="ctr_img" src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/c4/PM5544_with_non-PAL_signals.png/250px-PM5544_with_non-PAL_signals.png" alt="image">
                </a>
                <div class="in_forms">
                    <div class="srch_bx">
                        <form>
                            <input class="srch_in" type="text" name="search"/>
                        </form>
                        <div class="img_mic">
                            <a href="https://youtu.be/Ye8mB6VsUHw ">
                                <img class="mic_set" src="https://cdn.sesamestreet.org/sites/default/files/1496328210/Cookie_Big.png" />
                            </a>
                        </div>
                    </div>
                </div>
                <div>
                    <div class="btn_sbmt">
                        <input class="btn_srch" type="submit" value="Don't Hide me!" name="search"/>
                        <input class="btn_lcky" type="submit" value="Seriously, Don't!" name="luck"/>
                    </div>
                </div>
                <div class="lang_diff">
                    Links:
                    <a class="lang" href="">Link1</a>
                    <a class="lang" href="">Link2</a>
                    <a class="lang" href="">Link3</a>
                    <a class="lang" href="">Link4</a>
                    <a class="lang" href="">Link5</a>
                </div>
            </center>
            <footer id="footer">
                <div class="ctry">
                    <span class="ctry_ftr">
                        First half of a footer 
                    </span>
                </div>
                <div class="opt_ftr">
                    <span class="blft_ftr">
                        <a class="adv_ftr" href="">Footer Link 1</a>
                        <a class="adv_ftr" href="">Footer Link 2</a>
                        <a class="adv_ftr" href="">Footer Link 3</a>
                    </span>
                    <span class="brght_ftr">
                        <a class="adv_ftr" href="">Footer Link 4</a>
                        <a class="adv_ftr" href="">Footer Link 5</a>
                    </span>
                </div>
            </footer>
        </div>
    </body>
</html>

Посещенных сайтов

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

#footer позиционируется абсолютно, что означает, что родительский контейнер не знает, насколько он велик (то есть он находится вне «потока документов»). Высота #container установлена ​​на min-height: 100%, поэтому, как минимум, она должна быть равна полной высоте родителя (в данном случае, тела), но если дочерний контент выше, он растянется, чтобы вместить эта дополнительная высота.

Поскольку #footer не учитывается, когда #container пытается определить свою высоту, #container просто проверяет, подходит ли он другим position: static или position:relative детям.

Итак, когда вы уменьшаете высоту своего браузера до очень короткого, #container слишком короткий - он не оставляет места для #footer.

Есть несколько способов позаботиться об этом, хотя с адаптивной точки зрения сложно, если высота #footer является переменной в зависимости от содержимого, от того, переносится ли он и т. Д.

Если вы знаете высоту, вы можете добавить это количество отступов внизу #container (если включено box-sizing: border-box;, оно не добавится к height: 100% - оно будет включено), и оно будет зарезервировать место для #footer.

Если вы не знаете высоту, вы можете использовать display: flex;, чтобы заполнить всю высоту и сделать нижний колонтитул самовыравнивающимся по низу, без необходимости использовать position: absolute;. У Flexbox есть немного кривой обучения, хотя, я бы порекомендовал вам прочитать некоторые учебники. http://flexboxfroggy.com/ - забавная игра, которая также может помочь в ее изучении.

0 голосов
/ 28 апреля 2018

:)

Поздравляю, прежде всего, за соблюдение правил запроса на SO.

Ваша проблема связана с выводом нижнего колонтитула из потока документов (position:absolute). Похоже, вы хотите, чтобы он был помещен в поток документов. Поэтому измените position:absolute на position:relative (или static).

Чтобы всегда держать его внизу экрана, настройте #container на display:flex;flex-direction:column;min-height:100vh и увеличьте #center:

#footer {
  position:static; /* this is default value of position
                    * so you could just remove `position:absolute`
                    * from your code.
                    */
}
#container {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
}
#center {
  flex-grow: 1;
}

Посмотрите, как это работает:

* {
  margin: 0px;
  padding: 0px;
}

html,
body {
  height: 100%;
}

#container {
  min-height: 100%;
  position: relative;
}

a:visited {
  color: #609;
}


/* ----- Navigation Styling ----- */

#nav {
  display: flex;
  border: 10px solid goldenrod;
  /*Colourful Borders*/
  min-height: 9vh;
  justify-content: flex-end;
  align-items: baseline;
  background: #ff0;
  padding: 10px;
}


/*Nav Content*/


/* ----- Center Styling ----- */

#center {
  width: 100%;
  background-color: white;
  min-height: 10vh;
}

.ctr_img {
  height: 92px;
  width: 272x;
  padding-top: 20px;
}

.ctr_img:hover {
  -webkit-filter: invert(100%);
}

.img_mic {
  padding: 0 8px;
  float: right;
  display: inline-block;
  top: -30px;
  position: relative;
}

.srch_bx {
  border-style: hidden;
  box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 0 1px rgba(0, 0, 0, 0.08);
  max-width: 40%;
  min-height: 40px;
}

.srch_in {
  width: 100%;
  border-radius: 2px;
  border: none;
  overflow: auto;
  outline: none;
  left: 0px;
  background: url(data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw%3D%3D) transparent;
  font: 16px arial, sans-serif;
  display: inline-block;
  text-align: start;
}

.mic_set {
  background-size: 30px 30px;
  height: 100%;
  width: 26px;
}

.btn_sbmt {
  padding: 20px 50%;
  min-height: 20px;
  display: flex;
  justify-content: center;
}

.btn_srch,
.btn_lcky {
  background-color: #f2f2f2;
  border: 1px solid #f2f2f2;
  border-radius: 2px;
  color: #757575;
  font-family: arial, sans-serif;
  font-size: 1vw;
  font-weight: bold;
  margin: 11px 4px;
  padding: 0 16px;
  height: 36px;
}

.lang_diff {
  max-height: 28px;
  font-size: 0.9vw;
  margin-bottom: 24px;
  font-family: arial, sans-serif;
}


/* Footer Styling */

#footer {
  /* position: absolute; 
     bottom: 0; */
  height: 5.2em;
  /* Height of the footer */
  width: 100%;
  min-height: 10vh;
  background-color: #f2f2f2;
  line-height: 40px;
  /*Specifies the line height.*/
  min-width: 400px;
}

.ctry {
  display: flex;
  margin-left: 30px;
  text-align: left;
  color: rgba(0, 0, 0, .54);
  border-top: 1px solid #e4e4e4;
  max-width: 150px;
}

.ctry_ftr {
  font-size: 1vw;
}

.opt_ftr {
  display: flex;
  justify-content: space-between;
  border: 1px solid #e4e4e4;
}

span.blft_ftr a,
span.brght_ftr a,
span.brght_stg a {
  text-decoration: none;
  color: #666;
  margin-left: 16px;
  font-size: 1vw;
}

.brght_ftr {
  margin-right: 30px;
  float: right;
}

.adv_ftr {
  padding: 0 16px;
  text-decoration: none;
  display: inline-block;
}

#footer {
  line-height: 2.42em;
}
#container {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
}

#center {
  flex-grow: 1;
}
<div id="container">
  <!-- Added New for Footer behaviour -->
  <nav id="nav" class="nav_cls">
    <!--Currently at work-->
    <p>Navigation Bar Content</p>
  </nav>
  <center id="center">
    <a class="img_link" href="">
      <img class="ctr_img" src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/c4/PM5544_with_non-PAL_signals.png/250px-PM5544_with_non-PAL_signals.png" alt="image">
    </a>
    <div class="in_forms">
      <div class="srch_bx">
        <form>
          <input class="srch_in" type="text" name="search" />
        </form>
        <div class="img_mic">
          <a href="https://youtu.be/Ye8mB6VsUHw ">
            <img class="mic_set" src="https://cdn.sesamestreet.org/sites/default/files/1496328210/Cookie_Big.png" />
          </a>
        </div>
      </div>
    </div>
    <div>
      <div class="btn_sbmt">
        <input class="btn_srch" type="submit" value="Don't Hide me!" name="search" />
        <input class="btn_lcky" type="submit" value="Seriously, Don't!" name="luck" />
      </div>
    </div>
    <div class="lang_diff">
      Links:
      <a class="lang" href="">Link1</a>
      <a class="lang" href="">Link2</a>
      <a class="lang" href="">Link3</a>
      <a class="lang" href="">Link4</a>
      <a class="lang" href="">Link5</a>
    </div>
  </center>
  <footer id="footer">
    <div class="ctry">
      <span class="ctry_ftr">
                        First half of a footer 
                    </span>
    </div>
    <div class="opt_ftr">
      <span class="blft_ftr">
                        <a class="adv_ftr" href="">Footer Link 1</a>
                        <a class="adv_ftr" href="">Footer Link 2</a>
                        <a class="adv_ftr" href="">Footer Link 3</a>
                    </span>
      <span class="brght_ftr">
                        <a class="adv_ftr" href="">Footer Link 4</a>
                        <a class="adv_ftr" href="">Footer Link 5</a>
                    </span>
    </div>
  </footer>
</div>

Другая незначительная проблема, которая требовала адресации, заключалась в использовании line-height, выраженном в px для #footer, в то время как его высота была выражена в em, в результате чего на странице появлялась вертикальная полоса прокрутки. line-height:2.42em исправляет это.


С другой стороны, было бы несправедливо с моей стороны дать вам этот ответ, не упомянув о главной проблеме с доступностью в вашем примере, связанной с уменьшением размера шрифта на узких устройствах. Попробуйте открыть страницу примера на любом мобильном, и вы поймете, что я имею в виду. Элементы вашей страницы всегда должны иметь размер шрифта, позволяющий пользователям читать.

Основной целью веб-страниц является представление контента. Если вы представите контент в форме, отключающей возможность получения сообщения пользователем, ваша страница не будет выполнять свою функцию.

...