Detect with JavaScript or jQuery if CSS transform 2D is available

前端 未结 5 1156
攒了一身酷
攒了一身酷 2021-02-04 09:01

I\'m displaying a element on my site which I rotate with -90deg but if a browser doesn\'t support the CSS transform the element looks misspositioned and not really good. Now I w

相关标签:
5条回答
  • 2021-02-04 09:17

    This code tests for 2D transforms support.

    It can be easily adjusted to detect 3D transforms support instead. Just add 'translateZ(1)' to test CSS (see defaultTestValues in source code).

    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: 'translateX(.5em)'
               // This will test for 2D transform support
               // Add translateZ(1) to test 3D 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;
                }
            }
        }
    
        var cssPrefixedProperty,
            jsPrefixedProperty,
            testDiv = document.createElement('div');
    
        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 讨论(0)
  • 2021-02-04 09:20

    This is about as simple as you get and a jsfiddle. It no longer goes on an infinite loop.

    function getSupportedTransform() {
        var prefixes = 'transform WebkitTransform MozTransform OTransform msTransform'.split(' ');
        for(var i = 0; i < prefixes.length; i++) {
            if(document.createElement('div').style[prefixes[i]] !== undefined) {
                return prefixes[i];
            }
        }
        return false;
    }
    
    0 讨论(0)
  • 2021-02-04 09:20

    Just pull what you need out of Modernizr

    First we need the testProps function

       /**
         * testProps is a generic CSS / DOM property test; if a browser supports
         *   a certain property, it won't return undefined for it.
         *   A supported CSS property returns empty string when its not yet set.
         */
        function testProps( props, prefixed ) {
            for ( var i in props ) {
                if ( mStyle[ props[i] ] !== undefined ) {
                    return prefixed == 'pfx' ? props[i] : true;
                }
            }
            return false;
        }
    

    Then run the cssTransform test

    var tests = [];
     tests['csstransforms'] = function() {
            return !!testProps(['transformProperty', 'WebkitTransform', 'MozTransform', 'OTransform', 'msTransform']);
        };
    

    if tests['csstransforms'] is true, then you have the feature available.

    0 讨论(0)
  • 2021-02-04 09:28

    Here's a function based on Liam's answer. It will return either the name of the first supported prefix or false if none of the prefixes are supported.

    function getSupportedTransform() {
        var prefixes = 'transform WebkitTransform MozTransform OTransform msTransform'.split(' ');
        var div = document.createElement('div');
        for(var i = 0; i < prefixes.length; i++) {
            if(div && div.style[prefixes[i]] !== undefined) {
                return prefixes[i];
            }
        }
        return false;
    }
    
    0 讨论(0)
  • 2021-02-04 09:36

    Here's the code I'm using to detect if CSS3 transitions are supported:

    var div = document.createElement('div');
    div.setAttribute('style', 'transition:top 1s ease;-webkit-transition:top 1s ease;-moz-transition:top 1s ease;-o-transition:top 1s ease;');
    document.body.appendChild(div);
    var cssTransitionsSupported = !!(div.style.transition || div.style.webkitTransition || div.style.MozTransition || div.style.OTransitionDuration);
    
    div.parentNode.removeChild(div);
    div = null;
    

    I'm purposefully not looking for Microsoft support since Microsoft hasn't yet shipped a browser that supports CSS3 transitions and I don't want my code automatically supporting an implementation I haven't tested yet in the future.

    0 讨论(0)
提交回复
热议问题