Как предотвратить отображение текста значка материала, когда Google JS не может его преобразовать?

Как предотвратить отображение текста значка материала, когда JS Google не может преобразовать его в значки?

Иконки определяются в разметке как таковые:

<span class="material-icons">icon_name</span>

Пример: https://archive.fo/CKqKG/scr.png (см. Верхнюю строку кнопки).

Документация по значкам материалов: https://material.io/icons/

Это также проблема в поиске Google, когда Google фактически читает и сохраняет текст div, а не игнорирует его.

Пример: https://i.imgur.com/TixS06y.png.

Я понимаю, что одно из решений - просто переключиться на .PNG (предоставленные Google). Я хотел бы сделать все, что приведет к меньшей (сетевой) нагрузке на систему пользователя.

Спасибо!


person David    schedule 18.01.2017    source источник
comment
Это может помочь stackoverflow.com/a/12316349/3183699   -  person talkhabi    schedule 18.01.2017


Ответы (11)


вы можете использовать font-display: block;, просто добавьте этот CSS в заголовок HTML:

<style>
   @font-face {
      font-family: 'Material Icons';
      font-display: block;
    }
</style>

для получения дополнительной информации font-display

person Fareed Alnamrouti    schedule 14.11.2018
comment
Это будет работать только в том случае, если вы укажете src шрифта в @ font-face, а не используете тег @import или link в своей голове. К сожалению, это (пока) невозможно с Google Fonts: css-tricks.com/ - person Laurens; 19.03.2019
comment
Примечание: блок font-display: покажет невидимое начертание шрифта, что означает, что во время загрузки шрифта будет отображаться невидимый текст, который будет иметь ту же длину, что и резервный текст. Этот текст лигатуры обычно шире, чем фактический шрифт, поэтому вам нужно будет установить некоторые стили, чтобы, даже если он был невидимым из-за блока font-display:, ширина все равно была меньше, чтобы не было мерцания. - person gaurav5430; 29.06.2019
comment
Старый вопрос, но новая для меня проблема. Теперь вы можете указать свойство font-display с помощью шрифтов Google, поэтому fonts.googleapis. com / работает. - person Sheng Slogar; 20.04.2020
comment
Я попробовал ваше решение, и оно работает, но не тогда, когда скорость сети слишком низкая. Чтобы быть более понятным, он будет показывать блок (на самом деле ничего) вместо текста в течение примерно двух секунд, поэтому все нормально, когда я пробую режим fast 3G, и он не будет показывать тексты пользователю, но для режима slow 3G проблема все еще существует , всего с задержкой около двух секунд! Есть ли способ увеличить эту задержку ?! - person Hamidreza; 01.07.2020

Я боролся с подобной ситуацией: моя проблема заключалась не в том, что значки никогда не загружались, а в том, что им могло потребоваться время для загрузки при более медленных соединениях и до тех пор, пока они не загрузили уродливый неформатированный текст, например sentiment_very_satisfied будет отображаться на странице (часто во много раз больше, чем окружающий текст, что также делает его очень очевидным).

Другие решения здесь не помогли мне (включая font-display:block, которые, как я думал, могут быть многообещающими), поэтому я придумал свое, используя CSS и jQuery. Я уверен, что вы могли бы легко адаптировать его для использования ванильного JS.

CSS:

.material-icons{
    opacity:0;
}

jQuery:

$(window).load(function() {
    $('.material-icons').css('opacity','1');
});

Уловка здесь в том, что, в отличие от более часто используемого прослушивателя $(document).ready(), $(window).load() ожидает загрузки всех элементов страницы перед запуском. В данном случае это означает, что прозрачность значков не изменится, пока шрифт значка не будет загружен.

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

(Я также добавил переход к CSS .material-icons{transition:opacity 0.5s;}, чтобы они выглядели красиво и плавно.)

person todd    schedule 30.01.2019
comment
Я только что проверил, sentiment_very_satisfied - это настоящий значок: material.io/resources/icons/ < / а>. Ага, вот что я хочу прошить своих юзеров. - person Dem Pilafian; 29.09.2020

Если вы используете загрузчик веб-шрифтов Typekit, вы можете применять условные классы, чтобы скрыть значки, пока веб-шрифт загрузка или если не удалось загрузить, например:

.wf-loading, .wf-materialicons-n4-inactive {
  .material-icons {
    display: none;
  }
}

Вы, конечно, можете применять другие методы укладки в соответствии с вашими предпочтениями для достижения наилучших результатов, например, font-size: 0;, это будет зависеть от вашего сайта и варианта использования.

Чтобы загрузить значки материалов с помощью загрузчика веб-шрифтов, используйте следующую конфигурацию:

window.WebFontConfig = {
  google: {
    families: [
      'Material Icons',
    ],
  },
};
person Adam Reis    schedule 04.11.2017
comment
не могли бы вы указать, почему значок материала не отображается и почему он отображается как текст? и что может быть обходным путем? - person Ramesh Pareek; 07.02.2018
comment
Может быть множество причин, по которым значки материалов не отображаются, например, сбой подключения к Интернету или иным образом неудачный запрос на выборку файлов шрифтов. В этом случае, если вы используете значки материалов с лигатурами, когда ваш код выглядит примерно как <i class="material-icons">face</i>, слово face будет отображаться как обычный текст на вашей странице. Обход в моем ответе предотвращает появление этого текста. - person Adam Reis; 08.02.2018

Правильным решением будет добавить максимальную ширину с таким же размером шрифта и установить для переполнения значение «скрыто».

.material-icons {
    max-width: 16px;
    overflow: hidden;
}
person alabo briggs    schedule 12.04.2020

Я столкнулся с той же проблемой. Однако я считаю, что использование псевдоселектора, такого как i.material-icons: before, может помочь. См. это для получения дополнительной информации.

---- РЕДАКТИРОВАТЬ: рабочий пример

i.material-icons:before{display:none;}

person Ali    schedule 29.08.2017

Если вы используете angularjs, исправление может быть

<i class="material-icons-outlined" ng-bind-html=" 'icon_text' "></i>

или если вы используете jquery, то

HTML

<i material-icons="icon_text" class="material-icons"></i>

jQuery.onLoad

$('[material-icons]').each(function(){
  var icon_text = $(this).attr('material-icons');
  $(this).html(icon_text)
});

Значок появляется после загрузки страницы.

person Phaneendra Charyulu Kanduri    schedule 02.07.2019
comment
это выглядит многообещающим ответом - person PKInd007; 02.07.2019

Я обнаружил, что это помогает, если вы вставляете - &display=swap в конце href в теге ссылки следующим образом:

<link
    href="https://fonts.googleapis.com/icon?family=Material+Icons&display=swap"
    rel="stylesheet"
  >

вот ссылка для справки

person Neveh    schedule 15.02.2021
comment
Самый простой способ избежать отображения невидимого текста при загрузке пользовательских шрифтов - это временно показать системный шрифт (...), который сообщает браузеру, что текст, использующий шрифт, должен отображаться немедленно с использованием системного шрифта. Когда пользовательский шрифт готов, он заменяет системный шрифт. Это полная противоположность того, о чем идет речь. - person Andrey Popov; 17.05.2021

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

<link rel="preconnect" href="//fonts.googleapis.com">
<link rel="preconnect" href="//fonts.gstatic.com">
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
person Neil    schedule 16.05.2019
comment
Одна из немногих вещей, которые вы действительно могли сделать. Конечно не исправление, но это все же что-то. К сожалению, проблема в том, что запрос возвращает таблицу стилей, то есть следующее добавление запроса для самого шрифта. Чаще всего в конце очереди. Тем не менее кое-что. - person Andrey Popov; 17.05.2021

Создайте div style = "position: absolute; top: -1000px" на главной странице и введите все элементы со значком материала класса или отличным шрифтом следующим образом:

<div   style="position:absolute;top:-1000px" >      
<i class="icon material-icons-outlined"  >add_circle</i>
<i class="icon material-icons "  >list_alt</i>
<span class="fas fa-circle fa-stack-2x " ></span>
<span class="fas fa-home fa-stack-1x fa-inverse"  ></span>
</div>
person Paulo R. Carvalho de Oliveira    schedule 20.11.2019

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

пример:

<i class="material-icons">&#xE87D;</i>

вы можете найти список кодовых точек по адресу:

https://github.com/google/material-design-icons/issues/813#issuecomment-401601344

or

https://raw.githubusercontent.com/flutter/flutter/master/packages/flutter/lib/src/material/icons.dart

person Hani    schedule 26.11.2020

Мы можем сначала обнулить прозрачность значков с помощью css, а затем отобразить значки через 3 секунды с помощью addClass.

var delayInMilliseconds = 3000;
setTimeout(function() {
var element = document.getElementById("mayicons");
  element.className +="ops1";
}, delayInMilliseconds);
.material-icons {
    width: 26px;
    height: 30px;
    overflow: hidden;
    opacity: 0;

}

.ops1{
    opacity: 1;
}
<i id="mayicons" class="material-icons ">list</i>

person sina sadeghi    schedule 06.03.2021
comment
А что, если ваш интернет настолько медленный, что шрифт все еще не загружается через 3 секунды? - person Andrey Popov; 14.05.2021