выровнять эмодзи по вертикали в div на Mac

#html #css #vertical-alignment #emoji

#HTML #css #выравнивание по вертикали #эмодзи

Вопрос:

Возможно ли идеально выровнять эмодзи по вертикали в div на Mac?

введите описание изображения здесь

Как вы можете видеть на скриншоте, div имеет высоту 50 пикселей, а эмодзи — 50 пикселей в высоту, но голова выступает над div, а не находится в его идеальном вертикальном центре.

Вот скрипка.

Как вы можете видеть, мой div прост и содержит только код для эмодзи:

 <div>amp;#x1F464;</div>
  

Я пытался добавить кучу стилей вертикального центрирования в div, но безрезультатно:

 div {
  width: 50px;
  height: 50px;
  background-color: #f00;
  font-size: 50px;
  line-height: 50px;
  display: flex;
  align-self: center;
  justify-content: center;
  align-items: center;
  vertical-align: center;
}
  

Как ни странно, приведенный выше код отлично отображается в Windows, потому что их эмодзи совпадают с базовой линией шрифта.

Комментарии:

1. Вы пробовали уменьшать font-size ?

2. Да, уменьшение или увеличение font-size не устраняет несовершенство, хотя уменьшение font-size затрудняет его обнаружение.

Ответ №1:

Я перенес стили в дочерний элемент, который я добавил, чтобы окружить глиф. Я удалил line-height свойство, потому что это мешало кроссбраузерному отображению, и добавил небольшое количество нижнего отступа, чтобы компенсировать естественное пространство пробелов в самом символе. Я также добавил CSS Variable , чтобы свести к минимуму повторение повторяющегося значения. Это упростило тестирование при разных размерах. Протестировано в Mac Firefox / Chrome / Safari (все последние версии).

 div {
  position: relative;
  display: flex;
  flex-direction: column;
  margin-bottom: 1em;
}

.small {
  --symbol: 50px;
}

.medium {
  --symbol: 100px;
}

.large {
  --symbol: 150px;
}

div span {
  --symbol: 50px;
  width: var(--symbol);
  height: var(--symbol);  
  font-size: var(--symbol);
  background-color: #f00;
  padding-bottom: 0.06em;
}  
 <div>
  <span class="small">amp;#x1F464;</span>
</div>

<div>
  <span class="medium">amp;#x1F464;</span>
</div>

<div>
  <span class="large">amp;#x1F464;</span>
</div>  

Комментарии:

1. Спасибо! Мне действительно не нравится пользовательское заполнение 0,06em для этого, но, возможно, это единственное решение.

2. @LeoGalleguillos Поверьте мне, я тоже это ненавижу. Я не нашел другого способа обойти это и смог наконец увидеть согласованный кроссбраузерный рендеринг.

Ответ №2:

Да и нет, небольшое смещение верхнего интервала здесь вызвано самим символом и должно быть скорректировано с помощью transform: translate или отрицательного поля.

 div {
  position: relative;
  font-size: 2rem;
  border: red 1px solid;
  height: 5rem;
  width: 5rem;
}

#div1:after {
  content: '👤';
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%,-50%);
}

#div2 {
  display: flex;
  align-items: center;
  justify-content: center;
}

#div3 {
  display: table-cell;
  text-align: center;
  vertical-align: middle;
}  
 Yep...
<div id="div1"></div>

<br/>

Yep again.
<div id="div2">amp;#x1F464;</div>

<br/>

And yep again.
<div id="div3">amp;#x1F464;</div>  

Комментарии:

1. Спасибо. Однако эмодзи на самом деле выровнены не идеально по вертикали. Если увеличить размер шрифта с 2rem до 3rem, это станет легче увидеть.

2. @LeoGalleguillos отсюда и комментарий к первому предложению перед примером. Приветствия 🙂

Ответ №3:

Поместите текст в a span , чтобы вы могли выделять его отдельно от div . Затем удалите центрирование flexbox, и вы сможете вставить его туда с помощью некоторых других стилей, которые вы можете увидеть здесь.

 div {
  width: 50px;
  height: 50px;
  background-color: #f00;
}
div span {
  display: inline-block;
  font-size: 50px;
  line-height: 50px;
  text-align: center;
  padding-top: 7px;
}  
 <div>
  <span>amp;#x1F464;</span>
</div>  

Комментарии:

1. Значок не выровнен вплотную к нижней части родительского div в Firefox.

2. Ваш подход к использованию значка таков, что вы можете ожидать этих межбраузерных различий, поскольку вы имеете дело с потоком текста вместо четко определенного элемента DOM. Вот почему многие люди предпочитают использовать настоящие шрифты для значков, такие как Font Awesome, или SVG-код, чтобы более предсказуемо определять форму в браузере кроссбраузерным способом.

3. Выглядит довольно неплохо, однако в Windows это добавит дополнительные отступы. Кроме того, мы пытаемся избежать использования проприетарного шрифта icon.

Ответ №4:

Вот как я бы подошел к этому. Размер шрифта на Mac, похоже, создает изображение размером более 50×50, что может быть причиной проблемы. Скрытие переполнения, по крайней мере, сделает изображение более согласованным.

 <div class="container">
  <div class="emoji">
      amp;#x1F464;
  </div>
</div>

.container {
  width: 50px;
  height: 50px;
  background-color: #f00;
  overflow: hidden;
}
.emoji {
    font-size: 50px;
    width: 50px;
    height: 50px;
}
  

https://jsfiddle.net/pg46v8j3/2/

Комментарии:

1. Ах, я вижу, эмодзи будут разного размера в разных ОС. Я действительно не вижу отличного решения этой проблемы, за исключением, как говорили другие комментаторы, использования библиотеки типа font-awesome.