Центрирование Flexbox не работает с некоторой высотой / шириной - PullRequest
1 голос
/ 25 апреля 2020

У меня есть собственный переключатель, элемент span - это граница кнопки, а ::after - это точка, которая заполняет кнопку. Я хочу центрировать эту точку внутри промежутка, я использую flexbox для этого, но по какой-то причине, если я даю ::after это значения:

width: 1.5rem;
height: 1.5rem;

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

Почему это происходит?

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html {
  /* 1rem = 10px */
  font-size: 62.5%;
}

body {
  font-family: Arial, Helvetica, sans-serif;
}

input[type='checkbox'] {
  display: none;
}

input[type='checkbox']+label {
  cursor: pointer;
  display: inline-flex;
  flex-direction: row-reverse;
  align-items: center;
  font-size: 1.6rem;
  margin: 30px;
}

input[type='checkbox']+label span {
  margin-right: 8px;
  background-color: #fff;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 3rem;
  height: 3rem;
  border-radius: 50rem;
  border: 0.4rem solid #2b90d9;
}

input[type='checkbox']+label span::after {
  content: '';
  display: inline-block;
  width: 1.5rem;
  height: 1.5rem;
  border-radius: 50rem;
  background-color: #2b90d9;
  opacity: 0;
}

input[type='checkbox']:checked+label span::after {
  opacity: 1;
}
<input type="checkbox" id="radio" />
<label for="radio">test
  <span></span>
</label>

1 Ответ

2 голосов
/ 25 апреля 2020

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

Учтите это: Если у вас есть контейнер шириной 100 пикселей, а внутри у вас есть центрированный объект шириной 55 пикселей, у вас не будет идеального центрирования (потому что 45/2 не дает равного количества целых пикселей).

|   ----------------------------------------- 100px ------------------------------------ |
|               23px            |     centered 55px object     |             22px        |

В вашем коде 3rem и 1.5rem вычисляют до 30px и 15px соответственно.

Так вот в чем проблема:

|   ------------------------------------------ 30px ------------------------------------ |
|                8px            |     centered 15px object     |            7px          |

Это также объясняет, почему работает 1.4rem:

|                8px            |     centered 14px object     |            8px          |

С четным длина на контейнере и нечетная длина на дочернем (или наоборот), вы не можете иметь идеальное центрирование. Я бы оставил оба элемента нечетными или четными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...