Giter VIP home page Giter VIP logo

snap.js's Introduction

Snap.js

A Library for creating beautiful mobile shelfs in Javascript

View Video Preview

View Demos

Features

  • Library Independent
  • High Customization
  • Flick Support
  • User Intent Detection
  • Disable Hyperextension
  • Event Hooks
  • CSS3 Powered Animations with IE fallbacks
  • Drag Support
  • Drag Handle Support
  • Programatic API
  • "No-Drag" Elements
  • Definable Easing Mode
  • Enable/Disable Events
  • Disabled Sides (left or right)
  • Supports Ratchet (with templates!)

Support

  • Firefox 10+
  • Wide Webkit Support (including Android WebKit 2.3.X)
  • IE 10
  • IE 9 Supports Toggling, Dragging but no Transitions
  • IE 7/8 Supports Toggling but no dragging or Transitions

Installation

As standalone just include the file in a script tag:

<script src="snap.js"></script>

As a web component do:

$ component install jakiestfu/Snap.js

Usage

var snapper = new Snap({
  element: document.getElementById('content')
});

Settings and Defaults

settings = {
    element: null,
    dragger: null,
    disable: 'none',
    addBodyClasses: true,
    hyperextensible: true,
    resistance: 0.5,
    flickThreshold: 50,
    transitionSpeed: 0.3,
    easing: 'ease',
    maxPosition: 266,
    minPosition: -266,
    tapToClose: true,
    touchToDrag: true,
    slideIntent: 40,
    minDragDistance: 5
}
  • element: The element which the user will be sliding side to side
  • dragger: The element which the user will be using to slide the target element side to side
  • disable: String, set to 'left' or 'right' to disable the respective side
  • addBodyClasses: Add classes to the body to signify which side is being opened
  • hyperextensible: If false, pane may not be slide past the minPosition and maxPosition
  • resistance: The cooeficcient used to slow sliding when user has passed max or min threshold
  • flickThreshold: Number of pixels the user needs to swiftly travel to activate a "flick" open
  • transitionSpeed: The speed at which the pane slides open or closed
  • easing: The CSS3 Easing method you want to use for transitions
  • maxPosition: Maximum number of pixels the pane may be slid to the right
  • minPosition: Maximum number of pixels the pane may be slid to the left
  • tapToClose: If true, tapping an open pane will close it
  • touchToDrag: If true, dragging the target settings.element will open/close the pane
  • minDragDistance: The minimum amount of pixels the user needs to drag within the slideIntent degrees to move the pane
  • slideIntent: The number of degrees the user must initiate sliding in towards the left or right (see diagram below)

Notes on Slide Intent: The slide intent is an int between 0 and 90, and represents the degrees in the first quadrant of a circle that you would like to have mirrored on the X and Y axis. For example, if you have 40 set as your slideIntent value, the user would only be able to slide the pane by dragging in the blue area in the diagram below. Once intent has been defined, it will not change until the user releases.

Public Methods

open: Opens the pane to the specified side

snapper.open('left');
// OR
snapper.open('right');

close: Closes the pane

snapper.close();

expand: Opens the pane entirely

snapper.expand('left');
// OR
snapper.expand('right');

disable: Disables sliding events

snapper.disable();

enable: Enables sliding events after disabling

snapper.enable();

on: Adds an event hook

snapper.on('start', function(){
  // Do Something
});

The available methods to hook into are as follows:

  • start: Fired when touching down on the draggable pane and it begins to move
  • drag: Fired when the pane has been moved or slid
  • end: Fired when the pane has been let go of
  • animating: Fired when the pane is animating
  • animated: Fired when the pane is finished it's animations
  • ignore: Fired when trying to drag the pane but ended up dragging on an ignored element
  • close: Fired when close is called directly or if tapToClose is set to true
  • open: Fired when the menu is opened
  • expandLeft: Fired on expand('left')
  • expandRight: Fired on expand('right')
  • enable: Fired on enable
  • disable: Fired on disable

off: Removes an event hook

snapper.off('drag');

The event names listed above apply for the off method.

settings: Updates the settings for an already instantiated object

snapper.settings({yourSettings});

Currently, settings.element, settings.touchToDrag cannot be updated. To update the element, instantiate a new object. To allow listening to a drag, use snapper.enable()

state: Returns detailed information about the state of the pane

var data = snapper.state();

The data returned from the state method will look like the following:

