调整元素大小的CSS转换
我发现: 还有其他一些,但没有什么不是我想要的。我想要的是将某些内容缩放到其大小的50%(当然要有漂亮的动画过渡),并将页面布局重新调整为元素的新(视觉)大小。默认情况下,元素在布局结构中仍然保持其原始大小,并且仅使用关联的转换绘制 基本上,我希望用户单击一块文本(或其他内容),然后将该文本缩放到其大小的50%(或任意大小),并将其粘贴到下面的面板中,以指示它已被选中。移动元素后,我不希望元素周围有50%的空格 我尝试过重新设置高度/宽度,但这会导致元素本身经历一个新的布局,然后将比例应用到新的布局,这仍然会在完成所有操作后留下50%的空白。我的特定于mozilla(为了简单起见)的代码如下所示:调整元素大小的CSS转换,css,css-transforms,Css,Css Transforms,我发现: 还有其他一些,但没有什么不是我想要的。我想要的是将某些内容缩放到其大小的50%(当然要有漂亮的动画过渡),并将页面布局重新调整为元素的新(视觉)大小。默认情况下,元素在布局结构中仍然保持其原始大小,并且仅使用关联的转换绘制 基本上,我希望用户单击一块文本(或其他内容),然后将该文本缩放到其大小的50%(或任意大小),并将其粘贴到下面的面板中,以指示它已被选中。移动元素后,我不希望元素周围有50%的空格 我尝试过重新设置高度/宽度,但这会导致元素本身经历一个新的布局,然后将比例应用到新的
<script type="text/javascript">
function zap(e) {
var height = e.parentNode.offsetHeight/2 + 'px';
var width = e.parentNode.offsetWidth/2 + 'px';
e.parentNode.style.MozTransform='scale(0.0)';
e.parentNode.addEventListener(
'transitionend',
function() {
var selectionsArea = document.getElementById("selected");
selectionsArea.appendChild(e.parentNode);
e.parentNode.style.MozTransform='scale(0.5,0.5)';
e.parentNode.style.display = 'inline-block';
e.parentNode.style.height = height;
e.parentNode.style.width = width;
},
true)
}
</script>
即使它工作,上面仍然需要我在运行此代码之前首先将元素移动到页面底部(以消除空白),而且我还需要在重新调整大小时重新计算转换。。。因此,无论如何,我对这一尝试并不太满意
另外请注意,如果您使用上面的scale+trans
与trans+scale
相比,结果会有很大的不同
编辑3:我解决了安置问题。。。变换按指定的顺序应用,
scale(0.5,0.5)
基本上将像素的大小更改为原来的一半(可能暗示了它们是如何在内部实现的)。如果我把translate放在第一位,那么稍微少/多翻译以解释缩放引起的左上角位置的变化就可以了,但是当dom以合理的方式发生变化时,管理对象的位置和调整变换仍然是我无法做到的。这种感觉是错误的,因为我正朝着用javascript编写自己的布局管理器的方向发展,只是为了获得这种效果。我注意到的问题是,当元素缩放时,浏览器会改变其像素比例,而不是像素数量。元素更小,但在DOM中它不会更改其实际像素大小。正因为如此,我不认为CSS唯一的解决方案存在
我将可伸缩元素放入容器中,该容器保持与其余元素相同的像素比率。使用Java脚本,我只需更改容器的大小。一切仍然基于CSS3转换:缩放。也许JS代码可以更简单,但现在一切都是关于这个想法(只是概念的证明);)举两个例子:
HTML:
JS:
我终于找到了一个简单的解决方案,它与我开始时的解决方案非常相似。 我承认,在过去一年左右的时间里,我们花了很多努力才最终解决了这个问题。我其实是在寻找这个问题的答案。我以前在这方面遇到过问题。不管怎样,我又开始解决这个问题,我确实找到了一个简单的解决办法 无论如何,诀窍是将边距底部与CSS calc脚本一起使用 此外,必须为对象(div)声明绝对高度。如果div可以扩展,我认为这将不起作用,否则,经过多次尝试和数小时,我终于有了一个非常简单、干净、有效的解决方案 例如,高度=300px(不是30%,或者没有高度)。如果可以的话,我甚至会设置overflow-y=hidden。如果您希望div增长(而不是绝对高度),我相信您将需要JavaScript。我没有试过。否则,这将在所有测试中正常工作 我相信这将很好地与SASS或更少,因为您可以使用CSS中的变量声明一些重复的事情。我还没有试过 关于我的解决方案的一些重要评论:
.box wrap{
显示:块;
位置:相对位置;
框大小:边框框;
宽度:100%;
保证金:自动;
文本对齐:居中;
利润率:30px 10px;
填充:40px;
背景:黄色;
}
.包装盒:之前{
内容:“;
显示:块;
框大小:边框框;
位置:绝对位置;
背景:rgba(0,0,0,0.5);
宽度:计算(100%-80px);
高度:计算(100%-80px);
顶部:40px;
左:40px;
}
.盒子{
显示:内联块;
框大小:边框框;
位置:相对位置;
变换原点:50%0;
宽度:300px;
高度:150像素;
背景:红色;
}
.box.size-80{
变换:比例(0.8);
保证金:0自动计算(-150px*(1-0.8));
}
.box.size-70{
变换:比例(0.7);
保证金:0自动计算(-150px*(1-0.7));
}
.box.size-60{
变换:比例(0.6);
保证金:0自动计算(-150px*(1-0.6));
}
.box.size-50{
变换:比例(0.5);
保证金:0 a
function posX(e) {
return e.offsetLeft + (e.offsetParent ? posX(e.offsetParent) : 0)
}
function posY(e) {
return e.offsetTop + (e.offsetParent ? posY(e.offsetParent) : 0)
}
function placeThumbNail(e, container, x, y, scale) {
var contX = posX(container);
var contY = posY(container);
var eX = posX(e);
var eY = posY(e);
var eW = e.offsetWidth;
var eH = e.offsetHeight;
var margin = 10;
var dx = ((contX - eX) + margin + (x * eW * scale));
var dy = ((contY - eY) + margin + (y * eH * scale));
// assumes identical objects
var trans = 'translate(' + dx + 'px, ' + dy + 'px) ';
var scale = 'scale(' + scale + ',' + scale + ') ';
e.style.MozTransform = trans + scale ;
}
<div class="overall-scalable">
<div class="scalable" scalex='0.5' scaley='0.5'>
Nunc et nisi ante. Integer in blandit nisi. Nulla facilisi. Vestibulum vulputate sapien eget mauris elementum sollicitudin. Nullam id lobortis dolor. Nulla vitae nibh vitae sem volutpat pretium. Nunc et nisi ante. Integer in blandit nisi. Nulla facilisi. Vestibulum vulputate sapien eget mauris elementum sollicitudin. Nullam id lobortis dolor. Nulla vitae nibh vitae sem volutpat pretium.
</div>
</div>
.overall-scalable {width: 350px; height: 150px; overflow: hidden; -webkit-transition: all 1s;}
.scalable {color: #666; width: 350px; height: 150px; -webkit-transform-origin: top left; -webkit-transition: all 1s;}
$('button').click(function() {
$('.scalable').each(function(){
rescale($(this));
})
});
function rescale(elem) {
var height = parseInt(elem.css('height'));
var width = parseInt(elem.css('width'));
var scalex = parseFloat(elem.attr('scalex'));
var scaley = parseFloat(elem.attr('scaley'));
if (!elem.hasClass('rescaled')){
var ratioX = scalex;
var ratioY = scaley;
}else{
var ratioX = 1;
var ratioY = 1;
}
elem.toggleClass('rescaled');
elem.css('-webkit-transform', 'scale('+ratioX +', '+ratioY+')');
elem.parent().css('width', parseInt(width*ratioX) + 'px');
elem.parent().css('height', parseInt(height*ratioY) + 'px');
}