ASCII码 ASCII码

Web Components 系列(十)—— 实现 MyCard 的基本布局

发布于:2022-02-18 09:52:04  栏目:技术文档

mycard.001

前言

前面针对 Web Components 学习了一些基本的理论知识,我们了解到的概念有:

  • Custom Elements
  • Shadow DOM
  • Templates
  • Slots

以及和这些概念相关的子知识点。

理论知识基本上够用了,从现在开始我们需要将理论运用到实践中,让理论为实践服务。今天,我们就使用 Web Components 的相关知识来实现 MyCard 的制作,原型呢就以我们人人都有的身份证做参照吧。

最终实现的基本布局效果如下:

image-20220217225317835

使用 Templates 布局

这里我们使用 HTML 模板将布局先构建出来,代码如下:

  1. <template id="card_layout">
  2. <style>
  3. * {
  4. box-sizing: border-box;
  5. }
  6. :host {
  7. display: inline-block;
  8. width: 400px;
  9. height: 240px;
  10. border: 1px solid black;
  11. border-radius: 10px;
  12. box-shadow: -2px -2px 5px 0px #7a8489;
  13. }
  14. .container {
  15. display: flex;
  16. flex-direction: column;
  17. padding: 10px;
  18. height: 100%;
  19. }
  20. .card-body {
  21. flex: 1;
  22. display: flex;
  23. }
  24. .card-footer {
  25. padding: 10px 0;
  26. }
  27. .main-info {
  28. flex: 2;
  29. }
  30. .photo {
  31. flex: 1;
  32. display: flex;
  33. align-items: center;
  34. }
  35. .photo img{
  36. width: 100%;
  37. }
  38. .info-row {
  39. display: flex;
  40. padding-top: 15px;
  41. }
  42. .info-column {
  43. display: flex;
  44. align-items: center;
  45. }
  46. .info-title {
  47. padding: 0 10px;
  48. color: #0e5bd3;
  49. font-size: 12px;
  50. word-break: keep-all;
  51. }
  52. .info-content {
  53. letter-spacing: 2px;
  54. }
  55. </style>
  56. <div class="container">
  57. <div class="card-body">
  58. <div class="main-info">
  59. <div class="info-row">
  60. <div class="info-column">
  61. <div class="info-title">姓名</div>
  62. </div>
  63. <div class="info-content">编程三昧</div>
  64. </div>
  65. <div class="info-row">
  66. <div class="info-column">
  67. <div class="info-title">性别</div>
  68. <div class="info-content">男</div>
  69. </div>
  70. <div class="info-column">
  71. <div class="info-title">民族</div>
  72. <div class="info-content">汉</div>
  73. </div>
  74. </div>
  75. <div class="info-row">
  76. <div class="info-column">
  77. <div class="info-title">出生</div>
  78. <div class="info-content">2022</div>
  79. </div>
  80. <div class="info-column">
  81. <div class="info-title">年</div>
  82. <div class="info-content">12</div>
  83. </div>
  84. <div class="info-column">
  85. <div class="info-title">月</div>
  86. <div class="info-content">12</div>
  87. </div>
  88. <div class="info-column">
  89. <div class="info-title">日</div>
  90. </div>
  91. </div>
  92. <div class="info-row">
  93. <div class="info-column">
  94. <div class="info-title">住址</div>
  95. </div>
  96. <div class="info-content">xx省xx市xx区xx街道xx小区xx楼xx单元xx楼xx室</div>
  97. </div>
  98. </div>
  99. <div class="photo">
  100. <img src="./static/photo.jpg">
  101. </div>
  102. </div>
  103. <div class="card-footer">
  104. <div class="info-row">
  105. <div class="info-column">
  106. <div class="info-title">公民身份号码</div>
  107. </div>
  108. <div class="info-content">12345678901234567X</div>
  109. </div>
  110. </div>
  111. </div>
  112. </div>
  113. </template>

创建自定义元素

使用我们前面学习过的方法,创建一个基本的自定义元素 my-card,在自定义组件中引入 Templates 布局,代码如下:

  1. class MyCard extends HTMLElement {
  2. constructor () {
  3. super();
  4. this.shadow = this.attachShadow({mode: "open"});
  5. let tempEle = document.getElementById("card_layout");
  6. this.shadow.appendChild(tempEle.content);
  7. }
  8. }
  9. customElements.define("my-card", MyCard);

使用自定义元素

在 HTML 的 body 中引入 my-card 标签:

  1. <my-card></my-card>

总结

最终实现的效果如文章开头所示。

在这篇文章中,我们只使用 Custom Elements 和 Templates 实现了基本布局和样式,实用价值基本为零。

在后续中,会加入 Slots 让自定义元素实现可复用的效果。

~

~ 本文完,感谢阅读!

~

学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!

大家好,我是〖编程三昧〗的作者 隐逸王,我的公众号是『编程三昧』,欢迎关注,希望大家多多指教!

相关推荐
阅读 +