css3反转动画,实现div反转技巧

作者: wxfeng 分类: web前端 发布时间: 2018-03-17 00:00

CSS动画非常有趣; 它们的美妙之处在于,通过许多简单的属性,您可以创建任何东西,从优雅的淡入淡出到WTF-Pixar等让人引以为傲的效果。因为时翻转效果,因此在给定容器的正面和背面都有内容。本教程将向您展示如何以尽可能简单的方式创建该效果。

快速提示:这不是关于这种效果的第一篇教程,但我发现其他的过于复杂。许多其他教程添加额外的样式代码样本,然后要求读者破译哪些是需要的,哪些不是。本教程避免了这个问题,只提供了必要的样式; 你可以用任何你想要的方式将翻盖的每一面都做得很漂亮。


观看演示

HTML

正如上面的描述,HTML结构与包含正面与反面

<div class="flip-container" ontouchstart="this.classList.toggle('hover');">
    <div class="flipper">
        <div class="front">
            front
        </div>
        <div class="back">
            back
        </div>
    </div>
</div>

有两个内容窗格,正如您所期望的那样,“前面”和“后面”,而且还包含两个包含具有由其CSS解释的特定角色的元素。还要注意ontouchstart允许窗格在触摸屏上交换的部分。很显然,如果你愿意的话,你应该把代码分解成一个单独的,不显眼的JavaScript块。

CSS

<style type="text/css">
/* entire container, keeps perspective */
.flip-container {
    perspective: 1000px;
}
/* flip the pane when hovered */
.flip-container:hover .flipper, .flip-container.hover .flipper {
    transform: rotateY(180deg);
}
.flip-container, .front, .back {
    width: 320px;
    height: 480px;
}

/* flip speed goes here */
.flipper {
    transition: 0.6s;
    transform-style: preserve-3d;

    position: relative;
}

/* hide back of pane during swap */
.front, .back {
    backface-visibility: hidden;

    position: absolute;
    top: 0;
    left: 0;
}

/* front pane, placed above back */
.front {
    z-index: 2;
    /* for firefox 31 */
    transform: rotateY(0deg);
}

/* back, initially hidden pane */
.back {
    transform: rotateY(180deg);
    background:#e67878;    
}
</style>

以下是对这个过程的粗略概述:

  • 外围容器设置了整个动画区域的视角

  • 内部容器是实际翻转的元素,当父容器悬停时旋转180度。这也是您控制转换速度的地方。将旋转更改为-180deg会使元素反向旋转。

  • 正面和背面元素的位置完全相同,因此它们可以在相同的位置“重叠”; 它们的背面可见性是隐藏的,所以翻转后的元素在动画过程中不显示

  • 前面的元素比后面的元素具有更高的Z-index,所以前面的元素可以先编码,但它仍然显示在顶部

  • 背部元素旋转180度,以充当背部。

这就是它的全部!将这个简单的结构放置到位,然后根据需要设计每一侧的样式!

来自CSS动画专家Ana Tudor的注解

overflow: hidden在卡片元素上应用特定值(如)的特定属性将禁止它具有3D转换的子元素。我认为这是相关的,因为我遇到了麻烦,overflow: hidden正是在这种情况下,3D变换元素的所有孩子都在同一个平面上,但是一个或多个孩子已经被旋转了180deg

CSS翻转切换

如果您希望元素仅通过JavaScript翻转命令,那么一个简单的CSS类切换可以实现这个功能:

.flip-container:hover .flipper, .flip-container.hover .flipper, .flip-container.flip .flipper {
    transform: rotateY(180deg);
}

将flip类添加到容器元素将使用JavaScript翻转卡 – 不需要用户悬停。类似JavaScript的评论document.querySelector("#myCard").classList.toggle("flip")会做翻转!

CSS垂直翻转

执行垂直翻转操作就像翻转轴并添加transform-origin轴值一样简单。翻盖的原点必须更新,并且卡片以其他方式旋转:

    .vertical.flip-container {
    position: relative;}

    .vertical .back {
        transform: rotateX(180deg);
    }

    .vertical.flip-container .flipper {
        transform-origin: 100% 213.5px; /* half of height */
    }

    .vertical.flip-container:hover .flipper {
        transform: rotateX(-180deg);
    }

你可以看到X访问被使用,而不是Y

Internet Explorer支持

Internet Explorer需要对标准翻转代码进行重大修改,因为它尚未实现所有现代transform属性。基本上,前面和后面的元素都需要同时翻转:

/* entire container, keeps perspective */.flip-container {
    perspective: 1000px;
    transform-style: preserve-3d;}
    /*  UPDATED! flip the pane when hovered */
    .flip-container:hover .back {
        transform: rotateY(0deg);
    }
    .flip-container:hover .front {
        transform: rotateY(180deg);
    }.flip-container, .front, .back {
    width: 320px;
    height: 480px;}/* flip speed goes here */.flipper {
    transition: 0.6s;
    transform-style: preserve-3d;

    position: relative;}/* hide back of pane during swap */.front, .back {
    backface-visibility: hidden;
    transition: 0.6s;
    transform-style: preserve-3d;

    position: absolute;
    top: 0;
    left: 0;}/*  UPDATED! front pane, placed above back */.front {
    z-index: 2;
    transform: rotateY(0deg);}/* back, initially hidden pane */.back {
    transform: rotateY(-180deg);}/* 
    Some vertical flip updates 
*/.vertical.flip-container {
    position: relative;}

    .vertical .back {
        transform: rotateX(180deg);
    }

    .vertical.flip-container:hover .back {
        transform: rotateX(0deg);
    }

    .vertical.flip-container:hover .front {
        transform: rotateX(180deg);
    }

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注