parabola.js 포물선 과 카 트 효과 추가 예시 코드
8181 단어 parabola.js포물선
parabola.js
var funParabola = function (element, target, options) {
/*
*
* 1 1 , ,
* , ,200~800 , 2 8 , 100:1
* , ,
*/
var defaults = {
speed: 166.67, // , ( ) 16~17
curvature: 0.001, // , , ,
progress: function () {
},
complete: function () {
}
};
var params = {};
options = options || {};
for (var key in defaults) {
params[key] = options[key] || defaults[key];
}
var exports = {
mark: function () {
return this;
},
position: function () {
return this;
},
move: function () {
return this;
},
init: function () {
return this;
}
};
/*
* IE6-IE8 margin
* IE9+ transform
*/
var moveStyle = "margin", testDiv = document.createElement("div");
if ("oninput" in testDiv) {
["", "ms", "webkit"].forEach(function (prefix) {
var transform = prefix + (prefix ? "T" : "t") + "ransform";
if (transform in testDiv.style) {
moveStyle = transform;
}
});
}
// ( a, b )
/* : y = a*x*x + b*x + c;
*/
var a = params.curvature, b = 0, c = 0;
//
var flagMove = true;
if (element && target && element.nodeType == 1 && target.nodeType == 1) {
var rectElement = {}, rectTarget = {};
// ,
var centerElement = {}, centerTarget = {};
//
var coordElement = {}, coordTarget = {};
//
exports.mark = function () {
if (flagMove == false) return this;
if (typeof coordElement.x == "undefined") this.position();
element.setAttribute("data-center", [coordElement.x, coordElement.y].join());
target.setAttribute("data-center", [coordTarget.x, coordTarget.y].join());
return this;
}
exports.position = function () {
if (flagMove == false) return this;
var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft,
scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
//
if (moveStyle == "margin") {
element.style.marginLeft = element.style.marginTop = "0px";
} else {
element.style[moveStyle] = "translate(0, 0)";
}
//
rectElement = element.getBoundingClientRect();
rectTarget = target.getBoundingClientRect();
//
centerElement = {
x: rectElement.left + (rectElement.right - rectElement.left) / 2 + scrollLeft,
y: rectElement.top + (rectElement.bottom - rectElement.top) / 2 + scrollTop
};
//
centerTarget = {
x: rectTarget.left + (rectTarget.right - rectTarget.left) / 2 + scrollLeft,
y: rectTarget.top + (rectTarget.bottom - rectTarget.top) / 2 + scrollTop
};
//
coordElement = {
x: 0,
y: 0
};
coordTarget = {
x: -1 * (centerElement.x - centerTarget.x),
y: -1 * (centerElement.y - centerTarget.y)
};
/*
* (0, 0), c = 0
* :
* y = a * x*x + b*x;
* y1 = a * x1*x1 + b*x1;
* y2 = a * x2*x2 + b*x2;
* :
* b = (y2+ a*x2*x2) / x2
*/
//
b = (coordTarget.y - a * coordTarget.x * coordTarget.x) / coordTarget.x;
return this;
};
//
exports.move = function () {
// ,
if (flagMove == false) return this;
var startx = 0, rate = coordTarget.x > 0 ? 1 : -1;
var step = function () {
// y'=2ax+b
var tangent = 2 * a * startx + b; // = y / x
// y*y + x*x = speed
// (tangent * x)^2 + x*x = speed
// x = Math.sqr(speed / (tangent * tangent + 1));
startx = startx + rate * Math.sqrt(params.speed / (tangent * tangent + 1));
//
if ((rate == 1 && startx > coordTarget.x) || (rate == -1 && startx < coordTarget.x)) {
startx = coordTarget.x;
}
var x = startx, y = a * x * x + b * x;
// , ,
element.setAttribute("data-center", [Math.round(x), Math.round(y)].join());
// x, y ,
if (moveStyle == "margin") {
element.style.marginLeft = x + "px";
element.style.marginTop = y + "px";
} else {
element.style[moveStyle] = "translate(" + [x + "px", y + "px"].join() + ")";
}
if (startx !== coordTarget.x) {
params.progress(x, y);
window.requestAnimationFrame(step);
} else {
// ,
params.complete();
flagMove = true;
}
};
window.requestAnimationFrame(step);
flagMove = false;
return this;
};
//
exports.init = function () {
this.position().mark().move();
};
}
return exports;
};
이루어지다
// body
<div class="container">
![](dist/01.png)
<center> </center>
<!-- -->
<div class="img-element" id="imgElement">
![](dist/02.jpg)
</div>
<!-- -->
<div class="shop-cart" id="shopCart"></div>
<span class="shop-cart-num">0</span>
<div class="add-shop-cart"><!-- --></div>
</div>
// script
//
var imgElement = document.querySelector('#imgElement'),
//
shopCartElement = document.querySelector('#shopCart'),
//
proNum = 0;
//
var myParabola = funParabola(imgElement, shopCartElement, {
speed: 100,//
curvature: 0.005,//
complete: function () {
imgElement.style.visibility = "hidden";
$('.shop-cart-num').text(++proNum);
}
});
//
$('.add-shop-cart').click(function () {
//
$('#imgElement').css({ left: '70px', bottom: '25px', visibility: 'visible' });
myParabola.position().move();
});
효과 도이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
python 에서 최소 2 곱 하기 2 차 포물선 함수 에 적합 하 게 하 는 방법우 리 는 모두 최소 2 곱 하기 의합 선형 함수 로 문제 가 없다 는 것 을 알 고 있 습 니 다.그러면 2 차 함수,심지어 더 높 은 함 수 를 의합 할 수 있 습 니까?답 은 당연히 가능 하 다.포물선 모양 의...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.