Coder Social home page Coder Social logo

alexfoxy / lax.js Goto Github PK

View Code? Open in Web Editor NEW
10.3K 100.0 488.0 4.96 MB

Simple & lightweight (<4kb gzipped) vanilla JavaScript library to create smooth & beautiful animations when you scroll.

License: MIT License

JavaScript 100.00%
parallax scroll effects transitions animation css

lax.js's Introduction

lax.js

Simple & lightweight (<4kb gzipped) vanilla JavaScript library to create smooth & beautiful animations when you scroll.

Lax 2.0 Gif

>> DEMO <<


What's new with Lax.js 2.0

Lax.js 2.0 has been completely re-written with a focus on modularity and flexibility giving you more tools to create awesome animations.

  • New javascript animation syntax, allowing for more advanced effect combos
  • Use any value to drive animations, for example mouse position, time of day .. and of course scroll!
  • Animations can be given inertia when scrolling
  • Create custom CSS bindings
  • Animation easings
  • And much more..

Examples

Documentation

1. Getting started

2. Going deeper

3. Glossary

Getting started

NPM Setup

# https://www.npmjs.com/package/lax.js

npm install lax.js
yarn add lax.js
import lax from 'lax.js'

HTML setup

<script src="path-to-lax.min.js"></script>
<!-- or via CDN -->
<script src="https://cdn.jsdelivr.net/npm/lax.js" ></script>

Setup

To implement lax you need to create at least one driver, to provide values for animations, as well as the element animation bindings. Below is a simple example:

<!-- JS -->
<script>
  window.onload = function () {
    lax.init()

    // Add a driver that we use to control our animations
    lax.addDriver('scrollY', function () {
      return window.scrollY
    })

    // Add animation bindings to elements
    lax.addElements('.selector', {
      scrollY: {
        translateX: [
          ["elInY", "elCenterY", "elOutY"],
          [0, 'screenWidth/2', 'screenWidth'],
        ]
      }
    })
  }
</script>

<!-- HTML -->
<div class="selector">Hello</div>

Using presets

The easiest way to get started is to use presets via html classes. For example:

<div class="lax lax_preset_fadeIn:50:100 lax_preset_spin"></div>

Multiple presets can be chained together and they can be customised to suit your needs. Use the preset explorer to explore effects and see a simple example here.

DOM behavior and usage with Frameworks

To increase performance, lax.js indexes the list of elements to animate when the page loads. If you're using a library like React, Vue or EmberJS, it is likely that you are adding elements after the initial window.onload. Because of this you will need to call lax.addElements when you add components to the DOM that you want to animate, and lax.removeElements when the component unmounts.

Please find a React example here. Other examples will be available soon for Vue.js and Angular.

Adding drivers

Drivers provide the values that drive your animations. To set up a driver just call lax.addDriver with a name and a function which returns a number. This method is called every frame to calculate the animations so keep the method as computationally light as possible. The example below will be the most common use case for lax which returns the scrollY position of the window.

lax.addDriver(
  'scrollY',                          // Driver name
  function(laxFrame) {                     
    return window.scrollY    // Value method
  },
  { }                                 // Options
)

Driver options

inertiaEnabled: boolean = false

If enabled, the driver will calculate the speed at which its value is changing. Used to add inertia to elements using the inertia element option.

See this in action in the here.

frameStep: number = 1

By default each driver updates its value every animation frame, around ~60 times per second. You can use the frameStep to reduce frequency of the driver value updating. For example a value of 2 would only update ~30 times per second and a value of 60 would only update about once per second.

Adding elements

You can add lax animations to an element using the addElements method:

lax.addElements(
  '.selector',  // Element selector rule
  {             // Animation data
    scrollY: {  
      opacity: [
        [0, 100],
        [1, 0]
      ]
    }
  },
  {             
    style: {}   // Element options
  }
)

Element options

style: StyleObject

Add static CSS to each element, for example:

{
  transform: '200ms scale ease-in-out';
}

elements: Array<DOM nodes>

Pass references to raw DOM elements to allow for more flexible selection patterns. In this case, a unique selector must still be passed as the first argument, however it does not need to be a valid DOM selector.

This allows the library to tag the elements for removal later. Example:

const myDomElements = $('.selector')

{
  elements: myDomElements
}

onUpdate: (driverValues: Object, domElement: DomElement) => void

A method called every frame with the current driverValues and domElement. This could be used to toggle classes on an element or set innerHTML. See it in action here.

The driver values are formatted as follows:

{
  scrollY: [  // Driver name
    100,      // Driver value
    0         // Driver inertia
  ]
}

