Home  >  Article  >  Web Front-end  >  CSS3 image flip switching case and analysis of important attributes

CSS3 image flip switching case and analysis of important attributes

WBOY
WBOYOriginal
2016-08-26 10:13:151616browse

Image flip switching, without using CSS3, generally use JS to implement animation, and simultaneously operate the width and left, or height and top of the element to simulate the flip effect, and change the src or z-index when appropriate. Picture switching.

I accidentally discovered the CSS3 solution, http://www.webhek.com/css-flip/. Learn it quickly and summarize it as follows

First upload the code (most of them are copied from the above link, there are big compatibility issues, use with caution)

HTML:

<div class="flip-container">
    <div class="flipper">
        <div class="front">here is content : AAdiv>
        <div class="back">here is content : BBdiv>
    div>
div> 

CSS:

.flip-container {
    margin: 30px;
    display: inline-block;
    border: 1px solid #aaa;
    -webkit-perspective: 500;
    -moz-perspective: 500;
    -ms-perspective: 500;
    perspective: 500;
    -ms-transform: perspective(500px);
    -moz-transform: perspective(500px); /*重要*/
    transform-style: preserve-3d; /*重要*/
}
.flipper {
    position: relative;
    width: 200px;
    height: 200px;
    transition: 0.6s;
    transform-style: preserve-3d; /*重要*/
}
/* 触发翻转 */
.flip-container:hover .flipper{
    transform: rotateY(180deg);

}
.front ,.back{
    position: absolute;
    left: 0;
    top: 0;
    backface-visibility: hidden;  /*重要*/
    width: 100%;
    height: 100%;
}
.front {
    transform: rotateY(0deg);
    z-index: 2;
    background: red;
}
.back {
    transform: rotateY(-180deg);
    background: green;
}
  • Set the perspective attribute of the entire animation area on the outermost container element.
  • When the outer container element encounters a mouseover event, the container storing the card inside rotates 180 degrees. This is also where the rotation speed is controlled. If you set the rotation value to -180deg, it is reverse rotation.
  • means that the elements on the front and back of the card must be absolutely positioned so that they block each other in the same position. Their backface-visibility property is set to hidden so that the back of each card is not visible when flipped.
  • Set the front of the card to a higher z-index value than the back, so that the front of the card is on top.
  • Rotate the back card 180 degrees so that it plays the role of the back.

End of copying, there are important comments in CSS that require special attention.

The

perspective property defines the distance of the 3D element from the view, in pixels. The intuitive phenomenon is that the inner element will overflow the outer border when flipped. If it is not written, or the attribute value is 0, it will only change within the outer border.

And special attention needs to be paid to the attribute value to adapt to the width and height of the element that needs to be flipped. Too little will overflow and it will be exaggerated. Too much will have little difference from setting it to 0. The difference effect is shown in the picture below

transform-style: preserve-3d; The transform-style attribute specifies how to render nested elements in 3D space (copied from w3cschool).

Both flip-container and flipper need to be set. If flip-container is not set, the overflow 3D effect will be missing. If flipper is not set, after the container is flipped, we will still see the back of the front. Backface-visibility: hidden cannot reflect the effect.

What’s more annoying is that transform-style is not supported even in IE11.

So there is another solution that is compatible with IE, which is not to flip the container, but to flip the front and back at the same time. Fortunately, IE still supports backface-visibility: hidden, so the flipping effect is the same as the previous solution.

HTML is as follows:

<div class="flip-container">
    <div class="front">here is content : AAdiv>
    <div class="back">here is content : BBdiv>
div>  

Since the front and back are flipped directly, the flipper becomes redundant and the flipper is removed.

The CSS code is as follows (after many tests, we tried our best to support various browsers, and downgraded browsers that did not support CSS3 flip, retaining the switching effect)

.flip-container {
    -webkit-perspective: 500;
    -moz-perspective: 500;
    -ms-perspective: 500;
    perspective: 500;
    -ms-transform: perspective(500px);
    -moz-transform: perspective(500px);
    -moz-transform-style: preserve-3d;
    -ms-transform-style: preserve-3d;
    margin: 30px;
    display: inline-block;
    border: 1px solid #aaa;
    position: relative;
}
/*由于内层绝对定位导致高度缺少,这里显式设置了宽高*/
.flip-container, .front, .back {
    width: 200px;
    height: 200px;
}

.flip-container:hover .front {
    -webkit-transform: rotateY(180deg);
    -moz-transform: rotateY(180deg);
    -o-transform: rotateY(180deg);
    -ms-transform: rotateY(180deg);
    transform: rotateY(180deg);
}
.flip-container:hover .back {
    -webkit-transform: rotateY(0deg);
    -moz-transform: rotateY(0deg);
    -o-transform: rotateY(0deg);
    -ms-transform: rotateY(0deg);
    transform: rotateY(0deg);
    z-index: 3; /* 降级处理不支持CSS3的浏览器,只是简单的将back上升盖住front */
}

.front, .back {
    -webkit-backface-visibility: hidden;
    -moz-backface-visibility: hidden;
    -ms-backface-visibility: hidden;
    backface-visibility: hidden;
    -webkit-transition: 0.6s;
    -moz-transition: 0.6s;
    -o-transition: 0.6s;
    -ms-transition: 0.6s;
    transition: 0.6s;
    position: absolute;
    top: 0px;
    left: 0px;
}
.front {
    background: red;
    z-index: 2;
}
.back {
    background: green;
    -webkit-transform: rotateY(-180deg);
    -moz-transform: rotateY(-180deg);
    -o-transform: rotateY(-180deg);
    -ms-transform: rotateY(-180deg);
    transform: rotateY(-180deg);
}

There may be a lot of unnecessary compatibility code in the above, and the level is limited. Welcome to exchange more concise writing methods.

There is also a little TIPS. When using hover to trigger element flipping in other situations, you should use it as follows. The parent element with fixed width and height triggers, and the child element flips

.outer {
    width: 200px;
    height: 200px;
}
.inner {
    transition: 0.6s;
}
.outer:hover .inner{
    transform: rotateY(180deg);
}

Triggering the flip directly on the element hover as follows will have a big usage problem, because during the flipping process of the element, the element area becomes smaller and the cursor is separated from the element, so the element is restored and the hover is triggered to become smaller, causing unsmoothness

.inner {
    width: 200px;
    height: 200px;
  transition: 0.6s; } .inner:hover{ transform: rotateY(180deg); }

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:sass primary grammarNext article:sass primary grammar