10. Списки

На этой странице:

Вверх Стандартный маркер списка

Для изменения типа маркера применяют свойство list-style-type.

list-style-type:
  • Первый пункт
  • Второй пункт
  • Третий пункт
  • Четвёртый пункт
  • Пятый пункт
  • Шестой пункт
  • Седьмой пункт

CSS не различает нумерованные (OL) и маркированные (UL) списки, но браузеры различают, и для нумерованного списка устанавливают по умолчанию значение decimal.

list-style-type
Значения: disc | circle | square | decimal | upper-alpha | lower-alpha | upper-roman | lower-roman | none | inherit
По умолчанию: disc
Область применения: списки
Наследование: да
Примечание: CSS не различает нумерованные (OL) и маркированные (UL) списки

В браузерах, как правило, задаются предопределённые стили для вложенных списков:

  • Элемент
    • Элемент
      • Элемент
UL {list-style-type:disc;}     
UL UL {list-style-type:circle;}     
UL UL UL {list-style-type:square;}     
      

Свойство list-style-type наследуемое, но в силу предопределений браузера стиль, заданный для корневого UL, не распространится на потомки. Если это нужно, придётся определять для потомков явные стили чтобы перекрыть определения браузера, например, так:

UL, UL UL, UL UL UL {list-style-type:circle;}     
      
  • Элемент
    • Элемент
      • Элемент
Теперь маркерами всех трёх вложенных списков будут служить окружности.

Вверх Изображение в качестве маркера

Стандартный маркер можно заменить собственным, привлекая для этого свойство list-style-image.

list-style-image:
  • Первый пункт
  • Второй пункт
  • Третий пункт
  • Четвёртый пункт
  • Пятый пункт
  • Шестой пункт
  • Седьмой пункт
list-style-image
Значения: <url>| none | inherit
По умолчанию: none
Область применения: списки
Наследование: да

Вверх Местоположение маркера

Маркер можно располагать вне или внутри содержимого элемента списка. Это делается при помощи свойства list-style-position.

list-style-position:
  1. Первый, довольно большой пункт, занимающий несколько строк
  2. Второй, довольно большой пункт, занимающий несколько строк
  3. Третий, довольно большой пункт, занимающий несколько строк
list-style-position
Значения: inside | outside | inherit
По умолчанию: outside
Область применения: списки
Наследование: да

Вверх Интегрированное свойство

Все три свойства списка можно свести в одно: list-style.

Файл style.css
OL {list-style:lower-roman inside;}
            

Файл index.htm

  

      
Посмотреть
list-style
Значения: [<type> || <image> || <position> ] | inherit
По умолчанию: см. отдельные свойства
Область применения: списки
Наследование: да
Примечание: значения могут идти в любом порядке, любое может быть опущено (тогда работает значение по умолчанию)

Вверх Компоновка списка

Рассмотрим подробнее устройство списка.

Блочные элементы LI следуют друг за другом внутри блочного элемента UL (или OL). Маркеры не оказывают влияние на компоновку страницы: они “привешиваются” браузером слева от каждого LI на фиксированном расстоянии. Это расстояние зависит от браузера. В некоторых случаях маркеры могут оказаться даже за пределами окна (такой пример будет рассмотрен ниже).

Отступы при помощи margin-left

По правилу оформления списков, пункты должны записываться с отступом слева. Браузеры IE и Opera образуют промежуток при помощи внешнего отступа, который можно описать так:

UL, OL {margin-left:40px;}
    

Отступы при помощи padding-left

Браузер Firefox образует промежуток при помощи внутреннего отступа:

UL, OL {padding-left:40px;}
    

Пиксельный размер промежутка нельзя назвать удачным решением. Гораздо лучше использовать em, тогда величина сдвига будет зависеть от размера шрифта и меняться пропорционально вместе с ним.

Чтобы задать собственные em-отступы, можно записать один их двух вариантов:

Вариант 1:
UL, OL 
{
  margin-left:2em;
  padding-left:0;
}
    
Вариант 2:
UL, OL 
{
  padding-left:2em;
  margin-left:0;
}
    

Посмотрите, как это работает в следующем примере.

Файл style.css
  
UL, OL 
{
  margin-left:2em;
  padding-left:0;
  background:#afe9de;
}
      

Посмотреть

Для размещения в отступе широкого маркера величины и 2em может и не хватить.

Файл index.htm
  

      

В теме 9, в разделе “Кодирование списков” был рассмотрен пример со списком, в котором нумерация начиналась с XXVI. Чтобы маркер не вышел за пределы окна, пришлось для OL установить внешний отступ в 100px:

  

Посмотреть

Комментарий к вынужденному стилевому описанию был такой:

Браузеры делают фиксированный отступ для вывода элементов списка на экран (примерно 40 пикселов). Нумерация при этом смещается к левому краю окна. Когда номер достаточно большой, места не хватает. Для исключения этого неприятного эффекта в коде примера пришлось задать смещение списка вправо на 100 пикселов при помощи стилевого указания style="margin-left:100px" в теге OL.

Посмотреть
Так это выглядит, если убрать описание стиля.

Посмотреть
И так, если сомнительные 100px заменить более правильными 5em и добавить padding-left:0 (для браузеров, которые работают как Firefox).

Расстояние между маркером и LI, как уже было сказано, задаётся браузером, и в CSS пока нет средств для управления этим параметром.

Но можно отказаться от стандартных маркеров (при помощи правила list-style-type:none), нарисовать свой маркер и выводить его как фоновую картинку в левый внутренний отступ каждого LI.

Файл style.css
  
UL
{
  margin-left: 1em;
  padding-left: 0;
}
UL LI
{
  padding-left:20px;
  list-style-type: none;
  background: url(pic/marker8.png) no-repeat 0 0.6em;
}
      

Посмотреть

В качестве маркера задано изображение marker8.png, имеющее вид тире. Высота этого изображения — 1 пиксел, оно хорошо выравнивается по центру строки смещением 0.6em, и выравнивание сохраняется при любом размере шрифта. Более высокие рисованные маркеры идеально выровнять подобным образом уже не так просто:

Посмотреть

Файл index.htm
  

      

А что если маркер, как фоновое изображение, выравнивать по центру в вертикальном направлении? Тогда он должен точно попасть в середину LI по вертикали!

Файл style.css
  
UL
{
  margin-left: 1em;
  padding-left: 0;
}
UL LI
{
  padding-left:20px;
  list-style-type: none;
  background: url(pic/marker8.png) no-repeat 0 center;
}
      

Посмотреть

Файл index.htm
  

      

Получилось неплохо. А теперь протестируем наше решение на вложенном списке.

Посмотреть

Что такое? Почему маркеры рассыпались как горошины? Попробуйте самостоятельно объяснить причину. На самом деле, и в первом варианте с простым (не вложенным) списком не всё в порядке: попробуйте уменьшить ширину окна так, чтобы текст пунктов стал занимать более одной строки.

Вверх Горизонтальные списки

Построим горизонтальный список — основу для меню сайта и оформим его так, как показано на рисунке:

Горизонтальный список

Запишем список позиций в виде обычного UL пока без всяких стилевых указаний.

Так это выглядит в окне браузера:

Горизонтальный список

  • Начало
  • Техника фотосъёмки
  • Основы мастерства
  • Ссылки
  • О сайте

Посмотреть

Файл index.htm
  

      

Конечно, на горизонтальный список это не похоже. Но стоит взять в руки CSS, как через несколько минут картина совершенно изменится!

Прежде всего, уберём маркеры и, главное, превратим блочные элементы LI в строчные при помощи свойства display.

Файл style.css
  
.menu {list-style:none;}
.menu LI {display:inline;}
      

Так это выглядит в окне браузера:

Горизонтальный список

  • Начало
  • Техника фотосъёмки
  • Основы мастерства
  • Ссылки
  • О сайте

Посмотреть

Файл index.htm
  

      

Свойство display позволяет изменять представление элемента на экране (как и следует из его названия). Значение inline заставляет элемент вести себя подобно строчному, а значение block — подобно блочному.

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

На следующем шаге сделаем следующее. Для блока UL:

Для элементов LI зададим рубленый шрифт уменьшенного на 20% размера.

Файл style.css
  
.menu
{
  list-style:none;    
  margin:0;           
  padding:3px 0;      
  white-space:nowrap; 
}
.menu LI
{
  display:inline;   
  font:0.8em Tahoma,sans-serif; 
}
      

Так это выглядит в окне браузера:

Горизонтальный список

  • Начало
  • Техника фотосъёмки
  • Основы мастерства
  • Ссылки
  • О сайте

Посмотреть

Файл index.htm
  

      

Теперь осталось каждый элемент LI превратить в кнопку. Что делаем:

Файл style.css

.menu
{
  list-style:none;    /* Убираем маркеры */
  margin:0;           /* Убираем внешние отступы */
  padding:3px 0;      /* Убираем лишние внутренние отступы */
  white-space:nowrap; /* Запрещаем переносы */
}
.menu LI
{
  display:inline;   /* Превращаем LI в строчный элемент */
  font:0.8em Tahoma,sans-serif; /* Определяем шрифт */
  background:#fff2a6; /* Фон кнопки */
  padding: 2px 0.5em; /* Задаём внутренние  отступы */
  border:1px solid gray;     /* Рамка вокруг кнопки */
  border-left-color:#fff2a6; /* Убираем повтор рамки слева */
}

.menu LI.first
{
  border-left-color:gray; /* Восстанавливаем первую рамку */
}
     

Так это выглядит в окне браузера:

Горизонтальный список

  •  Начало
  • Техника фотосъёмки
  • Основы мастерства
  • Ссылки
  • О сайте

Посмотреть

Небольшая хитрость: рамки кнопок на стыках удваиваются, поэтому для левой рамки назначаем цвет фона #fff2a6, а у первой кнопки (с классом first) восстанавливаем цвет gray.

Файл index.htm