2014-11-11 3 views
0

Я только что попробовал решения, представленные в Why is an embedded google map altering Safari's font rendering?, и надеялся, что это исправит проблему, поскольку они оба являются браузерами на основе webkit.Почему встроенная карта google изменяет рендеринг шрифтов Chrome?

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

Я использую API Google Maps, чтобы вставить карту на странице на странице загрузки следующим образом:

$(document).ready(function() {   
    createMap("gmap", "<?php echo $this->business['location']; ?>"); 
}); 

function createMap(target, location) { 
    var url = "http://maps.google.com/maps/api/geocode/json?address=" + location + "&sensor=false"; 
    $.getJSON(url,function (data, textStatus, jqXHR) { 
     var r = data.results[0];    
     var jobLatLang = new google.maps.LatLng(r.geometry.location.lat, r.geometry.location.lng); 
     var mapOptions = { 
      zoom: 12, 
      center: jobLatLang 
     }; 

     var map, marker; 
     map = new google.maps.Map(document.getElementById(target),mapOptions); 
     marker = new google.maps.Marker({ 
      position: jobLatLang, 
      map: map, 
      title: r.formatted_address 
     }); 
     marker.setMap(map); 
     map.panTo(marker.getPosition()); 
    }); 
} 

и если заблокировать вызов createMap нет никакой проблемы с рендеринга текста (конечно это также означает отсутствие карты), и я понятия не имею, почему это приведет к тому, что текст будет отображаться в пределах position: fixed элементов, которые могут быть повторно отображены?

Любые идеи?

UPDATE: Теперь я был в состоянии получить <div> элемент, содержащий карту, чтобы предотвратить добавление каких-либо дальнейших сдвигов, добавив style="-webkit-transform:none !important;" однако проблема все еще сохраняется.

UPDATE 2: Я только что нашел ужасный обходной путь, который еще раз подтверждает этот вопрос, чем фиксирует это. с помощью следующей функции из Is it possible to remove inline styles with jQuery?

(function($) 
{ 
    $.fn.removeStyle = function(style) 
    { 
     var search = new RegExp(style + '[^;]+;?', 'g'); 

     return this.each(function() 
     { 
      $(this).attr('style', function(i, style) 
      { 
       return style.replace(search, ''); 
      }); 
     }); 
    }; 
}(jQuery)); 

и добавить этот ужасный кусок кода после вызова $.getJSON

setTimeout(function() { 
    $("#" + target).removeStyle("-webkit-transform"); 
    $("#" + target).find("*").each(function() { 
     $(this).removeStyle("-webkit-transform"); 
    }); 
}, 5000); 

Нечеткий текст исчезает после удаления всех встроенных -webkit-transform стилей.

UPDATE 3: я решил просто использовать эту работу вокруг, который является немного улучшенной версией обновления 2, пока что-то лучше не станет доступным. Я добавил слушатель idle события на карту Google, которая в соответствии с документацией https://developers.google.com/maps/documentation/javascript/reference#Map

Это событие вызывается, когда карта становится неактивной после того, как панорамирование или масштабирования.

который в моем случае является тем, что требуется. Обратите внимание, что я попытался подключить прослушиватель событий к tilesloaded, и вы бы подумали, что это сработает, однако это не так.

Так положить все это вместе я следующее:

(function($) 
{ 
    $.fn.removeStyle = function(style) 
    { 
     var search = new RegExp(style + '[^;]+;?', 'g'); 

     return this.each(function() 
     { 
      $(this).attr('style', function(i, style) 
      { 
       return style.replace(search, ''); 
      }); 
     }); 
    }; 
}(jQuery)); 

var mapTargetElement, mapIdleListener; 
function createMap(target, location) { 
    mapTargetElement = target; 
    var url = "http://maps.google.com/maps/api/geocode/json?address=" + location + "&sensor=false"; 
    $.getJSON(url,function (data, textStatus, jqXHR) { 
     var r = data.results[0];    
     var jobLatLang = new google.maps.LatLng(r.geometry.location.lat, r.geometry.location.lng); 
     var mapOptions = { 
      zoom: 12, 
      center: jobLatLang 
     }; 

     var map, marker; 
     map = new google.maps.Map(document.getElementById(target),mapOptions); 
     mapIdleListener = google.maps.event.addListener(map,'idle',removeWebkitTransforms); 
     marker = new google.maps.Marker({ 
      position: jobLatLang, 
      map: map, 
      title: r.formatted_address 
     }); 
     marker.setMap(map); 
     map.panTo(marker.getPosition());   
    }); 
} 

function removeWebkitTransforms() { 
    google.maps.event.removeListener(mapIdleListener); 
    $("#" + mapTargetElement).removeStyle("-webkit-transform").find("*").each(function() { 
     $(this).removeStyle("-webkit-transform"); 
    }); 
} 
+0

Соответствует ли [this] (https://code.google.com/p/chromium/issues/detail?id=20574) вашей проблеме? В этом случае, похоже, что он не был разрешен в течение нескольких лет. – elzi

+0

@elzi Конечно, это определенно кажется кандидатом, поскольку отображаемая карта Google имеет '-webkit-transform: translateZ (0px);' которая, по-видимому, вынуждает доступ к GPU для отображения страницы. Единственное отличие заключается в том, что рендеринг в этом случае выполняется после загрузки DOM. Я могу попытаться отложить загрузку карты на несколько секунд и посмотреть, что произойдет. – samazi

+0

FYI, задержка отображения карты в течение 5 секунд вызывает ту же проблему. – samazi

ответ

0

Код:

.google-map.google-map-wide 
{ 
    -webkit-transform: none !important;" 
} 

в код CSS.

И он сразу разобрал проблему рендеринга шрифтов.

+0

Это не сработало для меня. Также у вас есть знак после объявления 'CSS'. – samazi

Смежные вопросы