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, которое вам понадобится (без обработчика), намного меньше.