表达式后面的先执行
translateScale.style.webkitTransform = 'translate(30px) scale(1.5)';
rotate,skew,scale,translate:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
*{margin: 0;padding: 0;}
.con{
width: 100px;
height: 100px;
border:1px solid green;
display: flex;
margin-bottom: 10px;
}
.translate-scale,.translate,.scale,.skew,.rotate{
width: 50px;
height: 50px;
background: orange;
margin: auto;
line-height: 50px;
text-align: center;
color: #ffffff;
transition: all .5s;
}
</style>
</head>
<body>
<h1>transform2D 变换</h1>
<h3>旋转</h3>
<div class="con">
<div class="rotate">
旋转
</div>
</div>
<h3>斜切</h3>
<div class="con">
<div class="skew">
斜切
</div>
</div>
<h3>缩放</h3>
<div class="con">
<div class="scale">
缩放
</div>
</div>
<h3>位移</h3>
<div class="con">
<div class="translate">
位移
</div>
</div>
<h3>位移+缩放</h3>
<div class="con">
<div class="translate-scale">
位移+缩放
</div>
</div>
<script>
// 旋转
var rotate = document.querySelector('.rotate');
// 围绕中心点旋转,默认为顺时针
rotate.addEventListener('touchstart',(e)=>{
rotate.style.webkitTransform = 'rotate(90deg)';
});
// 斜切
var skew = document.querySelector('.skew');
// X,Y方向, 围绕中心点(默认)拉两个角
skew.addEventListener('touchstart',(e)=>{
skew.style.webkitTransform = 'skewX(30deg) skewY(45deg)';
});
// 缩放
var scale = document.querySelector('.scale');
// 传数字(无单位),基于原来的大小,围绕中心点(默认)X,Y
scale.addEventListener('touchstart',(e)=>{
// scale.style.webkitTransform = 'scale(2)';
// scale.style.webkitTransform = 'scale(1.5,2)';
scale.style.webkitTransform = 'rotate(360deg) scale(0.1)';
});
// 位移px,默认为 X轴
var translate = document.querySelector('.translate');
// X,Y可以为负值
translate.addEventListener('touchstart',(e)=>{
//translate.style.webkitTransform = 'translate(25px, 25px)';
translate.style.webkitTransform = 'rotate(360deg) translate(-50px,50px) scale(0.1)';
});
// 位移+缩放
var translateScale = document.querySelector('.translate-scale');
// X,Y可以为负值
translateScale.addEventListener('touchstart',(e)=>{
// 表达式后面的先执行
translateScale.style.webkitTransform = 'translate(30px) scale(2)';
});
</script>
</body>
</html>
3D变换:
位移translate,向Z轴移动-100,效果非常微弱,几乎看不出变化。
加CSS:
/ 景深 /
perspective: 50px;
.con{
width: 100px;
height: 100px;
border:1px solid green;
display: flex;
margin-bottom: 10px;
/* 景深 */
perspective: 50px;
}
perspective:景深
简单来说,就是设置这个属性后,那么,就可以模拟出像我们人看电脑上的显示的元素一样。比如说, perspective:800px 意思就是,我在离屏幕800px 的地方观看这个元素。(这个属性,要设置在父元素上面)。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Transform</title>
<style>
*{margin: 0;padding: 0;}
.con{
width: 100px;
height: 100px;
border:1px solid green;
display: flex;
margin-bottom: 10px;
/* 景深 */
perspective: 50px;
}
.translate-scale,.translate,.scale,.skew,.rotate{
width: 50px;
height: 50px;
background: orange;
margin: auto;
line-height: 50px;
text-align: center;
color: #ffffff;
transition: all .5s;
}
</style>
</head>
<body>
<h1>transform3D变换</h1>
<h3>旋转</h3>
<div class="con">
<div class="rotate">
旋转
</div>
</div>
<h3>位移</h3>
<div class="con">
<div class="translate">
位移
</div>
</div>
</body>
<script>
// 旋转
var rotate = document.querySelector(".rotate");
rotate.addEventListener("touchstart",()=>{
rotate.style.WebkitTransform = "rotateZ(45deg)";
})
// 位移
var translate = document.querySelector(".translate");
translate.addEventListener("touchstart",()=>{
translate.style.WebkitTransform = "translateZ(-100px)";
})
</script>
</html>
父级和子级都有3D效果,子级的效果如果被父级覆盖,则需要在父级元素上加:
transform-style: preserve-3d;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>transform-style</title>
<style>
.div1{
position: relative;
height: 300px;
width: 300px;
padding:20px;
border: 1px solid gray;
}
.div2{
padding:50px;
position: absolute;
border: 1px solid black;
background-color: green;
/* 3D转换 */
transform: rotateY(60deg);
/* 父级 */
transform-style: preserve-3d;
}
.div3{
padding:30px;
position: absolute;
border: 1px solid black;
background-color: orange;
/* 3D转换 */
transform: rotateY(-60deg);
}
</style>
</head>
<body>
<div class="div1">
<div class="div2">我是div2,父级
<div class="div3">div3</div>
</div>
</div>
</body>
</html>
第一个封装版本:
function cssTransform(ele, attr, val){
// ele:操作的元素
// 运动属性
// val 具体的值
if(!ele.transform){
ele.transform = {};
}
if (typeof val === 'undefined'){
// 取不到值的话,给默认值
if(typeof ele.transform[attr] === "undefined") {
switch(attr){
case 'scale':
case 'scaleX':
case 'scaleY':
case 'scaleZ':
ele.transform[attr] = 1;
break;
default:
ele.transform[attr] = 0;
}
}
// 取值
return ele.transform[attr];
}
else {
// 设置值
ele.transform[attr] = val;
let transformValue = '';
for(var name in ele.transform) {
switch(name){
case "scale":
case "scaleX":
case "scaleY":
case "scaleZ":
transformValue += "" + name + "(" + (ele.transform[name]) + ")";
break;
case "rotate":
case "rotateX":
case "rotateY":
case "rotateZ":
case "skewX":
case "skewY":
transformValue += "" + name + "(" + (ele.transform[name]) + "deg)";
break;
default:
transformValue += "" + name + "(" + (ele.transform[name]) + "px)";
}
ele.style.webkitTransform = ele.style.transform = transformValue;
}
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
*{margin: 0;padding: 0;}
.con{
width: 100px;
height: 100px;
border:1px solid green;
display: flex;
margin-bottom: 10px;
}
.translate-scale,.translate,.scale,.skew,.rotate{
width: 50px;
height: 50px;
background: orange;
margin: auto;
line-height: 50px;
text-align: center;
color: #ffffff;
transition: all .5s;
}
</style>
</head>
<body>
<h1>transform2D变换</h1>
<h3>旋转</h3>
<div class="con">
<div class="rotate">
旋转
</div>
</div>
<h3>斜切</h3>
<div class="con">
<div class="skew">
斜切
</div>
</div>
<script src="./transform1.0.js"></script>
<script>
var rotate = document.querySelector('.rotate');
rotate.addEventListener('touchstart',(e)=>{
cssTransform(rotate, 'rotate', 90);
cssTransform(rotate, 'scale', 2);
});
</script>
</body>
</html>
注意:
定义变量时,使用一个var比使用多个var效率更高。
var d =1, d1=2, d2=3;
和
var d=1;
var d1=2;
var d2=3;
第二个版本:
function Transform(element){
var units = {},
transform,
transforms = {},
attrs = ['scale', 'scaleX','scaleY','scaleZ', 'rotate', 'rotateX', 'rotateY', 'rotateZ','skew', 'skewX', 'skewY', 'translate', 'translateX', 'translateY', 'translateZ'];
attrs.forEach(function(attr){
if (attr.indexOf('scale') >= 0){
units[attr] = '';
// 设置默认值
transforms[attr] = 1;
}
else {
units[attr] = attr.indexOf('translate') >= 0 ? 'px' : 'deg';
// 设置默认值
transforms[attr] = 0;
}
// 在对象上定义一个属性
Object.defineProperty(element, attr, {
get: function(){
return transforms[attr];
},
set: function(value){
transform = '';
transforms[attr] = value;
attrs.forEach(function(attr){
transform += attr + '(' + transforms[attr] + units[attr] + ')';
});
console.log(transform);
element.style.transform = transform;
}
});
});
}
DOM 赋能:
Transform(rotate);
<script>
var rotate = document.querySelector('.rotate');
rotate.addEventListener('touchstart',(e)=>{
// DOM 赋能
Transform(rotate);
rotate.rotate = 90;
var deg = rotate.rotate;
console.log(deg);
});
</script>
移动端自定义滑动区域
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
body{
margin: 0;
padding: 0;
}
body,html{
height: 100%;
overflow: hidden;
position: relative;
}
header{
width: 100%;
height: 40px;
background: greenyellow;
color: black;
line-height: 40px;
text-align: center;
}
#wrap{
position: absolute;
top:40px;
bottom: 0;
right: 0;
left: 0;
overflow: hidden;
}
#list{
margin: 0;
padding: 0;
list-style: none;
}
#list li{
background: #ffffff;
color: #333333;
height: 40px;
line-height: 40px;
border-bottom: 1px solid #999999;
text-indent: 20px;
}
</style>
</head>
<body>
<header>
我是Header
</header>
<div id="wrap">
<ul id="list"></ul>
</div>
<script>
function $my(id){
return document.getElementById(id);
}
function initList(){
var list = $my('list');
var html = '';
for(var i=0; i<80; i++){
html += '<li>第' + (i+1) + '个</li>';
}
list.innerHTML = html;
}
initList();
var wrap = $my('wrap');
var lists = $my('list');
var startY = 0;
lists.addEventListener('touchstart', (e)=>{
startY = e.changedTouches[0].pageY;
});
lists.addEventListener('touchmove', (e)=>{
var moveY = e.changedTouches[0].pageY;
// 距离 = 起始点 - 活动点
var distance = moveY - startY;
if (distance < 0) {
lists.style.webkitTransform = lists.style.transform =
'translateY(' + distance + 'px)';
}
});
</script>
</body>
</html>