Текст в Safari позиционируется не так, как в других браузерах - PullRequest
0 голосов
/ 26 декабря 2018

Текст в Safari позиционируется не так, как в других браузерах.Есть ли причина для этого?Есть ли стиль, чтобы он соответствовал точным измерениям.

* {
  margin: 0;
  padding: 0;
}
#btn_signup {
  opacity: 1;
  position: absolute;
  width: 185px;
  height: 50px;
  left: 10px;
  top: 10px;
  overflow: visible;
}
#Rectangle_1 {
  opacity: 1;
  fill: transparent;
  stroke: rgb(67, 66, 93);
  stroke-width: 1px;
  stroke-linejoin: miter;
  stroke-linecap: butt;
  stroke-miterlimit: 4;
  shape-rendering: auto;
}
.Rectangle_1 {
  position: absolute;
  overflow: visible;
  width: 185px;
  height: 50px;
  left: 0px;
  top: 0px;
}
#Sign_up {
  opacity: 1;
  position: absolute;
  left: 58px;
  top: 16px;
  box-sizing: border-box;
  margin: 0;
  padding: 0;
  overflow: visible;
  width: 63px;
  white-space: nowrap;
  text-align: center;
}
#Path_1 {
  opacity: 1;
  fill: rgba(0,0,0,0);
  stroke: rgb(112, 112, 112);
  stroke-width: 0.5px;
  stroke-linejoin: miter;
  stroke-linecap: butt;
  stroke-miterlimit: 4;
  shape-rendering: auto;
}
.Path_1 {
  overflow: visible;
  position: absolute;
  top: 16.5px;
  left: 1px;
  width: 183.5px;
  height: 0.5px;
  transform: matrix(1,0,0,1,0,0);
}
<div id="A5">
  <div id="btn_signup">
    <svg class="Rectangle_1">
      <rect id="Rectangle_1" rx="4" ry="4" x="0" y="0" width="185" height="50"></rect>
    </svg>
    <div id="Sign_up">
      <span style="font-family:Helvetica;font-style:normal;font-weight:normal;font-size:18px;color:rgba(77,79,92,1);display:inherit;">Sign up</span>
    </div>
    <svg viewBox="12.5 0 183.5 0.5" class="Path_1">
      <path id="Path_1" d="M 12.5 0 L 196 0"></path>
    </svg>
  </div>
</div>

В Firefox текст находится на одном уровне со строкой.В Safari есть разрыв в несколько пикселей, как показано ниже:

enter image description here

Как удалить этот разрыв?

Добавлена ​​награда.Задавайте вопросы, если вам нужно больше ясности.

Обновление:
Спасибо за все предложения по вертикальному центрированию.Половина случаев, которые у меня есть, была бы зафиксирована вертикальным центрированием, а остальные - случаями выравнивания сверху.

Похоже, что я хочу, чтобы мое текстовое содержимое было ограничено рамкой содержимого на высоте заголовков, выровненной по верхнему краю текстовой строки, как показано на рисунке.

Ресурсы:
Похоже, что это распространенная проблема для разных платформ.
Метрики высоты и x-высоты крышки неточны
Вертикальные метрики

Ответы [ 6 ]

0 голосов
/ 04 января 2019

Пожалуйста, замените этот код в CSS:

#Sign_up {
    opacity: 1;
    box-sizing: border-box;
    overflow: visible;
    white-space: nowrap;
    height: 50px;
    line-height: 50px;
    text-align: center;
    display: block;
}
0 голосов
/ 03 января 2019

Шрифты отображаются по-разному в разных браузерах.Вот захват той же строки текста.Он был записан во всех основных браузерах и помещен один поверх другого, чтобы проиллюстрировать масштаб проблемы.(Взято из этой статьи )

enter image description here

Различные шрифты будут давать разные результаты

Когда мне нужно былотекст, который должен быть выровнен по вертикали по пикселям, у нас была команда, которая провела некоторое исследованиеМы обнаружили, что некоторые шрифты лучше выровнены по вертикали, чем другие, поэтому стоит протестировать.

Вы всегда можете взломать его с помощью JS

Если это сафари - измените высоту строки (или поля или что-то еще)

if (navigator.userAgent.toLowerCase().indexOf('safari') > -1) {
  $('.your-element').css({lineHeight: "21px"});
}
0 голосов
/ 03 января 2019

Сохранить position: relative; для #btn_signup.Также отцентрируйте Sign_up, используя следующий CSS

#Sign_up {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}

. Он будет работать одинаково во всех браузерах.

* {
  margin: 0;
  padding: 0;
}

