【发布时间】:2018-12-19 04:52:21
【问题描述】:
我正在尝试构建一个应用程序,您可以在其中使用鼠标滚轮稍微放大一点,然后再进一步放大另一点。
换句话说,缩放的“原点”可以沿途改变。
看看这个例子:https://codesandbox.io/s/4w4m1k5zlx
var phase = 1;
var box1 = document.getElementById("box1");
var box2 = document.getElementById("box2");
box1.style.transformOrigin = "0 0";
box2.style.transformOrigin = "0 0";
var width = 100;
var height = 100;
function transform(originX, originY, translateX, translateY, scale) {
transformElement(1, box1, originX, originY, translateX, translateY, scale);
transformElement(2, box2, originX, originY, translateX, translateY, scale);
}
function transformElement(
method,
element,
originX,
originY,
translateX,
translateY,
scale
) {
element.style.transition = "transform 1s linear";
if (method === 1) {
element.style.transform = `translate(${originX}px, ${originY}px) translate(${translateX}px, ${translateY}px) scale(${scale}) translate(-${originX}px, -${originY}px)`;
} else if (method === 2) {
element.style.transformOrigin = `${originX}px ${originY}px`;
element.style.transform = `translate(${translateX}px, ${translateY}px) scale(${scale})`;
}
var pointElement = document.createElement("div");
pointElement.classList.add("point");
pointElement.style.transform = `translate(${originX}px, ${originY -
2 * scale}px)`;
element.appendChild(pointElement);
}
function reset() {
resetElement(box1);
resetElement(box2);
}
function resetElement(element) {
while (element.children.length > 0) {
element.removeChild(element.children[0]);
}
element.style.transform = "";
element.style.transition = "";
void element.clientWidth;
}
function phase1() {
transform(width * 0.75, height / 2, 0, 0, 1.5);
}
function phase2() {
transform(width * 0.25, height / 2, 0, 0, 2);
}
function phase3() {
transform(width / 2, height, 0, 0, 2.5);
}
function phase4() {
transform(width / 2, 0, 0, 0, 3);
}
const phases = [reset, phase1, phase2, phase3, phase4];
setInterval(() => phases[phase++ % phases.length](), 1500);
* {
box-sizing: border-box;
}
body {
background-color: black;
}
.container {
position: relative;
margin: 60px;
background-color: lightgray;
width: 200px;
height: 200px;
}
.point {
width: 2px;
height: 2px;
background-color: white;
}
.box {
position: absolute;
top: 25%;
left: 25%;
transform-origin: 0 0;
background-color: teal;
opacity: 0.8;
width: 100px;
height: 100px;
}
.outline {
background-color: transparent;
border: 1px solid black;
}
<div class="container">
<div class="box outline">
</div>
<div id="box1" class="box"></div>
</div>
<div class="container">
<div class="box outline">
</div>
<div id="box2" class="box"></div>
</div>
示例中的顶部框: 这里我尝试用transform 模拟transform-origin,以便能够转换一个属性。然而,动画并不“均匀”——尤其是在第一个比例期间(它会再次放大和缩小一点——很难解释,但我希望你能看到)。
示例中的底部框: 同时更改transform-origin 和transform 会变得非常跳跃,因为transform 有一个过渡而transform-origin 没有.
上面的例子是最理想的,但由于缩放不流畅,它仍然看起来不太好。如何在不同阶段放大点而不使翻译再次跳转或放大和缩小?
【问题讨论】:
-
是的 :D 可以使用更多的帮助!
标签: javascript css css-transitions css-transforms