mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-02 20:16:04 +01:00
fix: removal of scroll anchoring code in favour of browser handling
closes #6150
This commit is contained in:
@@ -1,7 +1,3 @@
|
|||||||
/*
|
/*
|
||||||
The following stylesheet is only included on pages that can execute javascript
|
The following stylesheet is only included on pages that can execute javascript
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.page-topic [component="post/content"] img:not(.not-responsive):not([data-state]) {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
@@ -6,21 +6,3 @@
|
|||||||
==========
|
==========
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Prevent viewport shuffling on image load by restricting image dimensions until viewed by the browser */
|
|
||||||
.page-topic [component="post/content"] img {
|
|
||||||
transition: width 500ms ease;
|
|
||||||
transition: height 500ms ease;
|
|
||||||
transition: opacity 500ms ease;
|
|
||||||
|
|
||||||
&[data-state="unloaded"], &[data-state="loading"] {
|
|
||||||
display: inherit;
|
|
||||||
height: 0;
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
&[data-state="loaded"] {
|
|
||||||
display: inherit;
|
|
||||||
height: auto;
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -207,7 +207,7 @@ define('forum/topic', [
|
|||||||
return index;
|
return index;
|
||||||
};
|
};
|
||||||
|
|
||||||
Topic.navigatorCallback = function (index, elementCount, threshold) {
|
Topic.navigatorCallback = function (index, elementCount) {
|
||||||
var path = ajaxify.removeRelativePath(window.location.pathname.slice(1));
|
var path = ajaxify.removeRelativePath(window.location.pathname.slice(1));
|
||||||
if (!path.startsWith('topic')) {
|
if (!path.startsWith('topic')) {
|
||||||
return;
|
return;
|
||||||
@@ -217,8 +217,6 @@ define('forum/topic', [
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
images.loadImages(threshold);
|
|
||||||
|
|
||||||
var newUrl = 'topic/' + ajaxify.data.slug + (index > 1 ? ('/' + index) : '');
|
var newUrl = 'topic/' + ajaxify.data.slug + (index > 1 ? ('/' + index) : '');
|
||||||
|
|
||||||
if (newUrl !== currentUrl) {
|
if (newUrl !== currentUrl) {
|
||||||
|
|||||||
@@ -68,8 +68,6 @@ define('forum/topic/diffs', ['forum/topic/images', 'benchpress', 'translator'],
|
|||||||
posts: [data],
|
posts: [data],
|
||||||
}, function (html) {
|
}, function (html) {
|
||||||
postContainer.empty().append(html);
|
postContainer.empty().append(html);
|
||||||
Images.unloadImages(html);
|
|
||||||
Images.loadImages();
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -130,8 +130,6 @@ define('forum/topic/events', [
|
|||||||
editedPostEl.html(translator.unescape(data.post.content));
|
editedPostEl.html(translator.unescape(data.post.content));
|
||||||
editedPostEl.find('img:not(.not-responsive)').addClass('img-responsive');
|
editedPostEl.find('img:not(.not-responsive)').addClass('img-responsive');
|
||||||
images.wrapImagesInLinks(editedPostEl.parent());
|
images.wrapImagesInLinks(editedPostEl.parent());
|
||||||
images.unloadImages(editedPostEl.parent());
|
|
||||||
images.loadImages();
|
|
||||||
editedPostEl.fadeIn(250);
|
editedPostEl.fadeIn(250);
|
||||||
|
|
||||||
var editData = {
|
var editData = {
|
||||||
|
|||||||
@@ -1,104 +1,8 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
define('forum/topic/images', [
|
define('forum/topic/images', [], function () {
|
||||||
'forum/topic/postTools',
|
var Images = {};
|
||||||
'navigator',
|
|
||||||
'components',
|
|
||||||
], function (postTools, navigator, components) {
|
|
||||||
var Images = {
|
|
||||||
_imageLoaderTimeout: undefined,
|
|
||||||
};
|
|
||||||
|
|
||||||
Images.unloadImages = function (posts) {
|
|
||||||
var images = posts.find('[component="post/content"] img:not(.not-responsive)');
|
|
||||||
|
|
||||||
if (config.delayImageLoading) {
|
|
||||||
images.each(function () {
|
|
||||||
$(this).attr('data-src', $(this).attr('src'));
|
|
||||||
}).attr('data-state', 'unloaded').attr('src', 'about:blank');
|
|
||||||
} else {
|
|
||||||
images.attr('data-state', 'loaded');
|
|
||||||
Images.wrapImagesInLinks(posts);
|
|
||||||
$(window).trigger('action:images.loaded');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Images.loadImages = function (threshold) {
|
|
||||||
if (Images._imageLoaderTimeout) {
|
|
||||||
clearTimeout(Images._imageLoaderTimeout);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!config.delayImageLoading) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Images._imageLoaderTimeout = setTimeout(function () {
|
|
||||||
/*
|
|
||||||
If threshold is defined, images loaded above this threshold will modify
|
|
||||||
the user's scroll position so they are not scrolled away from content
|
|
||||||
they were reading. Images loaded below this threshold will push down content.
|
|
||||||
|
|
||||||
If no threshold is defined, loaded images will push down content, as per
|
|
||||||
default
|
|
||||||
*/
|
|
||||||
|
|
||||||
var images = components.get('post/content').find('img[data-state="unloaded"]');
|
|
||||||
var visible = images.filter(function () {
|
|
||||||
return utils.isElementInViewport(this);
|
|
||||||
});
|
|
||||||
var posts = $.unique(visible.map(function () {
|
|
||||||
return $(this).parents('[component="post"]').get(0);
|
|
||||||
}));
|
|
||||||
var scrollTop = $(window).scrollTop();
|
|
||||||
var adjusting = false;
|
|
||||||
var adjustQueue = [];
|
|
||||||
var oldHeight;
|
|
||||||
var newHeight;
|
|
||||||
|
|
||||||
function adjustPosition() {
|
|
||||||
adjusting = true;
|
|
||||||
oldHeight = document.body.clientHeight;
|
|
||||||
|
|
||||||
// Display the image
|
|
||||||
$(this).attr('data-state', 'loaded');
|
|
||||||
newHeight = document.body.clientHeight;
|
|
||||||
|
|
||||||
var imageRect = this.getBoundingClientRect();
|
|
||||||
if (imageRect.top < threshold) {
|
|
||||||
scrollTop += newHeight - oldHeight;
|
|
||||||
$(window).scrollTop(scrollTop);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (adjustQueue.length) {
|
|
||||||
adjustQueue.pop()();
|
|
||||||
} else {
|
|
||||||
adjusting = false;
|
|
||||||
|
|
||||||
Images.wrapImagesInLinks(posts);
|
|
||||||
$(window).trigger('action:images.loaded');
|
|
||||||
posts.length = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// For each image, reset the source and adjust scrollTop when loaded
|
|
||||||
visible.attr('data-state', 'loading');
|
|
||||||
visible.each(function (index, image) {
|
|
||||||
image = $(image);
|
|
||||||
|
|
||||||
image.on('load', function () {
|
|
||||||
if (!adjusting) {
|
|
||||||
adjustPosition.call(this);
|
|
||||||
} else {
|
|
||||||
adjustQueue.push(adjustPosition.bind(this));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
image.attr('src', image.attr('data-src'));
|
|
||||||
image.removeAttr('data-src');
|
|
||||||
});
|
|
||||||
}, 250);
|
|
||||||
};
|
|
||||||
|
|
||||||
Images.wrapImagesInLinks = function (posts) {
|
Images.wrapImagesInLinks = function (posts) {
|
||||||
posts.find('[component="post/content"] img:not(.emoji)').each(function () {
|
posts.find('[component="post/content"] img:not(.emoji)').each(function () {
|
||||||
@@ -126,6 +30,5 @@ define('forum/topic/images', [
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
return Images;
|
return Images;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -63,7 +63,6 @@ define('forum/topic/posts', [
|
|||||||
function onNewPostPagination(data) {
|
function onNewPostPagination(data) {
|
||||||
function scrollToPost() {
|
function scrollToPost() {
|
||||||
scrollToPostIfSelf(data.posts[0]);
|
scrollToPostIfSelf(data.posts[0]);
|
||||||
images.loadImages();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var posts = data.posts;
|
var posts = data.posts;
|
||||||
@@ -111,7 +110,6 @@ define('forum/topic/posts', [
|
|||||||
html.addClass('new');
|
html.addClass('new');
|
||||||
}
|
}
|
||||||
scrollToPostIfSelf(data.posts[0]);
|
scrollToPostIfSelf(data.posts[0]);
|
||||||
images.loadImages();
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,7 +250,6 @@ define('forum/topic/posts', [
|
|||||||
};
|
};
|
||||||
|
|
||||||
Posts.onTopicPageLoad = function (posts) {
|
Posts.onTopicPageLoad = function (posts) {
|
||||||
images.unloadImages(posts);
|
|
||||||
Posts.showBottomPostBar();
|
Posts.showBottomPostBar();
|
||||||
posts.find('[component="post/content"] img:not(.not-responsive)').addClass('img-responsive');
|
posts.find('[component="post/content"] img:not(.not-responsive)').addClass('img-responsive');
|
||||||
addBlockquoteEllipses(posts.find('[component="post/content"] > blockquote > blockquote'));
|
addBlockquoteEllipses(posts.find('[component="post/content"] > blockquote > blockquote'));
|
||||||
|
|||||||
Reference in New Issue
Block a user