From 9ca5bc7892410ed396d4cab8e30a1fc4b5f41513 Mon Sep 17 00:00:00 2001 From: Emmanuel ROHEE Date: Tue, 19 Aug 2014 18:29:41 +0200 Subject: [PATCH] keepScroll: a directive to anchor the scroller position at the bottom when the browser is resizing --- webclient/room/room-controller.js | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/webclient/room/room-controller.js b/webclient/room/room-controller.js index b585e338e..0ab2fc20a 100644 --- a/webclient/room/room-controller.js +++ b/webclient/room/room-controller.js @@ -104,6 +104,33 @@ angular.module('RoomController', ['ngSanitize']) }); }; }]) + +// A directive to anchor the scroller position at the bottom when the browser is resizing. +// When the screen resizes, the bottom of the element remains the same, not the top. +.directive('keepScroll', ['$window', function($window) { + return { + link: function(scope, elem, attrs) { + + scope.windowHeight = $window.innerHeight; + + // Listen to window size change + angular.element($window).bind('resize', function() { + + // If the scroller is scrolled to the bottom, there is nothing to do. + // The browser will move it as expected + if (elem.scrollTop() + elem.height() !== elem[0].scrollHeight) { + // Else, move the scroller position according to the window height change delta + var windowHeightDelta = $window.innerHeight - scope.windowHeight; + elem.scrollTop(elem.scrollTop() - windowHeightDelta); + } + + // Store the new window height for the next screen size change + scope.windowHeight = $window.innerHeight; + }); + } + }; +}]) + .controller('RoomController', ['$scope', '$http', '$timeout', '$routeParams', '$location', 'matrixService', 'eventStreamService', 'eventHandlerService', function($scope, $http, $timeout, $routeParams, $location, matrixService, eventStreamService, eventHandlerService) { 'use strict';