Обнаружение поддержки 'transform: translate3d' - PullRequest
36 голосов
/ 14 апреля 2011

Кто-нибудь знает, как я могу обнаружить transform: translate3d(x,y,z) доступна поддержка?

Моя проблема заключается в том, что я хочу использовать translate3d во всех браузерах, где он поддерживается, поскольку он имеет тенденцию использовать аппаратное ускорение и, следовательно, плавнее для анимации, а затем вернуться к translate, где его нет.

Ответы [ 12 ]

42 голосов
/ 27 сентября 2012

Проверьте это решение .

Это основано на том факте, что если браузер поддерживает преобразования, значение

window.getComputedStyle(el).getPropertyValue('transform')

будет строкой, содержащей матрицу преобразования, когда к элементу el применяется трехмерное преобразование. В противном случае это будет undefined или строка 'none', как в случае с Opera 12.02.

Работает во всех основных браузерах.

код:

function has3d() {
    if (!window.getComputedStyle) {
        return false;
    }

    var el = document.createElement('p'), 
        has3d,
        transforms = {
            'webkitTransform':'-webkit-transform',
            'OTransform':'-o-transform',
            'msTransform':'-ms-transform',
            'MozTransform':'-moz-transform',
            'transform':'transform'
        };

    // Add it to the body to get the computed style.
    document.body.insertBefore(el, null);

    for (var t in transforms) {
        if (el.style[t] !== undefined) {
            el.style[t] = "translate3d(1px,1px,1px)";
            has3d = window.getComputedStyle(el).getPropertyValue(transforms[t]);
        }
    }

    document.body.removeChild(el);

    return (has3d !== undefined && has3d.length > 0 && has3d !== "none");
}
10 голосов
/ 18 сентября 2011

Оригинальное сообщение в блоге , объявляющее о 3D-преобразованиях , содержит демонстрацию переворачивания изображения , которая делает это с помощью медиазапроса, например:

@media all and (-webkit-transform-3d) {
  /* Use the media query to determine if 3D transforms are supported */
  #flip-container {
    -webkit-perspective: 1000;
  }
  #flip-card {
    width: 100%;
    height: 100%;
    -webkit-transform-style: preserve-3d;
    -webkit-transition: -webkit-transform 1s;
  }
  #flip-container:hover #flip-card {
    -webkit-transform: rotateY(180deg);
  }
}

Это сообщение в блоге имеет хорошее введение в медиа-запросы. В этом есть еще несколько деталей.

9 голосов
/ 27 мая 2013

Вы можете попробовать CCS3 @ поддерживает :

@supports (transform: translate3d) {
  div {
    transform : translate3d(20px,0,0);
  }
}

@supports not (transform: translate3d) {
  div {
    transform: translate(20px,0);
  }
}

Могу ли я использовать @ support

4 голосов
/ 20 июля 2011
//The following is based on iScroll4's tests to determine if a browser supports CSS3 3D     transforms.
var has3d = function() {
    return ('WebKitCSSMatrix' in window && 'm11' in new WebKitCSSMatrix());
}
4 голосов
/ 14 апреля 2011

Я бы посоветовал использовать Modernizr .

. Он обнаруживает функции для целого ряда функций браузера, включая 3D-преобразования.Он также предоставляет метод задания правил CSS для браузеров, которые имеют различные функции или нет, поэтому похоже, что он будет делать именно то, что вы ищете.

Надеюсь, что это поможет.

1 голос
/ 03 января 2015

Возился со способом проверки поддержки 3d ... использовал эту реализацию из Джеффри Уэй в этой статье .Позволяет меньше кода и больше вариантов использования;)

/**
* Test For CSS3 property support
* use 'perspective' to test for 3d support
*/
var supports = (function() {

    'use strict';

    var div = document.createElement('div'),
        vendors = 'Khtml ms O Moz Webkit'.split(' '),
        len = vendors.length;

    return function(prop) {

        if (prop in div.style) return true;

        prop = prop.replace(/^[a-z]/, function(val) {
            return val.toUpperCase();
        });

        while(len--) {
            if (vendors[len] + prop in div.style) {
                return true;
            } 
        }

        return false;
    };
})();

if(supports('perspective')) {
    // do 3d stuff
}
0 голосов
/ 11 декабря 2015

Bootstrap использует следующий код:

@media all and (transform-3d), (-webkit-transform-3d) {
    .carousel-inner > .carousel-item {
        transition: transform 0.6s ease-in-out;
        backface-visibility: hidden;
        perspective: 1000px;
    }
    .carousel-inner > .carousel-item.next,
    .carousel-inner > .carousel-item.active.right {
        left: 0;
        transform: translate3d(100%, 0, 0);
    }
    .carousel-inner > .carousel-item.prev,
    .carousel-inner > .carousel-item.active.left {
        left: 0;
        transform: translate3d(-100%, 0, 0);
    }
    .carousel-inner > .carousel-item.next.left,
    .carousel-inner > .carousel-item.prev.right,
    .carousel-inner > .carousel-item.active {
        left: 0;
        transform: translate3d(0, 0, 0);
    }
}
0 голосов
/ 07 ноября 2014

Этот код настроен для тестирования Поддержка 3D-преобразований и других функций CSS3.

