javascript - 强制输入始终在具有动态高度的页面中的视口中
问题描述
我的网站有一个表格,当您输入内容时,它会在表格上方添加错误。当您在大屏幕桌面上执行此操作时,即使将输入移到底部,您仍然可以看到输入。但是,当您使用手机时,可能会出现很多错误并且输入会超出屏幕。
这就是问题所在:https ://angular-wwvhcw.stackblitz.io
我试图绑定一个输入事件,当输入事件发生时,我会将文档滚动到输入实际上位于同一位置的位置。
到目前为止,这是我的代码(我正在使用 Angular):
@Directive({
selector: '[appAnchorInput]'
})
export class AnchorInputDirective {
input: HTMLInputElement;
@HostListener('input') onInput() {
const position: DOMRect = this.el.nativeElement.getBoundingClientRect();
const pos = Math.abs(this.input.scrollTop - position.y); // can't figure equation to calculate proper scroll
this.viewportScroller.scrollToPosition([0, pos]);
}
constructor(private el: ElementRef, private viewportScroller: ViewportScroller) {
this.input = el.nativeElement;
}
}
你有什么想法来解决这个问题吗?也许有人有其他方法来解决这个问题(不幸的是无法删除该机制)。
解决方案
与其监听input
事件,不如监听keyup
事件,然后调用scrollIntoView()
目标元素(如果它在视口中不可见)。
HTML:
<input [(ngModel)]="value" (keyup)="handleKeyup($event)" id="dupa">
控制器:
handleKeyup($event) {
if (this.isInViewport($event.target)) {
console.log("visible")
} else {
console.log("not visible")
$event.target.scrollIntoView();
}
}
isInViewport(elem) {
var bounding = elem.getBoundingClientRect();
return (
bounding.top >= 0 &&
bounding.left >= 0 &&
bounding.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
bounding.right <= (window.innerWidth || document.documentElement.clientWidth)
);
};
我分叉了您的 StackBlitz 并对其进行了更新,以便它适用于我:https ://stackblitz.com/edit/angular-1sfnjj
来源:https ://gomakethings.com/how-to-test-if-an-element-is-in-the-viewport-with-vanilla-javascript/
推荐阅读
- ios - SwiftUI 如何确定图像是横向还是纵向?
- python - 为什么django rest framework app在本地工作,但部署到heroku时只能做GET请求?
- excel - 向下填充公式到最后一个可见单元格
- python - 如何计算字符串的出现次数以熊猫数据框中逗号分隔值中的特定子字符串开头?
- google-sheets - Countifs N 跨多个标准计数(在数据验证中),但如果数据验证单元格为空白,则不返回零
- css - rgb() 和 rgba() 不透明度有什么区别?
- angular - 在模板中调用 Angular 方法比 {{ }} 更有效吗?
- ruby-on-rails - Webpacker::Manifest::MissingEntryError 当 stylesheet_packs_with_chunks_tag
- twilio - Twilio 消息服务 - 将传入的 SMS 路由到工作室流程不起作用
- python - 计数表达式