Бодифлекс для начинающих

Свойства для дочерних элементов (Flex элементов)

order

По умолчанию, все элементы располагаются в исходном для них порядке. Однако, свойство  управляет порядком, в котором располагаются элементы внутри контейнера.

flex-grow

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

Если у всех элементов свойство  установлено в , то свободное пространство внутри контейнера будет равномерно распределено между всеми элементами. Если у одного из элементов значение установлено в , то элемент будет занимать в два раза больше пространства, чем остальные (по крайней мере, попытается).

Нельзя указывать отрицательные числа.

flex-shrink

Это свойство определяет возможность элемента уменьшаться в размере, при необходимости.

Нельзя указывать отрицательные числа.

flex-basis

Определяет размер элемента по умолчанию, до распределения оставшегося пространства. Это может быть длина (20%, 5rem и т.д.) или ключевое слово. Ключевое слово  означает «выглядеть как моё свойство  или «. Ключевое слово  означает что «размер основан на содержимом элемента» — это ключевое слово пока не очень хорошо поддерживается, поэтому его трудно проверить, а ещё труднее узнать что делают его братья ,  и .

Если установить значение , то дополнительное пространство вокруг содержимого не будет учитываться. Если установить , дополнительное пространство будет распределяться на основе значения . Смотрите этот рисунок.

flex

Это сокращение для ,  и . Второй и третий параметры ( и ) не обязательны. Значение по умолчанию установлено в .

Рекомендуется использовать это сокращённое свойство, а не указывать значения индивидуально. Короткая комбинация задаёт другие значения разумно.

align-self

Это свойство позволяет переопределить выравнивание по умолчанию (или заданное с помощью свойства ) для отдельных flex-элементов.

Пожалуйста посмотрите на объяснение свойства , чтобы понимать доступные значения.

Обратите внимание, что ,  и  не оказывают никакого влияния на flex-элемент

Примеры

Давайте начнём с самого простого примера, решающего задачу, которая возникает почти каждый день: идеальное центрирование. Не может быть ничего проще, если вы используете Flexbox.

Это зависит от того, что , установленный в  у flex-контейнера, поглощает дополнительное пространство. Таким образом, установка вертикального  в  у элемента, сделает элемент идеально центрированным по обеим осям.

Теперь давайте используем ещё несколько свойств. Рассмотрим список из 6 элементов, все с фиксированным размером в эстетическом отношении, но они могут быть автоматическими. Мы хотим, чтобы они были равномерно распределены вдоль горизонтальной оси и чтобы при изменении размера браузера всё было в порядке (без медиа-запросов!).

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

Давайте попробуем что-нибудь ещё. Представьте, что у нас есть навигация расположенная по правому краю в самой верхней части экрана, но мы хотим чтобы она располагалась по центру на экранах среднего размера и была в одну колонку на маленьких экранах. Проще простого.

Давайте попробуем сделать что-нибудь ещё лучше, играясь с гибкостью наших flex-элементов! Как насчёт трёхколоночного mobile-first макета с шапкой и футером на всю ширину экрана, и чтобы не было зависимости от исходного порядка элементов.

Горизонтальное выравнивание

CSS свойство justify-content определяет как браузер распределяет пространство между и вокруг флекс элементов вдоль главной оси флекс контейнера (горизонтально).

Это свойство может использоваться в тех случаях, когда для флекс элементов явно указана ширина, и если ширина всех флекс элементов внутри контейнера не вызывает переполнение контейнера, иначе свойство justify-content не окажет на такой элемент никакого эффекта.

Схематичное отображение работы свойства justify-content отображено на следующем изображении:

Рис. 211 Схематичное отображение работы свойства justify-content

Перейдем к рассмотрению следующего примера:

<!DOCTYPE html>
<html>
<head>
	<title>Использование свойства justify-content</title>
