iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >Web Components如何实现类Element UI中的Card卡片
  • 214
分享到

Web Components如何实现类Element UI中的Card卡片

2023-07-02 16:07:25 214人浏览 八月长安
摘要

这篇“WEB Components如何实现类Element UI中的Card卡片”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下

这篇“WEB Components如何实现类Element UI中的Card卡片”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Web Components如何实现类Element UI中的Card卡片”文章吧。

    Web Components 核心组成

    • 自定义元素(custom element),使用 window.customElements.define api注册

    • Shadow DOM隔离,影藏标记结构、样式和行为

    • 可以在<template>中定义标记结构、样式,多次重用。利用 slot 插槽、命名插槽,可以传入定制化的结构UI,使用上类似 Vue 中的 slot 插槽

    1. Custom Elements

    自定义的 html 标签,称为自定义元素(custom element)。根据规范,自定义元素的名称必须包含连词线-,用与区别原生的 HTML 元素。所以,<com-card>不能写成<comcard>

    <div id="custom-card" class="com-card">  <div class="com-card-head">    <slot name="head"></slot>  </div>  <div class="com-card-body">    <slot></slot>    <div class="link-wrap">      <a class="link" href="" title=" rel="external nofollow"  rel="external nofollow" "></a>    </div>  </div></div><script>  class ComCard extends HTMLElement {    constructor() {      super()      var tplEle = document.getElementById('custom-card')      this.append(tplEle)    }  }  window.customElements.define('com-card', ComCard)</script>

    这样就注册了浏览器可识别渲染的一个自定义元素标签。

    2. Shadow DOM

    Shadow DOM 是对DOM的一个封装。可以将标记结构、样式和行为隐藏起来,并与页面上的其他代码相隔离,保证不同的部分不会混在一起,可使代码更加干净、整洁。
    使用自定义元素的 this.attachShadow() 方法可以开启 Shadow DOM

    class ComCard extends HTMLElement {  constructor() {    super()    var shadow = this.attachShadow({mode: 'closed'})  // open    var tplEle = document.getElementById('custom-card')    shadow.appendChild(tplEle)  }}window.customElements.define('com-card', ComCard);

    其中参数{ mode: 'closed' },表示 Shadow DOM 是封闭的,不允许外部访问。

    3. templates 和 slots

    因为组件的样式应该与代码封装在一起,只对自定义元素生效,不影响外部的全局样式。所以,可以把样式写在<template>里面,这样作为自定义元素结构的基础可以被多次重用。

    <template id="custom-card-template">  <style>    .com-card {    }  </style>  <div class="com-card">  </div></template><script>  class ComCard extends HTMLElement {    constructor() {      super();      var shadow = this.attachShadow({mode: 'closed'})  // open      var tplEle = document.getElementById('custom-card-template')      var content = tplEle.content.clonenode(true)      shadow.appendChild(content)    }  }  window.customElements.define('com-card', ComCard);</script>

    完整代码

    <!DOCTYPE html><html><head>  <meta charset="UTF-8">  <title>Web Component</title>  <style>    * {        box-sizing: border-box;    }    body {        font-size: 14px;    }    .box {        padding: 5px 0 30px;    }    .box .caption {        display: none;    }    .box h2 {        text-align: center;    }    .box li {        color: #666;        font-size: 14px;        line-height: 1.8;        margin-top: 15px;    }    .img {        display: block;        width: 80%;        margin: 0 !important;    }    .card-head {        display: flex;        justify-content: space-between;        align-items: center;    }    .card-title {        color: #333;        font-size: 16px;    }    .card-head-btn {        color: #409eff;        cursor: pointer;        text-decoration: none !important;    }    .card-head-btn:hover {        text-decoration: none;    }  </style></head><body><div class="box">  <h2>Web Component</h2>  <com-card data-show-head="0" data-url="https://tiven.cn" data-title="天问博客">    <div slot="head" class="card-head">      <div class="card-title">卡片名称</div>      <a class="card-head-btn">操作按钮</a>    </div>    <img class="img" src="Https://file.lsjlt.com/upload/202306/28/bh23o2zxbzf.jpg" alt="天問">  </com-card>  <br>  <br>  <com-card data-show-head="1" data-url="https://tiven.cn/p/de241e23/" data-title="Vite+vue3+Vant快速构建项目">    <div slot="head" class="card-head">      <div class="card-title">卡片名称</div>      <a class="card-head-btn" onclick="hello()">操作按钮</a>    </div>    <img class="img" src="https://file.lsjlt.com/upload/202306/28/yrxrhzjgdpe.jpg" alt="天問">    <ol>      <li>君不见黄河之水天上来,奔流到海不复回。</li>      <li>君不见高堂明镜悲白发,朝如青丝暮成雪。</li>      <li>天生我材必有用,千金散尽还复来。</li>    </ol>  </com-card></div><template id="custom-card-template">  <style>    .com-card {        min-width: 200px;        min-height: 100px;        border-radius: 4px;        border: 1px solid #ebeef5;        background-color: #fff;        overflow: hidden;        color: #303133;        transition: .3s;        box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);    }    .com-card-head {        padding: 10px 20px;        border-bottom: 1px solid #ebeef5;        box-sizing: border-box;    }    .com-card-body {        padding: 20px;    }    .link-wrap {        text-align: left;        padding-top: 20px;    }    .link {        display: inline-block;        height: 42px;        line-height: 43px;        padding: 0 30px;        text-align: center;        cursor: pointer;        color: #fff;        background-color: #409eff;        border-color: #409eff;        -webkit-appearance: none;        box-sizing: border-box;        outline: none;        transition: .1s;        font-weight: 500;        -moz-user-select: none;        -webkit-user-select: none;        -ms-user-select: none;        font-size: 14px;        border-radius: 4px;        text-decoration: none !important;    }  </style>  <div class="com-card">    <div class="com-card-head">      <slot name="head"></slot>    </div>    <div class="com-card-body">      <slot></slot>      <div class="link-wrap">        <a class="link" href="" title=" rel="external nofollow"  rel="external nofollow" "></a>      </div>    </div>  </div></template><script>  class ComCard extends HTMLElement {    constructor() {      super();      var shadow = this.attachShadow({mode: 'closed'})  // open      var tplEle = document.getElementById('custom-card-template')      var content = tplEle.content.cloneNode(true)      var attrList = Array.from(this.attributes);      var props = attrList.reduce((prev, item)=>{        prev[item.name] = item.value        return prev      }, {})      if (props['data-show-head']!=='1') {        var head = content.querySelector('.com-card-head')        head.remove()      }      var urlEle = content.querySelector('.link')      if (props['data-url'] && props['data-title']) {        urlEle.href = props['data-url']        urlEle.title = props['data-title']        urlEle.innerText = props['data-title']      } else {        urlEle.remove()      }      shadow.appendChild(content)    }    connectedCallback(){      //在这里发送数据请求(ajax)      console.log('connectedCallback')    }    //被从文档DOM中删除时调用    disconnectedCallback(){      console.log('disconnectedCallback')    }    //被移动到新的文档时调用    adoptedCallback(){      console.log('adoptedCallback')    }    //当增加、删除、修改自身的属性时被调用    attributeChangedCallback(){      console.log('attributeChangedCallback')    }  }  window.customElements.define('com-card', ComCard);  function hello() {    alert('Hello,Web Component')  }</script></body></html>

    最终效果如上图所示

    Web Components vs Vue Components

    Vue ComponentWeb Component
    data实例属性
    propsattributes
    watchobservedAttributes、attributeChangedCallback
    computedgetters
    methodsclass methods
    mountedconnectedCallback
    destroyeddisconnectedCallback
    style scopedtemplate中的style
    templatetemplate

    Web Components 生命周期回调函数

    connectedCallback:当 custom element首次被插入文档DOM时,被调用。

    disconnectedCallback:当 custom element从文档DOM中删除时,被调用。

    adoptedCallback:当 custom element被移动到新的文档时,被调用。

    attributeChangedCallback: 当 custom element增加、删除、修改自身属性时,被调用。

    优点 and 缺点

    优点:

    • 浏览器原生支持,不需要引入额外的第三方库

    • 语义化

    • 复用性,移植性高

    • 不同团队不同项目可以共用组件

    缺点:

    • 需要操作DOM

    • 目前浏览器兼容性、性能方面不够友好

    • 和外部CSS交互比较难

    七、基于web components的框架

    LitElement 是一个快速、轻量级的 Web UI 框架。使用 lit-html 来渲染元素。

    Polymer 是一款实用、基于事件驱动、封装性和交互性强的 Web UI 框架。

    Omi 是基于 Web 组件的跨框架跨平台框架 。移动端 & 桌面 & 小程序

    以上就是关于“Web Components如何实现类Element UI中的Card卡片”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

    --结束END--

    本文标题: Web Components如何实现类Element UI中的Card卡片

    本文链接: https://www.lsjlt.com/news/342931.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Web Components实现类Element UI中的Card卡片
      目录引言Web Components 核心组成1. Custom Elements2. Shadow DOM3. templates 和 slots完整代码Web Component...
      99+
      2024-04-02
    • Web Components如何实现类Element UI中的Card卡片
      这篇“Web Components如何实现类Element UI中的Card卡片”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下...
      99+
      2023-07-02
    • element-ui如何实现上传图片后清空图片显示
      这篇文章主要为大家展示了“element-ui如何实现上传图片后清空图片显示”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“element-ui如何实现上传图片后...
      99+
      2024-04-02
    • VUE中element-ui如何实现一个复用Table组件
      小编给大家分享一下VUE中element-ui如何实现一个复用Table组件,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!步骤一先来个基本的表格展示官例的tableDatatableDat...
      99+
      2024-04-02
    • vue项目中如何实现element-ui组件按需引入
      目录element-ui组件按需引入按需引入完整引入vue项目搭建 + 引入element-ui初始化单页系统ElementUI整合项目element-ui组件按需引入 按需引入 1...
      99+
      2024-04-02
    • element-ui如何实现上传一张图片后隐藏上传按钮功能
      这篇文章给大家分享的是有关element-ui如何实现上传一张图片后隐藏上传按钮功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。element-ui上传一张图片后隐藏上传按钮 ...
      99+
      2024-04-02
    • vue如何实现基于element-ui的三级CheckBox复选框
      小编给大家分享一下vue如何实现基于element-ui的三级CheckBox复选框,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧...
      99+
      2024-04-02
    • 在element-ui的select下拉框如何实现滚动加载
      这篇文章给大家分享的是有关在element-ui的select下拉框如何实现滚动加载的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。这里通过自定义封装vue指令进行封装。...
      99+
      2024-04-02
    • 如何利用vue+element ui实现好看的登录界面
      目录界面效果图下面直接上代码:附加背景图片总结闲暇之余使用vue+element ui制作了个登录界面 话不多说,先上 界面效果图 下面直接上代码: <template>...
      99+
      2024-04-02
    • vue中如何实现element-ui表格缩略图悬浮放大功能
      这篇文章给大家分享的是有关vue中如何实现element-ui表格缩略图悬浮放大功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。element-ui界面非常简洁和美观,提供的组...
      99+
      2024-04-02
    • 如何实现element-ui表格中勾选checkbox高亮当前行效果
      这篇文章主要介绍了如何实现element-ui表格中勾选checkbox高亮当前行效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。我们在做...
      99+
      2024-04-02
    • angularjs中ui-router如何实现路由的二级嵌套
      这篇文章主要为大家展示了“angularjs中ui-router如何实现路由的二级嵌套”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“angularjs中ui-r...
      99+
      2024-04-02
    • web算法中朴素贝叶斯如何实现文档分类
      本篇内容主要讲解“web算法中朴素贝叶斯如何实现文档分类”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“web算法中朴素贝叶斯如何实现文档分类”吧!  作业要求:  实验数据在bayes_data...
      99+
      2023-06-02
    • Vue中Element的table多选表格如何实现单选
      目录Element的table多选表格实现单选vue table单选逻辑Element的table多选表格实现单选 效果图 1.在多选表格的基础上进行处理, 呈现单选表格的作用 2...
      99+
      2024-04-02
    • web开发中如何实现鼠标悬停图片产生边框的效果
      本篇文章给大家分享的是有关web开发中如何实现鼠标悬停图片产生边框的效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。HTML图片的宽高一定要...
      99+
      2024-04-02
    • Python中的嵌套类如何实现
      Q: python的类里可以写类吗A : 是的,Python中的类可以包含其他类,这些类被称为嵌套类或嵌套类型。在类中定义嵌套类的语法与在模块中定义类的语法相同。例如,下面是一个包含嵌套类的示例:class OuterClass: ...
      99+
      2023-05-14
      Python
    • Java如何实现照片转化为回忆中的照片
      目录前言环境依赖代码执行结果前言 本文提供将图片进行色彩处理的Java工具类,让图片变成回忆中的画面。主要将图片做黑白与褐色的处理,具体的效果往下看吧。 环境依赖 一些工具的依赖,最...
      99+
      2024-04-02
    • Vue.js+cube-ui如何实现类似头条效果的横向滚动导航条
      这篇文章主要介绍Vue.js+cube-ui如何实现类似头条效果的横向滚动导航条,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!对于这样的效果,在各大移动端项目中几乎是随处可见,为什么...
      99+
      2024-04-02
    • css如何实现图片在盒子中的居中
      这篇文章将为大家详细讲解有关css如何实现图片在盒子中的居中,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。图片在盒子中的居中  .box{   width: 3...
      99+
      2024-04-02
    • 如何在Python中实现类的继承
      如何在Python中实现类的继承?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、继承的格式类的继承格式如下,括号中的为父类名。class 类名(父类名): ...
      99+
      2023-06-15
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作