Giter VIP home page Giter VIP logo

stickybits's Introduction

⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️

This software is maintained under a new repository located at yowainwright/stickybits

⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️


StickyBits banner

Make things get sticky …in a good way


CircleCI npm version unpkg Greenkeeper codecov Share on Twitter


StickyBits 🍬

Stickybits is a lightweight alternative to position: sticky polyfills. It works perfectly for things like sticky headers.

Stickybits is awesome because

  • it can add a CSS Sticky Class (.js-is-sticky) when position: sticky elements become active and a CSS Stuck Class (.js-is-stuck) when they become stuck. See useStickyClasses.
  • it loosely mimics position: sticky to consistently stick elements vertically across multiple platforms
  • it does not have the jumpiness that plugins that are built around position: fixed have because it tries to support position: sticky first.
  • in its simplest use case, a scroll event listener will not be used if position: sticky is supported.
  • it is super simple & lightweight
  • it provides a wiki that digs deeply into fundementals of position: sticky and position: fixed and it works with them.

Installation   Setup   Usage   Feature   Options   Examples   Debugging   Notes   Contributing   Wiki


Installing from a package manager

yarn

yarn add stickybits

npm

npm i stickybits

Setup

Add dist/stickybits.min.js

Or as a module with import stickybits from 'stickybits'

Basic Usage

stickybits('selector');

By default, a selected stickybits element will

  • Stick elements to the top of the viewport when scrolled to vertically.
  • Stick elements at the bottom of their parent element when scrolled past.

Key Note: Stickybits expects and works best when the element that will become sticky is wrapped within a parent element that defines when the element starts being sticky and stops being sticky. See below for visual reference.

<main id="some-stickybit-parent">
  <nav id="some-stickybit-nav"></nav>
</main>

useStickyClasses Feature

Stickybits allows customers to add CSS to elements when they become sticky and when they become stuck at the bottom of their parent element.

By default, if position: sticky is supported, StickyBits will exit allowing the browser to manage stickiness and avoid adding a scroll event listener.

If the useStickyClasses argument is set to true then even if a browser supports position: sticky, StickyBits will still add a scroll event listener to add and remove sticky CSS Classes. This option is available so that CSS styles can use when StickyBits elements become sticky or stuck at the bottom of their parent.

To provide more feature richness to the Stickybits experience, a .js-is-sticky--change CSS class is added after the Stickybit element is sticky for a certain duration of scroll. By default this duration of scrolling is the height of the Stickybit element. The scroll duration for when .js-is-sticky--change is added can be modified by providing a number for customStickyChangeNumber option.

To use useStickyClasses:

stickybits('selector', {useStickyClasses: true});

Then, in css you can do:

.some-sticky-element.js-is-sticky {
  background-color: red;
}
.some-sticky-element.js-is-sticky--change {
  height: 50px;
}
.some-sticky-element.js-is-stuck {
  background-color: green;
}

View add css classes for more information on StickyBits CSS Classes.

Options

Vertical Layout Position

By default, a StickyBits element will stick to the top of the viewport when vertically scrolled to.

Stickybits loosely works for bottom positioning as well.

To have a StickyBits element stick to the bottom:

stickybits('selector', {verticalPosition: 'bottom'});

Custom Scroll Element

By default, if Stickybits uses window scrolling to define Sticky Elements. An element besides window can be used if window is undefined by selecting the desired scrolling element with the scrollEl option. For more custom sticky featuring, the scrollEl option can be used. However, those implementations require the implementing developers support.

To have Stickybit use an selector besides window:

stickybits('selector', {scrollEl: 'an-id'});

StickyBit Sticky Offset

By default, a StickyBits element will have a 0px sticky layout top offset. This means that the element will stick flush to the top of the viewport.

To have a StickyBits element stick with a 20px offset to its vertical layout position:

stickybits('selector', {stickyBitStickyOffset: 20});

StickyBits Cleanup

To cleanup an instance of Stickybits:

const stickybitsInstancetoBeCleanedup = stickybits('selector');
stickybitsInstancetoBeCleanedup.cleanup();

StickyBits Update

To update the calculations of an instance of Stickybits:

const stickybitsInstancetoBeUpdated = stickybits('selector');
stickybitsInstancetoBeUpdated.update();

Re-calculates each Stickybits instance's offsets (stickyStart, stickyStop). If the Stickybits implementer would like re-calculate offsets when the DOM window is resized or when the url changes. .update() can be invoked within an event listener.

const stickybitsInstancetoBeUpdated = stickybits('selector');
stickybitsInstancetoBeUpdated.update({ stickyBitStickyOffset: 20 });