Going deeper

Custom animations

Custom animations are defined using an object.

// Animation data
{
  scrollY: {                // Driver name
    translateX: [           // CSS property
      ['elInY', 'elOutY'],  // Driver value map
      [0, 'screenWidth'],   // Animation value map
      {
        inertia: 10        // Options
      }
    ],
    opacity: [
      // etc
    ]
  }
}

Driver name

The name of the driver you want to use as a source of values to map to your animation, for example, the document's scrollY position. Read about adding drivers here.

CSS property

The name of the CSS property you want to animate, for example opacity or rotate. See a list of supported properties here.

Some CSS properties, for example box-shadow, require a custom function to build the style string. To do this use the cssFn element option.

Value maps

The value maps are used to interpolate the driver value and output a value for your CSS property. For example:

[0, 200, 800]  // Driver value map
[0, 10,  20]   // Animation value map

// Result

| In  | Out |
| --- | --- |
| 0   | 0   |
| 100 | 5   |
| 200 | 10  |
| 500 | 15  |
| 800 | 20  |

Within the maps you can use strings for simple formulas as well as use special values. e.g:

['elInY', 'elCenterY-200', 'elCenterY',

See a list of available values here.

You can also use mobile breakpoints within driver value maps and animation maps for more flexibility.

scrollY: {
  translateX: [
    ['elInY', 'elCenterY', 'elOutY'],
    {
      500: [10, 20, 50], // Screen width < 500
      900: [30, 40, 60], // Screen width > 500 and < 900
      1400: [30, 40, 60], // Screen width > 900
    },
  ];
}

Options

modValue: number | undefined

Set this option to modulus the value from the driver, for example if you want to loop the animation value as the driver value continues to increase.

frameStep: number = 1

By default each animation updates its value every animation frame, around ~60 times per second. You can use the frameStep to reduce frequency of the animation updating. For example a value of 2 would only update ~30 times per second and a value of 60 would only update about once per second.

inertia: number

Use to add inertia to your animations. Use in combination with the inertiaEnabled driver option.

See inertia in action here.

inertiaMode: "normal" | "absolute"

Use in combination with inertia. If set to absolute the inertia value will always be a positive number via the Math.abs operator.

cssUnit: string = ""

Define the unit to be appended to the end of the value, for example For example px deg

cssFn: (value: number, domElement: DomElement) => number | string

Some CSS properties require more complex strings as values. For example, box-shadow has multiple values that could be modified by a lax animation.

// Box-shadow example
(val) => {
  return `${val}px ${val}px ${val}px rgba(0,0,0,0.5)`;
};

easing: string

See a list of available values here.

Optimising performance

Lax.js has been designed to be performant but there are a few things to bare in mind when creating your websites.

  • Smaller elements perform better.
  • Postion fixed and absolute elements perform best as they do not trigger a layout change when updated.
  • Off-screen elements do not need to be updated so consider that when creating your animation value maps.
  • The css properties blur, hue-rotate and brightness are graphically intensive and do not run as smoothly as the other available properties.

Glossary

CSS properties

name
opacity
scaleX
scaleY
scale
skewX
skewY
skew
rotateX
rotateY
rotate
translateX
translateY
translateZ
blur
hue-rotate
brightness

Special values

key value
screenWidth current width of the screen
screenHeight current height of the screen
pageWidth width of the document
pageHeight height of the document
elWidth width of the element
elHeight height of the element
elInY window scrollY position when element will appear at the bottom of the screen
elOutY window scrollY position when element will disappear at the top of the screen
elCenterY window scrollY position when element will be centered vertically on the screen
elInX window scrollX position when element will appear at the right of the screen
elOutX window scrollX position when element will disappear at the left of the screen
elCenterX window scrollX position when element will be centered horizontally on the screen
index index of the element when added using lax.addElements

Supported easings

name
easeInQuad
easeOutQuad
easeInOutQuad
easeInCubic
easeOutCubic
easeInOutCubic
easeInQuart
easeOutQuart
easeInOutQuart
easeInQuint
easeOutQuint
easeInOutQuint
easeOutBounce
easeInBounce
easeOutBack
easeInBack

lax.js's People

Contributors

0xflotus avatar afanjul avatar alexfoxy avatar antonreshetov avatar arthurdenner avatar bragovo avatar dependabot[bot] avatar madnificent avatar matixyo avatar okydk avatar patrickdesign avatar susiwen8 avatar tarunspartan avatar web-crab 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

lax.js's Issues

React hooks

Loving the library man! Keep it up :D super intuitive and yet customizable.

Been using 1.1.0 with React hooks and it was great! Just updated to 1.2.3 and something broke. Lax is still firing the update on scroll change but for some reason, the listening element is not reflecting the change.

React version: 16.8.6;

Currently out and on a mobile device, but would gladly give more information if you need!

Add anchored element width and height as new special values

When I need to use width/height of some anchored element I need to use this method:

...
data-lax-opacity="(vh) 0, 0 1, (-document.querySelector('.status').clientHeight+100) 1, (-document.querySelector('.status').clientHeight) 0"
data-lax-anchor=".status"
...

I don't know if exists another way to do this, but I think would be great to have special values as aelw and aelh to help on that.

Support for other CSS properties

Hello,

Are there any plans for adding support to other properties, such as width, height, top, left, padding, margin, etc...

Just curious, as if not, I'll look at another way to handle animating them on scroll :)

Typo in README.md

"Browser Betup" should be "Browser Setup". Love your library!

Cheers,
Kendall Jackson

Use of eval() is strongly discouraged

When spinning up a webapp with rollup and importing lax.js (in my case: I'm building a sapper app), it complains about laxxx using the eval statement, which supposedly is a security risk and may cause issues with minification. It's only a mild warning, but I'd be happy if you guys could switch out that eval with something else sometime 😉 Thanks.

Issue with Vue Router

I have added a mixin that removes the old lax elements and adds the new lax elements to my global lax instance. Unfortunately, this causes a route (after returning to it) to no longer animate properly. Not sure why.

Caveats:
Must be in the main component being routed to. It seems to work just fine otherwise.

lax.populateElements(), still broken

Hey brother, loving this tool so far. I'm still having the same issue with lax.populateElements() as #34, despite upgrading to 1.2.2 (which I see you published very recently)

Screen Shot 2019-04-03 at 1 54 42 PM

Translate rules are not being overwritten on page resize, as you can see here.

Feature Request: Animation Easings?

First of all, this is by far the best scroll effects library out there! I was looking for a lightweight alternative to the ScrollMagic + GreenSock stack and this is finally something really useful! Great job!

I was just wondering if there are any plans to add support for easings? Im using lax.js to add some decent scroll effects to our website. As some of the animations stop right inside the viewport, it would be nice if we could add some easing effects to have them slow down before the animation ends.

Lazy moves element down

When adding, for example, data-lax-preset="lazy-250" the element is shifted down the viewport by an amount relative to the strength. Is this expected behaviour?

NPM

Do you have plans to publish to NPM?

Responsive issues

Hi there, I'm using Bootstrap 4 (as many people) so for example, when using xs breakpoint (ie. mobile devices) some elements converts to "100% width blocks" so we need to avoid the animations.

As with laxxx library we are using data-attributes and we can't manage theme with media queries, is there any way to manage animations regarding breakpoints?

My suggestion:
Be able to define breakpoints in the setup:
lax.setup({breakpoints: {xs:0, sm:'576px', md:'768px', lg:'992px'}});

So we could use like this:

<div data-lax-xs-preset='' data-lax-md-preset='lazy'></div>
<p data-lax-md-opacity="0 1, 100 1, 200 0" data-lax-lg-opacity="100 1, 50 0, 200 0">

Is this supposed to work on iOS?

Just wondering if anyone has got this to work on iOS?

I've tested with Safari and Chrome and don't get the scroll effect. Just making sure I'm not doing something wrong here. I am using the smoothscroll plugin in addition.

Thanks for any info on this!

Responsive breakpoints have side effects

Hi Alex!

I'm very much enjoying your library, but I noticed an issue when adding the responsive code snippet.

Essentially, when I add:

lax.setup({
    breakpoints: { small: 0, large: 501 }
});

All my current animations break.

They then only start working again when I explicitly specify _small or _large on them.

Is there a way to have animations for all screen widths, and only apply the breakpoints to the few that require it? Right now I can't seem to see a way to use this breakpoint system where that behavior happens.

Hope there is a good solution to this :)

Stop after initial scroll

Hi,

Brilliant lib, just wondering if it would be possible at all for the animations to stop after a first initial scroll? I have put a window.onscroll that adds elements to do this currently but it's a bit hacky really.

Was wondering if there was intent to a single scroll function?

Drift functions

Another question regarding drift functions (I didn't check anymore) is that, typically (as web designer) you position an element in the "right position" without thinking in animations or so. After that, you plan to drop-in an animation library so the elements "appear animated" but you expect (I think) that the final position of the element stay in the "right position" you defined before, otherwise your element ends at 100px or 50px offset of the "right position".

So in my opinion (but maybe I'm wrong), functions like driftLeft (I didn't review anymore) should be like this:

driftLeft: (v=100) => { return { "data-lax-translate-x": 'vh ${v}, elh 0' } }, driftRight: (v=100) => { return { "data-lax-translate-x": 'vh ${-v}, elh 0' } },

So the element start "offsetted" and ends in the "right position" you originally had it. I don't know what is the consensus among other animation libraries... but I like to think that if for any reason the user lacks of javasript, the elements place the right position.

suggestion for READ.md

A suggestion for clarity to Usage with React, Vue.js & DOM changes which might be more concise.

Manage animations with javascript

Hello,

I have a website that have the same element many many time. That element always have the same class.

Instead of copying html attributes to all that elements with the preset I want to apply, I would like to be able to do it using javascript.

Your documentation don't mention that possibility, is it possible, and if yes, do you have a small code example ?

Thank you, and congratulation for this excellent plugin !

add/remove class on scroll?

Hi, thanks for the plugin. Great work!

Is there any way to trigger class add/remove on an element with it?

Animate elements outside the component which is scrolled.

I am not able to animate those elements which are outside the element which is been scrolled.
I have three parallel vertical divs. One div has element which can be scrolled and I want to animate an SVG which is in the other div which cant be scrolled, and not able to do so currently.

Using lax.js with Nuxt.js

When trying to use lax as the vue example got this error: "document is not defined" is there a workaround for using lax.js with SSR as a plugin or something ?

Using nuxt as "SPA" works properly.

Avoid the effect of intermittent animation when using regular mouse-wheels

Hi! In the readme file, I read the following:

  • Implement a tween for scroll wheels to remove reliance on smoothscroll
    288

If I understand you correctly, you need to avoid the effect of intermittent animation when using regular mouse-wheels (not Apple-magic-mouse or touchpad).

I think I can help do this in a demo example, and then we can add this to the api as an option

Library bugged on firefox

I am guessing this library has been made with only chrome in mind since it lags on nearly every other browser apart from chrome ?

console.error

Line 167:

console.error(`preset #{bits[0]} is not defined`)

Maybe:

console.error(`preset ${bits[0]} is not defined`)

Anchor has no effect on presets

The documentation states that "self" is the default anchor for presets, but I am unable to override it. Using a preset (built in or custom) I am unable to manually set an anchor with the data-lax-anchor attribute. It will use "self" regardless of what is supplied. This seems to be a bug?

Scrool Y for x pixels / 150vw then revert to normal scroll

Hey, I love this project!
i am just missing some functionality (or don't know how to apply it)

I do a lot of projects where I scroll an element on its Y axis until a certain point and then move on to scroll the page on the X-axis.

Or for example, PIN a section for an x amount of "length" and then continue to scroll normally...

For example (a recent project)
a mix between scrollMagic & Slick Slider...
https://www.scadafence.com/platform-technology/

Any way to achieve this or that using laxxx?

Missing lax.addElement(domElement)

The lax.js file has no function names addElement().

TypeError: lax_js__WEBPACK_IMPORTED_MODULE_9___default.a.addElement is not a function

I am using a create-react-app React Project and have done an npm install.
image

Cannot read property 'getBoundingClientRect' of null

I used laxxx.js on a website that is having gsap related scripts already available. I got the following error. Can you fix this issue?

Uncaught TypeError: Cannot read property 'getBoundingClientRect' of null
at Object.lax.calcTransforms (lax.js:1)
at lax.addElement (lax.js:1)
at NodeList.forEach ()
at Object.lax.populateElements (lax.js:1)
at Object.lax.setup (lax.js:1)
at window.onload (index.html:503)

Scroll-linked effects warning

This looks like a really excellent library. I have been avoiding these sort of techniques due to the following warning that firefox gives:

This site appears to use a scroll-linked positioning effect. This may not work well with asynchronous panning; see https://developer.mozilla.org/docs/Mozilla/Performance/ScrollLinkedEffects for further details and to join the discussion on related tools and features!

It would be nice if you acknowledged this warning in the readme, saying briefly how you overcome this problem so it's clear that this isn't going to break in a few browser versions.

How to set an ending point to the data-lax-translatex scroll effect?

I'm trying to set scroll effects using the lax library.

Here's my code:

<div class="coenter code herentainer-fluid outer">
    <div class="container-fluid inner" style="background: linear-gradient(180deg, rgba(255,255,255,0) 0%, rgba(255,255,255,0.17690826330532217) 50%, rgba(255,255,255,1) 94%), url(<?php echo get_field('block_6_background'); ?>) no-repeat;" />
    <div class="row h-100">
        <div class="col-md-12  align-self-center">
            <div class="container lax" data-lax-translate-x="vh 0, -elh (vw*0.4)" data-lax-anchor="self">
                <h1 class="text-white"><?php the_field('title_block_6'); ?></h1>
                <h2 class="text-white"><?php the_field('subtitle_block_6'); ?></h2>
            </div>
        </div>
    </div>
</div>

Is there a way to make the scroll effect inside .container .lax end just where the .container .lax itself ends?
Right now the h1 and h2 scroll until the end of the container-fluid, and that's not what I want!
I've been able to set the starting point of the scroll effect modifying the data-lax-translate-x="vh 0", but I can't make it end where I want!

Thanks for your help!

Add .babelrc to .npmignore (and other unnecessary files)

Hello!

Can't build my project via webpack because of .babelrc included in npm package (that requires presets i'm not using). Also npm loads other several unnecessary files, like docs, dev.

Quick fix for that is add .babelrc to .npmignore file.

Turn Animation Off

Is there a way to turn the animation off?? I'm trying to keep a website accessible and I am adding a toggle to disable animations do you have anything native to the library that will disable / stop the animations??

Styles - positioning absolute and from bottom

Hi.
Today i encoutered problem. I have image:
<img src="/images/top-building.png" class="bg-top-building lax" data-lax-translate-y="0 -300, (vh) 0" data-lax-anchor="self" />
and styles for it:
.bg-top-building{ position: absolute; z-index: 2; width: 100%; bottom:0; left:0; }
I've noticed that for some reason laxxx isn't calculating translation. All it does is set start values and while scrolling nothing changes. If i change bottom:0; to for example top:0; all acts as it should.

Any suggestion what can be the cause and fix for this behavior?

Not working with Gridsome

Trying to use it with Gridsome by adding this to main.js

import lax from 'lax.js'
export default function (Vue, {router, head, isClient}) {
  Vue.use(lax)
}

But it's not working :/

X Overflow on small devices

I'm trying to keep the animation on phones but it seems that elements overflow on the X axis and go outside the body thus stretching the screen size. How do I fix this issue?

Doesn't work with object already translated

I think this my just be a overhead on these elements and this library shouldn't care about them… on the other hand having elements already defining translation etc. respected would maybe broaden use cases.

provide a variable for the entire page content height?

this library is neat, i'm keen to have a go of it :)

however, i'm wondering if instead of just the viewport we could have a variable that is the computed height of the entire content? so we can have something at comes into focus as you scroll to the end of the content?

`vw` calculation includes scrollbar width

Using window.innerWidth as your basis for vw makes sense, but this includes the scrollbar width, which can throw off centering calculations.

To pull an element to center, it may make sense to do something like translating it to (vw*0.5-elw*0.5) which won't be exactly centered to any other centered content on the page that doesn't include scrollbar width.

Replacing window.innerWidth with document.body.clientWidthhere: https://github.com/alexfoxy/laxxx/blob/master/src/lax.js#L256 takes care of that.

It may also be useful to replace it for your breakpoint calculation: https://github.com/alexfoxy/laxxx/blob/master/src/lax.js#L328 but I haven't used that and so didn't test....

(Also, I was stuck for a while expecting vw to work like it does in CSS, so my 50vw was netting me crazy large numbers when I needed (vw*0.5). The information is in the readme, but it might be worth a line calling out that it's not used the same?)

Smooth scroll application - open source, better alternative

👋hi

The laxxx documentation mentions an app to smooth scroll out.

Scroll Wheels
Scroll wheels only increment the scroll position in steps which can cause the animations to look janky. You can use the SmoothScroll (http://www.smoothscroll.net/) plugin to smooth this out, however there maybe performance implications that need investigating.

https://github.com/alexfoxy/laxxx#scroll-wheels

This application is good but paid and linking to much better open sourced alternative is worth your consideration ☺️

https://github.com/Caldis/Mos

Good work on the lib 👏Keep it going!;)

Optimisations and changes to demo (index.html)

Love this new resource and would love to try and contribute as much as possible.

I feel that the index.html file inside the docs folder could be a little optimised by separating the js and css and also I have noticed the page lacks a title which could be displayed (something catchy or descriptive yet short).
also we could add some fork on GitHub or star go Github buttons to increase some reach and make it easy for people to access the repo from the website.

Would love to work on these as well, so please let me know what you think. 🥇
/cc: @alexfoxy

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.