Skip to main content

Grid-Сетка для нашего сайта

При просмотре разных сайтов в интернете можно заметить, как аккуратно располагаются на них элементы независимо от размера экрана: навигация, кнопки, блоки с текстом и другие вещи. За это отвечает язык разметки CSS (Cascading Style Sheets). Она бывает разных видов, но сегодня поговорим об одном из них, самом адаптивном — CSS-гридах.

Что такое CSS Grid

Grid (сетка) — это вид разметки, в котором элементы на сайте расположены в виде таблицы. Главная фишка этой таблицы в гибкости — можно объединять отдельные ячейки, менять размеры строк и столбцов, регулировать отступы между ними. А ещё гриды хорошо приспосабливаются к разным размерам экрана, что делает их адаптивными.

Структура грида напоминает обычный Excel-файл: есть горизонтальные и вертикальные линии, которые вместе образуют много разных ячеек. Только, в отличие от файла в Excel, внутри ячеек находятся не выгрузки по зарплате за март, а элементы сайта: текст, картинки, кнопки, блоки HTML-кода и так далее. А формально все эти части грид-разметки называются так:

grid-контейнер — самый главный элемент во всей разметке, в нём хранится всё содержимое сетки;

  • grid-ячейка — единица грид-сетки, сюда можно положить один или несколько блоков кода;
  • grid-линия — горизонтальная или вертикальная линия, разделяющая столбцы и колонки;
  • grid-строка (row) — ряд ячеек;
  • grid-столбец (column) — колонка ячеек;
  • grid-элемент — какой-либо элемент сайта;
  • grid-область (area) — пространство из ячеек, в CSS можно объединить несколько ячеек в одну и работать с ними как с единым целым.

А вот как они располагаются на схеме:

image.png

В отличие от Flexbox — другого популярного вида CSS-разметки — Grid позволяет создавать двумерные таблицы. Это значит, что в них могут быть одновременно и ряды, и колонки. А во Flexbox всё строго: можно выстроить элементы или в столбик, или в линию — сочетать оба метода нельзя.

Как мы можем использовать grid на нашем сайте!

С помощью grid-разметки очень удобно создавать разметку в виде столбцов.

image.pngрисунок 1

image.pngрисунок 2

image.pngрисунок 3

На рисунке 1 мы создали сетку состоящую из четырех столбцов, на рисунке 2 три столбца и на рисунке 3 - два столбца:

<!-- Сетка на 4 столбца -->
<div class="grid">
	<div class="col4">
		<div class="item">Содержимое столбца 1</div>
		<div class="item">Содержимое столбца 2</div>
		<div class="item">Содержимое столбца 3</div>
		<div class="item">Содержимое столбца 4</div>
	</div>
</div>

<!-- Сетка на 3 столбца -->
<div class="grid">
	<div class="col3">
		<div class="item">Содержимое столбца 1</div>
		<div class="item">Содержимое столбца 2</div>
		<div class="item">Содержимое столбца 3</div>
	</div>
</div>

<!-- Сетка на 2 столбца -->
<div class="grid">
	<div class="col2">
		<div class="item">Содержимое столбца 1</div>
		<div class="item">Содержимое столбца 2</div>
	</div>
</div>

для работы нашей сетки необходимо в подключаемых стилях css добавить следующий код:

<style type="text/css">
.grid {
  --min-col4: 250px;
  --min-col3: 352px;
  --min-col2: 544px;
  --col-gap: 20px;
  --width-item: 100%;
  display: grid;
  gap: var(--col-gap) var(--grid-gap);
  & .col4,
  & .col3,
  & .col2 {
    display: grid;
    align-content: center;
    justify-items: center;
    align-items: center;
    justify-content: center;
    gap: var(--col-gap) var(--grid-gap);
		color: var(--text-color);
    & .item {
      width: var(--width-item);
      background: var(--light-color);
      box-shadow: 0 24px 48px 0 var(--border-color-light), 0 1px 4px 0 var(--disabled-color-light);
      border-radius: 4px;
      position: relative;
			text-align: center;
    }
  }
  & .col4 {
    grid-template-columns: repeat(4, 1fr);
    & .item {
      min-width: var(--min-col4);
    }
  }
  & .col3 {
    grid-template-columns: repeat(3, 1fr);
    & .item {
      min-width: var(--min-col3);
    }
  }
  & .col2 {
    grid-template-columns: repeat(2, 1fr);
    & .item {
      min-width: var(--min-col2);
    }
  }
  @media screen and (max-width: 1087px) and (min-width: 736px) {
    & .col4 {
      grid-template-columns: repeat(3, 1fr);
    }
    & .col3 {
      grid-template-columns: repeat(2, 1fr);
    }
    & .col2 {
      grid-template-columns: 1fr;
    }
  }
  @media screen and (max-width: 735px) and (min-width: 481px) {
    & .col4 {
      grid-template-columns: repeat(2, 1fr);
    }
    & .col3 {
      grid-template-columns: 1fr;
    }
  }
  @media screen and (max-width: 480px) {
    & .col4 {
      grid-template-columns: 1fr;
    }
  }
}
</style>

