Позиціонування (вирівнювання) блокових елементів CSS. Позиціювання
Як ви напевно вже знаєте верстати сайт можна, використовуючи таблиці, в цьому випадку сторінка розбивається на комірки. А можна для цього використовувати блоки, коли сторінка сайту складається з окремих елементів.
Напевно, не помилюся, якщо скажу, що при цьому серйозною проблемою для багатьох веб-майстрів-початківців є завдання розмістити блоки в заданому місці веб-сторінки.
Однією з головних труднощів при верстці за допомогою блоків є позиціонування (вирівнювання) цих блоків.
Трохи про шари (layers)
Думаю, багато хто з вас чув про таке поняття, як шар (layer). І, зазвичай, під шаром розуміється блок, заданий тегом
. Насправді, все трохи не так.
У HTML немає шарів. Це просто метафора. Коли йдеться про шари, то під ними розуміється html контейнер (елемент), який може бути поміщений в певному місці веб-сторінки.
Другою помилкою є віднесення до шарів лише блоку, заданого тегом
. Це теж не так. До них також можна віднести параграфи (
), списки (
) та інші елементи.
А тепер про
ах.
Як уже говорилося вище, задати місце можна будь-якому HTML елементу. Для цього немає потреби завжди використовувати тег
. Також використання цього тега не зобов'язує вас задавати йому будь-яке положення на веб-сторінці.
Сенс застосування блоку, заданого тегом
зводиться до укрупнення. Адже всередину його можна помістити інші елементи (параграфи, картинки тощо). Таким чином виходить великий блок з різноманітним вмістом, який значно легше позиціонувати на веб-сторінці, ніж кожен з елементів окремо.
Використовується як розташування за замовчуванням. В цьому випадку браузер переглядає html код, поділяє його на елементи і складає сторінку. Виходить послідовність із низки елементів. Виводяться вони в тому порядку, в якому вказані в коді html.
Застосування параметрів left, top, right та bottomне призводить до якихось результатів.
Потрібно пам'ятати про статичне позиціонування, коли використовується відносне розташування.
Абсолютне (Absolute)
За допомогою абсолютного позиціонування задаються координати верхнього лівого кута блоку. У цьому відлік координат відбувається щодо розташування батьківського елемента. Якщо батьківським елементом є вікно браузера, вирівнювання блоку відбувається щодо нього. Якщо існує інший елемент, всередині якого розташований блок, вирівнювання відбувається вже щодо цього елемента.
Фіксований (Fixed)
Вже з назви стає зрозумілим, що в даному випадку елемент фіксується. Він розташований у певному місці веб-сторінки і нікуди не зрушується. Таке вирівнювання часто застосовується до спливаючих вікон, коли вони фіксуються по центру і не зміщуються при прокручуванні сторінки.
Відносне (Relative)
З цим видом позиціонування може бути складності. Його назва не зовсім вдала. Багато хто плутає відносне та абсолютне позиціонування елементів. Може здатися, що вирівнювання відбувається щодо батьківського елемента. А у випадку з абсолютним позиціонуванням – щодо вікна браузера. Але це не так.
Потрібно усвідомити, що розташування елемента в цьому випадку відбувається щодо його місця в статичному положенні. Це те, що згадувалося вище.
Простіше кажучи, ви вказуєте браузеру, що необхідно пересунути елемент на стільки пікселів, щодо того місця, де він розташований за замовчуванням.
Існує ще один складний момент. Що станеться, якщо батьківський елемент має відносне позиціонування, а вкладений у нього абсолютний елемент? У цьому випадку відлік координат дочірнього елемента буде проводитись щодо батьківського елемента, з урахуванням його зміщення, якщо воно має місце.
Підведемо підсумок.
Отже, є властивість position. Ця властивість може приймати 4 значення Static, Absolute, Fixed та Relative. За замовчуванням йде Static.
Коли ви вказуєте координати елемента, необхідно також повідомити браузеру, яким чином він повинен ці координати відраховувати. Потрібно дати йому відправну точку.
Не забувайте, що за відсутності властивості positionкоординати не враховуватимуться, блок залишиться на колишньому місці, у своєму статичному положенні.
А тепер подивимося, як задаються координати.
Для цих цілей застосовуються чотири види властивостей:
1. Top 2. Left 3. Right 4. Bottom
Top- Позитивне значення (наприклад, 20px) зміщує блок на 20 пікселів вниз. Негативне значення (-20px) зміщує елемент на 20 пікселів верх. Усе це відбувається щодо верхнього лівого кута.
Left- Зміщення вліво або вправо, залежно від знака. Щодо лівого верхнього кута.
Right- Зміщення вправо і вліво, дивлячись якийсь знак. Щодо правого верхнього кута.
Bottom- Зміщення вгору чи вниз, залежить від знака. Відбувається щодо лівого нижнього кута.
Для верстки сторінок часто використовуються два основних інструменти. позиціонування (positioning)і вільне переміщення (floating). CSS-позиціонування дозволяє вказати, де з'явиться блок елемента, а вільне переміщення переміщає елементи до лівого або правого краю блоку-контейнера, дозволяючи решті вмісту обтікати його.
Позиціонування та вільне переміщення елементів
1. Типи позиціонування
Властивість position дозволяє точно задати нове розташування блоку щодо того місця, де він перебував у нормальному потоці документа. За замовчуванням всі елементи розташовуються послідовно один за одним у порядку, в якому вони визначені в структурі HTML-документа. Властивість не успадковується.
position
Значення:
static
Значення за умовчанням означає відсутність позиціонування. Елементи відображаються послідовно один за одним у порядку, в якому вони визначені в HTML-документі. Використовується для чищення будь-якого іншого значення позиціонування.
relative
Відносно позиціонований елемент зсувається зі свого звичайного місця у різних напрямках щодо меж батьківського контейнера, а простір, що він займав, не зникає. Цей елемент може перекривати інший вміст на сторінці.
Якщо щодо позиціонованого елемента одночасно задати властивості top і bottom чи left і right , то першому випадку спрацює лише top , у другому — left .
Відносне позиціонування дозволяє задавати z-index елемента, а також абсолютно позиціонувати дочірні елементи всередині блоку.
absolute
Абсолютно позиціонований елемент повністю видаляється з потоку документа і позиціонується щодо меж його блоку-контейнера (іншого елемента або вікна браузера). Блок-контейнер для абсолютно позиціонованого елемента - найближчий елемент-предок, значення якості position якого не дорівнює static.
Розташування країв елемента визначається за допомогою властивостей усунення. Простір, який займав такий елемент, хлопається, начебто елемента не існувало на сторінці. Абсолютно позиціонований елемент може перекривати інші елементи або перекритим ними (за рахунок властивості z-index). Будь-який абсолютно позиціонований елемент генерує блок, тобто набуває значення display: block; .
fixed
Фіксує елемент у вказаному місці сторінки. Блоком-контейнером фіксованого елемента є вікно відтворення, тобто елемент завжди фіксується щодо вікна браузера і не змінює свого положення під час прокручування сторінки. Сам елемент у своїй повністю видаляється з основного потоку документа і у новому потоці документа.
initial
Встановлює значення властивості значення за замовчуванням.
inherit
Наслідує значення властивості від батьківського елемента.
Мал. 1. Різниця між статичним, відносним та абсолютним позиціонуванням
2. Властивості усунення
Властивості описують усунення щодо найближчої сторони блоку-контейнера. Задаються для елементів, котрим значення властивості position однаково static . Можуть приймати як позитивні, і негативні значення. Чи не успадковуються.
Для властивості top позитивні значення переміщують верхній край елемента, що позиціонується нижче, а негативні - вище верхнього краю його блоку-контейнера. Для властивості left позитивні значення зсувають край елемента, що позиціонується вправо, а негативні значення - вліво. Тобто позитивні значення зміщують елемент усередину блоку-контейнера, а негативні - за його межі.
3. Позиціонування всередині елемента
Для блоку-контейнера абсолютно позиціонованого елемента задається властивість position: relative без зсувів. Це дозволяє позиціонувати елементи усередині елемента-контейнера.
1. Якщо ширині або висоті абсолютно позиціонованого елемента присвоєно значення auto , то значення буде визначатися шириною або висотою вмісту елемента. Якщо ширина чи висота оголошено явно, саме це значення і буде присвоєно. 2. Якщо всередині блоку з position: absolute розташовані елементи, для яких задано обтікання float , то висота цього елемента дорівнює висоті найвищого з цих елементів. 3. Для елемента з position: absolute чи position: fixed не можна одночасно встановлювати властивість float , а елемента з position: relative — можна. 4. Якщо предок позиціонованого елемента є блоковим елементом, блок-контейнер формується областю вмісту, обмеженою рамкою (border). Якщо предок є рядковим елементом, блок-контейнер формується зовнішньою межею його вмісту. Якщо предка немає, блоком-контейнером є елемент body.
5. Вільне переміщення елементів
У звичайному порядку блокові елементи відображаються, починаючи з верхнього краю вікна браузера до нижнього краю. Властивість float дозволяє переміщати будь-який елемент, вирівнюючи його по лівому або правому краю веб-сторінки або елемента-контейнера, що містить його. При цьому інші блокові елементи будуть його ігнорувати, а малі елементи зміщуватимуться вправо або вліво, звільняючи для нього простір і обтікаючи його.
Мал. 3. Вільне переміщення елементів
Плаваючий блок приймає розміри свого вмісту з урахуванням внутрішніх відступів та рамок. Верхні та нижні відступи margin плаваючих елементів не хлопаються. Властивість float застосовується як до блокових елементів, так і до малих елементів.
Лівий або правий зовнішній край елемента, що переміщається, на відміну від позиціонованих елементів, не може розташовуватися лівіше (або правіше) внутрішнього краю його блоку-контейнера, тобто. виходити за його межі. При цьому якщо для блоку-контейнера задані внутрішні відступи, то плаваючий блок буде відстояти від краю блоку-контейнера на задану відстань.
Властивість автоматично змінює значення властивості display на display: block для наступних значень: inline , inline-block , table-row , table-row-group , table-column , table-column-group , table-cell , table-caption , table-header-group , table-footer-group . Значення inline-table змінює table .
Властивість не впливає на елементи з display: flex і display: inline-flex .
У разі використання властивості float для блокових елементів обов'язково задавати ширину. Тим самим браузер створить місце для іншого вмісту. Але якщо сукупна ширина всіх стовпців виявиться більше доступного місця, останній елемент спуститься вниз.
При цьому вертикальні відступи margin обтічних елементів не хлопаються з відступами сусідніх елементів, на відміну від звичайних блокових елементів.
6. Скасування обтікання елементів
6.1. Властивість clear
Властивість clear визначає, як розташовуватиметься елемент, що йде слідом за плаваючим елементом. Властивість скасовує обтікання з одного або обох сторін елемента, встановлене властивістю float . Для запобігання відображенню фону або меж під плаваючими елементами використовується правило (overflow: hidden;) .
6.2. Очищення потоку стилями за допомогою класу clearfix та псевдокласу: after
Припустимо, є блок-контейнер, для якого не задані ширина та висота. Усередині нього розміщений плаваючий блок із заданими розмірами.
Clearfix:after (content: ""; display: table; clear: both; ) Мал. 5. Застосування «очищаючого» методу для блоку-контейнера, що містить плаваючий елемент
6.3. Легкий спосіб очищення потоку
Існує ще один прийом очищення потоку для елемента, що містить плаваючі елементи, наприклад, для маркованого горизонтального списку:
Однією з найкращих сторін CSS є те, що стилі дають нам можливість позиціонувати вміст та елементи на сторінці практично будь-яким чином. Це вносить структурність у наш дизайн та допомагає зробити контент наочнішим.
Є кілька різних типів позиціонування CSS, кожен із цих типів має власну область дії. У цьому розділі ми збираємося поглянути на кілька різних випадків застосування - створення макетів, що багаторазово використовуються, і унікальне позиціонування одноразових елементів, а також опис декількох методів як це зробити.
Позиціювання через float
Один із способів позиціонування елементів на сторінці - через властивість float. Ця властивість досить універсальна і може застосовуватись різними шляхами.
По суті, властивість float бере елемент, прибирає його зі звичайного потоку сторінки та позиціонує ліворуч або праворуч від батьківського елемента. Всі інші елементи на сторінці обтікатимуть такий елемент. Наприклад, абзаци будуть обтікати зображення, якщо елемент встановлено властивість float.
Коли властивість float застосовується до кількох елементів одночасно, це дає можливість створити макет з обтічними елементами, розташованими поруч або навпроти один одного, як показано в багатоколоночному макеті.
Властивість float приймає кілька значень, два найпопулярніші - це left і right, вони дозволяють елементу розташовуватися ліворуч або праворуч від свого батька.
Img (float: left;)
float на практиці
Давайте створимо загальний макет сторінки з шапкою вгорі, двома колонками у центрі та підвалом внизу. В ідеалі, цю сторінку слід розмітити за допомогою елементів
,
,
......
Демонстрація макету без float
Тут елементи і
Section ( float: left; ) aside ( float: right; )
Для довідки обтічні елементи розташовуються по краю батьківського елемента. Якщо немає батька, обтіканий елемент розташовуватиметься по краю сторінки.
Коли ми встановлюємо елемент, що обтікає, то прибираємо його зі звичайного потоку HTML-документа. Це призводить до того, що ширина цього елемента за умовчанням стає шириною вмісту. Іноді, наприклад, коли ми створюємо колонки для макету, що багаторазово використовується, така поведінка небажана. Це можна виправити шляхом додавання властивості width з фіксованим значенням кожної колонки. Крім того, щоб обтічні елементи не торкалися один одного, в результаті чого вміст одного елемента розташовується поруч з іншим, ми можемо використовувати властивість margin , щоб встановити простір між елементами.
Нижче ми розширюємо попередній блок коду, додавши margin та width для кожної колонки, щоб краще формувати наш бажаний результат.
Для обтічного елемента також важливо розуміти, що елемент видаляється зі звичайного потоку сторінки і що елемент може змінити значення display , задане за замовчуванням. Властивість float спирається на те, що у елемента значення display встановлено як block і може змінити значення display у елемента за замовчуванням, якщо він ще не відображається як блоковий елемент.
Наприклад, елемент, у якого display вказаний як inline , такий як малий , ігнорує будь - які властивості height або width . Однак, якщо для рядкового елемента вказати float , значення display зміниться на block і тоді елемент може приймати властивості height або width .
Коли ми застосовуємо float для елемента, повинні стежити за тим, як це впливає на значення властивості display .
Для двох колонок ви можете встановити float, для однієї колонки як left, а для іншої як right, але для декількох колонок нам доведеться змінити наш підхід. Скажімо, наприклад, ми хотіли б отримати низку з трьох колонок між нашими елементами і
......
...
...
Щоб розташувати ці три елементи в рядок з трьох колонок, ми повинні встановити float для всіх елементів як left. Ми також маємо налаштувати ширину з урахуванням додаткових колонок і розташувати їх одне поруч із другим.
Тут у нас є три колонки, все з рівною шириною і значенням margin, а також з float, заданим як left.
Демонстрація триколонкового макету з float
Очищення та вміст float
Властивість float спочатку була розроблена, щоб дозволити вмісту обтікати навколо зображень. Для зображення може бути задано float і весь вміст навколо цього зображення, звичайно, обтікає навколо нього. Хоча це чудово працює для картинок, властивість float насправді не була призначена для використання в макеті і з метою позиціонування і, таким чином, йде з кількома пастками.
Однією з цих пасток є те, що іноді належні стилі не відображаються на елементі, розташованому поруч з обтічним елементом або його батьком. Коли елемент встановлений обтічний, він забирається зі звичайного потоку сторінки і, як результат, стилі елементів навколо цього обтічного елемента можуть отримати негативний вплив.
Часто значення властивостей margin та padding інтерпретуються некоректно, змушуючи їх зливатися з обтічним елементом. Інші властивості також можуть бути порушені.
Інша помилка полягає в тому, що іноді небажаний контент починає обтікати елемент із float . Видалення елемента з потоку документа дозволяє всім елементам навколо обтічного елемента обходити його і задіяти будь-який доступний простір навколо обтічного елемента, що часто буває небажаним.
У нашому попередньому прикладі з двома колонками, після того як ми додали float до елементів і
Демонстрація макету без очищення float
Щоб запобігти вмісту від обмотування навколо обтічних елементів, нам потрібно зробити очищення float і повернути сторінку в її звичайний потік. Ми розглянемо як очистити float, а потім поглянемо на їхній вміст.
Очищення float
Очищення float відбувається за допомогою властивості clear , яка приймає кілька різних значень: значення, що найчастіше використовуються - left , right і both .
Div (clear: left;)
Значення left очищає ліві float, в той час як значення right очищає праві float. Значення both, однак, очистить ліві та праві float і часто є найбільш ідеальним варіантом.
Повертаючись до нашого попереднього прикладу, якщо ми використовуємо clear властивість зі значенням both для елемента
Footer ( clear: both; )
Демонстрація макет з очищення float
Вміст float
Замість очищення float, ще одним варіантом є встановлення вмісту float. Результат вийде майже такий самий, проте вміст float дійсно гарантує, що всі наші стилі відображатимуться належним чином.
Щоб встановити вміст float , обтічні елементи повинні знаходитися всередині батьківського елемента, він буде виступати як контейнер, залишаючи потік документа повністю звичайним за його межами. У стилях цього батьківського елемента представлений клас group , як показано тут:
Тут трохи що відбувається, але, по суті, все, що CSS робить - очищає всі обтічні елементи всередині елемента з класом group і повертає документ у звичайний потік.
Більш конкретно, псевдоелементи :: before і :: after, як зазначено в уроці 4, динамічно генерують елементи вище та нижче елемента з класом group. Ці елементи не включають будь-який контент і відображаються як табличні елементи, подібно елементам блоковим. Динамічно генерований елемент після елемента з класом group очищає float всередині елемента з класом group так само, як і clear раніше. І, нарешті, елемент з класом group також очищає всі float, які можуть з'явитися до нього на випадок, якщо існує float зі значенням left або right. Також сюди включено невелику хитрість, яка змушує старі браузери грати красиво.
Тут більше коду, ніж єдина команда clear: both, але він може виявитися дуже корисним.
Розглядаючи наш макет сторінки з двома колонками, ми могли б обернути і
Показана тут техніка відома як clearfix і часто зустрічається на інших сайтах з ім'ям класу clearfix або cf. Ми вирішили використовувати ім'я класу group, тому що він представляє групу елементів і краще виражає вміст.
Коли для елементів встановлено float важливо стежити за тим, як вони впливають на потік сторінки і переконайтеся, що потік сторінки скидається шляхом очищення або через вміст float, як треба. В іншому випадку, відстеження float може викликати чимало головного болю, особливо на сторінках, що містять кілька рядків, у кожному з яких кілька колонок.
На практиці
Повернімося до сайту Styles Conference та опробуємо на ньому додавання float до деякого вмісту.
Насамперед, перед застосуванням float до будь-якого елементу, давайте забезпечимо вмістом ці обтічні елементи, додавши clearfix в наш CSS. У файлі main.css, трохи нижче від наших стилів сітки, додамо clearfix під ім'ям класу group, як і раніше. /* ======================================== Clearfix ======= ================================= */ .group::before, .group::after ( content: " "; display: table; ) .group::after ( clear: both; ) .group ( clear: both; * zoom: 1; )
Тепер, коли ми можемо використовувати float, давайте поставимо його для основного
всередині елемента як left і дозволимо решті вмісту в заголовку обтікати його праворуч.
Щоб зробити це, додамо клас logo до елементу
. Потім всередині нашого CSS додамо новий розділ стилів для головного заголовка. У цьому розділі ми оберемо елемент
Поки ми тут додамо трохи більше деталей до нашого логотипу. Почнемо з розміщення елемента або розрив рядка між словами «Styles» та «Conference», щоб змусити текст нашого логотипу розташовуватися на двох рядках.
У CSS додамо кордон по верху нашого логотипу і невеликий вертикальний padding, щоб логотип вільно дихав.
обтічний, то хочемо встановити вміст float . Найближчим батьком для
є елемент тому ми додамо до нього клас group . Це застосує до нього стилі clearfix, які ми встановили раніше.
...
Елемент приймає форму, так що давайте поглянемо на елемент
На відміну від елемента Однак ми не збираємося застосовувати клас безпосередньо до обтічного елемента. На цей раз ми збираємося додати клас до батька обтічного елемента і використовувати унікальний селектор CSS, щоб вибрати елемент, а потім задати йому float .
Почнемо з додавання класу primary-footer до елементу
Тепер, коли клас primary-footer встановлений для елемента
/* ======================================== Основний підвал ====== ================================== */ .primary-footer small ( float: left; )
Для перевірки – тут ми вибираємо елемент , який повинен знаходитися всередині елемента зі значенням primary-footer у атрибуту class , такий як наш елемент
Нарешті, додамо невеликий padding зверху та знизу елемента
Мал. 5.01. За допомогою декількох float, елементи і
Позиціювання через inline-block
На додаток до використання float ще один спосіб, яким ми можемо позиціонувати контент - це застосування властивості display в поєднанні зі значенням inline-block . Метод з inline-block, як ми ще обговоримо, в першу чергу корисний для компонування сторінок або розміщення елементів у лінію поруч один з одним.
Нагадаємо, що значення inline-block для властивості display відображає елементи в лінію і дозволяє їм приймати всі властивості блокової моделі, включаючи height, width, padding, border та margin. Застосування inline-block дозволяє нам повною мірою скористатися блочною моделлю, не переймаючись очищенням будь-яких float.
inline-block на практиці
Погляньмо на наш триколоночний приклад із самого початку. Почнемо ми, зберігаючи наш HTML таким:
......
...
...
Тепер замість float для наших трьох елементів ми змінимо у них значення display на inline-block, залишаючи властивості margin і width ті, що були раніше. В результаті наш CSS буде виглядати так:
На жаль, одного цього коду недостатньо щоб зробити трюк та останній елемент виштовхується на новий рядок. Пам'ятайте, оскільки малі елементи відображаються на одній лінії один за одним, вони включають єдиний простір між ними. Коли розмір кожного окремого простору додається до ширини та значення горизонтального margin всіх елементів у рядку, загальна ширина стає занадто великою, виштовхуючи останній елемент на новий рядок. Щоб відобразити всі елементи на одному рядку слід видалити порожній простір між кожним
.
Демонстрація елементів inline-block із пробілом
Видалення простору між рядково-блочними елементами
Є кілька методів, як видалити простір між рядково-блочними елементами і деякі з них складніші за інші. Ми збираємося зосередитись на двох найпростіших методах, кожен з яких відбуваються всередині HTML.
Перше рішення - це помістити кожен новий тег елемента у тому ж рядку, що і тег попереднього елемента, що закриває . Замість використання нового рядка для кожного елемента ми починаємо елементи з того ж рядка. Наш HTML може виглядати так:
...
...
...
...
Написання рядково-блочних елементів таким чином гарантує, що простору між такими елементами HTML не існує. Отже, простір і не з'явиться під час відображення сторінки.
Демонстрація елементів inline-block без пробілів
Ще один метод для видалення простору між рядково-блочними елементами полягає у відкритті коментаря HTML безпосередньо після елемента, що закриває тега. Потім закрийте коментар безпосередньо перед тегом наступного елемента. Це дозволяє рядково-блочним елементам починатися і завершуватися на окремих рядках HTML і «закоментує» будь-який потенційний простір між елементами. В результаті код виглядатиме таким чином:
...
...
...
...
Жоден із цих варіантів не є досконалим, але вони корисні. Я схиляюся до застосування коментарів для кращої організації, але який варіант ви оберете повністю залежить від вас.
Створення макетів, що багаторазово використовуються
При створенні сайту завжди краще написати модульні стилі, які можуть бути повторно задіяні в інших місцях, а макети, що багаторазово використовуються, знаходяться у верхній частині списку повторно застосовуваного коду. Макети можуть бути створені за допомогою float або рядково-блочних елементів, але що працює краще та чому?
Питання, що краще для структури сторінки - обтічні або рядково-блокові елементи, відкритий для обговорення. Мій підхід полягає у використанні рядково-блокових елементів для створення сітки або макета сторінки, а потім задіяти float , коли мені хочеться щоб контент обтікав навколо даного елемента (для чого float і були призначені під час роботи із зображеннями). Взагалі, я також вважаю, що із рядково-блочними елементами легше працювати.
Тим не менш, використовуйте те, що працює краще для вас. Якщо з одним підходом ви знайомі краще, ніж з іншим, тоді залучайте його.
В даний час в роботі з'явилися нові специфікації CSS - зокрема властивості flex-і grid-, які допоможуть вирішити, як найкраще зверстати сторінки. Слідкуйте за цими методами, коли вони почнуть спливати.
На практиці
З твердим розумінням макетів, що багаторазово використовуються, настав час впровадити один на наш сайт Styles Conference.
Для сайту Styles Conference ми створимо триколонок макет використовуючи рядково-блокові елементи. Ми зробимо це так, щоб отримати три колонки однакової ширини або дві колонки із загальною шириною, розділеною між ними як 2/3 для однієї та 1/3 для іншої.
Спочатку ми створимо класи, що визначають ширину цих колонок. Ці два класи ми назвемо col-1-3 для однієї третини та col-2-3 для двох третин. У розділі «Сітка» нашого файлу main.css перейдемо вперед та визначимо ці класи та відповідну їм ширину.
Ми хочемо, щоб обидві колонки відображалися як рядково-блокові елементи. Нам також треба переконатися, що вертикальне вирівнювання у них задано по верхній частині кожної колонки.
Давайте створимо два нових селектори, які спільно використовуватимуть display і vertical-align .
Подивіться на CSS знову. Ми створили два селектори класу col-1-3 та col-2-3 розділених комою. Кома в кінці першого селектора означає, що за нею слідує інший селектор. Після другого селектора йде фігурна дужка, що відкриває, яка повідомляє що починається опис стилю. За допомогою коми селектори, що розділяє, ми можемо прив'язати один стиль до кількох селекторів одночасно.
Ми хочемо помістити деякий простір між колонками, який допоможе розбити вміст. Це можна зробити, додавши горизонтальний padding до кожної колонки.
Це добре працює, однак, коли дві колонки розташовуються поруч один з одним, ширина простору між ними буде вдвічі більшою, ніж простір від зовнішнього краю. Щоб врівноважити це, ми помістимо всі наші стовпчики у сітку та додамо до неї той же padding .
Давайте скористаємося класом grid, щоб визначити нашу сітку, а потім задамо однаковий горизонтальний padding для класів grid, col-1-3 та col-2-3. З комами, що знову розділяють наші селектори, наш CSS виглядає наступним чином:
Коли ми встановлюємо горизонтальний padding, нам потрібно бути обережними. Пам'ятайте, у минулому уроці ми створили контейнер із класом container по центру всього нашого контенту на сторінці із шириною 960 пікселів. В даний момент, якби ми поставили елемент з класом grid всередину елемента з класом container , то їх горизонтальні padding склалися б разом і наші колонки не відображатимуться пропорційно ширині решти сторінки.
Ми здійснимо це, розбиваючи набір старих правил container на наступне:
Тепер будь-який елемент з класом container або grid буде 960 пікселів завширшки і розташовуватись по центру сторінки. Крім того, ми зберегли існуючий горизонтальний padding для будь-якого елемента з класом container шляхом переміщення його в новий, окремий набір правил.
Добре, всю важку необхідну частину налаштування сітки завершили. Тепер настав час для роботи з нашим HTML та перегляду, як ці класи діють.
Ми почнемо з тизерів на головній сторінці, у файлі index.html, вирівнявши їх за трьома колонками. В даний час тизери обгорнуті елементом з класом container. Ми хочемо змінити клас container на grid так, щоб всередині ми могли почати розміщення колонок.
...
...
...
...
І, нарешті, оскільки кожна наша колонка є рядково-блочним елементом, слід переконатися, що ми видалили порожній простір між ними. Щоб зробити це, ми скористаємося коментарями і додамо трохи документації до кожного розділу, щоб краще організувати свій код.
...
...
...
Для перевірки – у рядку 3 ми залишили коментар, що ідентифікує розділ «Спікери», який за ним слідує. Наприкінці рядка 7 ми відкриваємо коментар відразу після тега, що закриває. У цьому коментарі, у рядку 9 ми визначаємо наступний розділ «Розклад». Потім закриваємо коментар на початку рядка 11, відразу перед тегом, що відкриває . Аналогічна структура коментарів з'являється у рядках з 13 до 17 між двома елементами прямо перед розділом «Місце проведення». Загалом, ми закоментували будь-який потенційний порожній простір між колонками, одночасно використовуючи самі коментарі для ідентифікації наших розділів.
Тепер у нас є повторно використовувана триколонова сітка, яка підтримує різні розстановки, з використанням ширини колонок як 1/3 та 2/3. Наша головна сторінка містить три колонки, розділяючи всі тизери.
Мал. 5.02. Головна сторінка Styles Conference тепер включає триколонок макет
Демонстрація та вихідний код
Нижче ви можете переглянути сайт Styles Conference у його нинішньому стані, а також завантажити вихідний код сайту на даний момент.
Унікальне позиціонування елементів
Рано чи пізно кожен побажає точно позиціонувати елемент, але float або малі елементи не дозволяють зробити такий трюк. Обтічні елементи, які видаляють елемент із потоку сторінки, часто призводять до небажаних результатів, оскільки навколишні елементи обтікають навколо елемента з float . Рядково-блокові елементи, якщо ми не створюємо колонки, можуть бути досить незручні, коли справа стосується правильного положення. Для таких ситуацій ми можемо використовувати властивість position у поєднанні з властивостями зміщення блоку.
Властивість position визначає, як елемент позиціонується на сторінці і чи відображатиметься він у звичайному потоці документа. Воно застосовується у поєднанні з властивостями зміщення блоку - top , right , bottom і left , які визначають, де елемент буде розташований шляхом переміщення елемента в різних напрямках.
За замовчуванням у кожного елемента значення position встановлено як static , це означає, що елемент існує у звичайному потоці документа і не приймає жодних властивостей для його зміщення. Значення static найчастіше переписується значенням relative чи absolute, які ми розглянемо далі.
Відносне позиціонування
Значення relative для властивості position дозволяє елементам відображатися у звичайному потоці сторінки, резервуючи місце для елемента, як передбачалося, і не дозволяючи іншим елементам його обтікати. Однак, воно також дозволяє модифікувати положення елемента за допомогою зміщення властивостей. Наприклад, розглянемо такі HTML і CSS:
з класом offset задано значення position як relative, і навіть дві властивості усунення - left і top . Це зберігає вихідне положення елемента та іншим елементам заборонено рухатися до цієї області. Крім того, властивості зсуву переміщують елемент, виштовхуючи його на 20 пікселів від лівого та на 20 пікселів від верхнього вихідного розташування.
Для відносно позиціонованих елементів важливо знати, що властивості зміщення блоку визначають, куди елемент буде переміщений з огляду на його вихідне положення. Таким чином, властивість left зі значенням 20 пікселів фактично штовхає елемент праворуч на 20 пікселів. Властивість top зі значенням 20 пікселів потім штовхатиме елемент вниз на 20 пікселів.
Коли ми позиціонуємо елемент за допомогою властивостей усунення, елемент перекриває елемент під ним, а не зрушує його вниз, як це роблять margin або padding властивості .
Абсолютне позиціонування
Значення absolute для властивості position відрізняється від значення relative тим, що елемент з абсолютним позиціонуванням не з'являється у звичайному потоці документа, вихідний простір і положення елемента, що абсолютно позиціонується, не резервується.
Крім того, елементи, що абсолютно позиціонуються, переміщуються щодо їх найближчого відносно позиціонованого батьківського елемента. Якщо щодо позиціонованого батька не існує, то абсолютно позиціонований елемент позиціонуватиметься щодо елемента
. Це невелика частина інформації; давайте поглянемо на те, як це працює всередині деякого коду:
У цьому прикладі елемент позиціонується відносно, але не включає будь-які властивості зсуву. Отже, його становище не змінюється. Елемент
з класом offset включає значення position як absolute. Оскільки елемент є найближчим щодо позиціонованим батьківським елементом для
, то елемент
позиціонуватиметься щодо елемента
.
Для відносно позиціонованих елементів властивості зсуву визначають, в якому напрямку елемент буде переміщений щодо себе самого. Для елементів елементів зсуву, що абсолютно позиціонуються, визначають, в якому напрямку елемент буде переміщений щодо його найближчого щодо позиціонованого батька.
В результаті властивостей right і top елемент
з'явиться в 20 пікселях праворуч і 20 пікселях зверху всередині
.
Оскільки елемент
позиціонуються абсолютно, він не розташовується у звичайному потоці сторінки і буде перекривати будь-які навколишні елементи. Крім того, вихідне положення
не зберігається та інші елементи можуть зайняти це місце. Як правило, більша частина позиціонування може відбуватися без застосування властивостей position і властивостей усунення, але в деяких випадках вони можуть виявитися надзвичайно корисними.
Резюме
Вивчення позиціонування вмісту HTML і CSS є величезним кроком у бік освоєння цих мов. Додайте до цього блокову модель і ось ми впевнено рухаємося шляхом перетворення на фронтенд-розробників.
Ми говорили про те, що позиціонувати елементи сторінки можна шляхом використання таблиць. Але це можна робити і за допомогою стилів. Серед параметрів стилю є спеціальні властивості для позиціонування:
left- Завдання відстані в пікселах від лівого краю вікна (х-координата);
top- для завдання відстані у пікселах від верхнього краю вікна (у-координату);
z-index- для вказівки порядку, в якому елементи перекриватимуть один одного; це новий вимір, елементи з більшим z-індексом з'являтимуться над елементами з меншим z-індексом.
Звичайно, при використанні цих трьох властивостей не створюється ефекту тривимірного простору, але це вже щось більше, ніж плоска поверхня. У цьому випадку говорять про 2,5-мірний простір. Крім властивостей-координат, нам знадобиться властивість роsition, яке у поєднанні з властивостями leftі topдозволяє встановлювати елементи у певні позиції вікна. Властивість position може набувати трьох значень:
absolute- Задані властивості leftі topпоставлять елемент у крапку з координатами хі ущодо верхнього лівого кута контейнера (об'єкта, що містить цей елемент). Якщо вони визначені для елемента поза контейнером, то початком відліку координат буде лівий верхній кут сторінки. Зауважимо, що положення елемента залежить від положення його тега всередині HTML-документа;
relative- елемент буде встановлений відповідно до того, де вихідного тексту він знаходиться; це значення встановлено за замовчуванням. Наприклад, якщо елемент знаходиться у трьох рядках від початку його виділення у тексті документа, то за умовчанням вважається, що властивість позиціонування має значення relative, а властивості координат leftі top- нульові значення. Ненульові значення властивостей left та top задають зсув елемента щодо вихідного положення;
static- елемент буде поставлений у деяке положення щодо фону і не переміщатиметься при прокручуванні сторінки.
Наступний приклад показує використання властивості z-index. Хоча в тексті програми картинка описана вище за інші елементи, за рахунок присвоєння їй індексу з великим номером відбувається переміщення її поверх першого тексту. Таким чином, використання властивості z-indexзвільняє від пут природного порядку згадування елементів у тексті HTML-програми.
<НЕАD>Позиціювання НЕАD>
nepBbiu позиціонований текстН1>
Н1>
Мал. 666. Використання властивості i-index дозволяє змінити природний порядок проходження елементів у тексті HTML-документа
При позиціонуванні елементів може виявитися, що розміри елемента перевершують розміри фрагмента (відведеної області, заданої в прикладі тегом
). Наприклад, текст або зображення не поміщаються повністю у прямокутник, виділений для них. На цей випадок є властивість overwlow(Переповнення). Властивість overflowможе мати три значення:
nоне(нічого) - якщо елемент і вийде межі фрагмента (відведеного йому місця), він однаково буде показаний;
clip- виступаючі за межі фрагмента частини елемента будуть обрізані;
scroll- буде використано прокручування.
У наступному прикладі використовується властивість overflowдля створення механізму прокручування першого тексту.
<НЕАD><ТIТLЕ>ПозиціюванняТIТLЕ>НЕАD>
riepBbiM позиціонований текстН1>
Другий позиціонований текстН1>
Мал. 667. Механізм прокручування тексту, реалізований за допомогою властивості overflow
Звичайно, непоказні сторінки з попередніх малюнків створювалися лише з метою продемонструвати можливості мови щодо позиціонування елементів. Ви самі вирішите, які кошти і для чого використовуватимете на своїй Web-сторінці.
За допомогою властивостей позиціонування неважко створювати для написів ефект тривимірності. Ідея полягає в тому, щоб вивести однакові за змістом тексти злегка зрушеними один щодо одного та забарвленими у різні кольори. Спробуйте як вправу написати відповідну програму. На малюнку показано приблизно те, що має вийти. Нижче наведено один з можливих варіантів програми, яка створює «тривимірний» напис.
Мал. 668. Приклад створення тривимірного тексту за допомогою CSS
Зверніть увагу, що цей спосіб створення ефектних заголовків значно економніший, ніж використання графічних файлів з аналогічним змістом.
При відносному позиціонуванні блоку слід задати властивість position:relativeта властивості усунення. Зміщення в цьому випадку відбуватиметься не щодо "батьківського" елемента (як при абсолютному позиціонуванні), а щодо самого блоку нормального потоку. Це буде зрозуміліше на прикладі. Нехай у нас є html-сторінка з трьома div-ами:
Відносне позиціонування
Давайте задамо в таблиці стилів розміри та межі цих блоків:
Наш другий блок змістився вниз і вправо щодо того місця, де він перебував у нормальному потоці. Інші блоки залишилися на своїх місцях. Практично відносне позиціонування застосовується досить рідко, тому ми більше не приділятимемо цьому увагу і розглянемо плаваючі блоки.
Плаваючі блоки
Ці блоки не можна позиціонувати з точністю до пікселя, як у попередніх схемах, але ця схема позиціонування дуже поширена. Без плаваючих блоків обходиться рідкісний сайт, а вже зробити гумову верстку сайту без них і зовсім неможливо.
Такі блоки можуть вільно переміщатися по сторінці, подібним чином поводяться картинки в HTML, вирівняні за допомогою параметра align.
Плаваючі блоки визначаються властивістю float, який визначає чи буде блок плаваючим і в який бік він переміщатиметься. Можливі три варіанти:
left- блок притискається до лівого краю, решта елементів обтікає його з правого боку.
right- блок притискається до правого краю, решта елементів обтікає його з лівого боку.
none- блок не переміщається та позиціонується згідно з властивістю position.
Давайте подивимося на прикладі. Нехай у нас є html-сторінка з наступним кодом:
Зверніть увагу: спочатку до правого краю притисне блок 1, а вже до нього притисне блок 2.
А що робити, якщо ми хочемо, щоб блоки були притиснуті до правого краю, але були б один під одним. Для цього існує властивість clearяке визначає, які сторони плаваючого блоку не можуть сусідити з іншими плаваючими блоками. У цієї властивості може бути задане одне з чотирьох значень:
left- блок повинен розташовуватися нижче за всі лівосторонні блоки.
right- блок повинен розташовуватися нижче за всі правосторонні блоки.
both- блок повинен розташовуватися нижче за всі плаваючі блоки.
none- ніяких обмежень немає, це значення за промовчанням.
Давайте в нашому останньому прикладі поставимо цю властивість для другого блоку:
Нині наші блоки розташовуються у нормальному потоці, тобто. один під одним. Нам треба зробити блоки menuі contentплаваючими та лівосторонніми. А блок newsмає притискатися до правого краю, тобто. його ми зробимо правостороннім плаваючим блоком:
Подивимося на наш блок новин, видно, що він знаходиться нижче тексту в блоці content. Адже ми хотіли, щоб блок новин був праворуч, а текст обтікав би його ліворуч.
Чому ж у нас так не вийшло? Тому що наш блок newsу html-коді розташовується нижче тексту і його обтікатиме лише той текст, який розташований нижче за нього. Щоб виправити це треба помістити наш div="news"вище тексту (тобто до слова "контент"):
Позиціонування блоків
шапка сайту
блок новин
Контент
низ сайту
Ось тепер наш блок новин знаходиться на своєму місці:
А щоб він не притискався впритул до верхнього та правого країв, ми додамо для цього блоку значення полів:
Тепер ми досягли такого ж результату, як і при абсолютному позиціонуванні.
Погодьтеся, що за допомогою плаваючих блоків верстати сторінку простіше: не треба розраховувати пікселі, та й код коротший. До того ж при гумовій верстці ми і не можемо вказати точне розташування блоку на екрані, а за допомогою плаваючих блоків нам це і не потрібно, достатньо вказати лише орієнтир (ліворуч, праворуч, нижче або в тій же лінії).
Фіксовані блоки
Як ви пам'ятаєте, при фіксованому позиціонуванні блок фіксується щодо області перегляду. У певному сенсі фіксовані блоки нагадують фрейми. Тільки всередині кадру доступне прокручування, а всередині блоку немає.
У фіксованих блоків є одна істотна вада: вони не підтримуються браузерами Internet Explorer. А тому використовувати їх поки що не слід. Тому тут лише вкажемо синтаксис такого правила, якщо хочете спробуйте самі (наприклад, у браузері Opera).
#blok( position:fixed; left:0px; top:0px; )
Блок з ідентифікатором "blok" при прокручуванні сторінки залишатиметься на місці.
На сьогодні все. У наступному уроці ми познайомимося ще з деякими властивостями блоків та їх видами.