scrollTo 不是 Internet Explorer 11 中定义的方法(用于将元素滚动到视图中间)
scrollTo is not a a method defined in Internet Explorer 11 (for scrolling an element into the middle of the view)
我写了一个方法,将容器滚动到其中的一个元素,但将元素保持在视图的中间。它看起来像这样:
// Function for scrolling to an element, and placing it in the middle of the view
// By default, the container parameter is set to the browser window
function scrollIntoViewMiddle(element, container) {
if (container === undefined) {
container = window;
}
var elementRect = element.getBoundingClientRect();
var absoluteElementTop = elementRect.top;
var middleDiff = (elementRect.height / 2);
var scrollTopOfElement = absoluteElementTop + middleDiff;
var scrollY = scrollTopOfElement - (window.innerHeight / 2);
container.scrollTo(0, scrollY);
}
这适用于大多数浏览器,甚至是一些旧的 FF 浏览器。但是,在 Internet Explorer 11 上,我得到标题中的错误,即 scrollTo()
不是已定义的函数。什么可以替代 IE11 的此功能?感谢您的回答。
同意l-portet,因为the scrollTo method doesn't support IE browser, we could set the Element.scrollLeft property and Element.scrollTop属性达到同样的效果
此外,该问题还与以下代码有关:
var scrollY = scrollTopOfElement - (window.innerHeight / 2);
我认为您想根据目标元素和容器元素获取 scrollY,而不是 window 元素。所以,请尝试修改您的代码如下:
function scrollIntoViewMiddle(element, container) {
if (container === undefined) {
container = window;
}
var elementRect = element.getBoundingClientRect();
var absoluteElementTop = elementRect.top;
var middleDiff = (elementRect.height / 2);
var scrollTopOfElement = absoluteElementTop + middleDiff;
var scrollY = (scrollTopOfElement - (container.getBoundingClientRect().height / 2));
//container.scrollTo(0, scrollY);
container.scrollLeft = 0;
container.scrollTop = scrollY;
}
更多详细示例代码,请查看this sample。
此外,这里还有一个解决方法,它使用了JQuery animate和scrollto,你可以参考它。
<script src="Scripts/jquery-1.10.2.min.js"></script>
<script>
$(function () {
jQuery(document).on('click', '#scroll_button', function (e) {
var el = $("#scroll_test");
var elOffset = el.offset().top;
var elHeight = el.outerHeight();
var frameHeight = $("#editor").outerHeight();
var offset;
if (elHeight < frameHeight) {
offset = elOffset - ((frameHeight / 2) - (elHeight / 2));
}
else {
offset = elOffset;
}
jQuery('#editor').animate({
scrollTop: offset
}, 1000);
});
});
</script>
<style>
#editor {
height: 100px;
overflow: auto;
}
#scroll_test {
background-color: grey;
}
</style>
<div id="editor" placeholder="Enter text ..." contenteditable="true" autofocus>
<span>content</span><br />
<span>content</span><br />
<span>content</span><br />
<span>content</span><br />
<span>content</span><br />
<span>content</span><br />
<div id="scroll_test">
test
</div>
<span>content</span><br />
<span>content</span><br />
<span>content</span><br />
<span>content</span><br />
<span>content</span><br />
<span>content</span><br />
<span>content</span><br />
<span>content</span><br />
</div>
<button id="scroll_button">
Scroll
</button>
结果如下所示:
我写了一个方法,将容器滚动到其中的一个元素,但将元素保持在视图的中间。它看起来像这样:
// Function for scrolling to an element, and placing it in the middle of the view
// By default, the container parameter is set to the browser window
function scrollIntoViewMiddle(element, container) {
if (container === undefined) {
container = window;
}
var elementRect = element.getBoundingClientRect();
var absoluteElementTop = elementRect.top;
var middleDiff = (elementRect.height / 2);
var scrollTopOfElement = absoluteElementTop + middleDiff;
var scrollY = scrollTopOfElement - (window.innerHeight / 2);
container.scrollTo(0, scrollY);
}
这适用于大多数浏览器,甚至是一些旧的 FF 浏览器。但是,在 Internet Explorer 11 上,我得到标题中的错误,即 scrollTo()
不是已定义的函数。什么可以替代 IE11 的此功能?感谢您的回答。
同意l-portet,因为the scrollTo method doesn't support IE browser, we could set the Element.scrollLeft property and Element.scrollTop属性达到同样的效果
此外,该问题还与以下代码有关:
var scrollY = scrollTopOfElement - (window.innerHeight / 2);
我认为您想根据目标元素和容器元素获取 scrollY,而不是 window 元素。所以,请尝试修改您的代码如下:
function scrollIntoViewMiddle(element, container) {
if (container === undefined) {
container = window;
}
var elementRect = element.getBoundingClientRect();
var absoluteElementTop = elementRect.top;
var middleDiff = (elementRect.height / 2);
var scrollTopOfElement = absoluteElementTop + middleDiff;
var scrollY = (scrollTopOfElement - (container.getBoundingClientRect().height / 2));
//container.scrollTo(0, scrollY);
container.scrollLeft = 0;
container.scrollTop = scrollY;
}
更多详细示例代码,请查看this sample。
此外,这里还有一个解决方法,它使用了JQuery animate和scrollto,你可以参考它。
<script src="Scripts/jquery-1.10.2.min.js"></script>
<script>
$(function () {
jQuery(document).on('click', '#scroll_button', function (e) {
var el = $("#scroll_test");
var elOffset = el.offset().top;
var elHeight = el.outerHeight();
var frameHeight = $("#editor").outerHeight();
var offset;
if (elHeight < frameHeight) {
offset = elOffset - ((frameHeight / 2) - (elHeight / 2));
}
else {
offset = elOffset;
}
jQuery('#editor').animate({
scrollTop: offset
}, 1000);
});
});
</script>
<style>
#editor {
height: 100px;
overflow: auto;
}
#scroll_test {
background-color: grey;
}
</style>
<div id="editor" placeholder="Enter text ..." contenteditable="true" autofocus>
<span>content</span><br />
<span>content</span><br />
<span>content</span><br />
<span>content</span><br />
<span>content</span><br />
<span>content</span><br />
<div id="scroll_test">
test
</div>
<span>content</span><br />
<span>content</span><br />
<span>content</span><br />
<span>content</span><br />
<span>content</span><br />
<span>content</span><br />
<span>content</span><br />
<span>content</span><br />
</div>
<button id="scroll_button">
Scroll
</button>
结果如下所示: