首页 > 其他分享 >碎片化学习前端之HTML(webComponent)

碎片化学习前端之HTML(webComponent)

时间:2023-05-10 12:13:22浏览次数:34  
标签:DOM color webComponent 碎片 HTML let background 模板

前言

webComponent 是 HTML5 推出的新特性,为组件化推广奠定基础。

webComponent 基本使用

原生组件,性能较好,但存在兼容性问题。其核心技术有:Custom elements, Shadow DOM, HTML Templates。

Custom elements

JavaScript API,用于定义 custom elements 及其行为。

<m-button type="primary">webComponent</m-button> // 调用

<script type="text/javascript">
class MButton extends HTMLElement {
     constructor() {
     	super();
     }
}
window.customElements.define('m-button', MButton) // 关联 HTML 和 JS,自定义组件
</script>

HTML Templates

<template>, <slot> 元素标记元素结构,并重用元素。

<m-button type="primary">webComponent</m-button>

<template id="m-btn">
    <button class="m-button">
        <slot>Default</slot>
    </button>
</template>

<script type="text/javascript">
class MButton extends HTMLElement {
    constructor() {
        super();

        let btnTmpl = document.getElementById('m-btn') // 定义模板并获取模板
     }
}
</script>

Shadow DOM

JavaScript API,用于封装 Shadow DOM 附加到元素上,并关联其功能,以此保证元素的功能私有,不会与其他元素冲突。

<m-button type="primary">webComponent</m-button>

<template id="m-btn">
    <button class="m-button">
        <slot>Default</slot>
    </button>
</template>

<script type="text/javascript">
class MButton extends HTMLElement {
     constructor() {
        super();

        let btnTmpl = document.getElementById('m-btn') // 定义模板并获取模板

        let shadow = this.attachShadow({ mode: 'open' }) // 配置 devtools 是否可查看 DOM 结构,open / close
        let cBtnTmpl = btnTmpl.content.cloneNode(true) // copy 模板便于重用

     	shadow.appendChild(cBtnTmpl) // 模板挂载 Shadow DOM
     }
}
</script>

webComponent 高阶使用

webComponent 高阶使用主要包括属性设置,样式设置,事件绑定等

webComponent 属性设置

webComponent 在调用组件时进行属性传值,在声明组件时通过 DOM API 获取属性值进行操作。

<m-button type="primary">webComponent</m-button>

<script type="text/javascript">
class MButton extends HTMLElement {
     constructor() {
     	super();
     	
     	let btnTmpl = document.getElementById('m-btn') // 定义模板并获取模板
     	
     	let shadow = this.attachShadow({ mode: 'open' })
     	let cBtnTmpl = btnTmpl.content.cloneNode(true) // copy 模板便于重用
     	
     	let type = this.getAttribute('type') // 读取属性值,进行操作
     	
     	shadow.appendChild(cBtnTmpl) // 模板挂载 Shadow DOM
     }
}
</script>

