【问题标题】:transform origin 50% vertical变换原点 50% 垂直
【发布时间】:2016-09-08 06:34:10
【问题描述】:

我正在制作一些在悬停时翻转但无法让变换原点垂直工作的卡片。它们应该有 50% 的原点,以便它们向上和向下移动一样多,但它们总是向下推。

http://codepen.io/rachelreveley/pen/oxVOeL

<div class="column">
    <div class="card-container card-1">
        <div class="card">
            <div class="front">
                <h3>Front</h3>
                <p>Front</p>
            </div>
            <div class="back">
                <h3>Back</h3>
                <p>Back</p>
                <p><a class="button">Resell with intY</a></p>
            </div>
        </div>
    </div>
    <div class="card-container card-2">
        <div class="card">
            <div class="front">
                <h3>Front</h3>
                <p>Front</p>
            </div>
            <div class="back">
                <h3>Back</h3>
                <p>Back</p>
                <p><a class="button">Resell with intY</a></p>
            </div>
        </div>
    </div>
    <div class="card-container card-3">
        <div class="card">
            <div class="front">
                <h3>Front</h3>
                <p>Front</p>
            </div>
            <div class="back">
                <h3>Back</h3>
                <p>Back</p>
                <p><a class="button">Resell with intY</a></p>
            </div>
        </div>
    </div>
</div>

body {padding: 30px;}
.card-container {perspective: 1000; display: inline-block; margin: 0 3rem;}
.card-container:hover .card,
.card-container.hover .card {
    transform: rotateY(180deg) scale(1.1);
}
.card-container, .front, .back {
    width: 210px;
    height: 297px;
}
.card {
    transition: 0.6s;
    transform-style: preserve-3d;
    position: relative;
     transform-origin: 50%;
}
.front, .back {
    backface-visibility: hidden;
    position: absolute;
    top: 0;
    left: 0;
    padding: 20px;
}
.front {
    background-color: #eee;
    color: #122d40;
    z-index: 2;
    transform: rotateY(0deg);   /* for firefox 31 */
}
.back {
    background-color: #1f7c8f;
    transform: rotateY(180deg);
}

【问题讨论】:

    标签: css animation transform


    【解决方案1】:

    这里有两个考虑,水平位置和垂直位置。

    要保持水平位置,您需要计算transform-origin 的正确值。

    您为 .front 和 .back 元素添加了内边距,这使元素的宽度总共增加了 40 像素。

    您可以使用 CSS calc 函数将偏移量计算为calc(50% - 20px),这似乎可行。

    要解决翻转后的.card 的垂直放置问题,在悬停时,您将.card 的大小放大 1.1,因此要保持翻转后的元素相对于其他元素垂直居中,您可以添加top 到过渡的偏移量。

    例如,如果你的卡片高度为 160px,那么卡片会高出 16px,所以 offset 设置top: -8x(因为.card 是相对定位的)。

    body {padding: 30px;}
    .card-container {perspective: 1000; display: inline-block; margin: 0 2rem;}
    .card-container:hover .card,
    .card-container.hover .card {
    	transform: rotateY(180deg) scale(1.1);
        top: -8px; /* compute offset: 160*0.1/2 = 8 */
    }
    .card-container, .front, .back {
    	width: 100px;
    	height: 160px;
    }
    .card {
    	transition: 0.6s;
    	transform-style: preserve-3d;
    	position: relative;
        top: 0;
    	transform-origin: calc(50% + 20px);
    }
    .front, .back {
    	backface-visibility: hidden;
    	position: absolute;
    	top: 0;
    	left: 0;
    	padding: 20px;
    }
    .front {
    	background-color: #eee;
    	color: #122d40;
    	z-index: 2;
    	transform: rotateY(0deg);	/* for firefox 31 */
    }
    .back {
    	background-color: #1f7c8f;
    	transform: rotateY(180deg);
    }
    <div class="column">
      <div class="card-container card-1">
        <div class="card">
          <div class="front">
            <h3>Front</h3>
            <p>Front</p>
          </div>
          <div class="back">
            <h3>Back</h3>
            <p>Back</p>
            <p><a class="button">Resell with intY</a>
            </p>
          </div>
        </div>
      </div>
      <div class="card-container card-2">
        <div class="card">
          <div class="front">
            <h3>Front</h3>
            <p>Front</p>
          </div>
          <div class="back">
            <h3>Back</h3>
            <p>Back</p>
            <p><a class="button">Resell with intY</a>
            </p>
          </div>
        </div>
      </div>
      <div class="card-container card-3">
        <div class="card">
          <div class="front">
            <h3>Front</h3>
            <p>Front</p>
          </div>
          <div class="back">
            <h3>Back</h3>
            <p>Back</p>
            <p><a class="button">Resell with intY</a>
            </p>
          </div>
        </div>
      </div>
    </div>

    【讨论】:

    • 嗨,我不这么认为。我去掉了 20px 的填充,当你悬停时卡片仍然向下推没有任何区别。
    • @TheReveller 对不起,我误解了这个问题。你能澄清一下吗?当您将鼠标悬停在卡片上时,卡片的顶部边缘应该在哪里?所以,当你悬停时,卡片是 1.1 倍大,所以翻转卡片的上边缘应该比未翻转的卡片略高,同样,下边缘略低于相同的量?
    • @TheReveller 我又尝试了一个解决方案,请有空的时候看看,谢谢。
    • 谢谢马克。做到了。我不明白为什么我不能设置垂直原点。添加职位感觉就像是 hack。
    猜你喜欢
    • 2014-07-20
    • 2014-05-22
    • 2019-03-03
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    相关资源
    最近更新 更多