Отзывчивый элемент вертикального центрирования в меню навигации

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

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

Здесь сценарий: http://jsfiddle.net/4zahumwm/

HTML:

<h1 title="test">test</h1>
<nav id="nav-utility">
    <ul>
        <li><a href="#">HOME</a></li>
        <li><a href="#">MY STORY</a></li>
        <li class="mid-left"><a href="#">GALLERY</a></li>
        <li class="mid-right"><a href="#">RATES</a></li>
        <li><a href="#">TERMS</a></li>
        <li><a href="#">CONTACT</a></li>
    </ul>
</nav>

<div id="container"></div>

CSS

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

html {  
}

div#container{
    width:100%;
    height:95.7%;

    background: url(background/monitor/IMG_5929.jpg) no-repeat center center fixed; 
    -webkit-background-size: cover;
    -moz-background-size: cover;
    -o-background-size: cover;
    background-size: cover;}

h1{
    background-image:url(images/menu/polygon.png);
    display: block;
    height: 71px;
    left: 50%;
    margin:0; padding:0;    
    margin-left: -43px;
    position: absolute;
    text-indent: -9999px;
    top: 0;
    width: 87px;
    z-index: 1;

}

nav{
    width:100%;
    height:4.28%;
    /*min-height:40px;*/

    margin:0; padding:0;    

    background-color:#000000;

    list-style:none;
    text-align:center;
}

li, ul, a{
    margin:0; padding:0;    
    height:100%;
}

#nav-utility li{font-size:110%;color:#2bbfc4;}
#nav-utility li:before{content:'\00B7';padding-right:20px; padding-left:-10px;}
#nav-utility li:first-child:before{content:normal;}
#nav-utility li:last-child{padding-right:0;}
#nav-utility li:first-child{margin-left:-8px;}
#nav-utility li:nth-child(4):before{content:normal;}

nav ul{
}

nav li{
    display: inline-block;
    vertical-align:middle;
}

nav li a{
    font-family:Gotham, "Helvetica Neue", Helvetica, Arial, sans-serif;

    font-size:20px;
    color:white;

    text-decoration:none;
    line-height:4.28%;
}

nav li a:hover{
    border-bottom: 1px solid #196595;
    padding-bottom:1px;
}

nav li a:active{
    font-weight:bold;
}

nav ul li{
    margin: 0 10px 0 10px;
}

nav li.mid-left{
    margin-right: 63px; 
}
nav li.mid-right{
    margin-left: 63px;
}

Ответ 1

Конечный продукт

Мое первое решение можно найти в нижней части этой публикации.

Мы на самом деле делаем это сложнее, чем необходимо... Пусть сделают вкусный гамбургер!

Оберните навигатор и логотип в <header>:

<header class="hamburger">
    <h1>Logo</h1>
    <nav></nav>
</header>

Теперь они будут заполнением между булочками для гамбургеров, которые выглядят так:

header:before, header:after {
    content:'';
    display: block;
    height: 50%;
    background: #000;
    width: 100%;
}

Это дает нам эквивалент:

<header class="hamburger">
    <div>:before bun</div>
        <h1>Logo</h1>
        <nav></nav>
    <div>:after bun</div>
</header>
  • Каждому header:before и header:after присваивается одинаковая процентная высота

  • Контейнер <header> управляет высотой элемента псевдо-элемента (:before,:after)

  • <nav> содержится между и идеально центрируется по вертикали.

HTML/CSS/Demo Snippet

html,body {
height: 100%;  
}

body {
  margin: 0;
}

header {
    position: relative;
    background: #000;
    height: 4.3%;
    min-width: 800px;
}
/* 
   Create a spacer above and below the nav 
   to center the menu between them  
*/
header:before, header:after {
    content:'';
    display: block;
    height: 50%;
    background: #000;
    width: 100%;
}
h1 {
    background-image: url(http://imandragrafie.nl/demo/images/menu/polygon1.png);
    height: 80px;
    margin:0;
    padding:0;
    text-indent: -9999px;
    width: 100px;
    position: absolute;
    top: 0;
    left: 50%;
    margin-left: -40px;
}
nav#mainMenu {
    width:100%;
    text-align: center;
    margin:0;
    padding:0;
    background-color:#000000;
}
nav#mainMenu a {
    font-family:"Gill Sans", "Gill Sans MT", "Myriad Pro", "DejaVu Sans Condensed", Helvetica, Arial, sans-serif;
    font-size:1.2em;
    color: #FFF;
    text-decoration: none;
    vertical-align: middle;
}
/* create a spacer to get those dots */
 nav#mainMenu a:after {
    content:'\00B7';
    color:#2bbfc4;
    display: inline-block;
    width: 0;
    padding: 0 2%;
}
/*remove the dot and give a width to create a space for the image */
 nav#mainMenu a.mid-left:after {
    width: 120px;
    content:'';
}
/* No spacer for the last child */
 nav#mainMenu a:last-child:after {
    display: none;
}
<header>
	<h1 title="IMANDRAGRAFIE">IMANDRAGRAFIE</h1> 
	<nav id="mainMenu"><a href="index.html">HOME</a><a href="story.html">MY STORY</a><a href="gallery.php" class="mid-left">GALLERY</a><a href="rates.html" class="mid-right">RATES</a><a href="terms.html">TERMS</a><a href="contact.html">CONTACT</a></nav>
