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

Posted

技术标签:

【中文标题】跨浏览器 CSS 缩放的完整样式【英文标题】:complete styles for cross browser CSS zoom 【发布时间】:2012-11-03 19:41:47 【问题描述】:

我发现很难获得完全跨浏览器的 CSS 缩放属性..我只有这些

zoom: 2;
-moz-transform: scale(2);

【问题讨论】:

【参考方案1】:

这些对于跨浏览器来说已经足够了......

Demo

注意:正如@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 */

【讨论】:

不幸的是,这不会按预期工作。现代 Chrome 将同时应用缩放和比例,使其 4 倍大。 http://jsfiddle.net/X4XYf/148/ @martin 任何 webkit 端口实际上都会这样做。自 Safari 4 以来,zoom 是 introduced。 是的,如果您可以放弃 IE7 及以下版本,则可以放弃缩放并使用 -ms-zoom 供应商前缀(如果有记忆,IE8+ 支持)。随着 Webkit 的普及,我会说最好不要为一些市场份额约为 0.1% 的随机浏览器提供缩放并完全支持 Webkit。 你也可以加-ms- 应该读过cmets。是的,Chrome 会使用缩放和变换将其翻倍。【参考方案2】:

这是一个纯 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]-->

【讨论】:

【参考方案3】:

如果脚本是可行的,那么您可以通过使用面向未来的功能检测来避免多个受支持的缩放属性的冲突和浏览器嗅探。注意:我在这里使用 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");

【讨论】:

【参考方案4】:

针对@martin 的上述评论(他是正确的),我使用javascript(包括一些jQuery)和@Mr.外星人的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))

浏览器检测代码来自here,Chrome版本检测sn-p来自this post。

【讨论】:

我倾向于使用纯 css3 转换比例,以及针对 IE 的特殊样式表(带有条件 cmets)。 是的...那会更容易。没有那么聪明,但肯定更好。 :)【参考方案5】:

看来今天的答案是

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

这是一个关键。 ;-)

【讨论】:

以上是关于跨浏览器 CSS 缩放的完整样式的主要内容,如果未能解决你的问题,请参考以下文章

CSS 跨浏览器hr样式

CSS CSS格式链接,按钮和提交是相同的样式(跨浏览器)

跨浏览器自定义光标样式

如何样式选择跨浏览器[重复]

为跨浏览器功能设置选择菜单样式的正确方法[重复]

JS跨浏览器兼容性解决思路及方案汇总