<style> 
.container,
.container2,
.container3,
.container4,
.container5 {   
	display: flex; /* блочные флекс контейнеры */
}
.container {       
	justify-content: flex-start; /* флекс элементы позиционируются в начале контейнера */
}
.container2 {       
	justify-content: flex-end; /* флекс элементы позиционируются в конце контейнера */
}
.container3 {       
	justify-content: center; /* флекс элементы позиционируются в центре контейнера */
}
.container4 {       
	justify-content: space-between; /* флекс элементы равномерно распределяются по всей строке (первый и последний прижаты по бокам) */
}
.container5 {       
	justify-content: space-around; /* флекс элементы равномерно распределяются по всей строке */
}
div > div {
	width: 50px; /* ширина элемента */
	height: 50px; /* высота элемента */
	background: rgb(0,150,208); /* цвет заднего фона */
	color: #fff; /* цвет текста */
	margin: 1px; /* внешние отступы со всех сторон */
}
</style>
</head>
	<body>
		<h3>justify-content: flex-start;</h3>
		<div class = "container"> <!-- блочный флекс контейнер -->
			<div>A</div> <!-- дочерний флекс элемент -->
			<div>B</div> <!-- дочерний флекс элемент -->
			<div>C</div> <!-- дочерний флекс элемент -->
		</div>
		<h3>justify-content: flex-end;</h3>
		<div class = "container2"> <!-- блочный флекс контейнер -->
			<div>A</div> <!-- дочерний флекс элемент -->
			<div>B</div> <!-- дочерний флекс элемент -->
			<div>C</div> <!-- дочерний флекс элемент -->
		</div>
		<h3>justify-content: center;</h3>
		<div class = "container3"> <!-- блочный флекс контейнер -->
			<div>A</div> <!-- дочерний флекс элемент -->
			<div>B</div> <!-- дочерний флекс элемент -->
			<div>C</div> <!-- дочерний флекс элемент -->
		</div>
		<h3>justify-content: space-between;</h3>
		<div class = "container4"> <!-- блочный флекс контейнер -->
			<div>A</div> <!-- дочерний флекс элемент -->
			<div>B</div> <!-- дочерний флекс элемент -->
			<div>C</div> <!-- дочерний флекс элемент -->
		</div>
		<h3>justify-content: space-around;</h3>
		<div class = "container5"> <!-- блочный флекс контейнер -->
			<div>A</div> <!-- дочерний флекс элемент -->
			<div>B</div> <!-- дочерний флекс элемент -->
			<div>C</div> <!-- дочерний флекс элемент -->
		</div>
	</body>
</html>

В этом примере мы разместили пять блочных флекс контейнеров, внутри них мы разместили по три элемента <div>, которым задали ширину и высоту равную 50 пикселей.

Первый контейнер имеет значение flex-start свойства justify-content, это значение определяет, что флекс элементы позиционируются в начале контейнера. Это значение по умолчанию и указано лишь для демонстрационной цели.

Второй контейнер имеет значение flex-end свойства justify-content, это значение определяет, что флекс элементы позиционируются в конце контейнера.

Третий контейнер имеет значение center свойства justify-content, это значение определяет, что флекс элементы позиционируются в центре контейнера.

Четвертый контейнер имеет значение space-between свойства justify-content, это значение определяет, что флекс элементы равномерно распределяются по всей строке, при этом первый флекс элемент позиционируются в начале контейнера, а последний флекс элемент позиционируется в конце контейнера.

Пятый контейнер имеет значение space-around свойства justify-content, это значение определяет, что флекс элементы равномерно распределяются по всей строке, при этом пустое пространство между первым и после последнего флекс элемента равно половине между соседними элементами в контейнере.

Результат нашего примера:


Рис. 212 Пример использования свойства justify-content.

В настоящее время добавлена поддержка значения space-evenly свойства justify-content, которое позволяет разместить четный промежуток между каждым элементом, включая начальний и дальний конец контейнера:

Пример 1. Как сделать фотогалерею на Флексбокс

