跨浏览器CSS缩放的完整样式

23

我发现很难完全跨浏览器地获取CSS缩放属性..目前我只有这些

zoom: 2;
-moz-transform: scale(2);
5个回答

44

这些样式足以实现跨浏览器...

演示

注意:正如@martin所指出的那样,这可能不能按预期工作,但这并不意味着它失败了。Chrome会将其放大2倍,因为它也尊重zoom属性。所以它会使其变大2倍...

zoom: 2; /* IE */
-moz-transform: scale(2); /* Firefox */
-moz-transform-origin: 0 0;
-o-transform: scale(2); /* Opera */
-o-transform-origin: 0 0;
-webkit-transform: scale(2); /* Safari And Chrome */
-webkit-transform-origin: 0 0;
transform: scale(2); /* Standard Property */
transform-origin: 0 0;  /* Standard Property */

HTML

<div class="zoom">BlahBlah</div>

CSS

.zoom {
    zoom: 2;
    -moz-transform: scale(2);
    -moz-transform-origin: 0 0;
    -o-transform: scale(2);
    -o-transform-origin: 0 0;
    -webkit-transform: scale(2);
    -webkit-transform-origin: 0 0;
    transform: scale(2); /* Standard Property */
    transform-origin: 0 0;  /* Standard Property */
}

21
很遗憾这个方法不会像预期的那样工作。现代版的Chrome会同时应用缩放和比例,使得最终结果变为原来的4倍大小。[http://jsfiddle.net/X4XYf/148/] - martin
@martin 任何 WebKit 端口都可以做到这一点。zoom 是自 Safari 4 版本引入的(https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariCSSRef/Articles/StandardCSSProperties.html)。 - hexalys
1
如果你可以放弃IE7及以下版本,那么你也许可以放弃缩放并使用-ms-zoom供应商前缀(如果我没记错的话,它在IE8+中得到了支持)。随着Webkit的普及,我认为最好不要为市场份额约为0.1%的某些随机浏览器提供缩放功能,而是完全支持Webkit。 - martin
1
you can also add -ms- - Jacek Pietal
1
应该读一下评论。是的,使用缩放和变换,Chrome会将其加倍。 - mummybot

4
这里有一个仅使用CSS的解决方案。
.csszoom{
        -ms-transform: scale(1.5); /* IE 9 */
        -ms-transform-origin: 0 0;
        -moz-transform: scale(1.5); /* Firefox */
        -moz-transform-origin: 0 0;
        -o-transform: scale(1.5); /* Opera */
        -o-transform-origin: 0 0;
        -webkit-transform: scale(1.5); /* Safari And Chrome */
        -webkit-transform-origin: 0 0;
        transform: scale(1.5); /* Standard Property */
        transform-origin: 0 0;  /* Standard Property */
}
.ie8 .csszoom{
        zoom:1.5;
}

将HTML标签更改为

<!--[if lte IE 8]> <html class="ie8"> <![endif]--> 
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->

1
如果脚本编写可行,则可以通过使用面向未来的功能检测来避免多个支持的缩放属性的冲突和浏览器嗅探。
注意:这里出于方便使用了jQuery,但它也可以不用jQuery编写。

CSS:

.zoom {
    -moz-transform-origin: 0 0;
    -o-transform-origin: 0 0;
    -webkit-transform-origin: 0 0;
}

HTML:

<div class="mySelectorClass">Foobar</div>

脚本(一次性初始化)

var strPropZoom = "zoom";
var blnPropZoomUseScale = false;

$(function() {
    var jqBody = $("body");

    // Determine the supported 'zoom' method
    switch (true) {
        case Boolean(jqBody.css("zoom"))              : break;
        case Boolean(jqBody.css("-moz-transform"))    : strPropNameZoom = "-moz-transform";    blnPropZoomUseScale = true; break;
        case Boolean(jqBody.css("-o-transform"))      : strPropNameZoom = "-o-transform";      blnPropZoomUseScale = true; break;
        case Boolean(jqBody.css("-webkit-transform")) : strPropNameZoom = "-webkit-transform"; blnPropZoomUseScale = true; break;
    }
})

然后,当需要缩放时,只需调用:


var intZoom = 2.5; // NB: This could be calculated depending on window dimensions
$(".mySelectorClass")
    .css(
        strPropZoom
        ,(blnPropZoomUseScale ? "scale(" + intZoom + ")" : intZoom)
    )
    .addClass("zoom");

0
作为对@martin的评论的回应(他是正确的),我使用JavaScript(包括一些jQuery)和@Mr. Alien的一些CSS创建了一个复杂的解决方法。毫无疑问,还有其他方法可以实现这一点 - 也许更简单,但以下js和css组合适用于我:

css

.zoom{
   -moz-transform: scale(2); /* Firefox */
   -moz-transform-origin: 0 0;
   -o-transform: scale(2); /* Opera */
   -o-transform-origin: 0 0;
   zoom:2 /*IE*/;
 }
//Notice the absence of any Webkit Transforms

Javascript

(function($){
    var version=false,
    isSafari=Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0,
    isOpera=!!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0,
    isChrome=!!window.chrome && !isOpera;
    if(isChrome){
        version=(window.navigator.appVersion.match(/Chrome\/(\d+)\./)!==null) ?
        parseInt(window.navigator.appVersion.match(/Chrome\/(\d+)\./)[1], 10) :
        0;
        version=(version >= 10) ? true : false;
        // Don't know what version they switched it.  Figured that this was a good guess
    }
    // I added the extra ternary check in there because when testing in Chrome,
    // if I switched the user agent in the overrides section, it kept failing with 
    // null value for version.

    if(isSafari || version){
    $('.zoom').css('-webkit-transform','scale(2)');
    $('.zoom').css('-webkit-transform-origin','0 0');
        // If Scaling based upon different resolutions, a check could be included here
        // for window size, and the css could be adjusted accordingly.
    }
}(jQuery))

浏览器检测代码来自这里,Chrome版本检测片段来自这篇文章


我会倾向于使用纯CSS3变换缩放和针对IE的特殊样式表(通过条件注释实现)。 - Pierre
是的...那样会更容易。不太聪明,但肯定更好。 :) - dgo

-3

今天的答案似乎是

.zoom {
     zoom: 2; /* Chrome */
     transform: scale(2); /* FF, neglected by Chrome */
     transform-origin: 0;
}

那是一个板上钉钉的事情。;-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接