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

  <div class="wrapper">
    <h2>CSS Transform Level 2: tranlate</h2>
    <div class="camera"> 
      <div class="space"> 
        <div class="box new"></div> 
      </div> 
    </div>
  </div>
  
  <aside>
  <div class="control">
    <label for="translateX">X:</label>
    <input type="range" id="translateX" value="50" min="-100" max="100"/>
    <output id="outputX">50%</output>
  </div>
  <div class="control">
    <label for="translateY">Y:</label>
    <input type="range" id="translateY" value="50" min="-100" max="100"/>
    <output id="outputY">50%</output>
  </div>
  <div class="control">
    <label for="translateZ">Z:</label>
    <input type="range" id="translateZ" value="50" min="-200" max="200"/>
    <output id="outputZ">50px</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 {
  --x: 50%;
  --y: 50%;
  --z: 0px;
}

.old {
  transform: translate3d(var(--x), var(--y), var(--z));
}

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

h2 {
  font-size: 1em;
}

aside {
  display: flex;
  flex-direction: column;
  align-items: center;
  padding-left: 20vh;
  
  .item {
    margin: 2vh 0;
  }
}
const xVal = document.getElementById('translateX')
const yVal = document.getElementById('translateY')
const zVal = document.getElementById('translateZ')

const xOutputVal = document.getElementById('outputX')
const yOutputVal = document.getElementById('outputY')
const zOutputVal = document.getElementById('outputZ')

const rootEle = document.documentElement

xVal.addEventListener('input', (e) => {
  console.log(e.currentTarget.value)
  rootEle.style.setProperty('--x', `${e.currentTarget.value}%`);
  xOutputVal.textContent = `${e.currentTarget.value}%`;
})

yVal.addEventListener('input', (e) => {
  console.log(e.currentTarget.value)
  rootEle.style.setProperty('--y', `${e.currentTarget.value}%`);
  yOutputVal.textContent = `${e.currentTarget.value}%`;
})

zVal.addEventListener('input', (e) => {
  console.log(e.currentTarget.value)
  rootEle.style.setProperty('--z', `${e.currentTarget.value}px`);
  zOutputVal.textContent = `${e.currentTarget.value}px`;
})

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.