Разместить фотографии по строкам и столбцам на Флексбокс гораздо проще, чем многим кажется. Рассмотрим простую сетку:

<main class="gallery">
 
  <img src="/sample.jpg">
 
  <img src="/sample.jpg">
 
  <img src="/sample.jpg">
 
  <img src="/sample.jpg">
 
  <img src="/sample.jpg">
 
  <img src="/sample.jpg">
 
  <img src="/sample.jpg">
 
  <img src="/sample.jpg">
 
  <img src="/sample.jpg">
 
  <img src="/sample.jpg">
 
</main>

У нас есть main.gallery и 10 изображений в нем. Убедимся, что main.gallery растягивается на весь доступный экран:

.gallery {
 
   min-height: 100vh
 
}

Кое-что об изображениях

По умолчанию все изображения inline-block элементы. У них есть ширина и высота. Они выстроятся в линию (только если они не слишком большие и могут все поместиться)

На старт

Сейчас наша галерея будет выглядеть следующим образом:

Размеры всех 10 изображений остались нетронутыми. При необходимости картинки переместятся на вторую строку. Послушные ребята =)

А теперь, на сцену выходит Флексбокс:

.gallery {
 
    display: flex
 
 }

С этого момента поведение изображений изменилось. Из inline-block элементов они стали flex-items. В результате применения Флексбокс к .gallery все картинки уместились в одну линию. Да еще и растянулись по вертикали, вот так:

