weisk
5/5/2015 - 3:11 PM

Angular Parallax image & background

Angular Parallax image & background

angular.module 'directives'

### Usage:
  <div
    parallax-background
    parallax-background-ratio="0.6"
    parallax-background-src="assets/image.png"
    parallax-background-gradient="linear-gradient(rgba(0, 0, 0, 0) 60%, rgba(0, 0, 0, 0.4) 100%)">
  </div>
###

.directive 'parallaxBackground', ($window, $parse) ->
  restrict: 'A'
  compile: (tEl, tAttrs, tFn) ->
    parseSrc = $parse tAttrs.parallaxBackgroundSrc

    (scope, elem, attrs) ->
      src = parseSrc scope
      gradient = attrs.parallaxBackgroundGradient
      parallaxRatio = attrs.parallaxBackgroundRatio or 1.1

      img = new Image()
      img.src = src
      img.onload = ->
        if gradient
          elem.css 'background-image', "#{ gradient }, url(#{ src })"
        else
          elem.css 'background-image', "url(#{ src })"

        setPosition()
        setBindings()

      setBindings = ->
        $($window).bind 'scroll', setPosition
        $($window).bind 'touchmove', setPosition

      setPosition = ->
        initialOffset = elem.prop 'offsetTop'
        currentOffset = $window.pageYOffset

        if currentOffset > initialOffset
          newOffset = ($window.pageYOffset - initialOffset) * parallaxRatio
        else
          newOffset = 0

        elem.css 'transform', "translate(0px, #{ newOffset.toFixed(2) }px)"
        # $window.requestAnimationFrame -> elem.css 'transform', "translate(0px, #{ newOffset.toFixed(2) }px)"
        # elem.css 'background-position', "0 #{ newOffset }px"

### Usage
  <img
    src="assets/image.png"
    parallax-image
    parallax-ratio="0.6"/>
###
.directive 'parallaxImage', ($window) ->
  restrict: 'A'
  link: (scope, elem, attrs) ->
    parallaxRatio = attrs.parallaxRatio or 1.1
    parallaxVerticalOffset = attrs.parallaxVerticalOffset
    parallaxHorizontalOffset = attrs.parallaxHorizontalOffset

    setBindings = ->
      $($window).bind 'scroll', setPosition
      $($window).bind 'touchmove', setPosition

    setPosition = ->
      initialOffset = elem.prop 'offsetTop'
      currentOffset = $window.pageYOffset

      if currentOffset > initialOffset
        newOffset = ($window.pageYOffset - initialOffset) * parallaxRatio
      else
        newOffset = 0

      elem.css 'transform', "translate(0px, #{ newOffset }px)"

    setPosition()
    setBindings()