css - 为什么 transform : scale(xx. y) 从 Browser 变为 Browser

标签 css css-transforms

[已解决 - 解决方案如下所述]

#mycontainer {
   margin: 0 auto;
   width: 30em;
}

这个标记居中。

所以,以后,

$('#mycontainer').css("-webkit-transform", "scale(0.8)");
$('#mycontainer').css("-moz-transform", "scale(0.8)");
$('#mycontainer').css("-ms-transform", "scale(0.8)");
$('#mycontainer').css("-o-transform", "scale(0.8)");
$('#mycontainer').css("transform", "scale(0.8)");

标记没有改变,只是“外观”改变了,即它“看起来”按比例缩小了。

以上都是准确的吗?

如果是这样,我该如何方便地将对象居中并停在那里?

根据我的测试,Safari 使用上面的代码做了我想要的,而其他浏览器也将缩小的对象向右移动,这不是我想要的。

为了直接回应您的有效评论,这里有一个 jsFiddle 可以更完整地说明我的观点:http://jsfiddle.net/johnlove/yL2td3r2/

但是,在你看这个 jsFiddle 之前,让我先口头解释一下我想做什么。

我从用于居中分区的标准 CSS 开始。然后,我将调整大小方法挂接到窗口的 onresize 事件中。在那个事件中,我想保持分区居中并缩小变换中心在其默认中心 (50,50);例如,缩放到 0.8,这意味着左边缘 10% 和右边缘 10% 保持中心相同 (50,50)。

听起来很简单......但是,整个分区都发生了移动......并且只有当封闭的窗口变得超薄时才会移动......分区会缩小并保持居中,直到窗口变得非常非常薄。

我记得在一部非常非常非常老的电影中有一句台词, Actor 脱口而出“我正在褪色,我正在褪色”。 梦想之地。在这个时刻,这句话听起来对我来说非常合适。

最佳答案

这似乎...有点荒谬的解决方案。您想要一个以流为中心的图像,尽可能大,但绝不能大于窗口大小?只需使用

.container { 
    width: 100%; 
    margin: 0px auto; 
    max-width: 30em; 
} 

无需使用 JS 即可获得所需的效果。

您看到这个的原因是因为您使用的是一组 width - 这意味着您的容器总是 30em 宽,并且它的transform-origin 默认为 50% 50%

因此容器的中心点始终保持在 15em,并且它正在缩放到那个点,随着屏幕尺寸的减小,它似乎更靠近屏幕的右侧。这就是为什么它看起来向左移动的原因 - 您的 em 总是 30em 宽,所以原点总是 15em 向左。诀窍是将 transform-origin 设置为 0 0 - 尽管上述技术更好更简单。

让我们在这里稍微修改一下您的代码(我还删除了对 jQuery 的任何依赖,因为这在 vanilla JS 中真的不难,并删除了 ul - 这只是为了简单,因为它没有区别在这种情况下的最终结果):

window.addEventListener('resize', function(){

    var theScale = 0.7 * window.innerWidth / (480 + 9.6);
        theScale = theScale > 1 ? 1 : theScale;
    
    var theContainer = document.getElementById('container');
    
    theContainer.style.msTransform = "scale(" + theScale + ")";
    theContainer.style.mozTransform = "scale(" + theScale + ")";
    theContainer.style.webkitTransform = "scale(" + theScale + ")";
    theContainer.style.oTransform = "scale(" + theScale + ")";
    theContainer.style.transform = "scale(" + theScale + ")";

}, false);
body {
    margin: 0;
    padding: 0;
}

#container {
    margin: 0 auto;
    width: 30.00em;
    height: 22.50em;
    border: 0.30em solid #cd853f;
    overflow: hidden;
   -webkit-transform-origin: 0 0 ;
   -moz-transform-origin: 0 0 ;
   -ms-transform-origin: 0 0 ;
   transform-origin: 0 0 ;
}
#container img {
    /* match specs to #container */
    width: 100%;
    vertical-align: middle;
}
<section id="container">
<img src="http://lovesongforever.com/My_Love_Song_Forever_Folder/50_images/Nancy_and_John.jpg" alt="At Entrance of CP" />
</section>

但是,这是我的简单解决方案:

body {
    margin: 0;
    padding: 0;
}

#container {
    margin: 0 auto;
    width: 100%;
    max-width: 30.00em;
    height: 22.50em;
    border: 0.30em solid #cd853f;
    overflow: hidden;
}
#container img {
    width: 100%;
    vertical-align: middle;
}
<section id="container">
<img src="http://lovesongforever.com/My_Love_Song_Forever_Folder/50_images/Nancy_and_John.jpg" alt="At Entrance of CP" />
</section>

关于css - 为什么 transform : scale(xx. y) 从 Browser 变为 Browser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33161226/

相关文章:

php - 从表行中获取数据并将其传递给表单

CSS 没有第一次在 3D 变换上渲染背面

CSS transition scale() - 奇怪的延迟

css - css中的补间是什么?

html - 使用 css 在链接中定位图像

javascript - 如何从通过 npm 安装的库中引用 CSS?

html - 添加显示 : table-* to the CSS specification? 的可验证原因是什么

javascript - 无法增加视频元素宽度

html - 调整窗口大小后,右侧 float 元素显示在 Chrome 中变得困惑?

javascript - SVG 的自由变换插件 - 创建占位符元素