html元素 局部缩放,局部缩放.html

document

* {

padding: 0;

margin: 0;

}

html,

body {

height: 100%;

width: 100%;

text-align: center;

box-sizing: border-box;

}

.container {

padding: 100px 0;

background-color: red;

}

.wrapper {

margin: 0 auto;

padding-top: 100px;

width: 240px;

height: 200px;

}

.scale {

width: 100%;

transform-origin: 0 0;

-webkit-transform-origin: 0 0;

background-color: #fff;

}

243

243

243

243

243

1234
1111
2345
13234
23232323343434

var wrapper = document.querySelector('.wrapper');

var element = document.querySelector('.scale');

var vendors;

var distance = {};

var origin;

var scale = 1;

var isCanScale = false;

function handleTouch(e) {

e.preventDefault();

switch (e.type) {

case 'touchstart':

if (e.touches.length > 1) {

distance.start = getDistance({

x: e.touches[0].screenX,

y: e.touches[0].screenY

}, {

x: e.touches[1].screenX,

y: e.touches[1].screenY

});

}

break;

case 'touchmove':

if (e.touches.length === 2) {

origin = getOrigin({

x: event.touches[0].pageX,

y: event.touches[0].pageY

}, {

x: event.touches[1].pageX,

y: event.touches[1].pageY

});

distance.stop = getDistance({

x: e.touches[0].screenX,

y: e.touches[0].screenY

}, {

x: e.touches[1].screenX,

y: e.touches[1].screenY

});

scale = distance.stop / distance.start;

isCanScale = true;

setScaleAnimation(scale, true);

}

break;

case 'touchend':

scale = 1;

setScaleAnimation(scale);

break;

case 'touchcancel':

scale = 1;

setScaleAnimation(scale);

break;

default: ;

}

}

function vendor() {

var TRANSITION = 'transition';

var TRANSITION_END = 'transitionend';

var TRANSFORM = 'transform';

var TRANSFORM_PROPERTY = 'transform';

var TRANSITION_PROPERTY = 'transition';

if (typeof document.body.style.webkitTransform !== undefined) {

TRANSFORM = 'webkitTransform';

TRANSITION = 'webkitTransition';

TRANSITION_END = 'webkitTransitionEnd';

TRANSFORM_PROPERTY = '-webkit-transform';

TRANSITION_PROPERTY = '-webkit-transition';

}

return {

TRANSFORM: TRANSFORM,

TRANSITION: TRANSITION,

TRANSITION_END: TRANSITION_END,

TRANSFORM_PROPERTY: TRANSFORM_PROPERTY,

TRANSITION_PROPERTY: TRANSITION_PROPERTY

};

}

function getOrigin(first, second) {

return {

x: (first.x + second.x) / 2,

y: (first.y + second.y) / 2

};

}

function getDistance(start, stop) {

return Math.sqrt(Math.pow((stop.x - start.x), 2) + Math.pow((stop.y - start.y), 2));

}

function setScaleAnimation(scale, animation) {

var transition_animation = '';

var x, y;

if (!isCanScale) {

return;

}

isCanScale = false;

if (animation) {

transition_animation = 'none';

} else {

transition_animation = vendors.TRANSFORM_PROPERTY + ' 0.3s ease-out';

}

element.style[vendors.TRANSITION] = transition_animation;

x = origin.x + (-origin.x) * scale;

y = origin.y + (-origin.y) * scale;

element.style[vendors.TRANSFORM] = 'matrix(' + scale + ', 0, 0, ' + scale + ', -' + x + ', -' + y + ')';

}

vendors = vendor();

wrapper.addEventListener('touchstart', handleTouch);

wrapper.addEventListener('touchmove', handleTouch);

wrapper.addEventListener('touchend', handleTouch);

wrapper.addEventListener('touchcancel', handleTouch);

一键复制

编辑

Web IDE

原始数据

按行查看

历史

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值