Я создал пользовательский элемент с прикрепленным к нему onclick
eventListener. Ширина устанавливается CSS на 200px.
Когда я добавляю пользовательский элемент в более широкую ячейку таблицы, eventListener даже улавливает клики за пределами пользовательского элемента (но внутри ячейки таблицы).
При изучении элемента с помощью Firefox Inspector кажется, что пользовательский элемент заполняет всю ячейку таблицы, хотя его ширина задана. Почему это происходит?
class Test extends HTMLElement {
constructor() {
super();
var shadow = this.attachShadow( { mode: 'open' } );
var f = document.createElement('font');
f.innerHTML = 'text';
var div = document.createElement('div');
div.style.border = '1px solid black';
div.style.width = '200px';
this.addEventListener('click', function() {
console.info('clicked');
});
div.appendChild(f);
shadow.appendChild(div);
}
}
customElements.define('my-test', Test);
<table border=1 style='border-collapse: collapse;'>
<tr>
<td style='width: 800px;' align='center'>
<my-test></my-test>
</td>
</tr>
</table>
Вам нужно установить display: inline-block; margin:0; padding: 0
на значение :host
, чтобы хост-элемент соответствовал общему размеру дочерних элементов внутри shadowDOM.
class Test extends HTMLElement {
constructor() {
super();
var shadow = this.attachShadow( { mode: 'open' } );
shadow.innerHTML = `<style>
:host {
background-color: #F99;
border: 1px dashed #900;
display: inline-block;
margin: 0;
padding: 0;
}
</style>`;
var div = document.createElement('div');
div.style.backgroundColor = '#aaa';
div.style.width = '200px';
this.addEventListener('click', function() {
console.info('clicked');
});
var f = document.createElement('font');
f.innerHTML = 'text';
div.appendChild(f);
shadow.appendChild(div);
}
}
customElements.define('my-test', Test);
<table border=1 style='border-collapse: collapse;'>
<tr>
<td style='width: 800px;' align='center'>
<my-test></my-test>
</td>
</tr>
</table>
:host
— содержащий элемент. В вашем случае :host
будет стилизовать элемент <my-test>
.
Спасибо. Никогда раньше не слышал о принимающей собственности. Нужно проверить документы :)