More Stickybits Update Examples

// when the window is resized
const stickybitsInstancetoBeUpdated = stickybits('selector');
window.addEventListener('resize', () => {
  stickybitsInstancetoBeUpdated.update();
});
// when the url hash changes
window.addEventListener('hashchange', () => {
  stickybitsInstancetoBeUpdated.update();
});

Note: .update does not re-initialize classnames or pre-set calculations. Perhaps the update value can help you with that (see the paragraph below).

StickBits Update Props

Props can be updated to each instance by passing then into the .update function as an object.

// .update({ someProp: somePropValue })
const stickybitsInstancetoBeUpdated = stickybits('selector');
stickybitsInstancetoBeUpdated.update({ stickyBitStickyOffset: 20 });

StickyBits NoStyles

To use StickyBits without inline styles except for position: sticky or position: fixed:

stickybits('selector', {noStyles: true});

StickyBits Custom CSS Classes

To use custom CSS classes for Stickybits, add the appropriate properties and values.

parentClass:

stickybits('selector', {parentClass: 'new-parent-classname'});

stickyClass:

stickybits('selector', {stickyClass: 'new-sticky-classname'});

stuckClass:

stickybits('selector', {stuckClass: 'new-stuck-classname'});

StickyBits useFixed

To not use position: sticky ever, add the following key value to a stickybit initalization.

parentClass:

stickybits('selector', {useFixed: true});

To change all of the CSS classes

stickybits('selector', {
  parentClass: 'new-parent-classname',
  stickyClass: 'new-sticky-classname',
  stuckClass: 'new-stuck-classname',
  stickyChangeClass: 'new-sticky-change-classname'
});

StickyBits useGetBoundingClientRect

To not use offsetTop provide the optional boolean useGetBoundingClientRect. This feature is optimal when dealing with things like CSS calc which can throw off offsetTop calculations. Read more about this functionality here.

stickybits('selector', {useGetBoundingClientRect: true});

* For jQuery and Zepto support, read the jQuery notes below.

StickyBits applyStyle

If you want to take control of how styles and classes are applied to elements provide a function applyStyle. This is useful for example if you want to integrate with a framework or view library and want to delegate DOM manipulations to it.

stickybits('selector', {
  applyStyle: ({ classes, styles }, instance) => {
    // Apply styles and classes to your element
  }
});

Examples


Extended Examples


Have another example or question? Feel free to comment. 🙌

Notes

CSS Class Usage

3 CSS classes will be added and removed by Stickybits if position: sticky is not supported or if the useStickyClasses: true option is added to the plugin call. These Classes can be modified as desired. See the With Custom Classes example above.

  • js-is-sticky if the selected element is sticky.
  • js-is-stuck if the selected element is stopped at the bottom of its parent.
  • js-stickybit-parent so that styles can easily be added to the parent of a Stickybits element

Not a Polyfill

Stickybits is not a Shim or Polyfill for position: sticky because full support would require more code. This plugin makes elements vertically sticky very similarly to position: fixed but in a sticky sort of way. Read more about position sticky here or follow its browser implementation here.

Stickybits is a no dependency JavaScript plugin. It provides the smallest API possible in both features and kb size to deliver working sticky elements. This means that opinionated featuring is left out as much as possible and that it works with minimal effort in Frameworks.

CSS when position: sticky is not supported

Sticky Start and Sticky Stop: Because Stickybits is minimal, when position: sticky is not supported Stickybits will use position: fixed which is relative to the browser window. If the StickyBits parent element has a height recognized by the browser, Stickybits will take care of the sticky top and sticky bottom invocation. If the parent's height is not recognized by the browser there will be issues.

Left and Right Positioning: With position: fixed the Stickybit element will work relative to the browser window by default. To work with this issue, there are several options. Some are noted here. More solutions to come!

jQuery and Zepto Usage

Basic

$('selector').stickybits();

With scrollEl

$('selector').stickybits({scrollEl: '#scrollEl'});

// or

const el = document.querySelector('#scrollEl');
$('selector').stickybits({scrollEl: el});

With .update

const  instance = $('selector').stickybits();
instance.update();

With useStickyClasses

$('selector').stickybits({useStickyClasses: true});

With verticalPosition

$('selector').stickybits({verticalPosition: 'bottom'});

With stickyBitStickyOffset

$('selector').stickybits({stickyBitStickyOffset: 20});

Debugging

Stickybits 2.0 provides the same API but with more debugging feedback.

To view the Stickybits API in it's simpliest form:

const  stickybit = stickybits('a selection');
console.log(stickybit);

For more debugging and managing Stickybits, view the wiki.


Utility properties

Stickybits provides both version and userAgent properties which were added to offer insight into the browser and Stickybits.

These utility properties can be accessed as direct child properties of the instantiated Stickybits item.

const stickybit = stickybits('a selection')
stickybit.version // will show the version of stickybits being used
stickybit.userAgent // will show which userAgent stickybits is detecting

Browser Compatibility

Stickybits works in all modern browsers including Internet Explorer 9 and above. Please file and issue with browser compatibility quirks.

Contributing

Please contribute to Stickybits by filing an issue, responding to issues, adding to the wiki, or reaching out socially—etc.

Stickybits is a utility. It may often not be needed! With shared understanding of position: sticky and position: fixed along with product awareness, Stickybits can improve as can a shared understanding of the "sticky element issue". Is this paragraph over-reaching? Yes! Help improve it.

Thanks

This plugin was heavily influenced by Filament Group's awesome Fixed-sticky jQuery plugin. Thanks to them for getting my mind going on this a while back. Thanks to Peloton Cycle's Frame Throttle for an insightful solve for optimizing frame throttling.

Architecture discussions and Pull Request help has been provided by Jacob Kelley, Brian Gonzalez, and Matt Young. It is much appreciated!


Created and maintained by Jeff Wainwright with Dollar Shave Club Engineering.

More great contributors

stickybits's People

Contributors

acollectionofatoms avatar ajithbhat avatar alexey-m-ukolov avatar anilanar avatar artjomsimon avatar artskydj avatar athena0304 avatar awcross avatar baklazaner avatar bkeroackdsc avatar briangonzalez avatar browner12 avatar danielruf avatar eddiesigner avatar frankmerema avatar greenkeeper[bot] avatar hacknug avatar jakiestfu avatar jnachtigall avatar krasnoukhov avatar maurer2 avatar mbark avatar nextgenthemes avatar pestbarn avatar renovate[bot] avatar tvald avatar yowainwright avatar yuseiueno 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

stickybits's Issues

Question: Scroll event along with RAF

I've never seen a scroll event that uses Request Animation Frame in the event function. Is there somebody that can help me understand the reason why that's the approach for this project? Would it not be better to use only RAF?

Passive scroll listener

Doesn't it make more sense to use a passive scroll listener as preventDefault() is not used?

Perhaps mention that you may need z-index to a high value set in the docs

For some reason I had to use

z-index: 10; /* in front */

a lot for the elements I set sticky, even though nothing else on the page had a z-index, otherwise they scrolled behind whatever other things were in the same container. I didn't notice because my element was really skinny, so for a while I just thought they were just stuck in place and nothing was working, heh.

The behavior is different when using native position: fixed where I didn't have to set the z-index.

Cleanup method?

Is there any way to stop and clean up an instance of stickybits? If not, it would be nice to add one. For example, if you want to use the stickybits within a React component, it would be good to be able to remove it (especially the event listener added by manageStickiness()) when the component is unmounted.

Failure to stick properly in Chrome on 3rd child

I've copied a fairly simple Codepen demo I found and have embellished it slightly.
Link to my pen: https://codepen.io/IanYates/pen/ZyaQXZ

In latest Chrome (Version 61.0.3135.5 (Official Build) dev (64-bit)) on Windows you can scroll down and get image 1's header behaving properly, and image 2's header behaving properly but image 3's header doesn't stick.

In IE 11 this seems to work properly.

The CodePen I originally sourced from (https://codepen.io/yowainwright/pres/QdedaO) had a slightly older JS version that didn't work in IE 11. I've updated its JS code to the latest from the dist folder here. Apart from that change, and adding some more divs and the img elements, everything is the same.

I've tried multiple stickybits calls (targeting a specific div each time) and using a single stickybits call (selector targets all child divs). No difference.

With only 2 images it seems to behave correctly.

Any thoughts?

Thanks for the library - it came up in my Google news feed and happens to be exactly what I've been looking for :)

How does StickyBits check if the browser supports position: sticky?

Hi!

I'm evaluating StickyBits for use in the (React) app I'm developing, and it's important to me that the library exits (i.e. doesn't attach an event listener) if the browser supports position: sticky.

I tried looking at the source code and couldn't find any check for the browser support.

Please let me know if this isn't the right place to post this.

Callback function OR body class?

Hi,

I need to make some changes to other elements on the page outside of the stickybits parent element when the selected element becomes sticky. If the stickybits classes were also applied to the body I could hook my CSS transitions off that. An alternative is an option for a callback function perhaps.

