https://www.jianshu.com/p/f7acfafc9fa2
https://zhuanlan.zhihu.com/p/32752030?edition=yidianzixun&yidian_docid=0I5ffTxm
/**
design by zhangyingying at 2018-02-28
重力感应 el元素需要定位 消耗性能,建议页面使用效果不超过5个
参数 x, y => x, y轴的相对位移 d=> 位移方向
使用 v-gravity="{x: 20, y: 20, d: 1}"
**/
export default (Vue) => {
Vue.directive('gravity', {
bind: function(el, binding, vNode) {
let objM = binding.modifiers
let objV = binding.value
let objA = binding.arg
let conf = {
gx: 0,
gy: 0
}
let direction = 1
if(!!objV.x) {
conf.gx = objV.x
}
if(!!objV.y) {
conf.gy = objV.y
}
if(!!objV.d) {
direction = objV.d
}
let target = el
function handleOrientation(event) {
var x = event.beta; // [-180, 180]
var y = event.gamma; // [-90, 90]
if (x > 90) {
x = 90
};
if (x < -90) {
x = -90
};
if(x>80 && x<150) {
// 粘度系数0.2
// 当beta>80时,gamma转动速度变大,并且当gamma大于80时容易正负突变
y = Math.abs(y)*0.2
}
x += 90;
y += 90;
if(!!objM.rotateX) {
target.style['-webkit-transform-style'] = `preserve-3d`
target.style['transform-style'] = `preserve-3d`
target.style['-webkit-transform'] = `rotateX(${x*conf.gx}deg)`
target.style['transform'] = `rotateX(${x*conf.gx}deg)`
}else if(!!objM.rotateY){
target.style['-webkit-transform-style'] = `preserve-3d`
target.style['transform-style'] = `preserve-3d`
target.style['-webkit-transform'] = `rotateY(${y*conf.gy}deg)`
target.style['transform'] = `rotateY(${y*conf.gy}deg)`
}else if(!!objM.rotate){
target.style['-webkit-transform-style'] = `preserve-3d`
target.style['transform-style'] = `preserve-3d`
target.style['-webkit-transform'] = `rotateX(${x*conf.gy}deg rotateY(${y*conf.gy}deg)`
target.style['transform'] = `rotateX(${x*conf.gy}deg) rotateY(${y*conf.gy}deg)`
}else {
target.style.top = direction*(conf.gy * x / 180 - conf.gy/2) + "px";
target.style.left = direction*(conf.gx * y / 180 - conf.gx/2) + "px";
}
}
window.addEventListener('deviceorientation', handleOrientation);
},
})
}