CSS zoom не работает для in, в iOS 8 Mobile Safari
используя zoom: 0.5;
, изображение отображается в размере 0,5 x, когда не внутри <a>
тег, но в размере 1x, когда внутри <a>
тег.
это произошло с iOS 8 GM (iPhone 5 симулятор Xcode 6 GM и iPad mini).
этого не произошло с iOS 7.1.2 (iPhone 5) и iOS 7.0 (iPhone 5 симулятор Xcode 6 GM).
вот пример:https://dl.dropboxusercontent.com/u/379843/ios8csszoom/test.html
<!DOCTYPE html>
<html>
<body>
<img src="star-on@2x.png" style="border: 1px solid blue; zoom: 0.5;"/>
<a href="#">
<img src="star-on@2x.png" style="border: 1px solid blue; zoom: 0.5;"/>
</a>
<hr>
<img src="star-on@2x.png" style="border: 1px solid blue; -webkit-transform: scale(0.5);"/>
<a href="#">
<img src="star-on@2x.png" style="border: 1px solid blue; -webkit-transform: scale(0.5);"/>
</a>
</body>
</html>
-webkit-transform
is работает на iOS 8, но я не хочу использовать это, потому что, хотя изображение отображается в размере 0.5 x, пространство, потребляемое <img>
бирка размер 1x.
какие-нибудь обходные пути?
5 ответов
хотя и не идеально, вот как я справился с проблемой:
- замените анкеры другим элементом (div или span в зависимости от Блока/inline)
- дайте каждому элементу общее имя класса
- либо оставьте href, либо добавьте свойство data-href с помощью href
- на высоком уровне, есть прослушиватель событий привязки ко всем элементам с именем класса
- прослушиватель событий считывает href, а затем запускает логику маршрутизации / контроллера подходит для вашей структуры
пример:http://jsfiddle.net/z5crh05a/
$(".fauxLink").on("click", function(e) {
var href = $(e.currentTarget).attr("href");
e.preventDefault();
e.stopPropagation();
// navigation logic here
alert("Navigate to: "+href);
});
});
надеюсь, проблема в Safari исправлена в будущем обновлении iOS.
по умолчанию-webkit-transform на Safari и MobileSafari имеет исходный "центр центра", что означает, что родительский контейнер будет такого же размера, как если бы он не был масштабирован.
настройки этого параметра на "верхнем левом" через:
-webkit-transform-origin 0 0;
тогда все решение будет (с поддержкой IE9+, FF, Chrome и Safari/MobileSafari):
transform: scale(0.5);
-ms-transform: scale(0.5);
-mos-transform: scale(0.5);
-webkit-transform: scale(0.5);
transform-origin: 0 0;
-ms-transform-origin: 0 0;
-mos-transform-origin: 0 0;
-webkit-transform-origin: 0 0;
я преобразую эти изображения в масштабе.
-webkit-transform: scale(0.5);
-moz-transform: scale(0.5);
-o-transform: scale(0.5);
transform: scale(0.5);
это также работает для ios, но вы должны переместить свои фотографии после этого!
Я понял обходной путь, но может использоваться только с платформой webapp. Я использовал CakePHP и использовал вспомогательный метод для вывода всех тегов img, поэтому я переопределил этот метод, чтобы он выводил атрибуты width и height, и прекратил использовать CSS zoom.
Я использовал getimagesize GD, чтобы получить ширину и высоту. http://php.net/manual/ja/function.getimagesize.php
вместо того, чтобы изменять разметку, вы можете просто изменить размер изображений, используя немного javascript.
вот рабочий фрагмент (используя jQuery) того, что я сейчас использую в своем блоге WordPress:
var dmblog = {
// [TRUNCATED]
// ! dmblog.imgZoomResize
imgZoomResize : function(element) {
var zoom = element.css('zoom');
element.width(element[0].naturalWidth*zoom);
element.height(element[0].naturalHeight*zoom);
},
// ! dmblog.retinaImagesResize
retinaImagesResize : function() {
$('.post .entry-content img, .comment .comment-content img').each(function(){
dmblog.imgZoomResize($(this));
// set a handler on the resize event to resize the retina images
var $w = $(window),
namespace = $(this)[0].id.replace('#','.'),
element = $(this),
handler = function() {
dmblog.imgZoomResize(element);
};
$w.bind('resize'+namespace, handler);
});
}
};
// [TRUNCATED]
// ! for single posts, load some scripts
if ($('body').hasClass('single'))
{
// [TRUNCATED]
// resize retina images
dmblog.retinaImagesResize();
}
используя этот обходной путь, нет необходимости изменять css, теги привязки, или любой из вашей разметки, просто добавьте немного javascript, чтобы изменить размер изображений.
Я использую медиа-запросы CSS, чтобы установить масштаб CSS в 1 на больших экранах и 0.5 на небольших экранах. Даже если значение масштаба больше не работает, он по-прежнему сообщает, как 0.5 в jQuery. Поскольку это адаптивный дизайн, я добавил обработчик события изменения размера окна, чтобы автоматически изменять размер изображения вверх / вниз при изменении значения масштабирования (отвечая на запросы css media).
Если вы не используете медиа-запросы для ответственного изменения значения масштабирования CSS, то количество javascript, которое вам понадобится (без обработчика), намного меньше.