Топ 50% и translateY(-50%) работают не так, как ожидалось.

Вопрос или проблема

Я пытаюсь выровнять div по вертикали, используя старинный прием

top: 50%;
transform: translateY(-50%);

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

Я попробовал добавить display: flex к телу и align-content: center;, но это только перепутало все. Поэтому я попробовал вышеприведенный способ, но он просто располагает div на половине экрана, без влияния top: 50%;.

Вот код:

body {
  margin: 0;
  padding: 0;
  overflow: hidden;
}

#mittrek {
  width: 80%;
  max-width: 200px;
  height: 400px;
  border-radius: 20px;
  z-index: 10;
  background-color: rgba(0, 0, 0, 0.5);
  position: relative;
  margin-left: auto;
  margin-right: auto;
  top: 50%;
  transform: translateY(-50%);
  backdrop-filter: blur(15px);
  -webkit-backdrop-filter: blur(10px);
  background-repeat: no-repeat;
  display: flex;
  align-content: center;
  justify-content: center;
}

#mittrek::after {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  padding: 4px;
  border-radius: 20px;
  mask-composite: exclude;
  z-index: 4;
  overflow: hidden;
  box-shadow: 0px 0px 40px 15px black;
}
<!DOCTYPE html>

<html>
<body>
  <div id="mittrek"></div>
</body>
</html>

Вы установили неверное значение свойства position для mittrek. Вот обновленный код.

<!DOCTYPE html>

<html>
<head>
  <style>
    body {
      margin: 0;
      padding: 0;
      overflow: hidden;
    }

    #mittrek {
      width: 80%;
      max-width: 200px;
      height: 400px;
      border-radius: 20px;
      z-index: 10;
      background-color: rgba(0, 0, 0, 0.5);
      position: absolute; // Изменено с relative на absolute
      margin-left: auto;
      margin-right: auto;
      top: 50%;
      left: 50%; // Добавлено left
      transform: translate(-50%, -50%); // Изменено translateY на translate
      backdrop-filter: blur(15px);
      -webkit-backdrop-filter: blur(10px);
      background-repeat: no-repeat;
      display: flex;
      align-content: center;
      justify-content: center;
    }

    #mittrek::after {
      content: '';
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      padding: 4px;
      border-radius: 20px;
      mask-composite: exclude;
      z-index: 4;
      overflow: hidden;
      box-shadow: 0px 0px 40px 15px black;
    }
  </style>
</head>
<body>
  <div id="mittrek"></div>
</body>
</html>

result-image

Ответ или решение

Чтобы решить вашу проблему с вертикальным выравниванием элемента div с использованием старой техники top: 50%; и transform: translateY(-50%);, необходимо учесть несколько важных моментов относительно CSS-свойства position. Давайте разберем шаги для достижения правильного результата.

Проблема

Вы использовали свойство position: relative; для div с id mittrek, что в данной ситуации не позволяет элементу корректно позиционироваться от верхней границы экрана. В итоге элемент располагается на 50% от родительского элемента, который не занимает всю высоту экрана. Это объясняет, почему ваше выравнивание "в центре" не работает, как ожидалось.

Решение

  1. Измените позицию элемента с position: relative; на position: absolute;.
  2. Чтобы центровать элемент по горизонтали и вертикали, используйте left: 50%; вместе с transform: translate(-50%, -50%);. Таким образом, вы будете перемещать его к центру по обоим осям.

Вот обновленный код с исправлениями:

<!DOCTYPE html>
<html>
<head>
  <style>
    body {
      margin: 0;
      padding: 0;
      overflow: hidden;
      height: 100vh; /* Устанавливаем высоту для body, чтобы parent элемент занимал всю высоту окна */
    }

    #mittrek {
      width: 80%;
      max-width: 200px;
      height: 400px;
      border-radius: 20px;
      z-index: 10;
      background-color: rgba(0, 0, 0, 0.5);
      position: absolute; /* Изменили на absolute */
      top: 50%;
      left: 50%; /* Добавили left */
      transform: translate(-50%, -50%); /* Изменили на translate для центрирования */
      backdrop-filter: blur(15px);
      -webkit-backdrop-filter: blur(10px);
      background-repeat: no-repeat;
      display: flex;
      align-content: center;
      justify-content: center;
    }

    #mittrek::after {
      content: '';
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      padding: 4px;
      border-radius: 20px;
      mask-composite: exclude;
      z-index: 4;
      overflow: hidden;
      box-shadow: 0px 0px 40px 15px black;
    }
  </style>
</head>
<body>
  <div id="mittrek"></div>
</body>
</html>

Итоги

После внесения этих изменений ваш элемент mittrek должен корректно позиционироваться в центре экрана по вертикали и горизонтали. Использование position: absolute;, left: 50%; и translate(-50%, -50%); позволяет нам явно контролировать расположение элемента в пределах окна браузера. Если у вас есть дополнительные вопросы или вам требуется помощь с другими аспектами CSS, не стесняйтесь спрашивать!

Оцените материал
Добавить комментарий

Капча загружается...