Giter VIP home page Giter VIP logo

react-video-cover's Introduction

React Video Cover

A small React component rendering a <video/> with object-fit: cover, or a Fallback if object-fit is not available.

Demo

http://tkloht.github.io/react-video-cover

Installation

npm install --save react-video-cover

Basic Usage

Let's say you have a video tag like this

<video src="golden-gate.mp4" />

Now you want to display this video so that it always fills some container, while keeping the correct aspect ratio. For this example the container will be 300px by 300px:

  <div style={{
    width: '300px',
    height: '300px',
    overflow: 'hidden',
  }}>
    <video src="golden-gate.mp4" />
  </div>

We can use object-fit: cover to let the video fill the container:

<div style={{
  width: '300px',
  height: '300px',
  overflow: 'hidden',
}}>
  <video
    style={{
      objectFit: 'cover',
      width: '100%',
      height: '100%',
    }}
    src="golden-gate.mp4"
  />
</div>

The only problem with this: object-fit is not implemented by IE 11. If you do not have to support IE, I would suggest that you stop right here. If you want to get the same effect in IE, simply replace the video tag with the react-video-cover component:

<div style={{
  width: '300px',
  height: '300px',
  overflow: 'hidden',
}}>
  <VideoCover videoOptions={{src: 'golden-gate.mp4'}} />
</div>

react-video-cover will set width: 100% and height: 100% because I think these are sensible defaults. You can use the style prop to overwrite it.

Here is the complete example, which also allows you to play/pause by clicking the video:

import VideoCover from 'react-video-cover';

class MinimalCoverExample extends Component {
  render() {
    const videoOptions = {
      src: 'golden-gate.mp4',
      ref: videoRef => {
        this.videoRef = videoRef;
      },
      onClick: () => {
        if (this.videoRef && this.videoRef.paused) {
          this.videoRef.play();
        } else if (this.videoRef) {
          this.videoRef.pause();
        }
      },
      title: 'click to play/pause',
    };
    return (
      <div style={{
        width: '300px',
        height: '300px',
        overflow: 'hidden',
      }}>
        <VideoCover
          videoOptions={videoOptions}
        />
      </div>
    );
  }
}

It is also available as Example 3 on the demo-page.

Props

videoOptions

type: Object
default: undefined
All members of videoOptions will be passed as props to the

style

type: Object
default: undefined

Additional styles which will be merged with those defined by this component. Please note that some styles are not possible to override, in particular:

  • object-fit: cover (when the fallback is not used)
  • position: relative and overflow: hidden (when the fallback is used)

className

type: String
default: undefined
Use this to set a custom className.

forceFallback

type: Boolean
default: false
This component will use object-fit: cover if available, that is in all modern browsers except IE. This prop forces use of the fallback. This is helpful during troubleshooting, but apart from that you should not use it.

remeasureOnWindowResize

type: Boolean
default: false
If set, an event listener on window-resize is added when the Fallback is used. It will re-evaluate the aspect-ratio and update the styles if necessary. This has no effect if the fallback is not used. The classic example where it makes sense to use this is when using a background video. If you need to react to different events to re-measure the aspect-ratio please see the onFallbackDidMount prop.

onFallbackDidMount

type: Function
default: undefined
Will be executed when the Fallback is mounted. The only parameter is a function, which can be used to force a re-measuring, for example after the size of the surrounding container has changed. Please note that this will only be invoked if the fallback is used, that is in IE. See ResizableCoverExample for an example implementation.

onFallbackWillUnmount

type: Function
default: undefined
Will be executed before the Fallback unmounts. You probably want to use this to clear any event-listeners added in onFallbackDidMount.

Development

To start a webpack-dev-server with the examples:

npm start

Then open http://localhost:3000/react-video-cover

To build the examples:

npm run build-examples

You can find the results in dist_examples.

To build the Component as published to npm:

npm run build

You can find the results in dist.

Contact

Find me on Twitter or write me an email. Of course you can also use Github issues or open a pull request.

Honestly, it would be really great to know if anyone actually uses my little component. I'm also happy to help if you run into any problems.