Any ideas the best way I can achieve this?

Add typings for Typescript and export Stickybit class

It would be nice if the library would contain typings for Typescript, which would offer users to use this library in a Typescript project instead of doing import * as stickybits from 'stickybits'.

Also it would be nice to export the Stickybit class, to use it only for a single element without creating a Multibits instance.

Release 1.3

Hey,
Just wondering when you'll release 1.3 to npm? Thanks!

Ability to define class names

Thanks for the great plugin!

We are using css modules, which basically manages class names to avoid name conflicts. Therefore, it would be useful to be able to define the class names by yourself.

As far as I can see from the source, this is not currently possible?

As an example:

import styles from './styles.module.css';
// ...
stickybits(element, { useStickyClasses: true, classNames: { isStuck: styles.isStuck } });

Doesn't work in Google Chrome 55

None of provided codepen examples works in Google Chrome 55 on Ubuntu Linux. In Firefox all works as expected.
Error in Chrome devtools console:
se.getBoundingClientRect is not a function at Stickybit.manageStickiness

Going back to 'normal' state ?

I've an element on the top of mobile page and it sticks on top as expected 👍 after using
stickybits('#title')
I'd love to have ability to go back to normal state when somebody scrolls to the top - is it possible to achieve this someway ?

Sticky Classes aren't toggling properly if scrolltop not 0 on anchor load.

I'm using this library in part due to the sticky class toggling (as well as for the polyfill). Although I've ran into some issues for when the class is added or removed.

If the scroll position is not at 0 on pageload, the sticky classes don't get added properly. for instance, if the page loads on an anchor (id hash), the script thinks that's where the page head is. ( you scroll up and the stickyclass is added, but you scroll down to that anchor point, and the stickyclass is removed).
Likewise, if you scroll down a little ways, and reload (without a url hash), the stickyclass is always present, and never removed.

Here's my bin, blue header background is not sticky, purple background is sticky.
http://jsbin.com/rejuramuku/1/edit?html,css,console,output

You will have to view the bin without the editor in order to refresh with an anchor hash url. http://jsbin.com/rejuramuku/

Allow Stickybits scroll event to be bound to elements besides window for Internet Explorer (or `useStickyClasses`)

Hello,

I'm looking to use stickybits for the project that I'm on. However, branched off of your example and replaced the html/css with my own layout. When I loaded this example on Edge and IE I am not seeing sticky behavior. It works on all other browsers I've tried so far.

Here's the code pen that I've been working with https://codepen.io/bxyoung89/pen/BZeyaE

My intention is to have the yellow section be sticky (as it is in chrome) but it doesn't seem to be moving as it should.

js-is-stuck does not seem to be added when sticky is supported

I'm using the latest version of chrome which supports position: sticky. Unfortunately I'm noticing that js-is-stuck does not seem to be added. Is this a known issue?

I'm defining my sticky element with jquery

$('#element').stickybits({useStickyClasses: true});

The element is sticking correctly but the isStuck just does not work.

Set width of sticky element if `position: fixed`

Am I correct in understanding that in IE, as css sticky is not supported, this will add a position:fixed? I ask because I am dealing with a div inside a flexbox item. If I position fixed it, it looses it's parents width and no longer behaves as if it is contained in the parent. Thank you (sorry, not sure how to add the "question" label.)

Option to disable polyfill part of library

I've realized that the way I use this library, it's basically only for the styling provided by the "sticky" and "stuck" classes. It's much easier to polyfill my app in css than relying on the classes added by the js because the css is more extensible.

The js is fighting against my stylesheets by overriding properties on the element in an attempt to implement the 'polyfill' but I don't really need it at all. I banged my css with !important everywhere to get rid of it, but a disablePolyfill on the options would be nice (it could be ligher on the client if it skips the polyfill part).

Also, ability to set the name of the classes js-is-sticky and such should be ony a 1-liner as it's already set using a const.

How can I detect when element is stuck to top of viewport?

From what I can tell, the js-is-sticky class is added when the element gains the ability to stick, and the js-is-stuck class is added when the element sticks to the bottom of its parent. But how do we tell when the element has gotten stuck to the top of the viewport? I thought the js-is-sticky class indicated the element was stuck to the top of the viewport. But it only indicates the element's position is set to sticky.

I made this Codepen to demonstrate: https://codepen.io/matthewmcvickar/pen/VzbqLN

The green toolbar in that example gets the js-is-sticky class after the viewport has been scrolled a few pixels, but I don't want it to get that class until it starts sticking to the top of the viewport. Is this possible?

