Как вертикально выровнять элементы <li> в <ul>?


97

У меня есть горизонталь, <ul>и мне нужно центрировать каждую <li>по вертикали. Моя разметка ниже. У каждого <li>есть граница, и мне нужно, чтобы элементы и их содержимое были посередине по вертикали. Пожалуйста помоги; Я новичок в CSS.


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <style type="text/css">
        .toolbar li
        {
            border: solid 1px black;
            display: block;
            float: left;
            height: 100px;
            list-style-type: none;
            margin: 10px;
            vertical-align: middle;
        }
        .toolbar li.button
        {
            height: 50px;
        }
    </style>
</head>
<body>
    <div class="toolbar">
        <ul>
            <li><a href="#">first item<br />
                first item<br />
                first item</a></li>
            <li><a href="#">second item</a></li>
            <li><a href="#">last item</a></li>
            <li class="button"><a href="#">button<br />
                button</a></li>
        </ul>
    </div>
</body>
</html>

w3schools.com/css/css_navbar.asp - я знаю, что на это был дан ответ, но на случай, если кто-то посмотрит на это с этого
момента,

Ответы:


75

Я предполагаю, что, поскольку вы используете объявление XML, вы не беспокоитесь об IE или старых браузерах.

Так можно использовать display:table-cellи display:table-rowтак:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <style type="text/css">
        .toolbar ul {
            display:table-row;
        }
        .toolbar ul li
        {
            display: table-cell;
            height: 100px;
            list-style-type: none;
            margin: 10px;
            vertical-align: middle;
        }
        .toolbar ul li a {
            display:table-cell;
            vertical-align: middle;
            height:100px;
            border: solid 1px black;
        }
        .toolbar ul li.button a {
            height:50px;
            border: solid 1px black;
        }
    </style>
</head>
<body>
    <div class="toolbar">
        <ul>
            <li><a href="#">first item<br />
                first item<br />
                first item</a></li>
            <li><a href="#">second item</a></li>
            <li><a href="#">last item</a></li>
            <li class="button"><a href="#">button<br />
                button</a></li>
        </ul>
    </div>
</body>
</html>

1
спасибо, это частично работает. то есть содержимое задних ящиков центрировано, но как мне центрировать сами ящики?
akonsu 03

нет, нет, в середине списка. в этом конкретном примере последнее поле должно быть ниже первых трех.
akonsu

@akonsu - я его поменял, правда ни на чем кроме FireFox не тестировал. Сообщите мне, подходит ли оно.
Ричард JP Le Guen

1
Ричард, большое спасибо за вашу помощь. я не знал об этих типах дисплеев. к сожалению, они не поддерживаются в IE7. Я нашел способ выровнять содержимое каждого <li>: ampsoft.net/webdesign-l/vertical-aligned-nav-list.html, но, похоже, нет кроссбраузерного способа выровнять <li> внутри <ul>. ..
akonsu 04

1
Если вы ориентируетесь на IE7, почему у вас есть <?xml?>декларация? Все версии IE не поддерживают XHTML. Я думаю, вам может потребоваться прочитать Отправка XHTML как text / html Считается вредным: hixie.ch/advocacy/xhtml
Ричард Дж. П. Ле

75

Вот хороший вариант:

Установите line-heightравным тому, что heightесть; работает как шарм!

Например:

li {
    height: 30px;
    line-height: 30px;
}

1
Не могли бы вы уточнить на небольшом примере?
Leigh

1
Perfect - line-height: 30 пикселей; on floated <li> - это то, что мне нужно (Chrome)
GuruBob

1
Что будет, если он разделится на две строки?
Махеш

1
Да, возможно только при наличии не более одной строки текста.
Ванни Миарелли

1
Это единственное, что у меня сработало. Другие ответы не помогли.
adev

35

Для этого вы можете использовать flexbox.

ul {
    display: flex;
    align-items: center;
}

Подробное объяснение того, как использовать flexbox, можно найти здесь .


4

У меня такая же проблема. Попробуй это.

<nav>
    <ul>
        <li><a href="#">AnaSayfa</a></li>
        <li><a href="#">Hakkımızda</a></li>
        <li><a href="#">İletişim</a></li>
    </ul>
</nav>
@charset "utf-8";

nav {
    background-color: #9900CC;
    height: 80px;
    width: 400px;
}

ul {
    list-style: none;
    float: right;
    margin: 0;
}

li {
    float: left;
    width: 100px;
    line-height: 80px;
    vertical-align: middle;
    text-align: center;
    margin: 0;
}

nav li a {
    width: 100px;
    text-decoration: none;
    color: #FFFFFF;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.