Coder Social home page Coder Social logo

russ-enterapp / opentok-layout-js Goto Github PK

View Code? Open in Web Editor NEW

This project forked from aullman/opentok-layout-js

0.0 2.0 0.0 99 KB

Layout Manager for OpenTok - automatically lays out your Publishers and Subscribers nicely

JavaScript 90.12% HTML 9.88%

opentok-layout-js's Introduction

Build Status Code Climate Test Coverage

opentok-layout-js

Automatic layout of video elements (publisher and subscriber) minimising white-space for the OpenTok on WebRTC API. This is intended for use with the OpenTok on WebRTC JS API.

It automatically detects when an element is added or when the container is resized and it adjusts the layout of its' children accordingly.

Demo

Demo of layout container in action

Dependencies

The OpenTok for WebRTC JS API is required.

Usage

Call initLayoutContainer and pass it the element you want it to layout. It works best if you set the position of the element to be absolute or relative. You will then be returned an object with a layout method that you can call to layout the page.

var layout = initLayoutContainer(document.getElementById("layout"), {
    maxRatio: 3/2,     // The narrowest ratio that will be used (default 2x3)
    minRatio: 9/16,      // The widest ratio that will be used (default 16x9)
    fixedRatio: false,  // If this is true then the aspect ratio of the video is maintained and minRatio and maxRatio are ignored (default false)
    bigClass: "OT_big", // The class to add to elements that should be sized bigger
    bigPercentage: 0.8  // The maximum percentage of space the big ones should take up
    bigFixedRatio: false, // fixedRatio for the big ones
    bigMaxRatio: 3/2,     // The narrowest ratio to use for the big elements (default 2x3)
    bigMinRatio: 9/16,     // The widest ratio to use for the big elements (default 16x9)
    bigFirst: true        // Whether to place the big one in the top left (true) or bottom right
});
layout.layout()

In an OpenTok application you would do something like:

<html>
<head>
    <title>Layout Container Example</title>
    <script src="http://static.opentok.com/v2/js/opentok.min.js"></script>
    <script src="js/opentok-layout.min.js"></script>
    <style type="text/css" media="screen">
        #layoutContainer {
            width: 320px;
            height: 240px;
            background-color: #DDD;
            position:relative;
        }
    </style>
</head>
<body>
    <div id="layoutContainer">
        <div id="publisherContainer"></div>
    </div>
</body>
<script type="text/javascript" charset="utf-8">
    var layoutContainer = document.getElementById("layoutContainer");

    // Initialize the layout container and get a reference to the layout method
    var layout = initLayoutContainer(layoutContainer).layout;

    // Below is a normal hello world OpenTok application for v2 of the API
    // The layout container will redraw when the layout mtehod is called and
    // adjust the layout accordingly
    var sessionId = "mySessionId";
    var token = "myToken";
    var apiKey = "myAPIKey";

    var session = OT.initSession(sessionId);
    session.on("streamCreated", function(event){
        session.subscribe(event.stream, "layoutContainer", {
            insertMode: "append"
        });
        layout();
    }).connect(apiKey, token, function (err) {
        if (!err) {
            session.publish("publisherContainer");
            layout();
        }
    });
</script>
</html>

Now any time you call the layout method the layout container will automatically be positioned and sized so that it minimises the white-space within the box given.

Resizing the Window

You want to call the layout method any time the size of the layout container changes. If the size of the container varies depending on the size of the window you may need to do:

var resizeTimeout;
window.onresize = function() {
  clearTimeout(resizeTimeout);
  resizeTimeout = setTimeout(function () {
    layout();
  }, 20);
};

This throttles calling layout so that it's not called over an over again when you're resizing the window.

Animations

If you want to animate things you can use CSS3 transitions on the children. eg.

.container > * {
  transition-property: all;
  transition-duration: 0.5s;
}

Big Elements

If you add the bigClass to elements in the layout container they will be treated differently. They are essentially in a layout container of their own which takes up bigPercentage of the space and has it's own settings for ratios (bigMaxRatio, bigMinRatio, bigFixedRatio).

You can have multiple elements which are treated as big elements which allow you to have all kinds of different layouts.

To see how this works try the demo and double click on elements.

Padding, Margins and Borders

The Layout Container will take into account the padding, margins and borders on it's children. If you want spacing between elements simply give them a margin or padding and they will be spaced accordingly.

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.