#btn_signup {
  opacity: 1;
  position: relative;
  width: 185px;
  height: 50px;
  left: 10px;
  top: 10px;
  overflow: visible;
}

#Rectangle_1 {
  opacity: 1;
  fill: transparent;
  stroke: rgb(67, 66, 93);
  stroke-width: 1px;
  stroke-linejoin: miter;
  stroke-linecap: butt;
  stroke-miterlimit: 4;
  shape-rendering: auto;
}

.Rectangle_1 {
  position: absolute;
  overflow: visible;
  width: 185px;
  height: 50px;
  left: 0px;
  top: 0px;
}

#Sign_up {
  opacity: 1;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  box-sizing: border-box;
  margin: 0;
  padding: 0;
  overflow: visible;
  width: 63px;
  white-space: nowrap;
  text-align: center;
}

#Path_1 {
  opacity: 1;
  fill: rgba(0, 0, 0, 0);
  stroke: rgb(112, 112, 112);
  stroke-width: 0.5px;
  stroke-linejoin: miter;
  stroke-linecap: butt;
  stroke-miterlimit: 4;
  shape-rendering: auto;
}

.Path_1 {
  overflow: visible;
  position: absolute;
  top: 16.5px;
  left: 1px;
  width: 183.5px;
  height: 0.5px;
  transform: matrix(1, 0, 0, 1, 0, 0);
}
<div id="A5">
  <div id="btn_signup">
    <svg class="Rectangle_1">
      <rect id="Rectangle_1" rx="4" ry="4" x="0" y="0" width="185" height="50"></rect>
    </svg>
    <div id="Sign_up">
      <span style="font-family:Helvetica;font-style:normal;font-weight:normal;font-size:18px;color:rgba(77,79,92,1);display:inherit;">Sign up</span>
    </div>
    <svg viewBox="12.5 0 183.5 0.5" class="Path_1">
      <path id="Path_1" d="M 12.5 0 L 196 0"></path>
    </svg>
  </div>
</div>
0 голосов
/ 30 декабря 2018

Различные браузеры по-разному обрабатывают десятичное позиционирование.Работа с дробными пикселями не входит в спецификации CSS, поэтому, даже если сейчас все расположено правильно, он может снова сломаться после обновления браузера.Если вы удалите все дробные значения пикселей и добавите line-height:1, это должно сработать.

Если это не сработает, попробуйте это и дайте мне знать, что вы видите (я не использую Safari или FF),Проверьте span в каждом браузере, и инструмент должен выделить прямоугольник.Посмотрите, не соприкасается ли верх прямоугольника с линией или верх текста не соприкасается с верхом прямоугольника.В Chrome верхняя часть текста не касается верхней части прямоугольника, поэтому решение имеет вид line-height:1.

0 голосов
/ 29 декабря 2018

См. Этот вопрос и ответ: WebKit против Mozilla вертикальное выравнивание глифов шрифта в рамке

По сути, CSS позволяет вам играть с позицией текстовых элементов, но с фактической буквойпозиционирование против элемента зависит от шрифта и браузера.Вы не можете напрямую изменить это, что означает, что, теоретически, вы не можете быть уверены в фактическом положении самих букв.

CSS дает вам косвенный доступ, например, с vertical-align , вы можете выровнять текст с родительским текстом.Таким образом, в зависимости от значения, элементы будут располагаться относительно фактических букв.Например:

div {
  font-size: 20px;
  line-height: 1.2;
  border-top: solid lightgray 1px;
  font-family: arial;
}

div span {
  display: inline-block;
  background-color: lightblue;
  border-top: solid red 1px;
}

.topalign span {
  vertical-align: top;
}

.bottomalign span {
  vertical-align: bottom;
}
<div class="topalign">
  <span style="font-family: 'helvetica neue'; ">Helvetica N</span>
  <span style="font-family: 'arial'; font-size: 30px">Arial</span>
  <span style="font-family: 'Times new roman';  ">Times NR</span>
  <span style="font-family: 'Tahoma'; font-size: 15px;">Tahoma</span>
</div>
<div class="bottomalign">
  <span style="font-family: 'helvetica neue'; ">Helvetica N</span>
  <span style="font-family: 'arial'; font-size: 30px">Arial</span>
  <span style="font-family: 'Times new roman';  ">Times NR</span>
  <span style="font-family: 'Tahoma'; font-size: 15px;">Tahoma</span>
</div>

Вы также можете поиграть с line-height , что изменит высоту текстового элемента без изменения размера шрифта, что означает, что вы можетеболее или менее контролировать, где вы хотите разместить письмо.Но опять же, разные шрифты / браузеры будут отображаться по-разному.Вы все еще не располагаете буквы точно.Например:

