Search code examples
javascripthtmlcssweb-deployment

Auto play video when hover


I am trying to create a music website.

But I have stuck in a situation where I need to show my viewers what this music video contains (Basically a 5sec video) when they hover over the thumbnail.

The size of the video(height and width) should be equal to the size of the thumbnail.

This is my code

* {
  margin: 0px;
  padding: 0px;
}

body {
  background-color: #f2f2f2;
  font-family: 'RobotoDraft', 'Roboto', sans-serif;
  -webkit-font-smoothing: antialiased;
}

* {
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
}

h5 {
  margin: 0px;
  font-size: 1.4em;
  font-weight: 700;
}

p {
  font-size: 12px;
}

.center {
  height: 100vh;
  width: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
}

/* End Non-Essential  */

.property-card {
  margin: 5px;
  height: 18em;
  width: 14em;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -ms-flex-direction: column;
  flex-direction: column;
  position: relative;
  -webkit-transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
  -o-transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
  transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
  border-radius: 16px;
  overflow: hidden;
  -webkit-box-shadow: 15px 15px 27px #e1e1e3, -15px -15px 27px #ffffff;
  box-shadow: 15px 15px 27px #e1e1e3, -15px -15px 27px #ffffff;
}

/* ^-- The margin bottom is necessary for the drop shadow otherwise it gets clipped in certain cases. */

/* Top Half of card, image. */

.property-image {
  height: 15em;
  width: 14em;
  padding: 1em 2em;
  position: Absolute;
  top: 0px;
  -webkit-transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
  -o-transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
  transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
  background-image: url('https://cdn.photographylife.com/wp-content/uploads/2017/01/What-is-landscape-photography.jpg');
  background-size: cover;
  background-repeat: no-repeat;
}

/* Bottom Card Section */

.property-description {
  background-color: #FAFAFC;
  height: 5em;
  width: 14em;
  position: absolute;
  bottom: 0em;
  -webkit-transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
  -o-transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
  transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
  padding: 0.5em 1em;
  text-align: center;
}

/* Social Icons */

.property-social-icons {
  width: 1em;
  height: 1em;
  background-color: black;
  position: absolute;
  bottom: 1em;
  left: 1em;
  -webkit-transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
  -o-transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
  transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
}

/* Property Cards Hover States */

.property-card:hover .property-description {
  height: 0em;
  padding: 0px 1em;
}

.property-card:hover .property-image {
  height: 18em;

}

.property-card:hover .property-social-icons {
  background-color: white;
}

.property-card:hover .property-social-icons:hover {
  background-color: transparent;
}
<body>
    <h1 style="text-align: center;">Relax</h1>
    <div class="center">
      <div class="property-card">
          <a href="#">
              <div class="property-image">
                  <div class="property-image-title"></div>
              </div>
          </a>
          <div class="property-description">
            <h5> Card Title </h5>
            <p>Lorem Ipsum Dipsum hortata. Mixcall Horcho. Mixwell Chingo. More Bingo. Lorem Ipum doth be hard.</p>
          </div>
      </div>
    </div>
</body>


Solution

  • You can add the video element and hide it. Add onmouseover event listener to your image and play the video for 5 seconds when they hover over the image and display the image back after 5 seconds video preview.

    var video = document.getElementById('video')
    var image = document.getElementById('image')
    
    image.onmouseover = function() {
      video.style.display = 'block'
      image.style.display = 'none'
      video.play()
      setTimeout(function() {
            video.pause()
            video.currentTime = 0
            video.style.display = 'none'
            image.style.display = 'block'
      }, 5000)
    }
    * {
      margin: 0px;
      padding: 0px;
    }
    
    body {
      background-color: #f2f2f2;
      font-family: 'RobotoDraft', 'Roboto', sans-serif;
      -webkit-font-smoothing: antialiased;
    }
    
    * {
      -webkit-box-sizing: border-box;
      box-sizing: border-box;
    }
    
    h5 {
      margin: 0px;
      font-size: 1.4em;
      font-weight: 700;
    }
    
    p {
      font-size: 12px;
    }
    
    .center {
      height: 100vh;
      width: 100%;
      display: flex;
      justify-content: center;
      align-items: center;
    }
    
    /* End Non-Essential  */
    
    #video {
      margin: 5px;
      height: 18em;
      width: 14em;
      display: none;
      object-fit: cover
    }
    
    .property-card {
      margin: 5px;
      height: 18em;
      width: 14em;
      display: -webkit-box;
      display: -ms-flexbox;
      display: flex;
      -webkit-box-orient: vertical;
      -webkit-box-direction: normal;
      -ms-flex-direction: column;
      flex-direction: column;
      position: relative;
      -webkit-transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
      -o-transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
      transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
      border-radius: 16px;
      overflow: hidden;
      -webkit-box-shadow: 15px 15px 27px #e1e1e3, -15px -15px 27px #ffffff;
      box-shadow: 15px 15px 27px #e1e1e3, -15px -15px 27px #ffffff;
    }
    
    /* ^-- The margin bottom is necessary for the drop shadow otherwise it gets clipped in certain cases. */
    
    /* Top Half of card, image. */
    
    .property-image {
      height: 15em;
      width: 14em;
      padding: 1em 2em;
      position: Absolute;
      top: 0px;
      -webkit-transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
      -o-transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
      transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
      background-image: url('https://cdn.photographylife.com/wp-content/uploads/2017/01/What-is-landscape-photography.jpg');
      background-size: cover;
      background-repeat: no-repeat;
    }
    
    /* Bottom Card Section */
    
    .property-description {
      background-color: #FAFAFC;
      height: 5em;
      width: 14em;
      position: absolute;
      bottom: 0em;
      -webkit-transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
      -o-transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
      transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
      padding: 0.5em 1em;
      text-align: center;
    }
    
    /* Social Icons */
    
    .property-social-icons {
      width: 1em;
      height: 1em;
      background-color: black;
      position: absolute;
      bottom: 1em;
      left: 1em;
      -webkit-transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
      -o-transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
      transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
    }
    
    /* Property Cards Hover States */
    
    .property-card:hover .property-description {
      height: 0em;
      padding: 0px 1em;
    }
    
    .property-card:hover .property-image {
      height: 18em;
    
    }
    
    .property-card:hover .property-social-icons {
      background-color: white;
    }
    
    .property-card:hover .property-social-icons:hover {
      background-color: transparent;
    }
    <body>
        <h1 style="text-align: center;">Relax</h1>
        <div class="center">
          <div class="property-card">
              <a href="#">
                  <div class="property-image" id="image">
                      <div class="property-image-title"></div>
                  </div>
                  <video id="video">
                    <source control src="https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.webm"
                            type="video/webm">
                </video>
              </a>
              <div class="property-description">
                <h5> Card Title </h5>
                <p>Lorem Ipsum Dipsum hortata. Mixcall Horcho. Mixwell Chingo. More Bingo. Lorem Ipum doth be hard.</p>
              </div>
          </div>
        </div>
    </body>