Плюсом этого кода является то, что он обнаруживает поддерживаемый префикс поставщика (если есть).Назовите его:

testCSSSupport('transform')

Возможные возвращаемые значения:

false, если функция не поддерживается, или

{
    vendor: 'moz',
    cssStyle: '-moz-transform',
    jsStyle: 'MozTransform'
}

, когда функция поддерживается

/**
 * Test for CSS3 feature support. Single-word properties only by now.
 * This function is not generic, but it works well for transition and transform at least
 */
testCSSSupport: function (feature, cssTestValue/* optional */) {
    var testDiv,
        featureCapital = feature.charAt(0).toUpperCase() + feature.substr(1),
        vendors = ['', 'webkit', 'moz', 'ms'],
        jsPrefixes = ['', 'Webkit', 'Moz', 'ms'],
        defaultTestValues = {
            transform: 'translateZ(0.5em) rotateY(10deg) scale(2)'
           // This will test for 3D transform support
           // Use translateX to test 2D transform
        },
        testFunctions = {
            transform: function (jsProperty, computed) {
                return computed[jsProperty].substr(0, 9) === 'matrix3d(';
            }
        };

    function isStyleSupported(feature, jsPrefixedProperty) {
        if (jsPrefixedProperty in testDiv.style) {
            var testVal = cssTestValue || defaultTestValues[feature],
                testFn = testFunctions[feature];
            if (!testVal) {
                return false;
            }

            //Assume browser without getComputedStyle is either IE8 or something even more poor
            if (!window.getComputedStyle) {
                return false;
            }

            testDiv.style[jsPrefixedProperty] = testVal;
            var computed = window.getComputedStyle(testDiv);

            if (testFn) {
                return testFn(jsPrefixedProperty, computed);
            }
            else {
                return computed[jsPrefixedProperty] === testVal;
            }
        }
    }

    //Create a div for tests and remove it afterwards
    if (!testDiv) {
        testDiv = document.createElement('div');
        document.body.appendChild(testDiv);
        setTimeout(function () {
            document.body.removeChild(testDiv);
            testDiv = null;
        }, 0);
    }

    var cssPrefixedProperty,
        jsPrefixedProperty;

    for (var i = 0; i < vendors.length; i++) {
        if (i === 0) {
            cssPrefixedProperty = feature;  //todo: this code now works for single-word features only!
            jsPrefixedProperty = feature;   //therefore box-sizing -> boxSizing won't work here
        }
        else {
            cssPrefixedProperty = '-' + vendors[i] + '-' + feature;
            jsPrefixedProperty = jsPrefixes[i] + featureCapital;
        }

        if (isStyleSupported(feature, jsPrefixedProperty)) {
            return {
                vendor: vendors[i],
                cssStyle: cssPrefixedProperty,
                jsStyle: jsPrefixedProperty
            };
        }
    }

    return false;
}
0 голосов
/ 30 марта 2013

просто используйте:

alert($.support.cssTransform3d);

это оповещение истинно, если поддерживается, и ложно, если нет

0 голосов
/ 21 октября 2012

tl: dr - использовать пользовательский агент сниффинг. Вот скрипт для определения поддержки 3D-преобразования CSS в разных браузерах: https://github.com/zamiang/detect-css3-3D-transform

Я попробовал большинство методов в этом посте, в том числе такие, как Modernizer и Meny , но не мог поддерживать такие браузеры, как Firefox, сохраняя при этом хороший опыт для старых браузеров, таких как Safari 4 и 5, устройства iOS и Chrome для профессионалов Retina MacBook (все они имеют свои причуды).

CSS3 3D-преобразования включают взаимодействие между браузером и графической картой. Браузер может анализировать 3D-декларации, но не может правильно проинструктировать видеокарту о том, как визуализировать вашу страницу. Есть много возможных результатов, начиная от рендеринга страницы со строками (Safari 4) до красивого рендеринга страницы и затем сбой браузера через несколько секунд (Safari на iOS4). Любой подход «обнаружения признаков» недопустимо помечает их, поскольку «поддерживает CSS3 3D-преобразования». Это один из случаев, когда «обнаружение функций» завершается неудачей, и анализ пользовательского агента (и много тестов) приводит к победе.

Большинство функций обнаружения предполагает, что двоичный файл «поддерживает» или «не поддерживает». Это не относится к CSS3 3D-преобразованиям - существует «градиент поддержки».

Поддержка 3D-преобразования CSS3 может быть разделена на 4 уровня:

  1. Надежно поддерживает 3D-преобразования на большинстве машин. Например: Safari 6
  2. Может анализировать и применять объявления 3D-преобразования, но игнорирует 3D-детали. Например: Chrome на Retina MacBook Pro.
  3. Может анализировать и применять объявления 3D-преобразования, но отображает недопустимыми способами. Например: Safari 4 и Safari 4/5 в Windows показывают линии на странице.
  4. Невозможно применить объявления 3D-преобразования. Например: IE или Firefox

Этот скрипт вернет true в первом и втором сценарии, но false для 3 и 4:

Примечание: новичок в участии в stackoverflow - пожалуйста, дайте мне знать, если я вставлю этот код в строку (он немного длинный)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...