假设我有一个自定义元素。它由两部分组成,一个是打开和切换菜单的按钮,另一个是菜单本身。我想将菜单直接放在按钮 ( position: absolute
) 下方,但按钮的高度可能因主题而异。如何在第一次渲染之前找出按钮的高度?
简化示例:
import { render, html } from 'lit-html';
class Dropdown extends HTMLElement {
constructor() {
super();
this.root = this.attachShadow({ mode: "open" });
this.update();
}
get template() {
return html`
<style>
button {
height: 30px;
}
#dropdown-wrapper {
position: relative;
display: inline-block;
}
#dropdown-menu {
position: absolute;
top: ${dynamicButtonHeight}px;
left: 0;
}
</style>
<div id="dropdown-wrapper">
<button type="button">Dropdown</button>
<div id="dropdown-menu">
<slot></slot>
</div>
</div>
`;
}
update() {
render(this.template, this.root, { eventContext: this });
}
}
正如您在示例中看到的,我想知道初始渲染时按钮的高度并dynamicButtonHeight
以某种方式填充变量。在这个例子中,它是 30px,但这实际上可以是任何数字。如果我想将菜单向右对齐,这同样适用于宽度。
我知道我可以先渲染标记,然后使用按钮获得对按钮的引用,this.root.querySelector("button").offsetHeight
然后再重新渲染。尽管多亏了 lit-html 这会很有效,但我觉得这很脏并且在某些用例中会中断。
还有其他想法吗?