Таким образом мы получили разметку grid-сетки.

Модуль баннеров-ссылок на Автоматизированные информационные системы с использованием grid-разметки

Для того чтобы получить модуль баннеров-ссылок на АИС как на рисунке 2 нужно немного дополнить наш код css:

<style type="text/css">
.grid {
  --min-col4: 250px;
  --min-col3: 352px;
  --min-col2: 544px;
  --col-gap: 20px;
  --width-item: 100%;
  display: grid;
  gap: var(--col-gap) var(--grid-gap);
  & .col4,
  & .col3,
  & .col2 {
    display: grid;
    align-content: center;
    justify-items: center;
    align-items: center;
    justify-content: center;
    gap: var(--col-gap) var(--grid-gap);
		color: var(--text-color);
    & .item {
      width: var(--width-item);
      background: var(--light-color);
      box-shadow: 0 24px 48px 0 var(--border-color-light), 0 1px 4px 0 var(--disabled-color-light);
      border-radius: 4px;
      position: relative;
			text-align: center;
    }
  }
  & .col4 {
    grid-template-columns: repeat(4, 1fr);
    & .item {
      min-width: var(--min-col4);
    }
  }
  & .col3 {
    grid-template-columns: repeat(3, 1fr);
    & .item {
      min-width: var(--min-col3);
      &.ais {
        display: grid;
        justify-items: center;
        padding-top: 154px;
        & .icon {
				position: absolute;
				left: 0;
				top: 0;
				width: 100%;
				height: 154px;
				border-radius: 12px 12px0 0;
				background-position: center;
				overflow: hidden;
				padding-top: 24px;
				& img {
					position: relative;
					width: 130px;
					height: auto;
				}
			}
      }
      & .header {
				font-size: calc(25rem/var(--initial-font-multiplier));
				font-weight: bold;
				margin-top: 1rem;
        width: calc(100% - 1rem);
        height: 2rem;
			}
			& .description {
				margin-top: 2rem;
        width: calc(100% - 4rem);
        height: 4rem;
			}
      & .linkbtn {
				padding: 2em 0;
				& a {
					text-decoration: none;
					&.button-aisor {
						font-size: calc(20rem/var(--initial-font-multiplier));
						padding: .7rem 2rem;
						border-radius: 4px;
						border: 1px solid var(--primary-color-25);
						background: var(--primary-color-light);
						cursor: pointer;
						color: var(--primary-color);
						&:hover {
							background: var(--primary-color-hover);
							color: var(--primary-color-light);
						}
					}
				}
			}
    }
  }
  & .col2 {
    grid-template-columns: repeat(2, 1fr);
    & .item {
      min-width: var(--min-col2);
    }
  }
  @media screen and (max-width: 1087px) and (min-width: 736px) {
    & .col4 {
      grid-template-columns: repeat(3, 1fr);
    }
    & .col3 {
      grid-template-columns: repeat(2, 1fr);
    }
    & .col2 {
      grid-template-columns: 1fr;
    }
  }
  @media screen and (max-width: 735px) and (min-width: 481px) {
    & .col4 {
      grid-template-columns: repeat(2, 1fr);
    }
    & .col3 {
      grid-template-columns: 1fr;
    }
  }
  @media screen and (max-width: 480px) {
    & .col4 {
      grid-template-columns: 1fr;
    }
  }
}
</style>