{
    state: "closed", // State of the Pane
    info:{
        opening: "left", // Side which user intends to open
        towards: "right", // Direction user is dragging towards
        hyperExtending: false, // True if user is pulling past predefined bounds
        halfway: false, // True if pane is at least halfway open
        flick: false, // True if user has moved pane X amount of pixels in the open/close direction without changing directions
        translation:{
            absolute: 20, // Pixels pane has translated
            relative: 21, // Pixels pane has translated relative to starting translation
            sinceDirectionChange: 10, // Pixels pane has translated since the direction of the pane has changed
            percentage: 40.571649 // The percentage that the Pane is open. Good or animating other things
        }
    }
} 

Gotchas

Layout

The layout itself is what most people will have a hard time emulating, so the simplest approach I have found is as follows:

Two absolute elements, one to represent all the content, and another to represent all the drawers. The content has a higher z-index than the drawers. Within the drawers element, it's direct children should represent the containers for the drawers, these should be fixed or absolute. Assigning classes to your drawers to specify which side it is on is recommended. All absolutely positioned elements should have 0 for top, left, right, bottom properties, excluding your panes which will have auto set to their respective sides and a width assigned. The width of your drawers is usually the same number you want to use for minPosition and maxPosition

div.drawers {position: absolute;}
    div.left-drawer  {position: absolute;}
        [content]
    div.right-drawer  {position: absolute;}
        [content]
div#content {position: absolute;}
    [top-bars]
    [content] {overflow: auto}
    [bottom-bars]

A sample layout is found in demo/apps/default.html.

Independent Scrolling

Some CSS is required to get some smooth ass scrolling. Utilize the CSS below to apply this to any of your elements:

.scrollable{
    overflow: auto;
    -webkit-transition-property: top, bottom;
    transition-property: top, bottom;
    -webkit-transition-duration: .2s, .2s;
    transition-duration: .2s, .2s;
    -webkit-transition-timing-function: linear, linear;
    transition-timing-function: linear, linear;
    -webkit-overflow-scrolling: touch;
}

Z-Indeces and Display

Because of the nature of this code, drawers are just kind of stacked behind the content. To bring the proper drawer to the front, you can hook into Snaps.js' CSS classes:

With addBodyClasses set to true in your initialize options, one of the two classess will be added to the body tag: .snapjs-left or .snapjs-right, depending on which pane is being open, respectively. This being said, you can apply your CSS like the following to show the proper drawers:

.snapjs-right .left-drawer,
.snapjs-left .right-drawer {
    display: none;
}

FAQ

- How do I make a toggle button?

Toggles have been a popular request, but rather than bog the library down with additional methods, you can utilize the powerful API of Snap.js to create your own toggle. Toggles can be done like the following:

myToggleButton.addEventListener('click', function(){

    if( snapper.state().state=="left" ){
        snapper.close();
    } else {
        snapper.open('left');
    }

});

- How do I disable Snap.js dragging for my touch slider?

Snap.js supports cascading cancellation of events via a data attribute data-snap-ignore. If you were to use a slider, your markup might look like the following:

<div class="slider" data-snap-ignore="true">
    <ul>
        <li><img src="slide.jpg"></li>
        <li><img src="slide.jpg"></li>
        <li><img src="slide.jpg"></li>
        <li><img src="slide.jpg"></li>
        <li><img src="slide.jpg"></li>
    </ul>
</div>

All interactions on children elements of the element with the data-snap-ignore attribute will have their Snap.js events ignored.

- I am using Push.js from Ratchet, I keep losing my events on my elements, how can I fix this?

Simple. As wack as Push.js is (yes, it is in desperate need of attention as of v1.0.0), we can still solve this problem with it's only callback, 'push'.

// The function that will initialize your Snap.js instance
var doSnap = function(){
    if(window.snapper){
         // Snap.js already exists, we just need to re-bind events
        window.snapper.enable();
    } else {
        // Initialize Snap.js
        window.snapper = new Snap({
            element: document.getElementById('content')
        });
    } 
};

window.addEventListener('push', doSnap);
doSnap();

- Snap.js works on my Android device but i cannot scroll the content in my drawers, what gives?

Older Android devices (and iPhone as well) do not have native support for overflow scrolling. To solve this, you may use the wonderful library called iScroll

- transform: translate3d() breaks my fixed child elements, how can I solve this?

This is a problem with Chromium and should be fixed soon. I would advise not having your direct children element set to fixed, that may possibly solve your problem.

- I am experiencing a weird flicker when the CSS transform is applied

To solve the flicker, apply the following CSS to the element in question

#content{
    backface-visibility:hidden;
    -webkit-backface-visibility:hidden; /* Chrome and Safari */
    -moz-backface-visibility:hidden; /* Firefox */
    -ms-backface-visibility:hidden; /* Internet Explorer 10+ */
}

Compliments

