我不得不實施工作,也許這個帖子這個問題,並會幫助別人,所以這裏是我想出了什麼(見jsfiddle)。首先,我的要求比翻轉div
有更多的高度面。此外:
- 翻轉卡下方有內容需要平滑上下移動(例如,另一個CSS翻轉),同時卡翻轉以適應不同的人臉高度。
- 內容on臉部以及翻蓋卡片的上下都必須堅持頁面的響應式設計,換句話說,卡片不能有任何固定的CSS尺寸和絕對定位。
- 支持所有主流瀏覽器,但只支持最新版本。
HTML是相同的問題 - 一個「卡」有兩個「面」:
<div class="flipcard">
<div class="flipcard-front">
<h1>Front</h1>
<p>some shorter content</p>
</div>
<div class="flipcard-back">
<h1>Back</h1>
<p>some long content</p>
...
</div>
</div>
CSS(看起來令人生畏,但實際上只是一對夫婦減線):
.flipcard {
position: relative;
height: auto;
min-height: 0px;
/* Flip card styles: WebKit, FF, Opera */
-webkit-perspective: 800px;
-moz-perspective: 800px;
-o-perspective: 800px;
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
-o-transform-style: preserve-3d;
-webkit-transition: min-height 1s ease-out 0s, -webkit-transform 1s ease-out 0.5s;
-moz-transition: min-height 1s ease-out 0s, -moz-transform 1s ease-out 0.5s;
-o-transition: min-height 1s ease-out 0s, -o-transform 1s ease-out 0.5s;
/* only height adjustment for IE here */
-ms-transition: min-height 1s ease-out 0s;
}
/* The class that flips the card: WebKit, FF, Opera */
.flipcard.card-flipped {
-webkit-transform: rotateY(180deg);
-moz-transform: rotateY(180deg);
-o-transform: rotateY(180deg);
}
.flipcard .flipcard-front,
.flipcard .flipcard-back {
top: 0;
left: 0;
width: 100%;
/* backface: all browsers */
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
backface-visibility: hidden;
/* Flip card styles: IE 10,11 */
-ms-perspective: 800px;
-ms-transform-style: flat;
-ms-transition: -ms-transform 1s ease-out 0.5s;
}
.flipcard .flipcard-front {
position: relative;
display: inline-block;
-webkit-transform: rotateY(0deg);
-ms-transform: rotateY(0deg);
-o-transform: rotateY(0deg);
transform: rotateY(0deg);
}
.flipcard .flipcard-back {
position: absolute;
display: none;
-ms-transform: rotateY(180deg);
-o-transform: rotateY(180deg);
transform: rotateY(180deg);
/* webkit bug: https://bugs.webkit.org/show_bug.cgi?id=54371,
You need this fix if you have any input tags on your back face */
-webkit-transform: rotateY(180deg) translateZ(1px);
}
/* The 2 classes that flip the faces instead of the card: IE 10,11 */
.flipcard .flipcard-front.ms-front-flipped {
-ms-transform: rotateY(180deg);
}
.flipcard .flipcard-back.ms-back-flipped {
-ms-transform: rotateY(0deg);
}
注:不幸的是IE瀏覽器的最新版本仍然處理CSS旋轉不同於所有其他的,因爲它需要每個臉是flipp單獨編輯而不是翻轉包含它們的卡片。儘管webKit瀏覽器,FF和Opera似乎「理解」了這一點,但我希望這些瀏覽器具有最大的向後兼容性,因此所有這些醜陋的瀏覽器前綴混亂(谷歌爲大衛沃爾什在翻轉卡上的偉大帖子)。其次,我希望舊版瀏覽器至少能夠顯示正確的內容,因此不可見(背面)必須是display: none
,而可見面必須是display: block-inline
,以避免頁面上方和下方的內容出現摺疊頁邊距。第三,可以通過控制牌min-height
屬性而保留height: auto
(credit)來實現翻牌後內容的移動。在輪換之前稍稍運行一下這個轉換就可以讓它變得非常流暢。
最後,使用Javascript:
function flipCard() {
var card = $('.flipcard');
var front = $('.flipcard-front');
var back = $('.flipcard-back');
var tallerHight = Math.max(front.height(), back.height()) + 'px';
// visible/invisible *before* the card is flipped ;D
var visible = front.hasClass('ms-front-flipped') ? back : front;
var invisible = front.hasClass('ms-front-flipped') ? front : back;
var hasTransitioned = false;
var onTransitionEnded = function() {
hasTransitioned = true;
card.css({
'min-height': '0px'
});
visible.css({
display: 'none',
});
// setting focus is important for keyboard users who might otherwise
// interact with the back of the card once it is flipped.
invisible.css({
position: 'relative',
display: 'inline-block',
}).find('button:first-child,a:first-child').focus();
}
// this is bootstrap support, but you can listen to the browser-specific
// events directly as well
card.one($.support.transition.end, onTransitionEnded);
// for browsers that do not support transitions, like IE9
setTimeout(function() {
if (!hasTransitioned) {
onTransitionEnded.apply();
}
}, 2000);
invisible.css({
position: 'absolute',
display: 'inline-block'
});
card.css('min-height', tallerHight);
// the IE way: flip each face of the card
front.toggleClass('ms-front-flipped');
back.toggleClass('ms-back-flipped');
// the webkit/FF way: flip the card
card.toggleClass('card-flipped');
}
此應用類翻轉卡/面。在轉換過程中,背面有一個position: absolute
,因此在卡轉動時它是可見的。同時,卡的高度已經過渡。在過渡結束時,可見面部返回到position: relative
,並且卡的高度被解除限制而留下響應頁面。
希望這有助於 - 抱歉這個漫長的職位,這是我第一次:)
這似乎引起了一個問題,「返回」側不再點擊。 (在Chrome 31.0.1650.63中測試了你的jsfiddle) – Luke
@Luke在這裏很好,相同的Chrome版本31.0.1650.63 m – Arbel