webComponent 样式设置

  1. template 设置样式

    <m-button type="primary">webComponent</m-button>
    
    <template id="m-btn">
        <style type="text/css"> // 定义模板样式
            .m-button {
                border: none;
                outline: none;
                border-radius: 4px;
                padding: 5px 20px;
            }
        </style>
        <button class="m-button">
            <slot>Default</slot>
        </button>
    </template>
    
    class MButton extends HTMLElement {
        constructor() {
            super();
    
            let btnTmpl = document.getElementById('m-btn') // 定义模板并获取模板
    
            let shadow = this.attachShadow({ mode: 'open' })
            let cBtnTmpl = btnTmpl.content.cloneNode(true) // copy 模板便于重用
    
            let type = this.getAttribute('type') // 读取属性值,进行操作
    
            shadow.appendChild(cBtnTmpl) // 模板挂载 Shadow DOM
        }
    }
    
  2. Shadow DOM 设置样式

    <m-button type="primary">webComponent</m-button>
    
    <template id="m-btn">
        <style type="text/css"> // 定义模板样式
            .m-button {
                border: none;
                outline: none;
                border-radius: 4px;
            padding: 5px 20px;
            }
        </style>
        <button class="m-button">
            // 具名插槽使用:模板内<slot name="btn-text"></slot>,模板外调用时<span slot="btn-text"></span>
            <slot>Default</slot> 
        </button>
    </template>
    
    class MButton extends HTMLElement {
        constructor() {
            super();
    
            let btnTmpl = document.getElementById('m-btn') // 定义模板并获取模板
    
            let shadow = this.attachShadow({ mode: 'open' })
            let cBtnTmpl = btnTmpl.content.cloneNode(true) // copy 模板便于重用
    
            let type = this.getAttribute('type') // 读取属性值,进行操作
    
            const sheets = {
                'primary': {
                    background: '#409EFF',
                    color: '#FFF'
                },
                'success': {
                    background: '#67C23A',
                    color: '#FFF'
                },
                'warning': {
                    background: '#E6A23C',
                    color: '#FFF'
                },
                'danger': {
                    background: '#F56C6C',
                    color: '#FFF'
                },
                'default': {
                    background: '#909399',
                    color: '#FFF'
                },
            }
    
            const style = document.createElement('style')
            style.textContent = `
                .m-button {
                    background: ${sheets[type].background}; // 属性 配置css 样式
                    color: ${sheets[type].color};
                }
            `
    
            shadow.appendChild(style)
            shadow.appendChild(cBtnTmpl) // 模板挂载 Shadow DOM
        }
    }
    

    注意:webComponent 通过 Shadow DOM 隔离以后,外界无法修改样式,只能通过属性或者设置 CSS 变量的方式修改。

  3. css 变量设置样式

    <style type="text/css">
    :root {
        --text-color: #fff;
    }
    </style>
    
    <m-button type="primary">webComponent</m-button>
    
    <template id="m-btn">
        <style type="text/css"> // 定义模板样式
            .m-button {
                border: none;
                outline: none;
                border-radius: 4px;
                padding: 5px 20px;
            }
        </style>
        <button class="m-button">
        <slot>Default</slot>
        </button>
    </template>
    
    class MButton extends HTMLElement {
        constructor() {
            super();
    
            let btnTmpl = document.getElementById('m-btn') // 定义模板并获取模板
    
            let shadow = this.attachShadow({ mode: 'open' })
            let cBtnTmpl = btnTmpl.content.cloneNode(true) // copy 模板便于重用
    
            let type = this.getAttribute('type') // 读取属性值,进行操作
    
            const sheets = {
                'primary': {
                    background: '#409EFF',
                    color: '#FFF'
                },
                'success': {
                    background: '#67C23A',
                    color: '#FFF'
                },
                'warning': {
                    background: '#E6A23C',
                    color: '#FFF'
                },
                danger': {
                    background: '#F56C6C',
                    color: '#FFF'
                },
                'default': {
                    background: '#909399',
                    color: '#FFF'
                },
            }
    
            const style = document.createElement('style')
            style.textContent = `
                .m-button {
                    background: ${sheets[type].background}; // 属性 配置 css 样式
                    color: var(--text-color, ${sheets[type].color}); // css 变量配置 css 样式
                }
            `
    
            shadow.appendChild(style) // 样式挂载至 Shadow DOM
            shadow.appendChild(cBtnTmpl) // 模板挂载至 Shadow DOM
        }
    }
    

注意:通过 templates 设置样式的优先级是高于 css 变量和 Shadow DOM 的。

webComponent 事件绑定

<m-button type="primary">webComponent</m-button>

<template id="m-btn">
    <button class="m-button">
        <slot>Default</slot>
    </button>
</template>