Картинки теперь уместились все в одну линию, да еще и растянулись по вертикали. Жалкое зрелище =(

Все это результат стандартного поведения Флексбокс:

  1. Сплющить все дочерние элементы в одну линию и никуда их не переносить. Не самое лучшее решение для галереи, так что изменим его:
.gallery {
 
    flex-wrap: wrap
 
}

Это разрешит перенос элементов на другую строку как и полагается

Изображения перенесены

2. Теперь картинки располагаются в несколько линий. Но они все еще растянуты по вертикали и это определенно не характерно для изображений в галерее. Свойство align-items флекс-контейнера по умолчанию равно значению stretch

.align-items: stretch

Изменим его:

.gallery {
 
  ...
 
  align-items: flex-start
 
}

Это защитит картинки от растягивания.

Кроме того они выровнены относительно начала вертикальной оси:

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

Наша мощная флексбокс-галерея готова.

Преимущества использования Флексбокс

Сейчас преимущества использования Флексбокс не особо заметны, ведь тот же самый вид был и до его подключения.

Кроме легко получаемой адаптивности, преимущество флексбокс заключается в возможностях выравнивания. Флекс-контейнер .gallery имеет несколько свойств для настройки выравнивания:flex-direction: row ,justify-content: flex-startиalign-items: flex-start. Разметку галереи можно легко поменять поигравшись со следующим значением:

 .gallery {
 
   ...
 
   justify-content:center;
 
}

Теперь изображения идеально отцентрованы по горизонтали

Кроме того, картинки могут быть отцентрованы и по горизонтали и по вертикали .gallery.

.gallery {
 
   ...
 
   justify-content:center;
 
   align-items: center;
 
}

А теперь изображения выровнены не только горизонтально, но и вертикально

Флексбокс предоставляет много вариантов выравнивания. Играйтесь со значениями, как сочтете нужным.

Можете посмотреть на действующую Флексбокс галереюздесь.

Свойство Flex-Grow

flex-grow устанавливает коэффициент роста, который позволяет flex элементу увеличиваться и заполнять доступное пространство. Значение flex-grow принимает только целое число

Обратите внимание на следующее

<div class="wrapper">
  <div class="item item-1"></div>
  <div class="item item-2"></div>
  <div class="item item-3"></div>
</div>
.wrapper {
    display: flex;
    flex-wrap: wrap;
}

.item {
    flex-grow: 1;
}

Обратите внимание, что без использования flex-grow ширина элементов flex по умолчанию будет равна их начальной ширине. Однако при использовании flex-grow: 1 доступное пространство распределялось между ними

Вам может быть интересно, как пространство распределяется между flex элементами? Что ж, это хороший вопрос, и я скоро на него отвечу.

На приведенном ниже рисунке показано, как элементы выглядят без flex-grow. Другими словами, это их естественный размер.

Чтобы понять, как рассчитывается ширина flex элемента, см. уравнение ниже. Я узнал об уравнении из этого поста Саманты Минг (Спасибо!).

Давайте посчитаем размер элемента, содержащего текст «CSS».

Ширина элемента (width) = ( (flex-grow / общее кол-во flex-grow) * доступное пространство) + начальная ширина элементов

Flex-grow: коэффициент увеличения flex для элемента

Total flex-grow: суммирование значения flex-grow для всех flex элементов

Available space: перед применением flex-grow

Item width: начальная ширина элемента

—> Item width = ( (1 / 3) * 498) + 77 = 241

Множественные 

В предыдущем примере значение flex-grow одинаково для всех flex элементов. Давайте попробуем добавить flex-grow: 2 для первого элемента. Как это будет рассчитываться? Имейте в виду, что доступное пространство для нашего примера составляет 498 пикселей.

Надеюсь, теперь стало понятнее.

Можем ли мы использовать 0 как значение ?

Конечно! Поскольку свойство flex-grow принимает целочисленные значения, можно использовать 0 как способ предотвратить использование flex элемента для расширения на доступное пространство.

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

Flex Grow не делает Flex элементы одинаковыми

Существует распространенное заблуждение, что использование flex-grow сделает элементы равными по ширине. Это неверно. Идея использования flex-grow заключается в распределении доступного пространства. Как вы видели в уравнении, ширина каждого гибкого элемента рассчитывается на основе его начальной ширины (ширина до применения flex-grow).

Если вы хотите, чтобы flex элементы были одинаковой ширины, это можно сделать с помощью flex-basis. Я объясню это в следующих разделах.

Как заниматься бодифлексом?

Попробуйте комплекс из 12 простых движений, приведённый в книге Чайлдерс. Такая тренировка занимает около 15–20 минут и не требует значительной гибкости или особых навыков.

Любое из упражнений начинается с одной и той же дыхательной техники из пяти шагов:

  1. Полностью выдохните через рот.
  2. Быстро и максимально глубоко вдохните носом.
  3. Сделайте резкий выдох через рот, чтобы возник звук «ха» или «пах».
  4. Задержите дыхание, подтяните живот к позвоночнику и удерживайте такое положение 8 секунд (счётов про себя).
  5. Вдохните и расслабьтесь.

Вы делаете первые четыре шага, затем на задержке в восемь счётов выполняете упражнение, после чего расслабляетесь и повторяете движение ещё два раза. Если упражнение включает работу на одну сторону, например наклон вправо, выполните его по три раза в каждую сторону.

Лев

Поставьте ноги на расстоянии 30–35 см друг от друга, наклоните прямой корпус вперёд и обопритесь руками о бёдра чуть выше колен.

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

Уродливая гримаса

Примите позу, как в упражнении «Лев», и сделайте дыхательную технику. На задержке выпятите подбородок вперёд, чтобы нижние зубы находились перед верхними, и сложите губы трубочкой.

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

Боковая растяжка

Примите исходное положение с руками на коленях, сделайте дыхательную часть.

На задержке опустите левый локоть на левое колено и вытяните правую ногу в сторону. Перенесите вес тела на левое колено и вытяните правую руку над головой, растягивая бок. Задержитесь в этом положении.

Сделайте равное количество раз с обеих ног.

Оттягивание ноги назад

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

Удерживайте положение, затем вернитесь на четвереньки и повторите с другой ноги. Сделайте по три раза на каждую.

Сейко

Встаньте на четвереньки, одну ногу выпрямите в сторону. Сделайте дыхательное упражнение, втяните живот и на задержке поднимите прямую ногу в сторону.

Сделайте равное количество повторений с обеих ног.

Алмаз

Встаньте прямо, выполните дыхательное упражнение, втяните живот, на задержке согните руки в локтях, сомкните пальцы перед грудью и сильно надавите ими друг на друга. Удерживайте напряжение на протяжении 8 секунд, не поднимайте плечи к ушам, не прижимайте руки к груди.

Шлюпка

Сядьте на пол, разведите прямые ноги в стороны, натяните носки стоп на себя, руки поставьте на пол за телом. Выполните дыхательное упражнение, на задержке наклоните голову, втяните живот и поставьте руки на пол перед собой. Продолжайте медленно скользить руками вперёд, растягивая бёдра.

Кренделёк

Сядьте на пол, вытяните ноги вперёд. Затем правую ногу согните в колене и поставьте стопу с внешней стороны левого бедра. Ладони прижмите к полу за телом.

Сделайте дыхательное упражнение, втяните живот и на задержке разверните корпус влево. Правую кисть поставьте на пол за телом, левой рукой прижимайте колено к груди. Смотрите в стену позади вас, разворачивайте корпус, выпрямляйте спину.

По окончании интервала выполните в другую сторону.

Растяжка задней поверхности бедра

Лягте на спину, выполните дыхательное упражнение, втяните живот и на задержке поднимите ноги перпендикулярно полу, носки стоп натяните на себя. Обхватите руками верхнюю часть икр или бёдра, если не хватает растяжки, и потяните ноги к себе.

Не сгибайте колени, не отрывайте ягодицы от пола. Задержитесь в этом положении.

Упражнение на пресс

Лягте на спину, согните колени под прямым углом и поставьте стопы на пол на ширине бёдер. Руки вытяните вдоль тела на полу.

Сделайте дыхательное упражнение, на задержке втяните живот и оторвите плечи и лопатки от пола. Тянитесь руками в стену напротив вас, не ослабляя напряжение в мышцах пресса.

Это упражнение также можно делать с руками, вытянутыми вверх. Правила исполнения не меняются: вы делаете его на задержке, втягиваете живот, но тянетесь руками не в стену напротив, а в потолок.

Ножницы

Лягте на пол на спину, выпрямите ноги, руки вытяните вдоль тела или подложите под ягодицы ладонями вниз.

Выполните дыхательное упражнение, втяните живот и прижмите поясницу к полу. На задержке поднимите прямые ноги на 10 см от пола и выполняйте махи-«ножницы», чередуя положение ног.

Каких результатов можно достичь через месяц тренировок

По словам автора методики, уже на 2-й неделе занятий можно заметить первые результаты, бросающиеся в глаза. Кроме этого упражнения способствуют разглаживанию морщин на лице.

Через месяц вы и окружающие заметят, что ваш вес и объемы заметно упали, и вы выглядите гораздо моложе и стройнее.

Не менее важный вопрос, нужен ли какой-то уровень физической подготовки для фитнес-практики Bodyflex?

Для данной практики не обязателен уровень физической подготовки. Если у вас излишний вес и плохая физическая подготовка, вы  сможете похудеть очень быстро, проводя дома ежедневно 15-минутные занятия. Если вы периодически занимаетесь спортом, результат просто будет заметен спустя какое-то время.

Эта программа идеальна для женщин, которые планируют восстановить фигуру после родов, а также занятых дам и просто тех, кто хочет сделать себя идеальную. Данная практика направлена на сжигание жиров в проблемных  зонах и на подтягивание дряблой кожи. Фанатично нельзя относиться к упражнениям. Ведь при занятиях вам придется задерживать дыхание, а высокая интенсивность выполнения может пагубно сказаться на вашем здоровье. Поэтому рекомендуемое количество тренировок в неделю может доходить до 5-7дней в неделю, то есть ежедневно, а время тренировки фитнес-практики Bodyflex 1-2 раза в день, по 15-20 минут, но не больше.

Для упражнений 15 минут в день – это совсем немного, вы сможете быстро привыкнуть. К тому же упражнения весьма простые и ненавязчивые, а главное – правильное дыхание – залог положительных результатов

Но важно помнить, что если не проводить занятия ежедневно, эффективность будет снижаться и потом придется начинать все сначала

Существуют также медицинские противопоказания для фитнес-практики Bodyflex:

  • Гипертония
  • Аритмия
  • Близорукость
  • Грыжа
  • Беременность на любом сроке
  • Сердечная недостаточность
  • Обострение хронических заболеваний
  • Послеоперационные периоды

Пример 3: Как сделать макет сайта, используя Флексбокс

Строительство макетов полностью на Флексбокс не особо одобряется сообществом разработчиков. И, разделяя данное мнение, я все же считаю, что бывают ситуации, когда это допустимо. Самый главный совет, который я могу вам дать:Используйте флексбокс, когда это имеет смысл. Я объясню это на следующем примере.

Макет сайта “святой Грааль”

Самый наистандартнейший макет страницы на свете

Макет “святой Грааль” – хэдер, футер и 3 контейнера для контента

Есть два способа попытаться построить этот макет с помощью Flexbox. Начнем с первого. Для него нужно разместить во флекс-контейнере header, footer, nav, article и aside.

Разметка

Так выглядит наша разметка:

<body>
 
  <header>Header</header>
 
  <main>
 
    <article>Article</article>
 
    <nav>Nav</nav>
 
    <aside>Aside</aside>
 
  </main>
 
  <footer>Footer</footer>
 
</body>

Среди прочих, в стандартнейшей разметке есть особое правило: центральная колонка, article в разметке должна идти перед обоими сайдбарами nav и aside.

Article должен идти в разметке первым, но располагаться по центру макета

Подключаем флексбокс

body {
 
   display: flex
 
}

Поскольку дочерние элементы должны идти сверху вниз, изменим стандартное направление флексбокс

body {
 
 ...
 
 flex-direction: column
 
}
  1. header и footer должны быть фиксированной ширины
    header,
     
    footer {
     
      height: 20vh /*you can use pixels e.g. 200px*/
     
    }
  2. main должен занимать все свободное пространство в контейнере
    main {
     
       flex: 1
     
    }

Надеюсь, вы помните, что запись flex: 1 означает тоже самое что и flex-grow: 1, flex-shrink: 1 и flex-basis: 0

Это приведет к тому, что main вырастет и займет все доступное ему место

На этом этапе необходимо позаботиться о содержимом main – блоках article, nav и aside. Сделаем main флекс-контейнером

main {
 
  display: flex
 
}

А для nav и aside установим значение width

nav,
 
aside {
 
  width: 20vw
 
}

Убедимся, что article занимает все доступное ему пространство

article {
 
   flex: 1
 
}

Теперь article занимает все свободное место

Осталось сделать всего одну вещь. Поменяем значения flex-order, чтобы nav отображался первым

nav {
 
  order: -1
 
}

Готовый вариант

Свойство order используется, чтобы переопределить порядок flex-items. Все элементы flex-items внутри контейнера отображаются в порядке возрастания значения order. Элемент с наименьшим значением будет отображаться первым. По умолчанию значение order для всех flex-items равно 0.

Второе решение для макета

Предыдущее решение использует flex-container для всего контейнера. Макет очень сильно зависит от flexbox. Посмотрим на более разумный подход. Еще раз взглянем на результат, который должен у нас получиться.

Макет “святой Грааль”

header и footer могут быть блочными элементами. Без лишних вмешательств они и так заполнят все доступное им простанство контейнера и будут прижаты к верху и низу

<body>
 
  <header>Header</header>
 
  <main>
 
    <article>Article</article>
 
    <nav>Nav</nav>
 
    <aside>Aside</aside>
 
  </main>
 
  <footer>Footer</footer>
 
</body>

Что означает, что флекс-контейнер необходим только для main. Единственная сложность здесь заключается в том, что вам необходимо самим вычислить высоту блока main. Он должен занимать все свободное пространство между header и footer

main {
 
  height: calc(100vh - 40vh);
 
}

Рассмотрим этот код. Он использует CSS функцию calc для того, чтобы вычислить высоту main. Высота блока должна быть равна calc (100vh – высота хэдера – высота футера). В предыдущем случае вы должны были задать фиксированную высоту футеру и хэдеру. Теперь вы поступаете таким же образом только с main.Здесьлежит готовый результат.

Макет сайта в 2 колонки

Двухколоночный макет очень распространен. Их тоже очень легко строить на флексбокс.

Макет сайта в две колонки (сайдбар и основной контент)

Вот наша верстка:

<body>
 
  <aside>sidebar</aside>
 
  <main>main</main>
 
</body>

Инициализируем флексбокс

body {
 
  display: flex;
 
}

Задаем блоку aside фиксированную ширину

aside {
 
   width: 20vw
 
}

И, наконец, убедимся, что main занимает все доступное пространство

main {
 
  flex: 1
 
}

Вот, в общем-то, и все, что нужно сделать.

Табы с использованием JavaScript

В этом разделе разберём как можно создать табы на чистом JavaScript (без использования библиотеки jQuery).

Способ реализации вкладок с использованием JavaScript может потребоваться, когда в них нужно, например показывать динамический контент, получаемый через AJAX.

HTML и CSS код вкладок:

<style>
  .tabs {
    border: 1px solid lightgray;
  }

  .tabs__nav {
    display: flex;
    flex-wrap: wrap;
    list-style-type: none;
    background: #f8f8f8;
    margin: 0;
    border-bottom: 1px solid lightgray;
  }

  .tabs__link {
    padding: 0.5rem 0.75rem;
    text-decoration: none;
    color: black;
    text-align: center;
    flex-shrink: 0;
    flex-grow: 1;
  }

  .tabs__link_active {
    background: lightgray;
    cursor: default;
  }

  .tabs__link:not(.tabs__link_active):hover,
  .tabs__link:not(.tabs__link_active):focus {
    background-color: #efefef;
  }

  .tabs__content {
    padding: 1rem;
  }

  .tabs__pane {
    display: none;
  }

  .tabs__pane_show {
    display: block;
  }    
</style>

<div class="tabs">
  <div class="tabs__nav">
    <a class="tabs__link tabs__link_active" href="#content-1">Вкладка 1</a>
    <a class="tabs__link" href="#content-2">Вкладка 2</a>
    <a class="tabs__link" href="#content-3">Вкладка 3</a>
  </div>
  <div class="tabs__content">
    <div class="tabs__pane tabs__pane_show" id="content-1">
      Содержимое 1...
    </div>
    <div class="tabs__pane" id="content-2">
      Содержимое 2...
    </div>
    <div class="tabs__pane" id="content-3">
      Содержимое 3...
    </div>
  </div>
</div>

JavaScript код:

Инициализация табов на странице осуществляется с помощью вызова функции и передаче ей в качестве аргумента CSS селектора или DOM-элемента, содержащего вкладки:

$tabs('.tabs');

При этом инициализирован будет только первый контейнер с вкладками, имеющий указанный класс.

Для того чтобы на странице инициализировать сразу все вкладки, имеющие этот класс, можно, например, использовать следующий код:

var listTabs = document.querySelectorAll('.tabs');
for (var i = 0, length = listTabs.length; i < length; i++) {
  $tabs(listTabs);
}

Кроме этого, если результат вызова функции сохранить в переменную, то можно использовать методы, которые она представляет.

Например:

var tabs1 = $tabs('.tabs');
// программно переключиться на 2 вкладку (2 – номер вкладки, на которую нужно перейти)
tabs1.switchToTab(2);

Примеры

1. Пример, в котором данные о последней открытой вкладки таба будем сохранять в LocalStorage, а затем использовать эту информацию при открытии страницы для переключения на неё:

...
var mytabs = $tabs('.tabs');
if (localStorage.getItem('mytabs')) {
  mytabs.showTab(document.querySelector(''));
}

document.addEventListener('tab.show', function (e) {
  localStorage.setItem('mytabs', e.detail.querySelector('.tabs__link_active').getAttribute('href'));
});

2. Пример синхронизации вкладок на разных открытых страницах, относящихся к одному источнику (через LocalStorage):

window.onstorage = function (e) {
  mytabs.showTab(document.querySelector(''));
};

3. Пример, в котором показано как на одной странице можно вывести несколько табов с сохранением их состояний (активных вкладок) в LocalSorage:

<div class="tabs" id="tabs-1">...</div>
<div class="tabs" id="tabs-2">...</div>
    
<script>
var
  nameKey = 'mytabs2',
  mytabs = {},
  mytabsStorage = {},
  listTabs = document.querySelectorAll('.tabs');

for (var i = 0, length = listTabs.length; i < length; i++) {
  if (listTabs.id) {
    mytabs.id] = $tabs(listTabs);
  }
}
if (localStorage.getItem(nameKey)) {
  mytabsStorage = JSON.parse(localStorage.getItem(nameKey));
  for (var key in mytabsStorage) {
    if (mytabs.hasOwnProperty(key)) {
      mytabs.showTab(document.querySelector(' + '"]'));
    }
  }
}
document.addEventListener('tab.show', function (e) {
  mytabsStorage = e.detail.querySelector('.tabs__link_active').getAttribute('href');
  localStorage.setItem(nameKey, JSON.stringify(mytabsStorage));
})
</script>

Описание исходного JavaScript кода

Исходный JavaScript код состоит из функции . Внутри этой функции имеется переменная и функции , . Переменная хранит DOM-элемент, предоставляющий собой контейнер с вкладками. Метод предназначен для скрытия текущей (активной) вкладки и отображения другой в зависимости от переданной ему ссылки. Метод используется для переключения вкладки по её порядковому номеру. Установка обработчиков событий для вкладок определяется с помощью и выполняется в момент вызова .

Вне функции доступен только методы и . Первый метод позволяет программно перейти на вкладку через передачу ему ссылки на DOM-элемент (ссылки), а второй — по её порядковому номеру.

Принцип действия добавки Энимал Флекс

Спорт комплекс под названием Animal flex, действует на человека следующим образом:

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

Доступные стили

Изменяйте стиль компонентов классами-модификаторами и обычными классами. Смешивайте их и настраивайте как надо, или создайте свои.

Горизонтальное выравнивание

Изменяйте горизонтальное выравнивание вашего навигационного элемента с . По умолчанию навигационные панели выровнены по левому краю, но вы можете легко это изменить на центр или правый край.

Центрировано классом :

По правому краю классом :

Вертикально

Располагайте вашу навигацию по вертикали, изменяя направление элемента flex классом . Надо расположить ее вертикально лишь на некоторых брейкпойнтах? Используйте отзывчивые версии (например ).

Как всегда – вертикальная навигация доступна и без .

Вкладки

«Забирает» базовый элемент навигации с верха и добавляет класс для создания «вкладочного» интерфейса, Используйте их для создания зоны с поддержкой содержимого в виде .

Наполняйте и выравнивайте по центру

Заставьте содержимое вашего расширяться на полную доступную ширину с помощью одного-двух классов-модификаторов. Для пропорционального заполнения всего доступного пространства элементами класса , используйте класс nav-fill. Заметьте, что всё горизонтальное место занято, но не каждый элемент навигационной панели имеет одинаковую ширину.

Используя навигацию на основе , удостоверьтесь, что включаете в ссылки.

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

По аналогии с примером с , где использована навигация на основе , удостоверьтесь, что включили класс в ссылки.

Оцените статью
Рейтинг автора
5
Материал подготовил
Андрей Измаилов
Наш эксперт
Написано статей
116
Добавить комментарий