Как внедрить код css на наш сайт описывается в следующей статье.

Далее на главной странице авторизуемся на сайте через ЕСПД

image.png

image.png

В блоке управления сайтом жмем кнопку добавить блок

image.png

В блоке содержимое тычем в пиктограмму исходный код

image.png

Вставляем код блока баннеров-ссылок АИС

image.png

Жмем кнопку сохранить

image.png

Исходный HTML-код блока баннеров-ссылок АИС:

<div class="grid">
	<div class="col3">
		<div class="item ais">
			<div class="icon" style="background-image: url('/upload/uf/8a4/nt57kmvywtmecw7kvpwc8tab2oq2fiv6/first_bg.svg');">
				<img src="/upload/uf/656/pjdg5qva6c6dymybabtqnga06cy8enxo/logo_gos.svg" alt="Единый портал государственных услуг и функций">
			</div>
			<div class="header">Госуслуги</div>
			<div class="description">Единый портал государственных услуг и функций</div>
			<div class="linkbtn"><a class="button-aisor" href="https://gosuslugi.ru/" target="_blank">Перейти</a></div>
		</div>
		<div class="item ais">
			<div class="icon" style="background-image: url('/upload/uf/d21/n5ecgvbe3aeynjnjgoa32rsgn4d5thfd/second_bg.svg');"><img src="/upload/uf/727/k03nhm2aat12xpv5zcam0p9qxw932wj7/logo_sgo.svg" alt="Образование Ямала"></div>
			<div class="header">Образование Ямала</div>
			<div class="description">Государственная информационная система</div>
			<div class="linkbtn"><a class="button-aisor" href="https://sgo.yanao.ru/" target="_blank">Перейти</a></div>
		</div>
		<div class="item ais">
			<div class="icon" style="background-image: url('/upload/uf/275/t7pbyi4xtaorpjq011obapd8o0z6opfq/third_bg.svg');"><img src="/upload/uf/295/g27e8sbwjorxhx7rp0hmiys9mwcxow98/gerbrf.svg" alt="Портал образовательных услуг"></div>
			<div class="header">Портал образовательных услуг</div>
			<div class="description">Государственные и муниципальные услуги в сфере образования</div>
			<div class="linkbtn"><a class="button-aisor" href="https://e-uslugi.yanao.ru/" target="_blank">Перейти</a></div>
		</div>
	</div>
</div>

Модуль горячая линия

Для того чтобы получить модуль как на рисунке 2 необходимо еще дополнить наш css-код. Вот конечный результата:

<style type="text/css">
.grid {
  --min-col4: 250px;
  --min-col3: 352px;
  --min-col2: 544px;
  --col-gap: 20px;
  --width-item: 100%;
  display: grid;
  gap: var(--col-gap) var(--grid-gap);
  & .col4,
  & .col3,
  & .col2 {
    display: grid;
    align-content: center;
    justify-items: center;
    align-items: center;
    justify-content: center;
    gap: var(--col-gap) var(--grid-gap);
		color: var(--text-color);
    & .item {
      width: var(--width-item);
      background: var(--light-color);
      box-shadow: 0 24px 48px 0 var(--border-color-light), 0 1px 4px 0 var(--disabled-color-light);
      border-radius: 4px;
      position: relative;
			text-align: center;
    }
  }
  & .col4 {
    grid-template-columns: repeat(4, 1fr);
    & .item {
      min-width: var(--min-col4);
    }
  }
  & .col3 {
    grid-template-columns: repeat(3, 1fr);
    & .item {
      min-width: var(--min-col3);
      &.ais {
        display: grid;
        justify-items: center;
        padding-top: 154px;
        & .icon {
				position: absolute;
				left: 0;
				top: 0;
				width: 100%;
				height: 154px;
				border-radius: 12px 12px0 0;
				background-position: center;
				overflow: hidden;
				padding-top: 24px;
				& img {
					position: relative;
					width: 130px;
					height: auto;
				}
			}
      }
      & .header {
				font-size: calc(25rem/var(--initial-font-multiplier));
				font-weight: bold;
				margin-top: 1rem;
        width: calc(100% - 1rem);
        height: 2rem;
			}
			& .description {
				margin-top: 2rem;
        width: calc(100% - 4rem);
        height: 4rem;
			}
      & .linkbtn {
				padding: 2em 0;
				& a {
					text-decoration: none;
					&.button-aisor {
						font-size: calc(20rem/var(--initial-font-multiplier));
						padding: .7rem 2rem;
						border-radius: 4px;
						border: 1px solid var(--primary-color-25);
						background: var(--primary-color-light);
						cursor: pointer;
						color: var(--primary-color);
						&:hover {
							background: var(--primary-color-hover);
							color: var(--primary-color-light);
						}
					}
				}
			}
    }
  }
  & .col2 {
    grid-template-columns: repeat(2, 1fr);
    & .item {
      min-width: var(--min-col2);
      & .my-ads {
        position: relative;
         & .requests {
           display: grid;
           justify-items: center;
           padding: var(--grid-gap);
           border-radius: 4px;
           border: 1px solid var(--primary-color-25);
           background: var(--primary-color-light);
           overflow: hidden;
            & .icon {
              width: 126px;
              height: 126px;
              background: hsl(0, 0%, 100%);
              color: var(--primary-color);
              display: flex;
              justify-content: center;
              align-items: center;
              border-radius: 50%;
              box-shadow: 0 0 0 24px hsla(0, 0%, 100%, 0.5);
              margin: calc(-1 * var(--grid-gap)) 0;
           }
           &:hover {
               & .icon {
                 transform: scale(1.1);
                 transition: transform 1s ease-out;
             }
           }
           & .title {
             background: var(--primary-color-light);
             border-top: 1px solid var(--border-color-light);
             margin-top: 35px;
             padding: 1em 0;
             font-size: calc(18rem / var(--initial-font-multiplier));
             font-weight: bold;
             z-index: 1;
           }
           & .description {
             margin-top: 1em;
             & p {
               text-align: center;
               text-indent: 0;
             }
             & .my-btn {
               background-color: hsla(0, 0%, 100%, 0.5);
             }
           }
        }
      }
    }
  }
  @media screen and (max-width: 1087px) and (min-width: 736px) {
    & .col4 {
      grid-template-columns: repeat(3, 1fr);
    }
    & .col3 {
      grid-template-columns: repeat(2, 1fr);
    }
    & .col2 {
      grid-template-columns: 1fr;
    }
  }
  @media screen and (max-width: 735px) and (min-width: 481px) {
    & .col4 {
      grid-template-columns: repeat(2, 1fr);
    }
    & .col3 {
      grid-template-columns: 1fr;
    }
  }
  @media screen and (max-width: 480px) {
    & .col4 {
      grid-template-columns: 1fr;
    }
  }
}
</style>

Как внедрить код css на наш сайт описывается в следующей статье.

А это код для вставки в создаваемый модуль на главной странице:

<div class="grid">
	<div class="col2">
		<div class="item">
			<div class="my-ads">
				<div class="requests">
					<div class="icon"><img src="/upload/uf/c5a/xro8by1vlj0podvrd80goe3dtglnjpd0/gorline.png" alt="ГИА" width="73" height="61"></div>
					<div class="title">Горячая линия по вопросу организации учебного процесса в дни с неблагоприятными метеоусловиями</div>
					<div class="description">
						<p>+7 912-433-96-78 (круглосуточно)<br>+7 (34992) 5-72-10 добавочный 2210, 2212 (в рабочие часы)</p>
						<p><a href="/presscenter/news/144051/" target="_blank" class="my-btn">Шкала температур</a></p>
					</div>
				</div>
			</div>
		</div>
		<div class="item">
			<div class="my-ads">
				<div class="requests">
					<div class="icon"><img src="/upload/uf/d96/ibbxad9bmnnsuanhcm3ua32la2hdefep/gia.png" alt="ГИА" width="73" height="61"></div>
					<div class="title">Горячая линия по вопросам проведения государственной итоговой аттестации</div>
					<div class="description">
						<p>ГИА-9 +7 (34992) 5-72-10 добавочный 2226</p>
						<p>ГИА-11 +7 (34992) 5-72-10 добавочный 2225</p>
					</div>
				</div>
			</div>
		</div>
	</div>
</div>

В данном примере мы дополнительно использовали класс my-btn который описывается в статье: Оформление кнопок на просмотр/скачивание документов