<script type="text/javascript">
class MButton extends HTMLElement {
    constructor() {
     	super();
     	
     	let btnTmpl = document.getElementById('m-btn') // 定义模板并获取模板
     	
     	let shadow = this.attachShadow({ mode: 'open' }) // 配置 devtools 是否可查看 DOM 结构,open / close
     	let cBtnTmpl = btnTmpl.content.cloneNode(true) // copy 模板便于重用
     	
     	cBtnTmpl.querySelector('.m-button').addEventListener('click', this.onClick)
     	
     	shadow.appendChild(cBtnTmpl) // 模板挂载 Shadow DOM
    }
     onClick() {
        alert('click')
    }
}
</script>

后记

标签:DOM,color,webComponent,碎片,HTML,let,background,模板
From: https://www.cnblogs.com/huangminghua/p/17387582.html

相关文章

  • Java使用wkhtmltopdf实现HTML转pdf
    wkhtmltopdf设置全屏:wkhtmltopdf--disable-smart-shrinking--page-sizeA4-B0-L0-R0-T0test.htmloutput.pdf-B-T-R-L是有效果的,$snappy->setOption('margin-top','0mm');$snappy->setOption('margin-left','0mm'......
  • HTML中meta标签的那些属性
    <meta>标签是HTML中用于描述网页元信息的元素。它位于<head>部分,不会显示在页面内容中,但对于浏览器、搜索引擎等具有重要作用。主要作用有:定义文档的字符编码、提供网页的描述信息、关键词、作者、视口设置等,这些信息有助于搜索引擎理解和索引网页内容。 <meta>标签的......
  • HTML 表单
    9.1表单标签-主要标签-<form>:表单容器-<input>:输入框-相关标签-<textarea>:多行文本框-<select>、<option>:下拉菜单(组合使用)-<label>:标题(辅助表单标签),用for和id属性形成映射,点击标题也可选择9.2<input>标签属性-type:控制输入框类型-值:-text-普通文本输入......
  • 学习日记——HTML入门第一课
    1.了解HTML的定义,基本结构①对于超文本标记语言的理解,是超越文本(不限制于字符,包含视频音频)用“<>”这个特殊字符来书写的语言②基本结构为<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>网页标题</title></head>......
  • HTML a标签
    7.1属性-href:链接地址-target:控制链接的打开方式。-_self(默认)-在当前页面打开;-_blank-新标签页打开。7.2<base/>标签-作用:改变链接的默认行为-位置:在head标签中-属性:href——改变默认链接;target——改变默认目标。7.3可作为锚点-作用:跳转到本页指定id......
  • HTML 列表
    5.1无序列表ul<ul><li>无序列表</li><li>无序列表</li></ul>-ul里只能放li标签-默认黑色实心圆-type属性:-disc-黑色实心圆,-circle-黑色空心圆,-square-黑色实心正方形,-none-取消样式5.2有序列表ol<ol><li>有序列表</li><......
  • HTML div 和 span 标签
    4.1<div></div>-划分页面区域,独占一行4.2<span></span>-主要用于对文本独立修饰。-内容有多宽就占用多宽的空间,不换行,不破坏原有结构......
  • HTML特殊符号
    3.特殊符号3.1尖角号-<左尖角号<->右尖角号>3.2空格-&nbsp;宽度受字体影响-&emsp;宽度是1个中文字符宽度,基本不受字体影响3.3版权-&copy;3.4商标-&trade;-&reg;3.5与号-&amp;3.6人民币-&yen;3.7摄氏度-&deg;3.8特殊符号练习<......
  • html5 2.0学习
    列表定义:是一种特别的对象集合。集合:集中在一起合二为一(聚集)。聚集:多个列(信息资源)排在一起。信息资源:一堆数据,可能是字符,可能是图片。列表分类:有序列表无序列表 (自)定义列表 有序列表:有顺序的列表。列表结构:<ol><li></li></ol> 有顺序,每个li独占一行,默认li标签前面有顺......
  • HTML常用标签
    1.基础语法1.1标记(标签)-常规标记(双标记)<标记></标记>-空标记(单标记)<标记/>1.2<!DOCTYPEhtml>文档类型1.3<htmllang="zh-CN">为浏览器指出本文档所用语言1.4<meta/>-<metacharset=""/>:设置文档字符编码2.常用标签2.1<......