Teraz na GitHub: https://github.com/patrickmarabeas/jQuery-FontSpy.js
Zasadniczo metoda działa poprzez porównanie szerokości ciągu w dwóch różnych czcionkach. Używamy Comic Sans jako czcionki do testowania, ponieważ jest to najbardziej różna z bezpiecznych czcionek internetowych i miejmy nadzieję, że różni się wystarczająco od każdej niestandardowej czcionki, której będziesz używać. Dodatkowo używamy bardzo dużego rozmiaru czcionki, więc nawet małe różnice będą widoczne. Po obliczeniu szerokości ciągu Comic Sans rodzina czcionek zostaje zmieniona na czcionkę niestandardową, z możliwością powrotu do Comic Sans. Po zaznaczeniu, jeśli szerokość elementu string jest taka sama, czcionka zastępcza Comic Sans jest nadal używana. Jeśli nie, twoja czcionka powinna działać.
Przepisałem metodę wykrywania ładowania czcionek do wtyczki jQuery zaprojektowanej tak, aby dać programiście możliwość stylizacji elementów w oparciu o to, czy czcionka została załadowana, czy nie. Dodano licznik czasu awaryjnego, aby użytkownik nie pozostał bez zawartości, jeśli czcionka niestandardowa nie zostanie załadowana. To po prostu zła użyteczność.
Dodałem również większą kontrolę nad tym, co dzieje się podczas ładowania czcionek i przy niepowodzeniach, włączając dodawanie i usuwanie klas. Możesz teraz zrobić, co chcesz, z czcionką. Zalecałbym tylko modyfikację rozmiaru czcionek, odstępów między wierszami itp., Aby Twoja czcionka rezerwowa była jak najbardziej zbliżona do niestandardowej, aby Twój układ pozostał nienaruszony, a użytkownicy uzyskają oczekiwane wrażenia.
Oto demo: http://patrickmarabeas.github.io/jQuery-FontSpy.js
Wrzuć poniższy plik do pliku .js i odwołaj się do niego.
(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);
Zastosuj to do swojego projektu
.bannerTextChecked {
font-family: "Lobster";
}
$(document).ready(function() {
$('.bannerTextChecked').fontSpy({
onLoad: 'hideMe',
onFail: 'fontFail anotherClass'
});
});
Usuń to FOUC!
.hideMe {
visibility: hidden !important;
}
.fontFail {
visibility: visible !important;
}
EDYCJA: Usunięto kompatybilność FontAwesome, ponieważ nie działała ona poprawnie i występowały problemy z różnymi wersjami. Hacky fix można znaleźć tutaj: https://github.com/patrickmarabeas/jQuery-FontFaceSpy.js/issues/1