CSS - удаление горизонтального пробела в меню списка с использованием свойства display: inline

Я новичок в CSS, и у меня есть цель изучить и опубликовать свой веб-сайт в CSS к концу месяца.

Мой вопрос:

Я пытаюсь создать горизонтальное меню CSS с раскрывающимися списками при наведении курсора, однако, когда я использую свойство display: inline с элементами li (список), я получаю горизонтальные пробелы между элементами li (список) на панели. Как убрать это пространство?

Вот HTML:

<div id="tabas_menu">
    <ul>
        <li id="tabBut0" class="tabBut">Overview</li>
        <li id="tabBut1" class="tabBut">Collar</li>
        <li id="tabBut2" class="tabBut">Sleeves</li>
        <li id="tabBut3" class="tabBut">Body</li>
    </ul>
</div>

А вот и CSS:

#tabas_menu {
    position: absolute;
    background: rgb(123,345,567);
    top: 110px;
    left: 200px;
}

ul#tabas_menu {
    padding: 0;
    margin: 0;
}

.tabBut {
    display: inline;
    white-space: 
    list-style: none;
    background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(255,142,190,1)),to(rgba(188,22,93,1)));
    background: -moz-linear-gradient(top, rgba(255,142,190,1), rgba(188,22,93,1));
    font-family: helvetica, calibri, sans-serif;
    font-size: 16px;
    font-weight: bold;
    line-height: 20px;
    text-shadow: 1px 1px 1px rgba(99,99,99,0.5);
    -moz-border-radius: 0.3em;
    -moz-box-shadow: 0px 0px 2px rgba(0,0,0,0.5);
    -webkit-border-radius: 0.3em;
    -webkit-box-shadow: 0px 0px 2px rgba(0,0,0,0.5);
    padding: 6px 18px;
    border: 1px solid rgba(0,0,0,0.4);
    margin: 0;
}

Я могу удалить пробел, используя свойство float: left/right, но меня беспокоит, почему я не могу добиться того же эффекта, просто используя свойство display.


person Kayote    schedule 17.01.2011    source источник
comment
Вы также можете изменить свои объявления background на background-image. Я не знаю ваших точных намерений, но разбор сокращений приведет к тому, что ваш синтаксис перезапишет другие фоновые атрибуты. См. jsfiddle.net/XVXyA. Сравните с jsfiddle.net/XVXyA/1.   -  person Steven    schedule 17.01.2011


Ответы (3)


У меня был удивительно похожий вопрос пару недель назад.

Горизонтальные пространства вполне разумны. Между встроенными элементами пробелы имеют значение. Это имеет смысл, когда вы рассматриваете следующую разметку под общими стилями:

<b>Label:</b> <span>content</span>

Вы бы не расстроились, если бы этот контент отображался следующим образом?

Ярлык:контент

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

Есть несколько решений вашей проблемы (при условии, что вы хотите сохранить пробел в HTML по эстетическим соображениям, если это не важно, просто удалите пробел и покончите с этим), самое простое из которых — применить font-size: 0px к родительскому контейнеру. а затем восстановите размер шрифта до font-size: 16px или любого другого в каждом из встроенных элементов. Это делает так, что текстовые узлы между ними имеют нулевой размер шрифта.

person Steven    schedule 17.01.2011
comment
Спасибо, Стивен. Мне нравится трюк с размером шрифта. Будет играть с ним. Спасибо за помощь. - person Kayote; 17.01.2011
comment
Трюк с размером шрифта хорош. И есть много случаев, когда вам определенно не нужно пространство. Например. кнопки меню с рамкой, которые должны быть рядом друг с другом. - person ; 25.07.2011

Проблема в том, что некоторые браузеры отображают пробелы между элементами списка. Например:

<li>item 1</li>
<li>item 2</li>

После </li> в первой строке и перед <li> в следующей строке есть новая строка (и, возможно, несколько табуляций). Некоторые веб-браузеры отображают это как пробел. Есть два обходных пути.

Один из них — удалить все эти пробелы, например:

<ul>
    <li id="tabBut0" class="tabBut">Overview</li><li id="tabBut1" class="tabBut">Collar</li><li id="tabBut2" class="tabBut">Sleeves</li><li id="tabBut3" class="tabBut">Body</li>
</ul>

Это своего рода уродливое решение, но оно работает.

Другая возможность - это то, что вы сами упомянули - используйте float: left. Лично я всегда выбираю решение с плавающей запятой.

person Ben Lee    schedule 17.01.2011

Использование float:left усложняет расчет макета для браузеров. Если вы заботитесь о скорости и эффективности рендеринга, удалите все пробелы между <li> элементами.

person anon    schedule 05.03.2012