Ответ 1
Попробуйте взломать:
- сначала мы пытаемся предотвратить или отменить любую прокрутку
- всякий раз, когда пользователь нажимает клавишу, мы превращаем свойство
overflow
в элементvisible
, чтобы избежать прокрутки содержимого, но одновременно скройте элемент, установив егоopacity
равным 0. Сразу же после этого мы переключаемoverflow
вернуться кhidden
и снова показать элемент. - Чтобы избежать мерцания, мы создаем клон редактируемого элемента (с
overflow: hidden
) и показываем этот элемент, пока он не скрыт.
Здесь мы идем (использует jQuery для удобства DOM):
$(function() {
var editableElement = $('#editable'), clonedElement;
// Revert any scrolling
editableElement.on("scroll", function(event) {
editableElement.scrollTop(0);
// Try to prevent scrolling completely (doesn't seem to work)
event.preventDefault();
return false;
});
// Switch overflow visibility on and off again on each keystroke.
// To avoid flickering, a cloned element is positioned below the input area
// and switched on while we hide the overflowing element.
editableElement.on("keydown", function() {
// Create a cloned input element below the original one
if (!clonedElement) {
var zIndex = editableElement.css('zIndex');
if (isNaN(parseInt(zIndex, 10))) {
zIndex = 10;
editableElement.css({zIndex: zIndex});
}
clonedElement = editableElement.clone();
clonedElement.css({
zIndex: zIndex-1,
position: 'absolute',
top: editableElement.offset().top,
left: editableElement.offset().left,
overflow: 'hidden',
// Set pseudo focus highlighting for webkit
// (needs to be adapted for other browsers)
outline: 'auto 5px -webkit-focus-ring-color'
});
editableElement.before(clonedElement);
} else {
// Update contents of the cloned element from the original one
clonedElement.html(editableElement.html());
}
// Here comes the hack:
// - set overflow visible but hide element via opactity.
// - show cloned element in the meantime
clonedElement.css({opacity: 1});
editableElement.css({overflow: 'visible', opacity: 0});
// Immediately turn of overflow and show element again.
setTimeout(function() {
editableElement.css({overflow: 'hidden', opacity: 1});
clonedElement.css({opacity: 0});
}, 10);
});
});
Отметьте этот jsFiddle, чтобы играть с указанным выше кодом.
Обратите внимание, что это может быть не полное решение (я только пробовал его с Safari, Chrome и Firefox еще), но для проверенных браузеров он работает. Вы можете настроить и отполировать свою реализацию (например, выделение фокуса). В примере jsFiddle я также отключил проверку орфографии, чтобы избежать мерцающих меток.