</header>

Ответ 2

Отображение таблицы CSS - эффективный способ выравнивания по вертикали:

#nav-utility ul { display: table; height: 100%; }
#nav-utility li { display: table-cell; vertical-align: middle; }

Поскольку ячейки таблицы имеют переменную ширину, граница между 3-й и 4-й ячейками может не совпадать с горизонтальным центром страницы. Поэтому вам нужно разбить меню на два меню и использовать абсолютное позиционирование:

#nav-utility { position: relative; }
#nav-utility ul { position: absolute; top: 0; }
#nav-utility ul:nth-child(1) { right: 50%; }
#nav-utility ul:nth-child(2) { left: 50%; }

Объединяя все это вместе и добавляя сбросы, псевдопалеты и украшения, вы получаете этот фрагмент:

html, body {
    height: 100%;
}
body {
    margin: 0;
    padding: 0;
}
h1 {
    position: absolute;
    top: 0;
    left: 50%;
    z-index: 1;
    margin: 0 0 0 -43px;
    width: 87px;
    height: 71px;
    background-image: url(http://dummyimage.com/87x71/999/000&text=LOGO+87x71);
    text-indent: -9999px;
}
#nav-utility {
    position: relative;
    margin: 0;
    padding: 0;
    height: 4.28%;
    color: #2BBFC4;
    background-color: #000000;
}
#container {
    height: 95.7%;
    background: url(http://lorempixel.com/400/400/sports/1/) no-repeat center center fixed;
    -webkit-background-size: cover;
    -moz-background-size: cover;
    -o-background-size: cover;
    background-size: cover;
}
#nav-utility ul {
    display: table;
    position: absolute;
    top: 0;
    margin: 0;
    padding: 0;
    height: 100%;
    list-style: none;
}
#nav-utility ul:nth-child(1) {
    right: 50%;
    margin-right: 53px;
}
#nav-utility ul:nth-child(2) {
    left: 50%;
    margin-left: 53px;
}
#nav-utility li {
    display: table-cell;
    vertical-align: middle;
}
#nav-utility li:nth-child(n + 2) {
    padding-left: 10px;
}
#nav-utility li:nth-child(n + 2):before {
    content: "\00B7";
    padding-right: 10px;
}
#nav-utility a {
    font-family: sans-serif;
    font-size: 20px;
    color: #FFFFFF;
    text-decoration: none;
}
#nav-utility a:hover {
    margin-bottom: -1px;
    border-bottom: 1px solid #196595;
}
#nav-utility a:active {
    font-weight: bold;
}
<h1 title="test">test</h1>
<nav id="nav-utility">
    <ul>
        <li><a href="#">HOME</a></li>
        <li><a href="#">MY STORY</a></li>
        <li><a href="#">GALLERY</a></li>
    </ul>
    <ul>
        <li><a href="#">RATES</a></li>
        <li><a href="#">TERMS</a></li>
        <li><a href="#">CONTACT</a></li>
    </ul>
</nav>
<div id="container"></div>

Ответ 3

Я не думаю, что это можно сделать с помощью CSS. Здесь решение с использованием JS:

Вы также можете проверить их:

"Ответственный размер шрифта" пока не поддерживается на всех браузерах/устройствах.

Используя "отзывчивый размер шрифта" и FlowType, вы сможете согласовать шрифт согласованно на всех устройствах. Следующим шагом будет добавить "padding-top" и "padding-bottom" к следующему селектору: "nav li a". Вы можете использовать "%" или "px" для заполнения, и вы должны избавиться от свойства "line-height".

Ответ 4

Существует простой способ сделать это с помощью преобразований CSS3.

Вам нужен дополнительный контейнер <div class="align-vert"> вокруг вашего ul:

<h1 title="test">test</h1>
<nav id="nav-utility">
  <div class="align-vert">
    <ul>
        <li><a href="#">HOME</a></li>
        <li><a href="#">MY STORY</a></li>
        <li class="mid-left"><a href="#">GALLERY</a></li>
        <li class="mid-right"><a href="#">RATES</a></li>
        <li><a href="#">TERMS</a></li>
        <li><a href="#">CONTACT</a></li>
    </ul>
  </div>
</nav>

и новый класс:

.align-vert {
  position: relative;
  top: 50%;
  transform: translateY(-50%);
}

См. http://codepen.io/raad/pen/Evtmi (я набросал навигацию, чтобы вы могли видеть вертикальное выравнивание более легко).

Недостатком является то, что вы получаете только поддержку IE от IE9 (хотя может быть способ использования фильтра MS-матрицы - см. http://caniuse.com/#feat=transforms2d).