【问题标题】:transform-origin:100% not working for transform rotate变换原点:100% 不适用于变换旋转
【发布时间】:2019-12-03 04:16:16
【问题描述】:

我想制作当有人将鼠标悬停在其上时向左和向右打开的小册子。 我使用transform-origin: 0%transform: rotateY(-180deg) 为小册子的左侧站点打开左侧站点(卡片红色和蓝色)。对于右侧,我当然使用transform-origin: 100%transform: rotateY(180deg) 打开正确的站点(卡绿色)。

但右侧的实际行为是,它应用transform-origin: 0% 并在小册子的左侧站点后面旋转(这就是为什么你看不到它,但它在那里)。

我不明白为什么transform-origin: 100% 不生效。

这里是代码:https://jsfiddle.net/eL6q3hp4/2/

.book-container {
  height: 350px;
  width: 250px;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  -webkit-perspective: 1000px;
  -moz-perspective: 1000px;
  perspective: 1000px;
}

.book-part {
  height: auto;
  width: auto;
  position: absolute;
  transform-style: preserve-3d;
  top: 0;
  left: 0;
}

.book-part > .card {
  height: 350px;
  width: 250px;
  position: absolute;
  transform-style: preserve-3d;
  backface-visibility: hidden;
}

/* RIGHT SITE */
.right-part {
  transform-origin: 0%;
}
.right-card {
  transform: rotateY(-180deg);
}
.book-container:hover .right-part {
  transform: rotateY(180deg);
  transition: 0.7s;
  transition-delay: 0.3s;
}

/* LEFT SITE */
.left-part {
  transform-origin: 100%;
}
.left-card {
  transform: rotateY(180deg);
}
.book-container:hover .left-part {
  transform: rotateY(-180deg);
  transition: 0.7s;
}


.middle-card {
  background-color: blue;
}

.right-card {
  background-color: green;
}

.left-card {
  background-color: red;
}

.front-card {
  background-color: yellow;
}
    <div class="book-container">
        <div class="book-part middle-part">
            <div class="card middle-card"></div>
        </div>
        <div class="book-part right-part">
            <div class="card right-card"></div>
        </div>
        <div class="book-part left-part">
            <div class="card left-card"></div>
            <div class="card front-card"></div>
        </div>
    </div>

【问题讨论】:

  • 您介意我编辑您的问题以将代码直接放在问题中吗?
  • 你可以做到,谢谢。
  • img 标签不带图片是故意的吗?
  • 我的错误,把img标签想象成一个div。
  • 您的元素宽度为 0,因此变换原点不会执行任何操作

标签: css css-transforms


【解决方案1】:

.book-part 中删除绝对位置并反转旋转值。您也可以在右侧块中添加正面卡片

我还为结束效果添加了过渡:

.book-container {
  height: 350px;
  width: 250px;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  perspective: 1000px;
}

.book-part {
  transform-style: preserve-3d;
}

.book-part>.card {
  height: 350px;
  width: 250px;
  position: absolute;
  transform-style: preserve-3d;
  backface-visibility: hidden;
}


/* RIGHT SITE */

.right-part {
  transform-origin: 0%;
  transition: 0.7s;
}

.right-card {
  transform: rotateY(180deg);
}

.book-container:hover .right-part {
  transform: rotateY(-180deg);
  transition-delay: 0.3s;
}


/* LEFT SITE */

.left-part {
  transform-origin: 100%;
  transition: 0.7s;
  transition-delay: 0.3s;
}

.left-card {
  transform: rotateY(-180deg);
}

.book-container:hover .left-part {
  transform: rotateY(180deg);
  transition-delay: 0s;
}
<div class="book-container">
  <div class="book-part middle-part">
    <div class="card middle-card" style="background:blue"></div>
  </div>
  <div class="book-part right-part">
    <img class="card right-card" style="background:green">
    <img class="card front-card" style="background:pink;">
  </div>
  <div class="book-part left-part">
    <img class="card left-card" style="background:red"> 
    <img class="card front-card" style="background:yellow">
  </div>
</div>

你也可以像下面这样简化你的代码:

.book-container {
  height: 350px;
  width: 250px;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  perspective: 1000px;
  background:blue;
}
.book-container > div{
  transform-style: preserve-3d;
}

.book-container > div:before,
.book-container > div:after{
  content:"";
  height: 350px;
  width:100%;
  position: absolute;
  transform-style: preserve-3d;
  backface-visibility: hidden;
  background:yellow;
}


/* RIGHT SITE */
.right-part {
  transform-origin: 0%;
  transition: 0.7s;
}

.book-container .right-part:before {
  transform: rotateY(180deg);
  background:green;
}

.book-container:hover .right-part {
  transform: rotateY(-180deg);
  transition-delay: 0.3s;
}


/* LEFT SITE */
.left-part {
  transform-origin: 100%;
  transition: 0.7s;
  transition-delay: 0.3s;
}

.book-container .left-part:before {
  transform: rotateY(180deg);
  background:red;
}

.book-container:hover .left-part {
  transform: rotateY(180deg);
  transition-delay: 0s;
}
<div class="book-container">
  <div class="right-part">
  </div>
  <div class="left-part">
  </div>
</div>

【讨论】:

    【解决方案2】:

    我不知道在原始情况下您是否使用动态尺寸(在这种情况下,此解决方案不适用),但您可以使用transform-origin 的像素值使其工作:

    .book-container {
      height: 350px;
      width: 250px;
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      -webkit-perspective: 1000px;
      -moz-perspective: 1000px;
      perspective: 1000px;
    }
    
    .book-part {
      height: auto;
      width: auto;
      position: absolute;
      transform-style: preserve-3d;
      top: 0;
      left: 0;
    }
    
    .book-part > .card {
      height: 350px;
      width: 250px;
      position: absolute;
      transform-style: preserve-3d;
      backface-visibility: hidden;
    }
    
    /* RIGHT SITE */
    .right-part {
      transform-origin: 250px;
    }
    .right-card {
      transform: rotateY(180deg);
    }
    .book-container:hover .right-part {
      transform: rotateY(180deg);
      transition: 0.7s;
      transition-delay: 0.3s;
    }
    
    /* LEFT SITE */
    .left-part {
      transform-origin: 0%;
    }
    .left-card {
      transform: rotateY(-180deg);
    }
    .book-container:hover .left-part {
      transform: rotateY(-180deg);
      transition: 0.7s;
    }
    
    
    .middle-card {
      background-color: blue;
    }
    
    .right-card {
      background-color: green;
    }
    
    .left-card {
      background-color: red;
    }
    
    .front-card {
      background-color: yellow;
    }
    <div class="book-container">
            <div class="book-part middle-part">
                <div class="card middle-card"></div>
            </div>
            <div class="book-part right-part">
                <div class="card right-card"></div>
            </div>
            <div class="book-part left-part">
                <div class="card left-card"></div>
                <div class="card front-card"></div>
            </div>
        </div>

    【讨论】:

      猜你喜欢
      • 2016-03-07
      • 2017-11-07
      • 1970-01-01
      • 2017-06-01
      • 2019-02-21
      • 2015-04-10
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多