Jetzt auf GitHub: https://github.com/patrickmarabeas/jQuery-FontSpy.js
Im Wesentlichen vergleicht die Methode die Breite einer Zeichenfolge in zwei verschiedenen Schriftarten. Wir verwenden Comic Sans als Schriftart zum Testen, da es sich um die unterschiedlichste web-sichere Schriftart handelt und sich hoffentlich von jeder benutzerdefinierten Schriftart unterscheidet, die Sie verwenden werden. Zusätzlich verwenden wir eine sehr große Schriftgröße, sodass auch kleine Unterschiede erkennbar sind. Wenn die Breite der Comic Sans-Zeichenfolge berechnet wurde, wird die Schriftfamilie in Ihre benutzerdefinierte Schriftart geändert, wobei auf Comic Sans zurückgegriffen wird. Wenn diese Option aktiviert ist und die Breite des Zeichenfolgenelements gleich ist, wird die Fallback-Schriftart von Comic Sans weiterhin verwendet. Wenn nicht, sollte Ihre Schriftart betriebsbereit sein.
Ich habe die Methode zur Erkennung des Ladens von Schriftarten in ein jQuery-Plugin umgeschrieben, das dem Entwickler die Möglichkeit gibt, Elemente basierend darauf zu formatieren, ob die Schrift geladen wurde oder nicht. Ein ausfallsicherer Timer wurde hinzugefügt, damit der Benutzer nicht ohne Inhalt bleibt, wenn die benutzerdefinierte Schriftart nicht geladen werden kann. Das ist nur schlechte Benutzerfreundlichkeit.
Ich habe auch eine bessere Kontrolle darüber hinzugefügt, was beim Laden von Schriftarten und beim Fehlschlagen passiert, indem Klassen hinzugefügt und entfernt werden. Sie können jetzt mit der Schriftart tun, was Sie möchten. Ich würde nur empfehlen, die Schriftgröße, den Zeilenabstand usw. zu ändern, um Ihre Fallback-Schrift so nah wie möglich an die benutzerdefinierte Schrift zu bringen, damit Ihr Layout intakt bleibt und die Benutzer eine erwartete Erfahrung erhalten.
Hier ist eine Demo: http://patrickmarabeas.github.io/jQuery-FontSpy.js
Wirf das Folgende in eine .js-Datei und verweise darauf.
(function($) {
$.fontSpy = function( element, conf ) {
var $element = $(element);
var defaults = {
font: $element.css("font-family"),
onLoad: '',
onFail: '',
testFont: 'Comic Sans MS',
testString: 'QW@HhsXJ',
delay: 50,
timeOut: 2500
};
var config = $.extend( defaults, conf );
var tester = document.createElement('span');
tester.style.position = 'absolute';
tester.style.top = '-9999px';
tester.style.left = '-9999px';
tester.style.visibility = 'hidden';
tester.style.fontFamily = config.testFont;
tester.style.fontSize = '250px';
tester.innerHTML = config.testString;
document.body.appendChild(tester);
var fallbackFontWidth = tester.offsetWidth;
tester.style.fontFamily = config.font + ',' + config.testFont;
function checkFont() {
var loadedFontWidth = tester.offsetWidth;
if (fallbackFontWidth === loadedFontWidth){
if(config.timeOut < 0) {
$element.removeClass(config.onLoad);
$element.addClass(config.onFail);
console.log('failure');
}
else {
$element.addClass(config.onLoad);
setTimeout(checkFont, config.delay);
config.timeOut = config.timeOut - config.delay;
}
}
else {
$element.removeClass(config.onLoad);
}
}
checkFont();
};
$.fn.fontSpy = function(config) {
return this.each(function() {
if (undefined == $(this).data('fontSpy')) {
var plugin = new $.fontSpy(this, config);
$(this).data('fontSpy', plugin);
}
});
};
})(jQuery);
Wenden Sie es auf Ihr Projekt an
.bannerTextChecked {
font-family: "Lobster";
}
$(document).ready(function() {
$('.bannerTextChecked').fontSpy({
onLoad: 'hideMe',
onFail: 'fontFail anotherClass'
});
});
Entfernen Sie diese FOUC!
.hideMe {
visibility: hidden !important;
}
.fontFail {
visibility: visible !important;
}
BEARBEITEN: Die FontAwesome-Kompatibilität wurde entfernt, da sie nicht richtig funktionierte und Probleme mit verschiedenen Versionen auftraten. Eine hackige Lösung finden Sie hier: https://github.com/patrickmarabeas/jQuery-FontFaceSpy.js/issues/1