Detecting 'transform: translate3d' support

前端 未结 12 1683
遥遥无期
遥遥无期 2020-11-29 19:03

Does anyone know how I would detect transform: translate3d(x,y,z) support is available?

My issue is that I want to use translate3d across b

12条回答
  •  难免孤独
    2020-11-29 19:40

    This code is adjusted for testing 3D transforms support and other CSS3 features.

    The plus of this code is that it detects the vendor prefix supported (if any). Call it:

    testCSSSupport('transform')
    

    Possible return values:

    false, when feature unsupported, or

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

    when feature supported

    /**
     * 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;
    }
    

提交回复
热议问题