CSS Design: Приборкання списків
Причина, по якій ми не оформляємо їх як списки, полягає в тому, що нам не дуже хочеться перед кожною посиланням в меню бачити маркер. У попередній статті я розповів про деякі прийоми верстки сторінок за допомогою CSS. В одному з тих прийомів ми навчилися виводити списки в рядок, а не вертикально.
У цій же статті я покажу, як за допомогою CSS можна приборкати ці неповороткі і незграбні списки. Досить їм безпритульно хитатися по вашим веб-сторінкам. Настав ваш час командувати їм, як себе вести.
готуємо арену
Як предмет дресирування я вибрав прості ненумеровані списки. Всі згадані тут правила CSS можна застосувати і до нумерованим списками з тим же результатом. У всіх прикладах (крім спеціально обумовлених випадків) використовується наступний список:
- Item 1
- Item 2
- Item 3
- Item 4
- Item 5 зробимо цей пункт трохи довше,
щоб він переходив на наступний рядок
Кожен список просто поміщений всередину окремого елемента
#base border: 1px solid # 000;
margin: 2em;
width: 10em;
padding: 5px;
>
Без будь-яких додаткових стильових правил, список в базовому DIV-е буде виглядати так:
Item 5 зробимо цей пункт трохи довше, щоб він переходив на наступний рядок
позиціонування
У наступному прикладі властивостям margin-left і padding-left у елемента UL присвоєно значення 0:
Item 5 зробимо цей пункт трохи довше, щоб він переходив на наступний рядок
Зверніть увагу, що маркери лежать за кордоном DIV-а. Якби контейнером не була DIV, а
документа, маркери опинилися б за межами вікна броузера, тобто пропали б з очей геть. Якщо ви хочете, щоб маркери лежали всередині кордонів DIV-а, уздовж лівого його краю, надайте або властивості left-padding або властивості left-margin значення "1em".Item 5 зробимо цей пункт трохи довше, щоб він переходив на наступний рядок
Скажімо, вам знадобився список з особливими маркерами. Як ви поступали раніше? Створювали таблицю, в одній колонці розміщували gif-картинку маркера і зміщати її в осередку вгору і вправо. В іншій колонці розміщували текст, який мав би знаходиться в елементах
Стильове правило виглядає так:
ul list-style-image: url (bullet.gif);
>
А броузер покаже список так:
Item 5 зробимо цей пункт трохи довше, щоб він переходив на наступний рядок
Для тих броузерів, які не підтримують висновок графіки, додайте в правила наступну сходинку:
Зображення, вибране вами в якості маркера, може "виповзти" за кордону списку. Щоб цього не сталося, помістіть зображення всередину блоку
Всі три декларації можна об'єднати в одне коротке правило:
ul list-style: disc url (bullet.gif) inside;
>
ul list-style-type: disc;
list-style-image: url (bullet.gif);
list-style-position: inside;
>
Список в результаті буде виглядати так:
Item 5 зробимо цей пункт трохи довше, щоб він переходив на наступний рядок
Буває так, що у вас є список, але вам не потрібні маркери, або ви хочете використовувати в якості маркера якийсь інший символ. Знову-таки CSS поспішає до вас на допомогу. Додайте правило list-style: none; і зробіть елементи
ul list-style: none;
margin-left: 0;
padding-left: 1em;
text-indent: -1em;
>
Або властивість лівий padding. або властивість лівий margin повинно мати значення 0, а інше - значення 1em. Змінюючи цю властивість ви можете підігнати розмір відступу від вашого маркера до прийнятного. Негативне значення у властивості text-indent призводить до того, що перший рядок кожного пункту списку зсувається вліво і "надвісает" над іншим текстом.
Наступний наш список буде звичайним, тільки в якості маркера буде використаний стандартний HML-символ, наприклад ». який відповідає закриває друкарською лапки: ".
»Item 5 зробимо цей пункт трохи довше, щоб він переходив на наступний рядок
Тут слід зазначити, що Netscape6 / 7 / Mozilla (і інші похідні Gecko-браузери), а також Opera вміють генерувати контент з допомогою псевдо елемента: before з стандарту CSS2. Скористаємося цією функцією і сгенерируем автоматично символ "чи якийсь інший символ в якості маркера. Таким чином нам не треба буде вписувати його вручну в кожен LI елемент. Якщо ви працює з оглядачем Opera або з сімейством броузерів Gecko, нижченаведений CSS створить такий же список, що і попередній, при цьому в сам список нічого додатково додавати не потрібно.
# Custom-gen ul li: before content: "\ 00BB \ 0020";
>
Властивості content може бути присвоєна текстовий рядок, URL або щось інше, включаючи спеціальні символи. Якщо ви зупинили свій вибір на символі типу », в властивості треба прописати шістнадцятковий код цього символу. У правій друкарською лапки це код \ 00BB (інший символ \ 0020 - це пробіл, доданий з естетичних міркувань). Кінцевий результат представлений нижче (дивіться браузером Opera або Mozilla / Netscape):
Item 5 зробимо цей пункт трохи довше, щоб він переходив на наступний рядок
Вибудовуємо список в ряд
Хто сказав, що списки повинні йти вертикально і оформлятися зліва маркерами? Наприклад вам потрібен нумерований список посилань, але візуально ви хочете, щоб цей список на сторінці виглядав як вертикальна панель навігації. Або скажімо, ви хочете, щоб посилання розташовувалися горизонтально вздовж верхнього краю сторінки.
Це стосується не тільки списку посилань. Вам може знадобитися привести список кілька разів всередині абзацу (наприклад, список книг). Структурно - це список, але раніше якби ви таке зробили, цей список розірвав би ваш абзац. CSS знову приходить до вас на допомогу!
Так як даний перелік не буде на сторінці чимось окремим, я не буду поміщати його в базовий DIV, як попередні списки. На цей раз розмітка буде виглядати так: абзац, список, наступний абзац.
Уже чую крики: "Дурень! Ми думали ти навчиш нас, як поміщати списки всередині абзацу, а не між двома абзацами."
І на це я відповім: "Ну так, ви праві. На жаль (X) HTML не дозволяє поміщати списки всередину абзацу. Однак за допомогою стилів ви можете зробити ось що".
Перш за все, ось стильові правила:
# Inline-list border: 1px solid # 000;
margin: 2em;
width: 80%;
padding: 5px;
font-family: Verdana, sans-serif;
>
# Inline-list p display: inline;
>
# Inline-list ul, # inline-list li display: inline;
margin: 0;
padding: 0;
color: # 339;
font-weight: bold;
>
Весь код поміщений в
Результат виглядає так (список виділено синім кольором):
A bit of text before the list appears. Perhaps the context is something about a husband getting a call from his wife to pick up a few things on the way home from work. It does not really matter, for our purposes we just need some preceding text before the list:
Item 5 зробимо цей пункт трохи довше, щоб він переходив на наступний рядок.
And then there is the text that follows the list in the paragraph. One or two sentences is sufficient for the example.
Як і в прикладі вище з маркером ми можемо за допомогою CSS автоматично генерувати коми і крапки. Якщо ваші відвідувачі користуються тільки броузерами Opera і Gecko, вам нема про що турбуватися. Стильові правила будуть виглядати ось так:
# Inline-list-gen ul li: after content: ",";
>
# Inline-list-gen ul li.last: after content: ".";
>
Тут ми використовуємо псевдо-елемент: after для додавання коми в кінці кожного пункту списку, а точку ставимо за допомогою класу class = "last". Результат буде таким (пам'ятаєте, він працює тільки в Opera або Mozilla / Netscape):
A bit of text before the list appears. Perhaps the context is something about a husband getting a call from his wife to pick up a few things on the way home from work. It does not really matter, for our purposes we just need some preceding text before the list:
Item 5 зробимо цей пункт трохи довше, щоб він переходив на наступний рядок
And then there is the text that follows the list in the paragraph. One or two sentences is sufficient for the example.
Як я вже сказав на самому початку меню посилань, які ми бачимо на кожному сайті, повинні бути оформлені як списки, ніж вони по суті і є. Так як ми не хочемо бачити цей список так, як його виводить броузер за замовчуванням, скористаємося CSS для внесення косметичних змін. Ми вже знаємо, що списки можна спеціально виводити горизонтально (в один рядок), а не тільки вертикально (як вони виводяться за замовчуванням). За допомогою стилів маркери можна прибрати, а в ваших руках з'являється широкий набір можливостей, як візуально відокремити один пункт списку від іншого.
Ось приклади горизонтальних списків, вміщених в один і той же базовий DIV з наступними правилами.
# H-contain padding: 5px;
border: 1px solid # 000;
margin-bottom: 25px;
>
Два приклади нижче використовують все той же UL тільки без довгого тексту в останньому пункті. Доданий також додатковий клас, який дозволяє окремо працювати з одним з LI в списку.
символ | часто використовується для позначення різних варіантів вибору. Цілком природно використовувати його в меню. Симітіруем цей символ за допомогою кордонів у LI.
#pipe ul margin-left: 0;
padding-left: 0;
display: inline;
>
#pipe ul li margin-left: 0;
padding: 3px 15px;
border-left: 1px solid # 000;
list-style: none;
display: inline;
>
#pipe ul li.first margin-left: 0;
border-left: none;
list-style: none;
display: inline;
>
Ми додали клас class = "first" до першого LI, щоб у нього зліва не з'являлася непотрібна межа.
Дайте розберемо стильову таблицю правило за правилом, і я поясню для чого потрібно кожне з них.
#button width: 12em;
border-right: 1px solid # 000;
padding: 0 0 1em 0;
margin-bottom: 1em;
font-family: 'Trebuchet MS', 'Lucida Grande',
Verdana, Lucida, Geneva, Helvetica,
Arial, sans-serif;
background-color: # 90bade;
color: # 333;
>
#button ul list-style: none;
margin: 0;
padding: 0;
border: none;
>
#button li border-bottom: 1px solid # 90bade;
margin: 0;
>
#button li a display: block;
padding: 5px 5px 5px 0.5em;
border-left: 10px solid # 1958b7;
border-right: 10px solid # 508fc4;
background-color: # 2175bc;
color: #fff;
text-decoration: none;
width: 100%;
>
html> body #button li a width: auto;
>
#button li a: hover border-left: 10px solid # 1c64d1;
border-right: 10px solid # 5ba3e0;
background-color: # 2586d7;
color: #fff;
>
Нарешті, я дійшов до посилань. У вихідному дизайні зліва і справа були кордону по 10 пікселів кожен. Ці кордони міняли свій колір разом з фоном при наведенні мишки. Це поведінка досить просто отримати за допомогою псевдо-класу: hover. тому ефект зміни кольору кордонів і фону застосований до елементів .
Тут скористався одним трюком: щоб поведінка посилань поширювалося на весь блок (по ширині і висоті), я присвоїв їм правило display: block ;. Це спрацювало у всіх броузерах, крім IE для Windows. Якщо ви явно вкажіть ширину в 100%, IE для Windows все зрозуміє. Але при цьому ви отримуєте проблеми в браузерах IE5 для Mac і Netscape / Mozilla. Тому я схитрував: за допомогою дочірнього селектора ">" я присвоїв ширині значення "auto". Так як броузер IE для Windows не розуміє дочірніх селектор, він ігнорує це правило. IE5 для Mac, Opera і Netscape / Mozilla розуміють це правило, і всі залишилися задоволеними.
Правило для псевдо-класу: hover змінює колір фону і кордонів при наведенні мишки на посилання.
вершина айсберга
Марк Ньюхаус (Mark Newhouse) веде блог gnuhaus.com. працює в noao.edu. і пише статті для realworldstyle.com.