summaryrefslogtreecommitdiff
path: root/public
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--public/js/syncscroll.js19
1 files changed, 14 insertions, 5 deletions
diff --git a/public/js/syncscroll.js b/public/js/syncscroll.js
index abc9a274..0d858db7 100644
--- a/public/js/syncscroll.js
+++ b/public/js/syncscroll.js
@@ -161,13 +161,15 @@ ui.area.view.on('scroll', function () {
//editor.on('scroll', _.debounce(syncScrollToView, syncScrollDelay));
//ui.area.view.on('scroll', _.debounce(syncScrollToEdit, 50));
-var scrollMap, lineHeightMap;
+var scrollMap, lineHeightMap, viewTop, viewBottom;
viewAjaxCallback = clearMap;
function clearMap() {
scrollMap = null;
lineHeightMap = null;
+ viewTop = null;
+ viewBottom = null;
}
var buildMap = _.throttle(buildMapInner, buildMapThrottle);
@@ -183,6 +185,8 @@ function buildMapInner(syncBack) {
_scrollMap = [];
nonEmptyList = [];
_lineHeightMap = [];
+ viewTop = 0;
+ viewBottom = ui.area.view[0].scrollHeight - ui.area.view.height();
acc = 0;
var lines = editor.getValue().split('\n');
@@ -208,7 +212,8 @@ function buildMapInner(syncBack) {
}
nonEmptyList.push(0);
- _scrollMap[0] = 0;
+ // make the first line go top
+ _scrollMap[0] = viewTop;
var parts = ui.area.markdown.find('.part').toArray();
for (i = 0; i < parts.length; i++) {
@@ -296,9 +301,13 @@ function syncScrollToView(event, _lineNo) {
var topDiffPercent, posToNextDiff;
var textHeight = editor.defaultTextHeight();
lineNo = Math.floor(scrollInfo.top / textHeight);
- //if reach bottom, then scroll to end
- if (scrollInfo.height > scrollInfo.clientHeight && scrollInfo.top + scrollInfo.clientHeight >= scrollInfo.height - textHeight) {
- posTo = ui.area.view[0].scrollHeight - ui.area.view.height();
+ // if reach the last line, will start lerp to the bottom
+ var diffToBottom = (scrollInfo.top + scrollInfo.clientHeight) - (scrollInfo.height - textHeight);
+ if (scrollInfo.height > scrollInfo.clientHeight && diffToBottom > 0) {
+ topDiffPercent = diffToBottom / textHeight;
+ posTo = scrollMap[lineNo + 1];
+ posToNextDiff = (viewBottom - posTo) * topDiffPercent;
+ posTo += Math.floor(posToNextDiff);
} else {
topDiffPercent = (scrollInfo.top % textHeight) / textHeight;
posTo = scrollMap[lineNo];