License

MIT

react-video-cover's People

Contributors

greenkeeperio-bot avatar jonnyburger avatar tkloht avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

react-video-cover's Issues

Possible to use multiple sources?

The HTML <video> tag allows for using multiple child <source> tags so that you can provide various formats of videos so that the video renders best on the browser being used (not just MP4 but also ogg/ogv and WebM). Is there a way to use these multiple sources?

Import Link

it would be nice to have the import link in the tutorial ... that's a very basic thing to show in as dependencies providers ... great work though

source from local mp4 file instead of http

I'm having trouble rendering a src file that is local to my project. It only works with an http address. Is there a way to fix this? I tried @ddkpham from #185 suggestion but haven't had luck with that either. here is my code rn.

import VideoCover from 'react-video-cover';
import motionsf from "../public/motionsf.mp4"


class Video extends Component {

    render() {
        const src = process.env.PUBLIC_URL + {motionsf};
        return (
          <div className="video-container">
            <VideoCover
              className="hero-video"
              videoOptions={{
                src: //"https://ak8.picdn.net/shutterstock/videos/1014944278/preview/stock-footage-technology-concept-data-communication-artificial-intelligence-aerial-smart-city-localization.mp4",
                // https://download.shutterstock.com/gatekeeper/W3siZSI6MTU1NzkwMjkyMywiayI6InZpZGVvLzEwMTQ5NDQyNzgvcHJldmlldy5tcDQiLCJtIjoxLCJkIjoic2h1dHRlcnN0b2NrLW1lZGlhIn0sIlVIU2RRa0hEZGNFVmEybnE0a2ExNVlRNFQxOCJd/1014944278-preview.mp4",
                autoPlay: true,
                loop: true,
                muted: true,
              }}
            />
            <div className="hero-caption">
              <div className="hero-caption-inner">
                <h1>Where Was That Filmed?</h1>
              </div>
            </div>
          </div>
        );
      }
}


export default Video;

thanks in advance

unloading before url change "chrome"

Im using chrome and when i change url the video unloads before the route changes.

which is causing a really annoying flash on my screen.

it doesnt do this on firefox as firefox seems to pause the video

not working on safari

this code work on google chrome , but not in safari
on safari I have just a white screen
Capture d’écran 2019-04-06 à 16 25 38
I use Gatsby js , there is any error in my log .

How to mute the video & loop on it ?

Hi there !

Thanks for this cool plugin.

I try to use it but have the following error:

Uncaught (in promise) DOMException: play() failed because the user didn't interact with the document first. https://goo.gl/xX8pDD

Video do not play alone while having the play() in componentDidMount

Thanks

Usage as background video

Hi @T-Obi! Awesome project!

I'm interested in using it as a background video (with other content on a layer above it), like here is done for an image:

<div class="hero" style="background: url(images/hero.jpg') center center / cover">
  <div class="outer-container">
    <div class="container">
      <div class="inner-container">
      Blah blah
      </div>
    </div>
  </div>
</div>

So here the "Blah blah" is show on top of the image. Is this possible with your video component in some way?

Cheers!

componentWillReceiveProps has been renamed

When trying to use the forceFallback property, I get the following error:

Warning: componentWillReceiveProps has been renamed, and is not recommended for use. See https://fb.me/react-unsafe-component-lifecycles for details.

* Move data fetching code or side effects to componentDidUpdate.
* If you're updating state whenever props change, refactor your code to use memoization techniques or move it to static getDerivedStateFromProps. Learn more at: https://fb.me/react-derived-state
* Rename componentWillReceiveProps to UNSAFE_componentWillReceiveProps to suppress this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. To rename all deprecated lifecycles to their new names, you can run `npx react-codemod rename-unsafe-lifecycles` in your project source folder.

Please update the following components: VideoCoverFallback

Add type definitions

Do you have any plan to support typescript by adding type definitions to the project?

Compatibility with React-video

Is this compatible with React-video? If not it would be an appreciated feature since react-video doesn't have react-video-covers behavior when scaling.

Thanks!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.