Каскадность в CSS | Основы современной верстки
Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером
Видео может быть заблокировано из-за расширений браузера. В статье вы найдете решение этой проблемы.
В прошлом уроке была разобрана вторая часть словосочетания Каскадные таблицы стилей, а именно таблицы стилей. Мы изучили, как записываются и применяются стили к различным HTML элементам. В этом уроке поговорим о значении слова каскадные.
Что такое каскадность? Представьте себе каскад водопадов. В них вода перетекает из одного водопада в другой и так до тех пор, пока это все не уйдет в общий бассейн.
В CSS слово каскадность имеет такое же значение. В качестве воды у нас CSS свойства. Они могут накладываться и перекрывать друг друга. Другими словами каскадность — возможность языка CSS накладывать свойства друг на друга, а также расширять свойства в селекторах.
Возможно такое описание достаточно сложное, но давайте посмотрим на примере. Создадим параграф с двумя классами: text-bold
и text-dark
. Первый класс будет отвечать за жирное начертание текста, а второй за установку темного цвета шрифта. Также добавим селектор по тегу и укажем размер шрифта 24 пикселя.
<p> Какой-то очень интересный текст об интересной вещи. Очень интересно. </p>
В CSS файле укажем следующие стили:
p { font-size: 24px; } .text-bold { font-weight: bold; } .text-dark { color: #333333; }
Попробуйте воспроизвести этот пример, и вы увидите, что текст выводится темного цвета и с жирным начертанием. Стили от классов text-bold
и text-dark
сложились и применились к нашему параграфу. Также текст имеет размер 24 пикселя, которые мы указали для селектора по тегу.
Итоговыми стилями для нашего параграфа будут:
{ color: #333333; font-weight: bold; font-size: 24px; }
Это и есть каскадность стилей CSS. Хоть мы и использовали разные селекторы и классы для описания, но в конечном итоге они суммировались.
Приоритет селекторов
Важной чертой CSS является то, что разные типы селекторов имеют разный приоритет. Если стили противоречат друг другу в разных селекторах, то вступает в дело принцип приоритета. Разберем на примере. Возьмем параграф с классом red
и идентификатором blue
. Установим соответствующие цвета для текста. Для всех же параграфов в тексте установим зеленый цвет.
p { color: green; } .red { color: red; } #blue { color: blue; }
<p>Какого же цвета будет параграф?</p>
Перед тем, как читать дальше попробуйте выполнить этот пример в любом удобном вам месте.
Как вы смогли заметить, текст параграфа будет синим. Но почему так? Может быть, дело в том, что синий цвет в CSS указан самым последним? В данном случае нет. Даже если мы переместим селектор по идентификатору в самый вверх, параграф все равно останется синим.
Все дело в том, что селектор по идентификатору имеет самый высокий приоритет. Встретив его, браузер будет считать эти стили самыми важными для страницы и в случае противоречий возьмет значение в первую очередь из стилей для идентификатора.
Условно можно расставить селекторы в следующем порядке по приоритету:
- Селектор по идентификатору (
#blue
) - Селектор по классу (
.red
) - Селектор по тегу (
p
)
Где 1 — самый высокий приоритет, а 3 — самый низкий.
Разберем еще один пример:
p { color: blue; font-weight: bold; } .important { color: purple; font-style: italic; } #intro { color: green; }
<p>Индейские племена Манахаттоу и Канарси.</p>
Этот текст будет наклонным, жирным и зеленым. И вот почему:
- Селектор по тегу
p
:- Добавит синий цвет
- Добавит жирное начертание
- Селектор по классу
. important
:- Заменит
синий цветна пурпурный - Сделает текст курсивным
- Заменит
- Селектор по идентификатору
#intro
:- Заменит
пурпурный цветна зеленый
- Заменит
После всех таких преобразований итоговые стили для параграфа сложатся следующим образом:
{ color: green; font-weight: bold; font-style: italic; }
Важно: так как селектор по идентификатору имеет самый высокий приоритет и перебивает все стили классов, то его использование считается не очень хорошей практикой. Указав стили для идентификатора мы лишаем себя возможности переопределить стили с помощью классов. Это бывает очень важно для создания отзывчивых к действиям пользователя сайтов, когда на его действия мы меняем внешний вид некоторых элементов.
Переопределение свойств
Возможно у вас возник вопрос, а что случится, если элемент будет иметь несколько классов, свойства которых противоречат друг другу? Здесь каскадность работает по принципу «Кто последний, тот и прав». Проще всего это так же посмотреть на примере:
.alert { color: gray; } .alert-error { color: red; }
<p>Важное сообщение! Сообщение красного цвета</p>
Отталкиваясь от принципа каскадности, браузер вначале увидит селектор .alert
и установит серый цвет текста. Далее ему встретится селектор .alert-error
, который говорит установить красный цвет. И браузер просто перезапишет серый цвет на красный. Порядок классов в HTML в данном случае не играет никакой роли. Даже в таком случае
<p>Важное сообщение! Сообщение красного цвета</p>
цвет текста будет красным. Это наглядно показывает независимость CSS от HTML. Если же поменять местами селекторы в CSS, то поменяются и итоговые стили.
.alert-error { color: red; } .alert { color: gray; }
<p>Важное сообщение! Сообщение серого цвета</p>
Вес селекторов
Во время разработки вы будете встречать разные ситуации, при которых одни селекторы будут иметь больший вес, чем другие. Причем их месторасположение в CSS файле не имеет особого значения:
<textarea></textarea>
.form-input { height: 50px; } textarea { height: 200px; }
Какой высоты будет элемент <textarea>
? Правильный ответ — 50px, так как селектор по классу имеет больший приоритет, чем селектор по тегу. Но как же задать высоту в 200px и не вводить новые классы? Достаточно подставить к тегу еще и название класса:
.form-input { height: 50px; } textarea.form-input { height: 200px; }
Теперь для элемента <textarea>
будет установлена высота в 200px. Это произошло благодаря тому, что приоритеты «складываются» в рамках одного селектора. Для большего понимания таких сложений можно представить, что общий вес селектора определяется тремя цифрами, где:
- Первая цифра показывает количество идентификаторов в селекторе
- Вторая цифра показывает количество классов в селекторе
- Третья цифра показывает количество тегов в селекторе
Может звучать сложно, но концепция простая.
Разберем прошлый пример:<textarea></textarea>
.form-input { height: 50px; } textarea { height: 200px; }
- Селектор
.form-input
состоит из одного класса, поэтому в качестве второй цифры поставим единицу и получим: 010 - Селектор
textarea
состоит из одного тега. Записываем единицу в третий разряд нашего числа: 001
Визуально понятно, что 010 > 001, поэтому свойства внутри такого правила имеют больший приоритет. Мы захотели это исправить и дополнили наш селектор:
.form-input { height: 50px; } textarea.form-input { height: 200px; }
Теперь порядок сил во вселенной немного изменился:
- Селектор
.form-input
состоит из одного класса, поэтому в качестве второй цифры поставим единицу и получим: 010 - Селектор
textarea.form-input
состоит из одного класса и тега. Записываем единицу во второй и третий разряд нашего числа:
Получаем, что 010 < 011, а значит свойства внутри селектора textarea. form-input
будут иметь больший приоритет.
Такой подход поможет вам лучше понимать, как действуют те или иные правила, а также почему все разработчики стараются максимально уйти от сложных селекторов. При получении опыта, вы все реже будете считать вес таким образом, а уже будете изначально понимать, как расставлены приоритеты.
Самостоятельная работа
Создайте файлы index.html и style.css на своем компьютере.
Внутри HTML расположите следующую запись:
<div>Какой-то текст</div>
и следующие CSS стили:
div { width: 500px; height: 500px; background: #333333; } #main { color: white; width: 750px; } .text-white { color: white; } .alert { height: 350px; color: gray; } div { background: blue; } .alert-warning { background: #000000; color: yellow; }
Проанализируйте получившийся результат
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты.
Блочная модель | Основы современной верстки
Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером
Видео может быть заблокировано из-за расширений браузера. В статье вы найдете решение этой проблемы.
Представьте себе процесс строительства дома. Условно его можно разделить на несколько этапов: возведение структуры дома и его отделка. При возведении дома мы заливаем фундамент, возводим стены, устанавливаем крышу. После этого уже переходим к покраске дома, устанавливаем окна и занимаемся декорированием.
Процесс создания верстки можно описать похожими процессами. В ней так же важна роль возведения структуры и отделки. Для этого существуют несколько основных типов элементов:
- Блочные элементы (Block level). Эти элементы отвечают за каркас страницы.
- Строчные элементы (Inline level). Они помогают нам в процессе стилизации страницы или добавления функциональных частей.
Важно: сами по себе элементы HTML не являются блочными или строчными. HTML — всего лишь разметка. За то, будет элемент блочным или строчным, отвечает CSS. Для всех HTML-тегов существуют стандартные модели вывода, которые по умолчанию настроены в браузере, поэтому понятие блочных и строчных элементов обычно соотносят с определенными тегами, так как они имеют стандартное поведение при добавлении на страницу. В уроках соответствие тегов и значения условно, так как это поведение легко изменить с помощью CSS свойства display
.
Блочные элементы
Основная особенность блочных элементов — они занимают всю доступную им ширину. Из-за этого другие элементы до и после блочных элементов не встают в один ряд с ними, а располагаются до или после них, но уже на другой строке.
Представьте, что у вас есть шкаф и коробки с шириной, равной ширине шкафа. В этом случае мы не можем поставить коробки рядом друг с другом, так как для этого у нас не будет пространства. Единственное решение — класть коробки друг на друга. Блочные элементы ведут себя точно таким же образом.
В HTML-разметке такие коробки могли бы выглядеть следующим образом:
<div>Коробка №1</div> <div>Коробка №2</div> <div>Коробка №3</div>
На примере этой разметки уже стало понятно, что элемент <div>
является блочным элементом. Он занимает всю доступную ширину, и из-за этого другие элементы не встают с ним в один ряд.
Стоит отдельно отметить понятие «занимает всю доступную ширину». Что же именно скрывается за этой доступной шириной? Ширина всей страницы, ширина экрана или ширина дороги близ деревни Ракушки? На самом деле доступная ширина — вся доступная ширина родителя. То есть, если наш блок лежит внутри <body>
, то эта ширина будет равна именно ширине <body>
. Стоит изменить ширину <body>
, так сразу изменится и ширина блочного элемента внутри.
Какие же еще элементы являются блочными? На самом деле их так много, что просто делать перечисление не очень верно. В процессе углубления в верстку вы сами обнаружите, какие элементы являются блочными. Основными же блочными элементами являются:
<div>
<p>
- Теги списков:
<ul>
/<ol>
/<li>
- Заголовки:
<h2>
/<h3>
/<h4>
/<h5>
/<h5>
/<h6>
Внутрь блочных элементов мы можем вкладывать другие блочные элементы. Это позволяет нам делать сложную верстку, оперируя различными компонентами, которые будут созданы.
<div> <div> <h2>Заголовок статьи</h2> </div> <div> <p>А здесь находится текст статьи</p> </div> </div>
Как вы видите, внутрь блочных элементов <div>
мы положили другие такие же блоки, а также заголовок и параграф. Такая вложенность может достигать любого уровня.
Важно: хоть HTML и позволяет бесконечно вкладывать блоки друг в друга, лучше сохранять здравый смысл. Дело в том, что процесс вывода верстки достаточно долгий для браузеров. На это тратится довольно много ресурсов. И чем больше вложенность блоков друг в друга, тем сложнее браузеру и компьютеру все это обработать
Вложенность блочных элементов друг в друга ограничена только несколькими пунктами:
- Нельзя вкладывать заголовки в заголовки
- Нельзя вкладывать параграфы в параграфы
Скорее всего с этим у вас проблем не возникнет, так как представить себе ситуацию с заголовком внутри заголовка достаточно трудно.
Для создания блочного элемента используется тег <div>
. Он не имеет никаких дополнительных стилей, кроме блочного отображения. Этим тегом оборачивается связанная информация, создаются каркасы компонентов. Но тег не является семантичным, то есть не несет смысловой нагрузки. Подробнее о семантических элементах будет в следующем уроке
Строчные элементы
Строчные элементы являются отделочным материалом, с помощью которого мы можем выделить участки текста, или добавить немного логики, как в случае со ссылками. Строчные элементы противоположны блочным. Они не занимают всю доступную ширину и из-за этого не происходит переноса соседних элементов.
Давайте добавим в прошлый пример строчный элемент:
<div> <div> <h2>Заголовок статьи</h2> </div> <div> <p>А <a href="#">здесь</a> находится текст статьи</p> </div> </div>
Что произошло? Мы обернули слово здесь в ссылку, которая уведет пользователя в то место, которое мы укажем. Что произойдет в браузере при добавлении этого тега? Ссылка станет синего цвета и появится подчеркивание. Но сам текст останется на месте, так как ширина ссылки будет равна ширине слова здесь.
Если представить наши строчные элементы в виде коробок, то они расположатся следующим образом:
Это главная отличительная черта строчных элементов. Помимо этого есть важная особенность, связанная с применением свойств width
и height
в CSS. Для строчных элементов эти свойства не работают. Их применение не даст никакого эффекта.
Наиболее часто используемыми строчными элементами являются:
<span>
<a>
- Теги выделения текста:
<i>
/<em>
/<b>
/<strong>
Так же, как и блочные элементы, мы можем вкладывать строчные элементы внутрь строчных. Это распространенная практика, которая вам пригодится. Например:
<span> Длинный текст, который мы обернули в строчный элемент span. Внутри span мы также можем вставить тег <i>i</i>, <strong>strong</strong> и так далее. </span>
Используйте <span>
для дополнительных стилей внутри блочных элементов, например параграфов. Например,
<p>Хекслет — <span>онлайн</span> курсы по программированию</p>
Теперь можно использовать <span>
для создания дополнительных стилей, например для другого цвета или шрифта
Важно: не вкладывайте внутрь строчных элементов блочные. Это нарушает семантику и усложняет чтение кода
Блочная модель документа
Еще до работы с CSS полезно понимать, как браузер выводит элементы на вашу страницу. Помимо естественных свойств высоты и ширины, любой элемент на странице может иметь следующие свойства:
padding
— Внутренние отступы элементаmargin
— Внешние отступы от элементаborder
— Видимые границы элемента
Каждое из них не просто выполняет ту функцию, которая указана, но и напрямую влияет на конечные значения высоты и ширины элемента.
Представьте, что у нас есть квадрат со стороной 150 пикселей. Мы добавили к нему рамку в 2 пикселя, внутренний отступ в 10 пикселей с каждой стороны и по 20 пикселей внешнего отступа с каждой стороны.
Сколько места будет занимать наш квадрат на странице? Для этого нам надо суммировать все значения.
Ширина: 150px (начальная ширина) + 2px (граница справа) + 2px (граница слева) + 10px (внутренний отступ справа) + 10px (внутренний отступ слева) + 20px (Внешний отступ справа) + 20px (Внешний отступ слева) = 214px
Высота: 150px (начальная высота) + 2px (граница сверху) + 2px (граница снизу) + 10px (внутренний отступ сверху) + 10px (внутренний отступ снизу) + 20px (Внешний отступ сверху) + 20px (Внешний отступ снизу) = 214px
Дополнительное задание
Воспользуйтесь любым онлайн сервисом, который умеет преобразовывать HTML разметку. Например, https://htmlcodeeditor.com/ .
Вставьте в левую область следующую разметку:
<div> <div> <h2>Заголовок статьи</h2> </div> <div> <p>А здесь находится текст статьи</p> </div> </div>
Попробуйте изменять блочные и строчные теги, добавлять и удалять их. Посмотрите, как будет меняться поведение.
Дополнительные материалы
- Верстка текста. Списки — HTML Basics: Урок 3
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты.
Основы понимания макета — Изучите веб-разработку
- Предыдущий
- Обзор: макет CSS
Если вы работали с этим модулем, значит, вы уже ознакомились с основами того, что вам нужно знать для создания макета CSS сегодня, а также для работы с более старыми CSS. Это задание проверит ваши знания путем разработки простого макета веб-страницы с использованием различных методов.
Предпосылки: | Прежде чем приступать к этой оценке, вы должны были уже проработать все статьи этого модуля. |
---|---|
Цель: | Для проверки понимания методов компоновки CSS с использованием Flexbox, Grid, Floating и Positioning. |
Вы можете скачать HTML, CSS и набор из шести изображений здесь.
Сохраните документ HTML и таблицу стилей в каталоге на вашем компьютере и добавьте изображения в папку с именем изображений
. При открытии файла index.html
в браузере вы должны увидеть страницу с базовым стилем, но без макета, которая должна выглядеть примерно так, как показано на рисунке ниже.
Эта начальная точка содержит все содержимое макета, отображаемое браузером в обычном режиме.
В качестве альтернативы вы можете использовать такой сайт, как Glitch, чтобы провести оценку, вставив HTML и CSS. Обратите внимание, что если вы используете онлайн-редактор, вам нужно будет загрузить изображения и заменить значения в src
атрибуты, чтобы указать на новые местоположения изображений. Если в используемом вами онлайн-редакторе нет отдельной панели CSS, не стесняйтесь поместить ее в элемент в заголовке документа.
Примечание:Если вы застряли,обратитесь к нам за помощью — см. раздел «Оценка или дополнительная помощь» внизу этой страницы.
Вам предоставили исходный HTML,базовый CSS и изображения — теперь вам нужно создать макет для дизайна.
Ваши задачи
Теперь вам нужно реализовать макет. Задачи,которые вам необходимо выполнить:
- Чтобы отображать элементы навигации в ряд с одинаковым расстоянием между элементами.
- Панель навигации должна прокручиваться вместе с содержимым,а затем зависать в верхней части окна просмотра,когда оно достигает его.
- Изображение внутри статьи должно быть обёрнуто текстом.
<артикул>
иЭлементы
должны отображаться в виде двух столбцов. Столбцы должны быть гибкого размера,чтобы при уменьшении размера окна браузера столбцы становились уже.- Фотографии должны отображаться в виде сетки из двух столбцов с промежутком в 1 пиксель между изображениями.
Вам не нужно будет редактировать HTML,чтобы получить этот макет,и методы,которые вы должны использовать:
- Flexbox
- Сетка
- Плавающий
- Позиционирование
Есть несколько способов выполнения некоторых из этих задач,и часто не существует единственно правильного или неправильного способа сделать что-то. Попробуйте несколько разных подходов и посмотрите,какой из них работает лучше всего. Делайте заметки во время эксперимента.
На следующем снимке экрана показан пример того,как должен выглядеть готовый макет дизайна:
Если вы хотите оценить свою работу или застряли и хотите обратиться за помощью:
- Поместите свою работу в общедоступный онлайн-редактор,такой как CodePen,jsFiddle или Glitch.
- Напишите сообщение с просьбой об оценке и/или помощи в разделе «Обучение» форума MDN Discourse. Ваш пост должен включать:
- Описательный заголовок,такой как «Требуется оценка для понимания фундаментального макета».
- Подробная информация о том,что вы уже пробовали и что вы хотели бы,чтобы мы сделали;например,сообщите нам,если вы застряли и нуждаетесь в помощи или хотите получить оценку.
- Ссылка на пример,который вы хотите оценить или с которым вам нужна помощь,в общедоступном онлайн-редакторе (как указано в шаге 1 выше). Это хорошая практика — очень сложно помочь кому-то с проблемой кодирования,если вы не видите его код.
- Ссылка на фактическое задание или страницу оценивания,чтобы мы могли найти вопрос,по которому вам нужна помощь.
- Предыдущий
- Обзор:макет CSS
Обнаружили проблему с содержанием этой страницы?
- Отредактируйте страницу на GitHub.
- Сообщить о проблеме с содержимым.
- Посмотреть исходный код на GitHub.
Хотите принять участие?
Узнайте,как внести свой вклад.
Последнее изменение этой страницы от участников MDN.
Flexbox — Изучите веб-разработку
- Предыдущий
- Обзор:макет CSS
- Следующий
Flexbox — это метод одномерной компоновки для размещения элементов в строках или столбцах. Элементы изгибаются (расширяются),чтобы заполнить дополнительное пространство,или сжимаются,чтобы поместиться в меньшие пространства. В этой статье объясняются все основы.
Предпосылки: | Основы HTML (изучение Введение в HTML) и представление о том,как работает CSS (изучите Введение в CSS.) |
---|---|
Цель: | Чтобы узнать,как использовать систему макетов Flexbox для создания веб-макетов. |
Долгое время единственными надежными кросс-браузерными инструментами,доступными для создания макетов CSS,были такие функции,как плавающие элементы и позиционирование. Они работают,но в некотором смысле они также ограничивают и разочаровывают.
Следующие простые макеты трудно или невозможно выполнить с помощью таких инструментов любым удобным и гибким способом:
- Вертикальное центрирование блока содержимого внутри его родителя.
- Заставляет все дочерние элементы контейнера занимать равную часть доступной ширины/высоты,независимо от доступной ширины/высоты.
- Приведение всех столбцов в макете с несколькими столбцами к одинаковой высоте,даже если они содержат разное количество содержимого.
Как вы увидите в последующих разделах,flexbox значительно упрощает многие задачи по макетированию. Давайте копать!
В этой статье вы выполните ряд упражнений,которые помогут вам понять,как работает flexbox.Для начала вам нужно сделать локальную копию первого начального файла — flexbox0.html из нашего репозитория GitHub. Загрузите его в современный браузер (например,Firefox или Chrome) и просмотрите код в редакторе кода. Вы также можете увидеть это вживую здесь.
Вы увидите,что у нас есть элемент
с заголовком верхнего уровня внутри него и элемент,содержащий три
s. Мы собираемся использовать их для создания довольно стандартного макета из трех столбцов.
Для начала нам нужно выбрать,какие элементы должны быть размещены в виде гибких блоков. Для этого мы устанавливаем специальное значение display
на родительский элемент элементов,на которые вы хотите воздействовать. В этом случае мы хотим разместить элементов,поэтому мы устанавливаем это на
:
section{дисплей:гибкий}
Это приводит к тому,что элемент
Итак,это единственное объявление дает нам все,что нам нужно. Невероятно,правда? У нас есть макет из нескольких столбцов со столбцами одинакового размера,и все столбцы имеют одинаковую высоту. Это связано с тем,что значения по умолчанию,присвоенные flex-элементам (дочерним элементам flex-контейнера),настроены для решения общих проблем,таких как эта.
Для ясности повторим,что здесь происходит. Элемент,которому мы присвоили значение display
flex
,действует как блочный элемент с точки зрения того,как он взаимодействует с остальной частью страницы,но его дочерние элементы размещаются как гибкие элементы. В следующем разделе более подробно объясняется,что это значит. Также обратите внимание,что вы можете использовать значение display
inline-flex
,если вы хотите разместить дочерние элементы элемента как flex-элементы,но чтобы этот элемент вел себя как встроенный элемент.
Когда элементы размещаются как flex-элементы,они располагаются по двум осям:
- Основная ось — это ось,идущая в направлении расположения гибких элементов (например,в виде строки на странице или столбца вниз по странице). Начало и конец этой оси называются главный пуск и основной конец .
- Поперечная ось — это ось,идущая перпендикулярно направлению размещения гибких элементов. Начало и конец этой оси называются поперечный пуск и поперечный конец .
- Родительский элемент,для которого установлено
display:flex
(в нашем примере),называется flex-контейнером .
- Элементы,размещенные в виде гибких блоков внутри контейнера flex,называются гибкими элементами (в нашем примере это элементы
).
Помните об этой терминологии при изучении последующих разделов.Вы всегда можете вернуться к нему,если запутаетесь в каком-либо из используемых терминов.
Flexbox предоставляет свойство под названием flex-direction
,которое указывает,в каком направлении проходит главная ось (в каком направлении расположены дочерние элементы flexbox). По умолчанию установлено значение row
,что приводит к тому,что они располагаются в ряд в том направлении,в котором работает язык вашего браузера по умолчанию (слева направо,в случае английского браузера).
Попробуйте добавить следующее объявление в правило :
flex-direction:column;
Вы увидите,что это помещает элементы обратно в макет столбца,как это было до того,как мы добавили какой-либо CSS. Прежде чем двигаться дальше,удалите это объявление из своего примера.
Примечание:Вы также можете размещать гибкие элементы в обратном направлении,используя значения row-reverse
и column-reverse
.Поэкспериментируйте и с этими значениями!
Одна из проблем,которая возникает,когда у вас есть фиксированная ширина или высота в вашем макете,заключается в том,что в конечном итоге ваши дочерние элементы flexbox переполнят свой контейнер,нарушив макет. Взгляните на наш пример flexbox-wrap0.html и попробуйте просмотреть его вживую (сделайте локальную копию этого файла сейчас,если хотите следовать этому примеру):
Здесь мы видим,что дети действительно вырываются из контейнера. Один из способов исправить это — добавить следующее объявление в правило :
flex-wrap:wrap;
Кроме того,добавьте следующее объявление в правило :
flex:200px;
Попробуйте прямо сейчас. Вы увидите,что макет выглядит намного лучше,если в него включены:
.
Теперь у нас есть несколько строк. В каждую строку помещается столько дочерних элементов flexbox,сколько это разумно.Любое переполнение перемещается на следующую строку. 9Объявление 0029 flex:200px ,установленное для статей,означает,что каждая из них будет иметь ширину не менее 200 пикселей. Позже мы обсудим это свойство более подробно. Вы также можете заметить,что последние несколько дочерних элементов в последней строке стали шире,так что вся строка по-прежнему заполнена.
Но здесь мы можем сделать еще кое-что. Прежде всего,попробуйте изменить значение свойства flex-direction
на row-reverse
. Теперь вы увидите,что у вас все еще есть макет из нескольких строк,но он начинается с противоположного угла окна браузера и движется в обратном направлении.
На данный момент стоит отметить,что существует сокращение для flex-direction
и flex-wrap
:flex-flow
. Так,например,можно заменить
flex-direction:row;flex-wrap:обернуть;
с
flex-flow:рядная обмотка;
Давайте теперь вернемся к нашему первому примеру и посмотрим,как мы можем контролировать,какую долю пространства занимают гибкие элементы по сравнению с другими гибкими элементами.Запустите локальную копию flexbox0.html или возьмите копию flexbox1.html в качестве новой отправной точки (посмотрите ее вживую).
Сначала добавьте следующее правило в конец вашего CSS:
article{гибкий:1}
Это безразмерное значение пропорции,определяющее,сколько доступного пространства вдоль главной оси будет занимать каждый гибкий элемент по сравнению с другими гибкими элементами. В этом случае мы присваиваем каждому элементу одинаковое значение (значение 1),что означает,что все они будут занимать одинаковое количество свободного места,оставшегося после установки таких свойств,как отступы и поля. . Это значение пропорционально распределяется между flex-элементами:присвоение каждому flex-элементу значения 400000 будет иметь точно такой же эффект.
Теперь добавьте следующее правило под предыдущим:
article:nth-of-type(3){гибкий:2}
Теперь,когда вы обновитесь,вы увидите,что третий занимает в два раза больше доступной ширины,чем два других.Всего теперь доступно четыре единицы пропорции (поскольку 1+1+2=4). Первые два гибких элемента имеют по одной единице,поэтому каждый из них занимает 1/4 доступного пространства. В третьем две единицы,поэтому он занимает 2/4 доступного места (или половину).
Вы также можете указать значение минимального размера в значении гибкости. Попробуйте обновить существующие правила для статей следующим образом:
article{гибкий:1 200 пикселей}статья:nth-of-type(3){гибкий:2 200 пикселей}
В основном это гласит:«Каждому гибкому элементу сначала будет предоставлено 200 пикселей доступного пространства. После этого оставшееся доступное пространство будет разделено в соответствии с пропорциональными единицами». Попробуйте обновить,и вы увидите разницу в том,как распределяется пространство.
Настоящую ценность flexbox можно увидеть в его гибкости/отзывчивости. Если вы измените размер окна браузера или добавите еще один элемент ,макет продолжит работать нормально.
flex
— это сокращенное свойство,которое может указывать до трех различных значений:
- Безразмерное значение пропорции,которое мы обсуждали выше. Это можно указать отдельно,используя длинное свойство
flex-grow
. - Значение второй безразмерной пропорции,
flex-shrink
,который вступает в игру,когда flex-элементы переполняют свой контейнер. Это значение указывает,насколько элемент будет сжиматься,чтобы предотвратить переполнение. Это довольно продвинутая функция flexbox,и мы не будем подробно о ней рассказывать в этой статье. - Минимальное значение размера,о котором мы говорили выше. Это можно указать отдельно,используя длинное значение
flex-basis
.
Мы бы не советовали использовать полноформатные свойства flex,за исключением случаев,когда это действительно необходимо (например,чтобы переопределить что-то ранее установленное). Они приводят к написанию большого количества дополнительного кода и могут несколько сбивать с толку.
Вы также можете использовать функции flexbox для выравнивания flex-элементов вдоль главной или поперечной оси. Давайте рассмотрим это на новом примере:flex-align0.html (см. также его вживую). Мы собираемся превратить это в аккуратную,гибкую кнопку/панель инструментов. На данный момент вы увидите горизонтальную строку меню с несколькими кнопками,зажатыми в верхнем левом углу.
Сначала сделайте локальную копию этого примера.
Теперь добавьте следующее в нижнюю часть примера CSS:
деления{дисплей:гибкий;выравнивание элементов:по центру;выравнивание содержимого:пространство вокруг}
Обновите страницу,и вы увидите,что кнопки теперь правильно расположены по центру по горизонтали и по вертикали. Мы сделали это с помощью двух новых свойств.
align-items
управляет расположением flex-элементов на поперечной оси.
- По умолчанию значение равно
stretch
,которое растягивает все гибкие элементы,чтобы заполнить родителя в направлении поперечной оси.Если у родителя нет фиксированной высоты в направлении поперечной оси,тогда все гибкие элементы станут такими же высокими,как самый высокий гибкий элемент. Вот как в нашем первом примере столбцы были одинаковой высоты по умолчанию. - Значение
center
,которое мы использовали в приведенном выше коде,заставляет элементы сохранять свои внутренние размеры,но центрироваться по поперечной оси. Вот почему кнопки нашего текущего примера центрированы по вертикали. - У вас также могут быть такие значения,как
flex-start
иflex-end
,которые будут выравнивать все элементы по началу и концу поперечной оси соответственно. См.align-items
для получения полной информации.
Вы можете переопределить align-items
поведение отдельных flex-элементов путем применения к ним свойства align-self
. Например,попробуйте добавить в CSS следующее:
button:first-child{выравнивание:flex-end}
Посмотрите,какой эффект это имеет,и удалите его снова,когда закончите.
justify-content
управляет расположением гибких элементов на главной оси.
- Значение по умолчанию —
flex-start
,что делает все элементы расположенными в начале главной оси. - Вы можете использовать
flex-end
,чтобы разместить их на конце. center
также является значением дляjustify-content
. Это заставит гибкие элементы располагаться в центре главной оси.- Значение,которое мы использовали выше,
space-around
,полезно — оно распределяет все элементы равномерно вдоль главной оси с небольшим пространством,оставленным с обоих концов. - Есть еще одно значение,
пробел между
,что очень похоже напробел-около
,за исключением того,что он не оставляет пробелов с обоих концов.
Свойство justify-items
игнорируется в макетах flexbox.
Мы хотели бы призвать вас поиграть с этими значениями,чтобы увидеть,как они работают,прежде чем продолжить.
Flexbox также имеет функцию изменения порядка макета flex-элементов,не влияя на исходный порядок. Это еще одна вещь,которую невозможно сделать с помощью традиционных методов компоновки.
Код для этого прост. Попробуйте добавить следующий код CSS в пример кода панели кнопок:
кнопка:первый дочерний элемент{порядок:1}
Обновите,и вы увидите,что кнопка «Улыбка» переместилась в конец основной оси. Давайте поговорим о том,как это работает,немного подробнее:
- По умолчанию все flex-элементы имеют значение
order
,равное 0. - Элементы Flex с более высокими указанными значениями порядка будут отображаться позже в порядке отображения,чем элементы с более низкими значениями порядка.
- элемента Flex с одинаковым значением порядка появятся в их исходном порядке. Таким образом,если у вас есть четыре элемента,значения порядка которых были установлены как 2,1,1 и 0 соответственно,их порядок отображения будет 4-й,2-й,3-й,затем 1-й.
- 3-й элемент появляется после 2-го,потому что он имеет такое же значение порядка и находится после него в исходном порядке.
Вы можете установить отрицательные значения порядка,чтобы элементы отображались раньше,чем элементы,значение которых равно 0. Например,вы можете сделать так,чтобы кнопка «Blush» отображалась в начале главной оси,используя следующее правило:
button:last- ребенок{порядок:-1}
С помощью flexbox можно создавать довольно сложные макеты. Совершенно нормально установить гибкий элемент в качестве гибкого контейнера,чтобы его дочерние элементы также располагались как гибкие блоки. Взгляните на complex-flexbox.html (также смотрите его вживую).
HTML для этого довольно прост. У нас есть элемент Давайте посмотрим на код,который мы использовали для макета. Прежде всего,мы настраиваем дочерние элементы Затем мы устанавливаем некоторые значения гибкости для самих Далее мы выбираем первый Наконец,мы устанавливаем размер кнопки. На этот раз присвоив ему значение гибкости 1 auto. Это дает очень интересный эффект,который вы увидите,если попробуете изменить ширину окна браузера. Кнопки занимают столько места,сколько могут. Столько,сколько будет удобно;кроме того,они перейдут на новую строку. Поддержка Flexbox доступна в большинстве новых браузеров:Firefox,Chrome,Opera,Microsoft Edge и IE 11,более новых версиях Android/iOS и т. д. Однако вы должны знать,что все еще используются старые браузеры,которые не не поддерживать Flexbox (или поддерживать,но поддерживать очень старую,устаревшую его версию.) Пока вы только учитесь и экспериментируете,это не имеет большого значения;однако,если вы планируете использовать flexbox на реальном веб-сайте,вам необходимо провести тестирование и убедиться,что ваш пользовательский интерфейс по-прежнему приемлем в максимально возможном количестве браузеров. Flexbox немного сложнее,чем некоторые функции CSS. Например,если в браузере отсутствует тень CSS,то сайт,скорее всего,все еще можно будет использовать. Однако отсутствие поддержки функций flexbox,вероятно,полностью сломает макет,сделав его непригодным для использования. Мы обсуждаем стратегии преодоления проблем с кросс-браузерной поддержкой в нашем модуле кросс-браузерного тестирования. Вы дошли до конца этой статьи,но можете ли вы вспомнить самую важную информацию? Вы можете найти дополнительные тесты,чтобы убедиться,что вы сохранили эту информацию,прежде чем двигаться дальше — см. Проверка своих навыков:Flexbox. На этом мы завершаем знакомство с основами Flexbox. Мы надеемся,что вам было весело,и вы хорошо поиграете с ним,когда продолжите свое обучение. Далее мы рассмотрим еще один важный аспект макетов CSS:CSS Grids. ,содержащий три
s. Третий
содержит три
s:
section - article статья статья - div - кнопка кнопка деления кнопка деления кнопка кнопка
в виде гибких блоков.
раздел{дисплей:гибкий}
. Обратите особое внимание на второе правило:мы устанавливаем третий
,чтобы его дочерние элементы также располагались как гибкие элементы,но на этот раз мы располагаем их как столбец.
артикул{гибкий:1 200 пикселей}статья:nth-of-type(3){гибкий:3 200 пикселей;дисплей:гибкий;гибкий поток:колонка}
flex:1 100px;
,чтобы придать ему минимальную высоту 100 пикселей,затем мы устанавливаем его дочерние элементы (элементы ) так,чтобы они также располагались как flex-элементы. Здесь мы размещаем их в ряд и выравниваем по центру доступного пространства,как мы делали это в примере с отдельной кнопкой,который мы видели ранее.
статья:nth-of-type(3) div:first-child{гибкий:1 100 пикселей;дисплей:гибкий;flex-flow:перенос строк;выравнивание элементов:по центру;выравнивание содержимого:пространство вокруг}
кнопка{гибкий:1 авто;поле:5px;размер шрифта:18 пикселей;высота строки:1,5}