div {
  font-size: 30px;
  line-height: 1.2;
  border-top: solid lightgray 1px;
  font-family: arial;
}

div span {
  display: inline-block;
  background-color: lightblue;
  border-top: solid red 1px;
}

.topalign span {
  vertical-align: top;
}
<div class="topalign">
  <span style="font-family: 'helvetica neue'; ">Helvetica N</span>
  <span style="font-family: 'arial'; line-height: 1.5;">Arial</span>
  <span style="font-family: 'Times new roman';  line-height: 0.5;">Times NR</span>
  <span style="font-family: 'Tahoma'; ">Tahoma</span>
</div>

Таким образом, теоретически вы не можете точно определить фактические позиции букв именно там, где вы хотите.Это не может быть явным, и поэтому может привести к несоответствиям во всем браузере.

Как говорится, случай, на который вы указываете, похоже на ошибку Firefox со шрифтом Helvetica.Буквенное расположение Helvetica не согласуется с другими шрифтами или другими браузерами.Это особенно очевидно при сравнении с Helvetica Neue или Arial , которые должны быть более или менее одинаковыми.Смотри:

div {
  font-size: 30px;
  line-height: 1.2;
  border-top: solid lightgray 1px;
  font-family: arial;
}

div span {
  display: inline-block;
  background-color: lightblue;
  border-top: solid red 1px;
}

.topalign span {
  vertical-align: top;
}
<div class="topalign">
  <span style="font-family: 'helvetica';  ">Helvetica </span>
  <span style="font-family: 'helvetica neue'; ">Helvetica N</span>
  <span style="font-family: 'arial'; ">Arial</span>
</div>

Даже если вы не можете явно указать расположение букв, тем не менее, вы можете ожидать определенного уровня согласованности.Обычно, есть нормальная и когерентная прокладка, которая более или менее равна сверху и снизу.Он может варьироваться от шрифта к шрифту и от браузера к браузеру, но способ отображения helvetica в Firefox наверняка кажется ошибкой (по крайней мере, для меня, может быть, есть причина, но я не понимаю, почему).

Так что если вы можете заменить Helvetica на Helvetica Neue , вы можете играть с line-height , чтобы расположить букву против элемента и достичьто, что ты хочешь.Например, обычно высота строки около 0,75 прибывает заподлицо с верхним и нижним заглавными буквами, что означает, что, располагая элемент, вы можете расположить букву.Вот так например:

* {
  margin: 0;
  padding: 0;
}
#btn_signup {
  opacity: 1;
  position: absolute;
  width: 185px;
  height: 50px;
  left: 10px;
  top: 10px;
  overflow: visible;
}
#Rectangle_1 {
  opacity: 1;
  fill: transparent;
  stroke: rgb(67, 66, 93);
  stroke-width: 1px;
  stroke-linejoin: miter;
  stroke-linecap: butt;
  stroke-miterlimit: 4;
  shape-rendering: auto;
}
.Rectangle_1 {
  position: absolute;
  overflow: visible;
  width: 185px;
  height: 50px;
  left: 0px;
  top: 0px;
}
#Sign_up {
  opacity: 1;
  position: absolute;
  left: 58px;
  top: 16px;
  box-sizing: border-box;
  margin: 0;
  padding: 0;
  overflow: visible;
  width: 63px;
  white-space: nowrap;
  text-align: center;
}
#Path_1 {
  opacity: 1;
  fill: rgba(0,0,0,0);
  stroke: rgb(112, 112, 112);
  stroke-width: 0.5px;
  stroke-linejoin: miter;
  stroke-linecap: butt;
  stroke-miterlimit: 4;
  shape-rendering: auto;
}
.Path_1 {
  overflow: visible;
  position: absolute;
  top: 16.5px;
  left: 1px;
  width: 183.5px;
  height: 0.5px;
  transform: matrix(1,0,0,1,0,0);
}
<div id="A5">
  <div id="btn_signup">
    <svg class="Rectangle_1">
      <rect id="Rectangle_1" rx="4" ry="4" x="0" y="0" width="185" height="50"></rect>
    </svg>
    <div id="Sign_up">
      <span style="font-family:Helvetica neue;font-style:normal;font-weight:normal;font-size:18px;color:rgba(77,79,92,1);display:inherit;line-height: 0.75;">Sign up</span>
    </div>
    <svg viewBox="12.5 0 183.5 0.5" class="Path_1">
      <path id="Path_1" d="M 12.5 0 L 196 0"></path>
    </svg>
  </div>
</div>
0 голосов
/ 28 декабря 2018
*{
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}

попробуйте

...