Implement parallax effect extension#7794
Conversation
|
@cvializ I will take a look at soon, meanwhile could you please experiment flag around the whole thing? ( |
|
Thanks! For the experiment flag, is the guard at extensions/amp-fx-parallax/0.1/amp-fx-parallax.js#164 enough? It runs when the extension script is included. |
|
@cvializ almost, needs an entry in |
aghassemi
left a comment
There was a problem hiding this comment.
Some requests for structural changes. Will review the details of the implementation after the structure is changed.
| @@ -0,0 +1,223 @@ | |||
| /** | |||
There was a problem hiding this comment.
Let's add a article-parallax.amp.html to examples folder.
Maybe: https://gist.github.com/aghassemi/0fde9b1df0ad531dbdfc29588ca27c73 (paths need updating)
| return new ParallaxService(win); | ||
| }).start_(); | ||
| }; | ||
|
|
There was a problem hiding this comment.
move the experiment assert right before installing the service here.
| * Installs parallax handlers, tracks the previous scroll position and | ||
| * implements post-parallax-update scroll hooks. | ||
| */ | ||
| export class ParallaxService { |
There was a problem hiding this comment.
let's move the service under service folder and make it an "ampdoc" level service rather than a window service. See video-manager.js and video-manager-impl for an example.
Note that moving this outside of the component does NOT mean the core AMP library (v0.js) grows in size because it would only get bounded into binaries that actually use it ( e.g. amp-fx-parallax/0.1/amp-fx-parallax.js)
| * Install handlers after the document has loaded. | ||
| */ | ||
| start_() { | ||
| const win = this.win_; |
There was a problem hiding this comment.
move to or call from the constructor. installing a service should be enough to get it going.
| * in the document. | ||
| * @param {!Window} global | ||
| */ | ||
| function installParallaxHandlers(global) { |
There was a problem hiding this comment.
let's move this, parallaxMutate and transform to be private methods on ParallaxService class and make all other methods on ParallaxService also private.
aghassemi
left a comment
There was a problem hiding this comment.
Awesome! Just a few nits and then we can merge.
examples/article-parallax.amp.html
Outdated
| <span>Lorem Ipsum Dolor Sit Amet Consectetur Adipiscing<span> | ||
| </div> | ||
| </h1> | ||
| <amp-img height="50vh" layout="fixed-height" src="http://localhost:8000/examples/img/hero@1x.jpg"></amp-img> |
examples/article-parallax.amp.html
Outdated
| <noscript> | ||
| <style amp-boilerplate>body{-webkit-animation:none;-moz-animation:none;-ms-animation:none;animation:none}</style> | ||
| </noscript> | ||
| <script async custom-element="amp-fx-parallax" src="../../dist/v0/amp-fx-parallax-0.1.max.js"></script> |
There was a problem hiding this comment.
update the paths to point to CDN (to test locally, hit article-parallax.amp.max.html (note .max.) and server will rewrite the paths to local files.
| import {ampdocServiceFor} from '../../../src/ampdoc'; | ||
| import {installParallaxForDoc} from '../../../src/service/parallax-impl'; | ||
|
|
||
| const ampdoc = ampdocServiceFor(AMP.win).getAmpDoc(); |
There was a problem hiding this comment.
wrap these in onDocumentReady
|
|
||
| The factor to use when scrolling. A value greater than 1 scrolls the element upward when the user scrolls down the page. A value less than 1 scrolls the element downward when the user scrolls downward. A value of 1 behaves normally. A value of 0 effectively makes the element scroll fixed with the page. | ||
|
|
||
| ## Styling |
There was a problem hiding this comment.
I don't think we need a section regarding styling since it is a purely a behaviour attribute.
src/service/parallax-impl.js
Outdated
| * Get the previous scroll value. | ||
| * @return {number} | ||
| */ | ||
| getPreviousScroll() { |
There was a problem hiding this comment.
this and the following 5 methods can become private too
|
also add the component to the whitelist under |
|
@muxin Yuxi, let's wait for this for the Canary cut as well. Thanks! |
| 'src/service/video-manager-impl.js', | ||
| 'extensions/amp-a4a/0.1/amp-a4a.js->src/service/variable-source.js', | ||
| 'extensions/amp-fx-parallax/0.1/amp-fx-parallax.js->' + | ||
| 'src/service/parallax-impl.js', |
* initial setup for extension nexxtv-player * added nexxtv player logic * nexxtv player bugfixes, cleanup, tests, docs * added video interface, changed attribute start to seek-to * reworked video interface for nexxtv-player * added message handler for nexxtv player and tests * nexxtv player minor fixes & cleanup * nexxtv player changed indents from 4 spaces to 2 * added unlayoutCallback for nexxtv player * initial setup for extension nexxtv-player * added nexxtv player logic * nexxtv player bugfixes, cleanup, tests, docs * added video interface, changed attribute start to seek-to * reworked video interface for nexxtv-player * added message handler for nexxtv player and tests * nexxtv player minor fixes & cleanup * nexxtv player changed indents from 4 spaces to 2 * added unlayoutCallback for nexxtv player * fixed linting issues (#7673) * initial setup for extension nexxtv-player * added nexxtv player logic * nexxtv player bugfixes, cleanup, tests, docs * added video interface, changed attribute start to seek-to * reworked video interface for nexxtv-player * added message handler for nexxtv player and tests * nexxtv player minor fixes & cleanup * nexxtv player changed indents from 4 spaces to 2 * added unlayoutCallback for nexxtv player * initial setup for extension nexxtv-player * added nexxtv player logic * nexxtv player bugfixes, cleanup, tests, docs * added video interface, changed attribute start to seek-to * reworked video interface for nexxtv-player * added message handler for nexxtv player and tests * nexxtv player minor fixes & cleanup * fixed linting issues (#7673) * nexxtv player review fixes (#7816) * nexxtv player: updated validation rules (#7816) * nexxtv player validator ordered alphabetical, changed spec_url * fire amp-dom-update event on insert and replace (#7819) * temp * trigger `amp-dom-update` event on insert and replace * switch -amp-form to i-amp-form * Validator Rollup (#7844) * Revision bump. * Revision bump for amp-playbuzz changes in #7450 * Revision bump. * Allow filtering by HtmlFormat (AMP, AMP4ADS) in the code generator. * Revision bump. * Revision bump due to Github pull. * Code generation now driven by a variable LIGHT, which is broader than the previous GENERATE_DETAILED_ERRORS distinction. LIGHT implies filtered for specific format (AMP or AMP4ADS, and only amp.validator.validateSaxEvents, and no detailed errors. * Generate ValidatorRules.directAttrLists and globalAttrs and ampLayoutAttrs, reducing overhead by indirection. * Implement parallax effect extension (#7794) * Do not set hidden attribute on hide/collapse (#7879) * amp-bind: Support `Math` functions (#7797) * initial commit for Math in amp-bind * fix lint * ali's comment * avoid scope conflicts with built-in functions * remove Math functions from documentation * Measure 3P ad latency (#7902) * Update spec URLs from github to ampproject. (#7901) * Update github urls to ampproject urls * test .out updated * Too many slashes. * Moved Developing.md and Design_Principles.md (#7908) * Rename DEVELOPING.md to contributing/DEVELOPING.md * Move files to new folder * Renaming toggle to toggleVisibility because it was conflicting with sidebar and breaking it (#7855) * disable scrollRestoration auto for embed case (#7899) * Disable Fast Fetch for all ads when remote.html is used. (#7906) * Fix DoubleClick Fast Fetch bugs around categoryExclusions and tagForChildDirectedTreatment (#7843) * Fix incorrect parameter name for `tagForChildDirectedTreatment` in DoubleClick. * Added unit test for tagForChildDirectedTreatment. * Fixed the categoryExclusions bug in Fast Fetch DoubleClick. * Removed parens in arrow functions to satisfy linter * Adds two new experiment IDs (#7850) * Adds two new experiment IDs to distinguish "any externally triggered" experiment from "any internally triggered". Also updates tests to remove a number of assumptions that only a single eid will be populated. * Use return val to detect "externally selected"; test updates. * Updated network implementation guide. (#7862) * Updated network impl guide. * Changed 'validation' to 'verification' * Cid timeout error should not be dev error (#7911) * Fix amp-ad test (#7918) * Update amp-install-serviceworker.md (#7932) Fully escape javascript regex. * Update amp-cache-modifications.md (#7933) Add `data-no-service-worker-fallback-shell-url` as a URL to be rewritten as absolute. * amp-fx-parallax Don't use global (#7942) * Viewer integration: rewrite error message to indicate request name (#7923) * rewrite error message * update * ticks * Fix up links in DEVELOPING.md (#7944) We moved DEVELOPING.md to the contributing folder but didn't update many of the relative links accordingly. * Popin ad extension document updated. (#7674) * Add popin ad extension. * register popin. * Add resizeable attribute. * Remove resizable. * Implemented the render-start and no-content APIs. * Fixed lint. * Remove quatation. * Use tei@popin.cc * Rebase old commit . * Fixed document because tag was not closed. * I replaced the removed double quotes. * Add double quotes. * Support for bind expressions in mustache templates (#7602) * first pass at adding/removing subtrees * tests passing * Add ability to add and remove bindings in the subtree rooted at a specific node * lint fixes * merge conflict * ci issues * some cleanup * pr comments * pr comments, new method of removing bindings for node and its children * fix some lint warnings * test and lint fixes * mutation observer * update comments * add observer * naive implementation * cleanup * clean * cleanup bind impl * very simple example of bind in a template * pr comments * lint errors * pr comments * cleanup * lint errors * pr comments * pr comments and lint warnings * typo * comments * more lint warnings * pr comment * change README * cleanup * pr comments * pr comments 2 * lint warnings * don't use foreach on Nodelist * casting * more ci warnings * even more ci warnings * even more ci warnings * even more ci issues * even more ci comments * even more ci issues * pr comments * more pr comments * fix refactoring oversight * pr comments * pr comments * merge * pr comments * ci issues * pr comments * assertElement * pr comments * typo * updating sanitizer * fixing up sanitizer test * pr comments * pr comments * expanded on amp-mustache tests * pr comments * remove class from whitelist * restore whole sandbox * update mustache validator test and output * pr comments * nexxtv player gulp check-types fixes (#7816) * nexxtv player fix error gulp presumbit with postmessage (#7816) * added dependency check for nexxtv player (#7816) * nexxtv player minor fix in validator (#7816) * nexxtv player fixed validator (#7816) * fixed validator (#7816)
| const previousScrollTop = this.getPreviousScroll_(); | ||
| const delta = previousScrollTop - newScrollTop; | ||
|
|
||
| elements.forEach(element => { |
There was a problem hiding this comment.
This should be done in a for loop, since scroll performance is critical.
| return; | ||
| } | ||
| element.update(delta); | ||
| this.setPreviousScroll_(newScrollTop); |
There was a problem hiding this comment.
Why is this done in the loop?
| * @return {string} | ||
| */ | ||
| transform_(position) { | ||
| return `translate3d(0,${position.toFixed(2)}px,0)`; |
| this.parallaxMutate_.bind(this, parallaxElements, viewport); | ||
|
|
||
| viewport.onScroll(() => vsync.mutate(mutate)); | ||
| mutate(); // initialize the elements with the current scroll position |
There was a problem hiding this comment.
This should be inside a vsync mutate, too.
| this.element_ = element; | ||
|
|
||
| /** @private @const {!function(number):string} */ | ||
| this.transform_ = transform; |
There was a problem hiding this comment.
Why are we passing this in? Couldn't this just be on the ParallaxElement class?
| const elementRect = viewport.getLayoutRect(this.element_); | ||
| elementRect.top -= viewportRect.top; | ||
| elementRect.bottom = elementRect.top + elementRect.height; | ||
| return this.isRectInView_(elementRect, viewportRect.height); |
There was a problem hiding this comment.
We have a helper function that does exactly this.
* initial setup for extension nexxtv-player * added nexxtv player logic * nexxtv player bugfixes, cleanup, tests, docs * added video interface, changed attribute start to seek-to * reworked video interface for nexxtv-player * added message handler for nexxtv player and tests * nexxtv player minor fixes & cleanup * nexxtv player changed indents from 4 spaces to 2 * added unlayoutCallback for nexxtv player * initial setup for extension nexxtv-player * added nexxtv player logic * nexxtv player bugfixes, cleanup, tests, docs * added video interface, changed attribute start to seek-to * reworked video interface for nexxtv-player * added message handler for nexxtv player and tests * nexxtv player minor fixes & cleanup * nexxtv player changed indents from 4 spaces to 2 * added unlayoutCallback for nexxtv player * fixed linting issues (ampproject#7673) * initial setup for extension nexxtv-player * added nexxtv player logic * nexxtv player bugfixes, cleanup, tests, docs * added video interface, changed attribute start to seek-to * reworked video interface for nexxtv-player * added message handler for nexxtv player and tests * nexxtv player minor fixes & cleanup * nexxtv player changed indents from 4 spaces to 2 * added unlayoutCallback for nexxtv player * initial setup for extension nexxtv-player * added nexxtv player logic * nexxtv player bugfixes, cleanup, tests, docs * added video interface, changed attribute start to seek-to * reworked video interface for nexxtv-player * added message handler for nexxtv player and tests * nexxtv player minor fixes & cleanup * fixed linting issues (ampproject#7673) * nexxtv player review fixes (ampproject#7816) * nexxtv player: updated validation rules (ampproject#7816) * nexxtv player validator ordered alphabetical, changed spec_url * fire amp-dom-update event on insert and replace (ampproject#7819) * temp * trigger `amp-dom-update` event on insert and replace * switch -amp-form to i-amp-form * Validator Rollup (ampproject#7844) * Revision bump. * Revision bump for amp-playbuzz changes in ampproject#7450 * Revision bump. * Allow filtering by HtmlFormat (AMP, AMP4ADS) in the code generator. * Revision bump. * Revision bump due to Github pull. * Code generation now driven by a variable LIGHT, which is broader than the previous GENERATE_DETAILED_ERRORS distinction. LIGHT implies filtered for specific format (AMP or AMP4ADS, and only amp.validator.validateSaxEvents, and no detailed errors. * Generate ValidatorRules.directAttrLists and globalAttrs and ampLayoutAttrs, reducing overhead by indirection. * Implement parallax effect extension (ampproject#7794) * Do not set hidden attribute on hide/collapse (ampproject#7879) * amp-bind: Support `Math` functions (ampproject#7797) * initial commit for Math in amp-bind * fix lint * ali's comment * avoid scope conflicts with built-in functions * remove Math functions from documentation * Measure 3P ad latency (ampproject#7902) * Update spec URLs from github to ampproject. (ampproject#7901) * Update github urls to ampproject urls * test .out updated * Too many slashes. * Moved Developing.md and Design_Principles.md (ampproject#7908) * Rename DEVELOPING.md to contributing/DEVELOPING.md * Move files to new folder * Renaming toggle to toggleVisibility because it was conflicting with sidebar and breaking it (ampproject#7855) * disable scrollRestoration auto for embed case (ampproject#7899) * Disable Fast Fetch for all ads when remote.html is used. (ampproject#7906) * Fix DoubleClick Fast Fetch bugs around categoryExclusions and tagForChildDirectedTreatment (ampproject#7843) * Fix incorrect parameter name for `tagForChildDirectedTreatment` in DoubleClick. * Added unit test for tagForChildDirectedTreatment. * Fixed the categoryExclusions bug in Fast Fetch DoubleClick. * Removed parens in arrow functions to satisfy linter * Adds two new experiment IDs (ampproject#7850) * Adds two new experiment IDs to distinguish "any externally triggered" experiment from "any internally triggered". Also updates tests to remove a number of assumptions that only a single eid will be populated. * Use return val to detect "externally selected"; test updates. * Updated network implementation guide. (ampproject#7862) * Updated network impl guide. * Changed 'validation' to 'verification' * Cid timeout error should not be dev error (ampproject#7911) * Fix amp-ad test (ampproject#7918) * Update amp-install-serviceworker.md (ampproject#7932) Fully escape javascript regex. * Update amp-cache-modifications.md (ampproject#7933) Add `data-no-service-worker-fallback-shell-url` as a URL to be rewritten as absolute. * amp-fx-parallax Don't use global (ampproject#7942) * Viewer integration: rewrite error message to indicate request name (ampproject#7923) * rewrite error message * update * ticks * Fix up links in DEVELOPING.md (ampproject#7944) We moved DEVELOPING.md to the contributing folder but didn't update many of the relative links accordingly. * Popin ad extension document updated. (ampproject#7674) * Add popin ad extension. * register popin. * Add resizeable attribute. * Remove resizable. * Implemented the render-start and no-content APIs. * Fixed lint. * Remove quatation. * Use tei@popin.cc * Rebase old commit . * Fixed document because tag was not closed. * I replaced the removed double quotes. * Add double quotes. * Support for bind expressions in mustache templates (ampproject#7602) * first pass at adding/removing subtrees * tests passing * Add ability to add and remove bindings in the subtree rooted at a specific node * lint fixes * merge conflict * ci issues * some cleanup * pr comments * pr comments, new method of removing bindings for node and its children * fix some lint warnings * test and lint fixes * mutation observer * update comments * add observer * naive implementation * cleanup * clean * cleanup bind impl * very simple example of bind in a template * pr comments * lint errors * pr comments * cleanup * lint errors * pr comments * pr comments and lint warnings * typo * comments * more lint warnings * pr comment * change README * cleanup * pr comments * pr comments 2 * lint warnings * don't use foreach on Nodelist * casting * more ci warnings * even more ci warnings * even more ci warnings * even more ci issues * even more ci comments * even more ci issues * pr comments * more pr comments * fix refactoring oversight * pr comments * pr comments * merge * pr comments * ci issues * pr comments * assertElement * pr comments * typo * updating sanitizer * fixing up sanitizer test * pr comments * pr comments * expanded on amp-mustache tests * pr comments * remove class from whitelist * restore whole sandbox * update mustache validator test and output * pr comments * nexxtv player gulp check-types fixes (ampproject#7816) * nexxtv player fix error gulp presumbit with postmessage (ampproject#7816) * added dependency check for nexxtv player (ampproject#7816) * nexxtv player minor fix in validator (ampproject#7816) * nexxtv player fixed validator (ampproject#7816) * fixed validator (ampproject#7816)
* initial setup for extension nexxtv-player * added nexxtv player logic * nexxtv player bugfixes, cleanup, tests, docs * added video interface, changed attribute start to seek-to * reworked video interface for nexxtv-player * added message handler for nexxtv player and tests * nexxtv player minor fixes & cleanup * nexxtv player changed indents from 4 spaces to 2 * added unlayoutCallback for nexxtv player * initial setup for extension nexxtv-player * added nexxtv player logic * nexxtv player bugfixes, cleanup, tests, docs * added video interface, changed attribute start to seek-to * reworked video interface for nexxtv-player * added message handler for nexxtv player and tests * nexxtv player minor fixes & cleanup * nexxtv player changed indents from 4 spaces to 2 * added unlayoutCallback for nexxtv player * fixed linting issues (ampproject#7673) * initial setup for extension nexxtv-player * added nexxtv player logic * nexxtv player bugfixes, cleanup, tests, docs * added video interface, changed attribute start to seek-to * reworked video interface for nexxtv-player * added message handler for nexxtv player and tests * nexxtv player minor fixes & cleanup * nexxtv player changed indents from 4 spaces to 2 * added unlayoutCallback for nexxtv player * initial setup for extension nexxtv-player * added nexxtv player logic * nexxtv player bugfixes, cleanup, tests, docs * added video interface, changed attribute start to seek-to * reworked video interface for nexxtv-player * added message handler for nexxtv player and tests * nexxtv player minor fixes & cleanup * fixed linting issues (ampproject#7673) * nexxtv player review fixes (ampproject#7816) * nexxtv player: updated validation rules (ampproject#7816) * nexxtv player validator ordered alphabetical, changed spec_url * fire amp-dom-update event on insert and replace (ampproject#7819) * temp * trigger `amp-dom-update` event on insert and replace * switch -amp-form to i-amp-form * Validator Rollup (ampproject#7844) * Revision bump. * Revision bump for amp-playbuzz changes in ampproject#7450 * Revision bump. * Allow filtering by HtmlFormat (AMP, AMP4ADS) in the code generator. * Revision bump. * Revision bump due to Github pull. * Code generation now driven by a variable LIGHT, which is broader than the previous GENERATE_DETAILED_ERRORS distinction. LIGHT implies filtered for specific format (AMP or AMP4ADS, and only amp.validator.validateSaxEvents, and no detailed errors. * Generate ValidatorRules.directAttrLists and globalAttrs and ampLayoutAttrs, reducing overhead by indirection. * Implement parallax effect extension (ampproject#7794) * Do not set hidden attribute on hide/collapse (ampproject#7879) * amp-bind: Support `Math` functions (ampproject#7797) * initial commit for Math in amp-bind * fix lint * ali's comment * avoid scope conflicts with built-in functions * remove Math functions from documentation * Measure 3P ad latency (ampproject#7902) * Update spec URLs from github to ampproject. (ampproject#7901) * Update github urls to ampproject urls * test .out updated * Too many slashes. * Moved Developing.md and Design_Principles.md (ampproject#7908) * Rename DEVELOPING.md to contributing/DEVELOPING.md * Move files to new folder * Renaming toggle to toggleVisibility because it was conflicting with sidebar and breaking it (ampproject#7855) * disable scrollRestoration auto for embed case (ampproject#7899) * Disable Fast Fetch for all ads when remote.html is used. (ampproject#7906) * Fix DoubleClick Fast Fetch bugs around categoryExclusions and tagForChildDirectedTreatment (ampproject#7843) * Fix incorrect parameter name for `tagForChildDirectedTreatment` in DoubleClick. * Added unit test for tagForChildDirectedTreatment. * Fixed the categoryExclusions bug in Fast Fetch DoubleClick. * Removed parens in arrow functions to satisfy linter * Adds two new experiment IDs (ampproject#7850) * Adds two new experiment IDs to distinguish "any externally triggered" experiment from "any internally triggered". Also updates tests to remove a number of assumptions that only a single eid will be populated. * Use return val to detect "externally selected"; test updates. * Updated network implementation guide. (ampproject#7862) * Updated network impl guide. * Changed 'validation' to 'verification' * Cid timeout error should not be dev error (ampproject#7911) * Fix amp-ad test (ampproject#7918) * Update amp-install-serviceworker.md (ampproject#7932) Fully escape javascript regex. * Update amp-cache-modifications.md (ampproject#7933) Add `data-no-service-worker-fallback-shell-url` as a URL to be rewritten as absolute. * amp-fx-parallax Don't use global (ampproject#7942) * Viewer integration: rewrite error message to indicate request name (ampproject#7923) * rewrite error message * update * ticks * Fix up links in DEVELOPING.md (ampproject#7944) We moved DEVELOPING.md to the contributing folder but didn't update many of the relative links accordingly. * Popin ad extension document updated. (ampproject#7674) * Add popin ad extension. * register popin. * Add resizeable attribute. * Remove resizable. * Implemented the render-start and no-content APIs. * Fixed lint. * Remove quatation. * Use tei@popin.cc * Rebase old commit . * Fixed document because tag was not closed. * I replaced the removed double quotes. * Add double quotes. * Support for bind expressions in mustache templates (ampproject#7602) * first pass at adding/removing subtrees * tests passing * Add ability to add and remove bindings in the subtree rooted at a specific node * lint fixes * merge conflict * ci issues * some cleanup * pr comments * pr comments, new method of removing bindings for node and its children * fix some lint warnings * test and lint fixes * mutation observer * update comments * add observer * naive implementation * cleanup * clean * cleanup bind impl * very simple example of bind in a template * pr comments * lint errors * pr comments * cleanup * lint errors * pr comments * pr comments and lint warnings * typo * comments * more lint warnings * pr comment * change README * cleanup * pr comments * pr comments 2 * lint warnings * don't use foreach on Nodelist * casting * more ci warnings * even more ci warnings * even more ci warnings * even more ci issues * even more ci comments * even more ci issues * pr comments * more pr comments * fix refactoring oversight * pr comments * pr comments * merge * pr comments * ci issues * pr comments * assertElement * pr comments * typo * updating sanitizer * fixing up sanitizer test * pr comments * pr comments * expanded on amp-mustache tests * pr comments * remove class from whitelist * restore whole sandbox * update mustache validator test and output * pr comments * nexxtv player gulp check-types fixes (ampproject#7816) * nexxtv player fix error gulp presumbit with postmessage (ampproject#7816) * added dependency check for nexxtv player (ampproject#7816) * nexxtv player minor fix in validator (ampproject#7816) * nexxtv player fixed validator (ampproject#7816) * fixed validator (ampproject#7816)
Closes #1443