Горизонтальное и вертикальное центрирование блока
Эта техника применяется, в основном, для вёрстки модальных окон. Основывается на том, что блокс position: absolute смещается относительно ближайшего родителя с position: relative | absolute | fixed. Смещение задаётся при помощи CSS-свойств
Если мы используем единицу измерения % для задания смещения, важно помнить, что процент берётся относительно родительского контейнера.Это значит, что left: 50% сместит блок на 50% от ширины родителя, а не от собственной ширины. Для того, чтобы сместить блок на 50% относительно собственной ширины, необходимо использовать свойство transform с функцией translateX(50%) - движение по оси X, translateY(50%) - движение по оси Y или translate(50%, 50%) - движение по обеим осям.
В примере ниже показано, как мы сначала смещаем абсолютно спозиционированный блок на 50% слева направо (left) и на 50% сверху вниз (top) относительно контейнера,а затем, смещаем на 50% вверх и на 50% вправо относительно самого себя (transform: translate(-50%, -50%)), чтобы блок встал ровно по центру контейнера.
Дело в том, что в CSS, началом координат является верхняя левая точка элемента, а не центр элемента.Поэтому нам не достаточно просто подвинуть блок на 50% вниз и вправо, так как тогда в центре контейнера окажется левый верхний угол блока, а не центр блока.
Пример:
Код:
<div class="container"> <div class="block"></div> </div>
.container { position: relative; width: 100%; height: 250px; } .block { position: absolute; /* позволяет двигать блок относительно родительского релятивного контейнера */ top: 50%; /* смещаем блок на 50% от высоты родителя */ left: 50%; /* смещаем блок на 50% от ширины родителя */ transform: translate(-50%, -50%); /* смещаем блок на 50% от ширины и высоты этого блока */ width: 120px; height: 80px; }
.container { background: lightblue; } .block { background: teal; }
Задача
Сделать просмотр изображений как на dns-shop.ru
- Размер внешнего контейнера: 100% * 100vh
- Вместо картинок можно использовать цветные блоки
- Стрелочки: arrow-left, arrow-right; изображение кнопки "закрыть": close.
<div class="sol3"> <div class="title">iPhone Xs Max</div> <button class="button close"></button> <button class="button left"></button> <button class="button right"></button> <div class="image-container"><img src="./assets/images/iphonexsmax-1.jpg" alt="iPhone Xs Max"></div> <div class="slider-container"> <button class="button left"></button> <button class="thumb active"><img src="./assets/images/iphonexsmax-2.jpg" alt="Next"></button> <button class="thumb"><img src="./assets/images/iphonexsmax-3.jpg" alt="Next"></button> <button class="thumb"><img src="./assets/images/iphonexsmax-4.jpg" alt="Next"></button> <button class="thumb"><img src="./assets/images/iphonexsmax-5.jpg" alt="Next"></button> <button class="button right"></button> </div> </div>
.sol3 { position: relative; width: 100%; height: 100%; min-height: 550px; overflow: hidden; background: white; } .sol3 .title { position: absolute; top: 30px; left: 30px; font-size: 24px; font-weight: bold; color: #444; } .sol3 .image-container { position: absolute; bottom: 50%; right: 50%; transform: translate(50%, 50%); width: 70%; height: 60%; text-align: center; } .sol3 .image-container img { max-width: 100%; max-height: 100%; object-fit: contain; } .sol3 .slider-container { position: absolute; bottom: 30px; right: 50%; width: 320px; height: 80px; margin-right: -160px; display: flex; justify-content: space-between; } .sol3 .slider-container .thumb { text-align: center; padding: 8px; background: white; border: 1px solid #d8d8d8; margin: 5px; width: 70px; height: 70px; border-radius: 4px; cursor: pointer; box-shadow: none; } .sol3 .slider-container .thumb img { display: inline-block; max-width: 100%; max-height: 100%; opacity: 0.7; } .sol3 .slider-container .thumb.active { border-color: #464646; } .sol3 .slider-container .thumb.active img, .sol3 .slider-container .thumb:hover img { opacity: 1; } .sol3 .slider-container .button { width: 60px; } .sol3 .slider-container .button.left { left: auto; right: 100%; width: 40px; } .sol3 .slider-container .button.right { right: auto; left: 100%; width: 40px; } .sol3 .button { position: absolute; bottom: 50%; transform: translateY(50%); background: white; min-width: 30px; min-height: 30px; border: none; cursor: pointer; opacity: 0.4; background-repeat: no-repeat; background-position: center center; background-size: contain; width: 80px; height: 80px; box-shadow: none; } .sol3 .button:hover { opacity: 1; } .sol3 .button.left { left: 0; background-image: url('./assets/images/angle-left-sm.svg'); } .sol3 .button.right { right: 0; background-image: url('./assets/images/angle-right-sm.svg'); } .sol3 .button.close { position: absolute; top: 30px; right: 30px; transform: none; width: 30px; height: 30px; background-image: url('./assets/images/times-sm.svg'); } @media (max-width: 500px) { .sol3 .slider-container { transform: scale(0.8); } }