0

I have a card flip animation built with pure css. I was wondering if it's possible to have the card flip animation work only when someone clicks the "Link" <a> tag instead of hovering? I know this is possible with java script but I couldn't find anything to get this working with pure css. Could anyone point me in the right direction? Anything helps, thanks.

@import url('https://fonts.googleapis.com/css?family=Playfair+Display:400,400i,700,700i,900,900i');

@import url('https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i,800,800i');

html, body { 
  height: 100%;
  width: 100%; 
  margin: 0; 
  padding: 0; 
  background-color:#eaeaea;}

.container {
  width:900px;
  height:550px;
  background-color:white;
  position: absolute;
  top:0;
  bottom: 0;
  left: 0;
  right: 0;
  margin: auto;}

.right-div {
  width:540px;
  height:550px;
  background-image:url();
  transform:scale(1);
  background-position: -170px 0px; 
  background-size:cover;
  position: absolute;
  top:0;
  bottom: 0;
  right: 0;
  margin: auto;}

.left-div {
  width:323px;
  height:550px;
  background-color:white;
  position: absolute;
  top:0;
  bottom: 0;
  left: 0;
  margin: auto;}

.content-name {
    font-family: 'Open Sans', sans-serif;
    letter-spacing: 3px;
    font-size: 10px;
    text-transform: uppercase;
    color: #7E7E7E;    
    font-weight: 700;
    margin-top:160px;
    margin-left:40px;}

.content-title {
    font-family: 'Playfair Display', serif;
    font-size: 44px;
    letter-spacing: 3px;
    font-weight: 700;
    color: #2C2C2C;
    margin-top:10px;
    margin-left:40px;}

.content-description {
    margin-top: -20px;
    font-family: 'Open Sans', sans-serif;
    font-size: 13px;
    color: #7e7e7e;
    line-height: 22px;
    margin-left:40px;}

.content-link {
    position:absolute;
    margin-top:20px;
    color: #2C2C2C;
    font-family: 'Open Sans', sans-serif;
    letter-spacing: 3px;
    font-size: 11px;
    text-transform: uppercase;
    font-weight: 700;
    text-decoration: none;
    margin-left:40px;}





/*Flip*/

.flip-container {
  -webkit-perspective: 1000;
  position: fixed;
  top: 50%;
  left: 50%;
  /* bring your own prefixes */
  transform: translate(-50%, -50%);}

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

.flip-container, .front, .back {
 width: 900px;
 height: 550px;}

.flipper {
 -webkit-transition: 0.6s;
 -webkit-transform-style: preserve-3d;
 position: relative;}

.front, .back {
 -webkit-backface-visibility: hidden;
  position: absolute;
  top:0;
  bottom: 0;}

.front {
  z-index: 2;}

.back {
  -webkit-transform: rotateY(180deg);
  background: white;}
<div class="flip-container">
 <div class="flipper">
  <div class="front">
<div class="container">
  <div class="left-div">
      <p class="content-name">title</p>
      <p class="content-title">name</p>
    <p class="content-description">Sed ut perspiciatis unde omnis iste natus <br/> error sit voluptatem accusantium doloremque laudantium, totam rem aperiam.</p>
    <a href="#" class="content-link">Link</a>
  </div>
  <div class="right-div">
  </div>
  </div>
    </div>
    <div class="back">
      :p
  </div>
 </div>
</div>
David Kris
  • 799
  • 2
  • 10
  • 25

2 Answers2

1

It looks like you can do what you are looking for by using the :focus-within pseudo class:

.flip-container .flipper:focus-within  {
  -webkit-transform: rotateY(180deg);
}

@import url('https://fonts.googleapis.com/css?family=Playfair+Display:400,400i,700,700i,900,900i');

@import url('https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i,800,800i');

html, body { 
  height: 100%;
  width: 100%; 
  margin: 0; 
  padding: 0; 
  background-color:#eaeaea;
}

.container {
  width:900px;
  height:550px;
  background-color:white;
  position: absolute;
  top:0;
  bottom: 0;
  left: 0;
  right: 0;
  margin: auto;
 }

.right-div {
  width:540px;
  height:550px;
  background-image:url();
  transform:scale(1);
  background-position: -170px 0px; 
  background-size:cover;
  position: absolute;
  top:0;
  bottom: 0;
  right: 0;
  margin: auto;
}

.left-div {
  width:323px;
  height:550px;
  background-color:white;
  position: absolute;
  top:0;
  bottom: 0;
  left: 0;
  margin: auto;
}

.content-name {
    font-family: 'Open Sans', sans-serif;
    letter-spacing: 3px;
    font-size: 10px;
    text-transform: uppercase;
    color: #7E7E7E;    
    font-weight: 700;
    margin-top:160px;
    margin-left:40px;
}

.content-title {
    font-family: 'Playfair Display', serif;
    font-size: 44px;
    letter-spacing: 3px;
    font-weight: 700;
    color: #2C2C2C;
    margin-top:10px;
    margin-left:40px;
}

.content-description {
    margin-top: -20px;
    font-family: 'Open Sans', sans-serif;
    font-size: 13px;
    color: #7e7e7e;
    line-height: 22px;
    margin-left:40px;
}

.content-link {
    position:absolute;
    margin-top:20px;
    color: #2C2C2C;
    font-family: 'Open Sans', sans-serif;
    letter-spacing: 3px;
    font-size: 11px;
    text-transform: uppercase;
    font-weight: 700;
    text-decoration: none;
    margin-left:40px;
}


/*Flip*/

.flip-container {
  -webkit-perspective: 1000;
  position: fixed;
  top: 50%;
  left: 50%;
  /* bring your own prefixes */
  transform: translate(-50%, -50%);
}

.flip-container .flipper:focus-within  {
  -webkit-transform: rotateY(180deg);
}

.flip-container, .front, .back {
 width: 900px;
 height: 550px;
}

.flipper {
  -webkit-transition: 0.6s;
  -webkit-transform-style: preserve-3d;
  position: relative;
}

.front, .back {
  -webkit-backface-visibility: hidden;
  position: absolute;
  top:0;
  bottom: 0;
}

.front {
  z-index: 2;
}

.back {
  -webkit-transform: rotateY(180deg);
  background: white;
}
<div class="flip-container">
  <div class="flipper">
 <div class="front">
      <div class="container">
        <div class="left-div">
          <p class="content-name">title</p>
          <p class="content-title">name</p>
          <p class="content-description">Sed ut perspiciatis unde omnis iste natus <br/> error sit voluptatem accusantium doloremque laudantium, totam rem aperiam.</p>
          <a href="#" class="content-link">Link</a>
        </div>
        <div class="right-div">
        </div>
      </div>
    </div>
    <div class="back">
      :p
    </div>
  </div>
</div>
trevorp
  • 1,161
  • 1
  • 14
  • 19
  • So what Im asking is not possible with pure css? – David Kris Jun 07 '18 at 19:56
  • @ColeGwozdecki It looks like it can be done using `:focus-within` which has [decent support](https://caniuse.com/#search=focus-within) with modern browsers. See my updated answer above. – trevorp Jun 07 '18 at 20:09
0

This is basically abusing CSS, because this is a job for js.

Anyway you can achieve this using :target however the styling won't go away until something else in the document has been targeted.

div {
  background-color: orange;
  height: 100px;
  width: 100px;
  transition: transform 1.5s ease;
  backface-visibility: hidden;
}

div:target {
  transform: rotateY(180deg);
}
<a href="#test">Click to Flip</a>
<div id="test"></div>
Rainbow
  • 6,772
  • 3
  • 11
  • 28