This code attempts to make your webapp's feel more "native". These other repos go well with it, too!

Licensing

MIT, dawg

snap.js's People

Contributors

cayasso avatar feng92f avatar jakiestfu avatar jbest84 avatar jrussell-ivantage avatar justindarc avatar nikolaiwarner avatar njj avatar raido avatar simonwaldherr 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  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  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  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

snap.js's Issues

SnapJS combined with Rachet Push function

Im prototyping and mobile app using both tools, managed to get links working with Ratchet's Push function but one thing still wrong.

I have two buttons on the "bar-title" that control both drawers, left and right.

The buttons are something like:

and the Javascript:

$('[data-toggle-panel]').click(function(){
var target = $(this).data();
snapper.open(target.togglePanel);
});

They all work on the first pageload, but once I open a new page, which again runs through Ratchet's push, the buttons won't work anymore.

The drag events still open the drawers though.

Am I doing something wrong or is there any incompatibility between both tools?

transform(translate3d(0px, 0px, 0px) breaks fixed position elements

When snapper object is "closed", the element has inline style set. If the element contains another element that has position:fixed, it no longer behaves as expected, and scrolls with the page content. Setting the -transform css property to -transform:none fixes the issue.

Uncaught TypeError: Cannot read property 'pageX' of undefined

Hi I'm occasionally getting this error in the console:

Uncaught TypeError: Cannot read property 'pageX' of undefined

And the console relates it to the following line in the script:
cache.startDragX = utils.hasTouch ? e.touches[0].pageX : e.pageX;

Any tips on what it might be?

adding checkbox toggle

Is it possible to implement a checkbox toggle which opens the drawer on check and closes the drawer on uncheck. Also this checkbox has to react on alternative ways of opening/closing the drawer (for instance: drag to open the drawer - checkbox checks, tap the content to close the drawer - checkbox unchecks)

Thanks!!!

Put the demo on a dedicated, fullscreen page

I can't really try out the demo, because when I try to slide, the whole browser content slides. And the demo box is so tiny. Please let me open the demo on a new page which contains it fullscreen (meta viewport etc.).

Better drag behavior detection.

I was wondering is it possible that there be a better drag behavior implemented to Snap.js? As I modified the demo to fit what I wanted to do with it, I made the content area to be scrollable. However, should I begin dragging the page diagonally (in both mobile and desktop), it becomes confusing already because the menu is opening halfway and the page is scrolling too.

Maybe I'm not doing it right. Please advise. :)

can't close the drawer when touchToDrag set to false

Unable to close the drawer with following setting:

touchToDrag: false,

I would like to disable drag feature and be able open/close drawers using just toggle botton(-s) as well as be able to close drawer when clicking on the content area (just like when touchToDrag is enabled)

Totally sick plugin btw, congrats.

Readme Incorrect

The readme specifies the event 'stop' exists when it is in fact 'end'.

Animation hotness

While I was looking around for an off-canvas menu solution I found another implementation that has a nice animation touch you may like to add to a wish-list ;)

Notice when the menu opens on this example (reduce browser window to see menu link):
http://dbushell.github.io/Responsive-Off-Canvas-Menu/step4.html

It uses a subtle .csstransforms3d to give a really nice feel to the open/close animation (the link is from a smashing mag article)

Another example of something very similar is the native google maps app for iOS - notice the 3d animation effect when opening and closing the right drawer menu.

It's small details but I think it really touches like this add to the 'feel'. Would be nice to see how it works for snap?

Percentage maxPosition

Hi

FIrst off... this is sweet.

Second... Is there any way to set the maxPosition as a percentage? I'm building a responsive site with quite a big font size in the nav that I'd like to scale up and down depending on the browser width... So I need to accomodate wider content in the draw and hence use a percentage as I don't want to end up with a massive draw on mobiles, but I need it nice and wide for desktops...

Any way I can do this?

Thanks in advance!

iOS swipe left when opened moves whole screen

Hi, not sure if anyone noticed but once the side bar is opened sometimes when you swipe left on the side bar the whole screen moves like if the rest of the page was just there. I tried something like:
$("#sidebar").on("swipeleft", this.preventEvent); //hammer.js library for events
$("#sidebar").on("dragleft", this.preventEvent);
But this doesn't seem to fix the issue. I still get the same problem intermittently on the demo and on my code. Not sure if there is an issue with something like overflow-x?

It works perfect on Android and I've just managed to reproduce this on iOS. Any ideas?

Android 2.3.x Webkit & Firefox Mobile

Hi I tested it on Android:

Webkit
The swipe transition starts but it's impossible to access to the menu

Firefox Mobile
It works but some areas are not repainted

