html自定义元素,广告位内容附加在#shadow-root之后

hy

我尝试用js创建自定义元素。这是我的自定义元素

class ImageBackground extends HTMLElement {
  createdCallback() {
    let src = this.hasAttribute('src') ? this.getAttribute('src') : '/static/images/user.png'
    let className = `img-bg ${this.hasAttribute('className') ? this.getAttribute('className') : ''}`
    let isLazy = this.getAttribute('lazy') !== false

    const slotContent = document.createElement('slot')
    slotContent.setAttribute('name', 'slot-content')

    const wrapper = document.createElement('div')
    wrapper.appendChild(slotContent)
    wrapper.style.backgroundImage = `url("${src}")`
    wrapper.style.backgroundSize = 'cover'
    wrapper.style.backgroundPosition = 'center'
    wrapper.style.height = '300px'
    wrapper.setAttribute('class', className)

    this.createShadowRoot().appendChild(wrapper)
  }
}

document.registerElement('img-bg', ImageBackground)

这是我的哈巴狗模板

img-bg(src="/static/images/email.svg")
      p(slot="slot-content") cek

我想在插槽内附加p元素。但p元素附加在#shadow-root之后。

在此处输入图片说明

谁能解决这个问题... :(对不起,英语不好

间隔

<slot>标签用于进口儿童元素的进入<slot>,而不是一个地方,你把你自己的孩子。

最好的办法是将您<slot>的东西包装起来,然后将组件的<p>标签放在之后<slot>

或者,不建议:

如果要将组件生成的任何标签添加到插槽中,则需要将标签作为元素的子元素放置,而不是放置在shadowDOM中。只要将其放置为适当的子项,即可匹配的要求,而<slot>不是所显示的要求<slot>

class MyEl extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({mode:'open'}).innerHTML = `
    <style>
      .wrapper {
        border: 1px solid black;
        padding: 5px;
      }
      ::slotted(*) {
        background-color: #8F8; 
        margin: 1px;
        padding: 5px;
      }
    </style>
    <p>Before Slot</p>
    <div class="wrapper"><slot>Hi There</slot></div>
    <p>After Slot</p>
    `;
  }

  connectedCallback() {
  }
}

customElements.define('my-el', MyEl);

function addChild() {
  var el = document.querySelector('my-el');
  var p = document.createElement('p');
  p.textContent = "New stuff as a child.";
  el.appendChild(p);
}

var button = document.querySelector('#one');
button.addEventListener('click', addChild);
p {
  font-family: tahoma;
}

my-el p {
  font-weight: bold;
}
<p>Before Element</p>
<my-el>
  <p>Stuff in the slot</p>
</my-el>
<p>After Element</p>
<hr/>
<button id="one">Add Child</button>

因此,添加到插槽中的唯一方法是将子元素添加到该元素。

这可能不是一件好事,因为您正在更改组件用户创建的内容。这可能会弄乱他们的代码,CSS或两者。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从自定义表格广告位中删除了THEAD,TBODY,TR HTML元素

在自定义元素阴影DOM中选择广告位文字

亚马逊lex使动态自定义广告位

nginx位置将/之后的所有内容重写为root

Laravel 5.2将内容从“ public”移到root之后,bower_components出现了许多错误的路径

google action包如何定义自定义广告位类型?

自定义广告位选项不会对其参数进行任何简化

如何在广告位项目中向td添加自定义类?

我的自定义广告位类型呈现意外值

如何在rasa中的自定义操作中设置广告位

在元素之后添加HTML内容

多个模板广告位的广告位内容相同

root @之后如何更改部分

枢轴root之后使用chroot

获取Vue广告位的渲染HTML内容作为变量

在WooCommerce内容窗口小部件中产品标题之后显示ACF自定义字段

设置自定义HTML元素的内容

在pivot_root之后无法卸载

使用array.push()之后,如何为数组中的每个元素应用自定义类?

在killall -u root之后如何重新登录到root?

如何自定义root提示?

授予自定义脚本root权限

清除<i>元素之后的内容

[Vue警告]:未知的自定义元素:<app>-您是否正确注册了组件?(位于<Root>中)

在onItemClick之后关闭AlertDialog-自定义ListViewDialog

什么是淘汰赛自定义绑定“之后”变量?

自定义视图在addSubview之后不可点击

Magento 2:在head标签之后添加自定义脚本

在handle()之后在自定义artisan命令上运行代码