Оглавление как в книге

Недавно потребовалось сверстать страницу в виде оглавления, как в книге. С левой стороны текст, с правой цифры. У каждой строки должно быть визуальное сопровождение, чтобы четко видеть какой текст к какой странице относится. Было одно условие – без картинок.

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

Поэтому я постарался максимально упростить задачу, то есть минимум кода + минимум стилей. Решение мне понравилось, и я решил поделиться им с вами.

оглавление

Что же нам нужно для выполнения задачи? Элемент-контейнер, и внутри него еще два элемента, прижатые к краям контейнера. И конечно же возможность повторить это все n раз.

HTML:

<body>
<h1>Оглавление как в книге</h1>
<div>
<p class="left">Введение</p>
<p class="right">1</p>
</div>
<div>
<p class="left">Часть первая</p>
<p class="right">2</p>
</div>
<div>
<p class="left">Часть двадцать вторая</p>
<p class="right">3</p>
</div>
</body>

Уж проще вроде бы некуда. Задерживаться на коде не будем, двигаемся дальше. Единственный недостаток – классы, прописаные для обоих p.
Мысль моя заключалась вот в чем. Если не ставить фоновое изображение с пунктиром по центру конрейнера, то нужно сделать так чтобы border-bottom контейнера поднялся до середины текста.

Отрицательный margin отлично справляется с этой задачей в Файрфоксе, Опере и IE7, а для IE6 еще придется текстовые блоки вынести из общего потока с помощью position:relative.

Для того чтобы пунктирная линия была не видна под текстом задаем для текстовых блоков background любого цвета.

Смотрим на стили:

div {
margin:0 auto;
height:10px; /*высота контейнера - половина высоты строки*/
width:760px;
border-bottom:1px dotted #000000;
clear:both; /*исправление для повторяющихся блоков*/
margin-bottom: 10px;
}
div p {
background:#FFFFFF;
border-bottom: 1px solid #FFFFFF;
padding: 0 5px;
}
/*исправление для IE6*/
* HTML div p{
margin-bottom: -10px;
position:relative;
}/*конец исправления для IE6*/
.left{
float:left;
}
.right{
float:right;
}

У этого примера есть несколько неудобств и спорных моментов, и возможность его использования довольно сомнительна, но он может послужить неплохим примером использования CSS “не по назначению” ;)

P.S.

Комментарий pepelsbey‘a натолкнул меня на интересную мысль. Я опять начал думать в сторону списка, но под другим углом :)

Допустим у нас есть нумерованый список. Но как же нам заставить цифры быть справа, а текст слева? Да очень просто! Мы зададим списку direction: rtl и все! :) А текст в списке будет в блоках, у которых прописан float:left. Кода становится на много меньше, и реализация становится явнее :)

HTML:

<ol>
<li><span>Введение</span></li>
<li><span>Глава первая</span></li>
<li><span>Глава двадцать вторая</span></li>
</ol>

CSS:

ol{
direction: rtl;
margin: 0 auto;
width: 740px;
padding-right: 20px;
}

ol li{
clear: both;
margin: 0 10px 10px 0;
border-bottom: 1px dotted #000000;
height: 10px;
}

ol li span{
display:block;
float:left;
height: 20px;
background: #FFFFFF;
padding-right: 5px;
*margin-bottom: -10px;/*исправление для IE*/
_position: relative; /*исправление для IE6*/
}

Краткость – сестра таланта! Спасибо, Вадим :)

P.S.2

Рано радовался… в браузерах семейства мелкомягких для каждого элемента нумерованого списка остается цифра 1, а не меняется по порядку.. :( А если вставлять цифры в отдельный блок то вся задумка теряется.

Рабочий пример.

Эта запись была опубликована в рубрике CSS. Вы можете следить за комментариями к этой записи.

Комментарии

  1. Sam написал:

    Замечательно!

  2. pepelsbey написал:

    А я бы запихнул это дело в нумерованный список вместо DIV/P и раздал бы классы «chapter» / «page» ;)

  3. neutrino написал:

    [quote comment="193"]А я бы запихнул это дело в нумерованный список вместо DIV/P и раздал бы классы «chapter» / «page» ;)[/quote]

    Вадим, ты натолкнул меня на классную мысль! :) Смотри апдейт поста.

  4. Mo1ot0k написал:

    Супер !!!

  5. Dmitry Baranovskiy написал:

    Как мне добавить сюда ссылку на пример такой задачи? Похоже, что комментарий принимается за спам.
    А идея со списком не совсем верна: страницы не всегда идут как 1, 2, 3…

  6. neutrino написал:

    [quote comment="210"]Как мне добавить сюда ссылку на пример такой задачи? Похоже, что комментарий принимается за спам.[/quote]

    Хм, вроде не должны ссылки как спам приниматься.. Можно с underscore попробовать :)

  7. Dmitry Baranovskiy написал:

    Ok. dmitry.baranovskiy.com / temp / contents.html

  8. neutrino написал:

    [quote comment="212"]Ok. dmitry.baranovskiy.com / temp / contents.html[/quote]
    ну и в чем прикол?

  9. Dmitry Baranovskiy написал:

    Прикол в том, как та же задача реализована. На мой взгляд, моя реализация лучше. :)
    Во-первых разметка более семантически корректная, во-вторых учитывается возможность увеличения шрифта, а в третьих, как я уже писал, номер страницы в общем случае не имеет ничего общего с порядковым номером.

    P.S. И похоже, что функция «Получать email когда кто-то комментирует эту запись» не работает.

  10. SvT написал:

    Вот тут понравилось как сделано hereyesterday.com ;)

  11. Константин написал:

    [quote post="82"]Рано радовался… в браузерах семейства мелкомягких для каждого элемента нумерованого списка остается цифра 1, а не меняется по порядку.. А если вставлять цифры в отдельный блок то вся задумка теряется.[/quote]Искал информацию как сделать так, чтобы нумерованый список начинался не с еденицы, а с произвольной цифры и вышел на эту статью.
    А решение оказалось таким: в атрибут li прописываем value=цифра

    Попробуйте! ;)

Leave a Reply

Your email is never published nor shared. Required fields are marked *

*

You may use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>