IE8/9 support (sorry!)

Hi Jake,
I remember seeing an issue a little while back mentioning support for IE8 and 9 - is there any news on this?

The only thing stopping us using this in production is that the click toggle doesn't work in IE8 or 9 (it works fine in IE10).

We're trying to use snap in a responsive site, so at screen sizes below 980px snap is enabled. While its only a few users that still use narrower widths we have seen enough users using IE8/9 with smaller browser windows to justify needing to support them.

Did you get chance to look into why the open (and close) toggle doesn't respond in these browsers?

Many thanks again!

*REAL* CSS-Only Fix For Z-Index - SOLVED

The following CSS resolves the z-index issue on all screen sizes:

.snapjs-right .left-drawer,
.snapjs-left .right-drawer {
  display: none;
}

In the current solution that you have posted, the overlap of the drawers sometime affects touch events.

Can't close with flick when disabling a side

As the title says, when you disable one of the sides in the settings it's not possible anymore to close the tray by swiping in the opposite direction as you opened it. Can only be closed with tapping then.

Snapper.close() Double Runs if Button Called Too Long

Hey I noticed something else with Snap.js...you probably have noticed it too...I don't notice it as often or much on my iphone but on an iPad today...when I am on the demo app and clicking the Toggle open/close button. When I hold the button slightly too long, like a second

A lot of times it is so fast that I click the button and before I can pull my finger away, it is like clicking again so it does like a partial open/close or close/open real quick...so it doesn't open or close all the way, it starts one then reverses the process like a second later.

I am thinking, when the

snapper.open('left'); or snapper.close();

is called, if it would possibly Disable those calls for like
a second or 2 after the fact,it would prevent this from happening maybe.

UPDATE

Strangely enough I just tested the "Toggles" Demo and it does not seem to do it, just the Top left Toggle button on all the demo pages. Is anyone else seeing this?

Sliders combined with Snap.js

Is there any way to prevent Snap.js normal behaviour when the user is trying to drag a slider interface inside the main content?

One option viable in my case would to only allow Snap.js dragging on the title bar.

Thanks.

IE Support, why was this line added?

Hey Jake and everyone else that has contributed to this awesome bit of JS. I'm loving how polished and easy it is to add this interaction to a responsive site that I'm building. Everything is working great, but I do have a question about a particular line of code that was added in commit "b1f8718" related to IE support.

The line in question is 223, shown here:

settings.element.style.width = (win.innerWidth || doc.documentElement.clientWidth)+'px';

The line causes our container to grow much larger than intended and commenting it out seems to not cause problems for our application. Could you explain what the intent was for this line?

Thanks,

David.

IE10 touch taptoclose does not work

I found a minor issue with the latest IE fix commit.
Tap to close works fine using a real mouse or pen but it does not work with the touch event in IE10 (it was working before the commit). However overall great improvement for IE<10.

enable option

hello Jacob thks for this cool project

depending of the context I need to enable left, right or both drawers
what do you think about adding a parameter to the disable & enables functions

this should work?

        this.enable = function(side) {
            if (side === 'left' || side === 'right') {
                settings.disable = (side === 'left') ? 'right': 'left';
            } else if (side) {
                settings.disable = '';
            }
            if (settings.touchstart) {
                action.drag.listen();
            }
        };
        this.disable = function(side) {
            if (side) {
                settings.disable = side;
            } else {
                action.drag.stopListening();
            }
        };

Cascade "data-snap-ignore" Elements

If using data-snap-ignore="true", then all child elements also require the attribute to be present for dragging to be disabled down the tree. This proves to be a bit tedious for many-child elements.

<div id="container" data-snap-ignore="true">
    <div id="content">This will still drag</div>
</div>

<div id="container" data-snap-ignore="true">
    <div id="content" data-snap-ignore="true">Now it won't drag</div>
</div>

To have the data-snap-ignore="true" cascade down from the parent element would be great!

Thus said, I love what you've done in such short time! Very cool stuff!

Override clicks/touches to content element when shelf is open

When a shelf is open, touching the content element (if tapToClose is enabled) should only do tapToClose and ignore actual clicks to the content element.

For example, currently if a user taps the content element expecting to close the shelf but in the process they hit a link or button on the content element instead they will follow that link instead of closing the shelf.

Perhaps adding an invisible overlay to the content element to catch clicks?

Snap.js iPhone Address bar tap

Hey,

normally if you tap on the addressbar or the clock bar on the top of the screen the content of the page scrolls back to top.
if you use snap.js this feature is disabled, perhaps a bug or a feature.

Occasional unresponsive toggle

Hi again!