[NOTE: This is a bug! I was right in my initial interpretation of what js-is-sticky means.]

[TL/DR: This happened because my sticky element wasn't the first child of its parent. Until this bug is fixed, I rearranged the HTML to wrap it differently as a workaround, and now this works.]

About stickybits and breakpoints

Is there any way to disable/enable the plugin under/over a certain breakpoint? I only need my columns to be sticky when they're sitting side by side and not collapsed on top of each other.

Right now I'm using a couple of !important to override the plugin inline styles but ideally it shouldn't add them when I don't need it to do nothing.

Classes not applied after refreshing scrolled page

When refreshing a scrolled website, the browser automatically tries to keep your position. This causes stickybits not to apply its classes even if the option is set to true. I think classes should be there just as inline-styles are.

Here's a dev link where you can check this issue (http://dev.llos.co/cupofcouple/jessica-barensfeld-simon-howell/). If you want to see how the element gets stuck at the bottom you'll need to expand the comments section (just tap on the "Comments (N)" link to do that.

Bottom sticky doesn't update until you scroll onto its parent

If you have something above the parent containing the bottom sticky, it doesn't move the bottom sticky into place until the top of the page passes the top of the parent element, and then it jumps into place at the bottom.

Tested on Firefox with bottom sticky settings:
{useStickyClasses: true, stickyBitStickyOffset: 0, verticalPosition: "bottom", customVerticalPosition: true}

Expected behaviour:
Bottom sticky snaps to bottom of view as soon as possible (i.e. snaps midway into parent element on page load).

Should Stickybits provide the ability to automatically stick elements to the bottom of the viewport?

Firefox 54.0.1 (32-bit)
Chrome Version 59.0.3071.115 (Official Build) (64-bit)

{useStickyClasses: true, stickyBitStickyOffset: 0, verticalPosition: "bottom", customVerticalPosition: true}

Works on Firefox, but on Chrome it does nothing. It adds position: sticky; but no position: bottom, so the element doesn't stick to anything.

I've heard that pushing 0 to css without a px causes issues on Chrome, might be a similar issue here.

Object doesn't support `getBoundingClientRect` (found in IE10)

Steps to reproduce

  1. Apply stickybits to an existing element without providing a scrollEl option.
  2. Open on IE10 in Windows 7.

What should happen

Sticky bits galore!

What actually happens

In IE10 on Windows 7, I'm getting the following error:

Object doesn't support property or method `getBoundingClientRect`

screen shot 2017-08-03 at 10 20 32

From looking at the minification it becomes clear that this error is coming from stickybits.js, line 74. Since I have initialised without option scrollEl, se should be window.

I don't see any documentation saying that window should support getBoundingClientRect(), so perhaps se should default to document.documentElement?

Should Stickybits provide a public `positionVal` for `position: sticky || fixed`?

I think it would be a good idea to add a boolean property to the stickyBits instance, which indicates if the plugin is using the native implementation of position: sticky.

This would allow users to simply check via JavaScript if the position: fixed "polyfill" is active or not, to for example apply additional styles dynamically.

I'm thinking of a property called isNative or isUsingNative. Also a property which indicates that the instance is using position: fixed would work (like for example: isPolyfilled).

An in-range update of eslint-plugin-import is breaking the build 🚨

Version 2.4.0 of eslint-plugin-import just got published.

Branch Build failing 🚨
Dependency eslint-plugin-import
Current Version 2.3.0
Type devDependency

This version is covered by your current version range and after updating it in your project the build failed.

As eslint-plugin-import is “only” a devDependency of this project it might not break production or downstream projects, but “only” your build or test tools – preventing new deploys or publishes.

I recommend you give this issue a high priority. I’m sure you can resolve this 💪

Status Details
  • continuous-integration/travis-ci/push The Travis CI build could not complete due to an error Details

Commits

The new version differs by 10 commits.

  • 44ca158 update utils changelog
  • a3728d7 bump eslint-module-utils to v2.1.0
  • 3e29169 bump v2.4.0
  • ea9c92c Merge pull request #737 from kevin940726/master
  • 8f9b403 fix typos, enforce type of array of strings in allow option
  • 95315e0 update CHANGELOG.md
  • 28e1623 eslint-module-utils: filePath in parserOptions (#840)
  • 2f690b4 update CI to build on Node 6+7 (#846)
  • 7d41745 write doc, add two more tests
  • dedfb11 add allow glob for rule no-unassigned-import, fix #671

See the full diff

Not sure how things should work exactly?

There is a collection of frequently asked questions and of course you may always ask my humans.


Your Greenkeeper Bot 🌴

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.