<div class="container">
  <div class="wrapper">
    <h2>CSS Transform Level 1: rotateX()  rotateY() rotateZ()</h2>
    
    <div class="camera"> 
      <div class="space"> 
        <div class="box old"></div> 
      </div> 
    </div>
  </div>

<!--   <div class="wrapper">
    <h2>CSS Transform Level 2: rotate: x y z angle</h2>
    <div class="camera"> 
      <div class="space"> 
        <div class="box new"></div> 
      </div> 
    </div>
  </div> -->
  
  <aside>
  <div class="control">
    <label for="rotateX">rotateX:</label>
    <input type="range" id="rotateX" value="45" min="-360" max="360"/>
    <output id="outputRotateX">45deg</output>
  </div>
  <div class="control">
    <label for="rotateY">rotateY:</label>
    <input type="range" id="rotateY"  value="30" min="-360" max="360"/>
    <output id="outputRotateY">30deg</output>
  </div>
  <div class="control">
    <label for="rotateZ">rotateZ:</label>
    <input type="range" id="rotateZ"  value="20" min="-360" max="360"/>
    <output id="outputRotateZ">20deg</output>
  </div>

</aside>
  
</div>


<footer>
  <p>请使用Firefox 72+浏览器查看Demo效果(^_^)!</p>
</footer>
@import url('https://fonts.googleapis.com/css?family=Gochi+Hand');

* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}


body {
  margin: 0;
  padding: 0;
  background-color: #291642;
  font-family: 'Gochi Hand', sans-serif;
  color: #fff;
  font-size: 130%;
  letter-spacing: 0.1rem;
  display: flex;
  flex-direction: column;
  align-items: center;
  width: 100vw;
  min-height: 100vh;
  
  .container {
    flex: 1;
    display: flex;
    width: 100vw;
    justify-content: center;
    align-items: center;
    padding-top: 20vh;
    padding-bottom: 40vh;
  }
  
  footer {
    display: flex;
    justify-content: center;
    align-items: center;
    background: rgba(#000, .75);
    width: 100vw;
    padding: 20px;
  }
}

.wrapper {
  display: flex;
  flex-direction: column;
  align-items: center;
  margin: 0 4vh;
}

.camera {
  width: 40vh;
  height: 40vh;
  margin: 2vh 6vh;
  border: 1px dashed #f36;
  position: relative;
  display: flex;
  justify-content: center;
  align-items: center;
  perspective-origin:center center; 
  perspective:500px;
  padding: 2px;
}

.space{ 
  width:100%; height:100%; 
  border:1px dashed #fa90ef; 
  transform-style:3d; 
  
  display: flex;
  justify-content: center;
  align-items: center;
}


.box {
  width: 100%;
  height: 100%;
  transform-origin: center center;
  
  display: flex;
  justify-content: center;
  align-items: center;
  
  background: hsla(343,100%,58%,.3);
  
  &::after {
    content:'';
    position: absolute;
    width: 6px;
    height: 6px;
    background: #fff;
    border-radius: 100%;
  }
}

:root {
  --angleX: 45deg;
  --angleY: 30deg;
  --angleZ: 20deg;
}

.old {
  transform: rotateX(var(--angleX)) rotateY(var(--angleY)) rotateZ(var(--angleZ));
}

.new {
  rotate: var(--x) var(--y) var(--z) var(--angle);
}

h2 {
  font-size: 1em;
}

aside {
  display: flex;
  flex-direction: column;
  align-items: center;
  padding-left: 20vh;
  
  .item {
    margin: 2vh 0;
  }
}
View Compiled
const rotateX = document.getElementById('rotateX')
const rotateY = document.getElementById('rotateY')
const rotateZ = document.getElementById('rotateZ')

const outputRotateX = document.getElementById('outputRotateX')
const outputRotateY = document.getElementById('outputRotateY')
const outputRotateZ = document.getElementById('outputRotateZ')

const rootEle = document.documentElement

rotateX.addEventListener('input', (e) => {
  console.log(e.currentTarget.value)
  rootEle.style.setProperty('--angleX', `${e.currentTarget.value}deg`);
  outputRotateX.textContent = `${e.currentTarget.value}deg`;
})

rotateY.addEventListener('input', (e) => {
  console.log(e.currentTarget.value)
  rootEle.style.setProperty('--angleY', `${e.currentTarget.value}deg`);
  outputRotateY.textContent = `${e.currentTarget.value}deg`;
})

rotateZ.addEventListener('input', (e) => {
  console.log(e.currentTarget.value)
  rootEle.style.setProperty('--angleZ', `${e.currentTarget.value}deg`);
  outputRotateZ.textContent = `${e.currentTarget.value}deg`;
})
View Compiled

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.