I've noticed that when clicking the open menu link with a mouse the trigger doesn't always close on the second click on the menu link icon.

This is noticeable on the default demo page - click on the menu icon to open then click on it again to close - it doesn't always respond to the second click for me?

Note that this does not appear to happen using touch, only with mouse?

Do you notice the same behaviour?

Error while dragging in mobile safari in iOs 6

when dragging I get the following error in the console, though everything seems to still work

line 368 TypeError: 'undefined' is not an object (evaluating 'e.touches[0].pageX')

I temporarily resolved the issue, with the following change to line 368 in snap.js, though It probably isn't the best way to do it :)

Was: cache.startDragX = utils.hasTouch ? e.touches[0].pageX : e.pageX;

I changed to: cache.startDragX = utils.hasTouch && e && e.touches[0] ? e.touches[0].pageX : e.pageX;

Toolbar Fixed

Hi,

Is possible fix #toolbar on top of page?
Now have position absolute and I need fixed

anyone have same problem?

my english is not very well, sorry

Snap.js Modes: Reveal, Push, Over

Current implementation: You drag the content area to the left/right to reveal the drawer that is visible below (in terms of z-depth) the content area.

I'd like to use it this way for our iOS app, however for Android I need a slightly different behavior:
On Android the new pattern suggests that you start dragging on the content area to actually move the revealing navigation from the left. The drawer will be on above the content, which is not moved at all.

image

Do you see anything like this being available as an option? To make this easier, I'd suggest to ignore the static Android header for now and keep it full page.

Source: http://developer.android.com/design/patterns/navigation-drawer.html

does not work in any version of IE

hi,
this is one of the best side panels i have ever seen, please make it work in IE

i get this error
Unable to get property 'snapIgnore' of undefined or null reference
snap.js, line 155 character 21

thanks in advanced.

Persistence of the Open/Close State by "Cookie"

Is possible to add a support (like a "cookie") to maintain the state of the menu if the user changes the page? Example: If clicked to open the menu and changed the page, the menu on this page starts open.

Broken in Firefox

Just tried implementing Snap on a site and I'm getting this error:

e.srcElement is undefined
[Break On This Error] if (e.srcElement.dataset.snapIgnore === "true") {
main.js (line 4957)

The same problem on your demo site :(

When right is disabled, right is not really disabled

Tested this in the example: http://jakiestfu.github.io/Snap.js/demo/apps/rightDisabled.html which ran 1.6.1 at the time of my test.

How to reproduce:

  1. Open http://jakiestfu.github.io/Snap.js/demo/apps/rightDisabled.html in Chrome
  2. Open the drawer on the left
  3. Drag the main #content as far to the left as you can

Expected behavior: dragging stops when the rightmost point of the #content comes into view again

Actual behavior: you can drag to the left as far as you can, and it will show the right drawer, even though it's disabled.

Licensing

What kind of license is Snap.js under?

UX Issue using tapToClose

I'm noticing a problem when tapping the content area to close the menu - if the user taps a link the drawer closes and they get immediately taken to the link tapped.

I think the expected behaviour would be tap the content area to close the menu then tap to choose a link - I'm noticing that in closing the menu, if the user taps an area where there is a link by accident, they get unintentionally taken to the link destination which is confusing.

I believe the facebook app on iOS uses the tap to close first behaviour.

From a UX point of view, maybe it would be helpful to add a transparent overlay (eg. 50% black) over the content area when the drawer opens to indicate that the content area is not accessible until the drawer is closed to reinforce the 'tap first to close' then use the page as normal?

Really great work on this, the best solution I've found for touch menus, looking forward to seeing it develop :)

Drag and closing the drawer doesn't work with version 1.6.2

Recently wanted to try to use this in a project and noticed that the example didn't work correctly. I could only open the drawer by clicking on the menu icon(dragging didn't work) and I couldn't close the drawer. Reverting to version 1.6.1 solved all issues.

Tested this in both Chrome and Firefox.

no version tags available for bower

Hi, there are no tags available for this project and the only way to checkout the code using bower is by the commit id like this:
"snapjs": "d0c557343c79317a189495944b4b0c9017d80f27"
Could someone that has permissions please tag the latest commit. Thanks.

Manipulating the browser history - history.pushState()

Hello there,

wouldn't it be great to improve the project by HTML5 History API? For example:

URL bar: http://yoursite.com/
snapper.open('left'); -> URL bar: http://yoursite.com/left-drawer-is-open
snapper.expand('right'); -> URL bar: http://yoursite.com/left-drawer-is-expanded-on-the-right
snapper.close(); -> URL bar: http://yoursite.com/

Some project:

Have any of you tried it?

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.