Как я могу изменить источник @ font-face с помощью Javascript? - PullRequest
0 голосов
/ 23 июня 2018

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

Я изо всех сил пытаюсь найтилучший способ загрузить шрифты.Очевидно, что я не хочу загружать сразу все шрифты, поэтому мне нужно загружать шрифт только после его создания.Использование правила @font-face CSS было бы идеальным, но я не могу понять, как изменить Src шрифта с помощью Javascript.

Прямо сейчас мой метод заключается в использовании Google Fonts, где вызагрузите шрифт с помощью ссылки css, например <link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">.Затем я могу использовать Javascript, чтобы изменить ссылку на эту ссылку, которая загружается новым шрифтом.Но этот метод ограничивает меня использованием только Google Fonts, тогда как было бы идеально иметь возможность загружать в локальные веб-шрифты, шрифты TypeKit и т. Д.

Есть ли у кого-нибудь какие-либо предложения для лучшего способа загрузки вшрифты или как использовать Javascript для доступа к правилу @font-face в CSS?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Эта демонстрация взаимодействует с пользователем с помощью некоторых переключателей.Каждый переключатель соответствует семейству шрифтов от Google Fonts.Закомментированные части имеют дело с localStorage (нет смысла изменять стили, если вы потеряете их при выходе со страницы).Он не будет работать здесь на SO, но сохранит ваши изменения в менее строгой среде (нормальные обстоятельства).

Ссылки

HTMLFormControlsCollection

Делегирование события

Переменные CSS

Шаблонные литералы


Демо

//document.onDOMContentLoaded = init;

var form = document.forms.font;

form.addEventListener('change', fontInput);

function fontInput(e) {
  var fc = form.elements;
  var fam = ['Montserrat', 'Roboto', 'Open Sans', 'Raleway', 'Quicksand'];
  var idx = parseInt(fc.font.value, 10);
  var family = `${fam[idx]}`;
  var url = `https://fonts.googleapis.com/css?family=`;
  var fontUrl;
  if (e.target.name === 'font') {
    var famFont = family.replace(/\s/g, `+`);
    fontUrl = `${url}${famFont}`;
    document.getElementById('link').href = fontUrl;
    console.log(fontUrl);
    //localStorage.setItem('fontUrl', fontUrl);
  }
  cssVAR(family);
  e.stopPropagation();
}

function cssVAR(str) {
  var root = document.documentElement
  root.style.setProperty('--fam', str);
  return false;
}

/*
function init(e) {
  var saved = localStorage.getItem('fontUrl');
  if (!saved) {
    localStorage.setItem('fontUrl', 'https://fonts.googleapis.com/css?family=Open+Sans');
    document.getElementById('link').href = 'https://fonts.googleapis.com/css?family=Open+Sans';
  } else {
    document.getElementById('link').href = saved;
  }
}
*/
:root {
  --fam: "Raleway";
}

.as-console-wrapper {
  width: 40%;
  margin-left: 60%;
  max-height: 60px;
}

.as-console-row:after {
  display: none;
}

body {
  font-family: var(--fam);
}

#font {
  font-family: Consolas;
  font-size: 13px;
}
<link href='https://fonts.googleapis.com/css?family=Raleway' rel='stylesheet' id='link'>
<form id='font'>
  <fieldset>
    <legend>Font-Family</legend>
    <label>Montserrat</label>
    <input type='radio' value='0' name='font'>
    <label>Roboto</label>
    <input type='radio' value='1' name='font'>
    <label>Open Sans</label>
    <input type='radio' value='2' name='font'>
    <label>Raleway</label>
    <input type='radio' value='3' name='font' checked>
    <label>Quicksand</label>
    <input type='radio' value='4' name='font'>
  </fieldset>
</form>
<h1>Dynamic CSS</h1>
<p><q>The face of the moon was in shadow.</q></p>
<cite>Mr. Spaceship, by Philip K. Dick</cite>
0 голосов
/ 26 июня 2018

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

function setFontTo(fontName) {
  const styleId = 'font-style-sheet';

  // Get a reference to the current in-use stylesheet, if there is one.
  var fontStyleSheet = document.getElementById(styleId);

  // Then define a new stylesheet with an updated @font-face rule:
  var newFontStyleSheet = document.createElement("style");
  newFontStyleSheet.id = styleId;
  newFontStyleSheet.textContent = `
    @font-face {
      font-family: 'main-dynamic-font';
      src: url(assets/fonts/${fontName}.woff) format('woff');
    }
  `;

  // Then we swap: add the new rule first, then remove the old one.
  // That way you don't get a flash of unstyled text.
  document.head.appendChild(newFontStyleSheet);

  if (fontStyleSheet) {
    fontStyleSheet.parent.removeChild(fontStyleSheet);
  }
}

И затем убедитесь, что в вашем файле / пакете CSS определите класс, который использует этот шрифт, например что-то вроде:

.main-content {
  font-family: 'main-dynamic-font', serif;
}

И затем вВаша разметка вы используете этот класс для любого элемента, который требует стилизации текста с использованием выбранного шрифта:

<div class="main-content blah blah ...">
  ...
</div>

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

<select id="font-picker">
  <option value="roboto-regular">Roboto (regular)</option>
  ...
</select>

с обработчиком js для этого селектора.

fontSelector = document.getElementById("font-picker");
fontSelector.addEventListener("change", evt => {
  // read the selected value, and then call the font swap function here.
});
...