19.CSS-定位(上)

本文详细介绍了CSS中的定位流,包括相对定位和绝对定位的概念、注意事项及其应用场景。相对定位不脱离标准流,常用于元素微调;绝对定位则脱离标准流,通常与相对定位结合使用,实现子元素相对于父元素的精确定位。文章通过实例展示了如何利用相对和绝对定位解决布局问题,以及如何实现元素的水平居中。

定位

定位流的分类

1.相对定位

什么是相对定位?

相对定位就是相对于自己以前在标准流中的位置来移动

注意点
  1. 相对定位是不脱离标准流的,会继续在标准流中占据一份空间;
  2. 需要配合其他的属性一起使用,相对于自己以前在标准流中的位置来移动;
position: relative;
top: 20px;
right: ;
bottom: ;
left: 20px;
  1. 在相对定位中同一个方向上的定位属性只能使用一个;
  2. 由于相对定位是不脱离标准流的,所以在相对定位中是区分块级元素/行内元素/行内块级元素的;
  3. 由于相对定位是不脱离标准流的,并且相对定位的元素会占用标准流中的位置,所以当给相对定位的元素设置margin/padding等属性的时候,会影响到标准流的布局
应用场景
  1. 用于对元素进行微调;
    例如:当input和img的顶部对不齐时
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>75-定位流</title>
  <style>
    *{
      margin: 0;
      padding: 0;
    }
    input{
      width: 200px;
      height: 50px;
    }
    img{
      width: 100px;
      height: 50px;
      position: relative;
      top: 20px;
    }
  </style>
</head>
<body>
<input type="text">
<img src="images/vcode.jpg">
</body>
</html>
  1. 配合绝对定位来使用。

2.绝对定位

什么是绝对定位?

就是相对于body来定位(不一定是相对于body)
规律:

  1. 默认情况下所有的绝对定位的元素,无论有没有祖先元素,都会以body作为参考点。
  2. 如果一个绝对定位的元素有祖先元素,并且祖先元素,那么这个绝对定位的元素就会以定位流的那个祖先元素作为参考点。
    (只要是这个绝对定位元素的祖先元素都可以;定位流指的是绝对定位、相对定位、固定定位,只有静态定位不行)
  3. 如果一个绝对定位的元素有祖先元素,并且祖先元素也是定位流,而且祖先元素中有多个元素都是定位流,那么这个绝对定位的元素会以离他最近的那个元素为参考点(就近原则)
注意点
  1. 绝对定位的元素是脱离标准流的;
  2. 绝对定位的元素是不区分块级元素/行内元素/行内块级元素的。
  3. 如果一个绝对定位的元素是以body作为参考点,那么其实是以网页首屏的宽度和高度作为参考点,而不是以整个网页的高度和宽度作为参考点的;
  4. 一个绝对定位的元素会忽略祖先元素的padding。
应用场景

在企业开发中,不会单独使用相对定位或者绝对定位。
单独使用相对定位的弊端:
相对定位不会脱离标准流,会继续在标准流当中占用一份空间,所以不利于布局界面。
单独使用绝对定位的弊端:
默认情况下绝对定位的元素会以body作为参考点,所以会随着浏览器的宽度高度的变化而变化。
绝对定位和相对定位结合使用:子绝父相
子元素用绝对定位,父元素用相对定位
例如:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>79-绝对定位-子绝父相</title>
  <style>
    *{
      padding: 0;
      margin: 0;
    }
    ul{
      list-style: none;
      width: 800px;
      height: 50px;
      margin: 0 auto;
      margin-top: 100px;
    }
    ul li{
      float: left;
      width: 100px;
      height: 50px;
      line-height: 50px;
      text-align: center;
      background-color: #cccccc;
    }
    ul li:nth-of-type(4){
      background-color: yellow;
      position: relative;
    }
    ul li img{
      /*单独使用相对定位的弊端:
        相对定位不会脱离标准流,会继续在标准流当中占用一份空间,所以不利于布局界面。*/
      /*position: relative;
      left: -42px;
      top: -18px;*/
      /*单独使用绝对定位的弊端:
      默认情况下绝对定位的元素会以body作为参考点,所以会随着浏览器的宽度高度的变化而变化*/
      /*position: absolute;
      left: 526px;
      top: 90px;*/
      /*绝对定位和相对定位结合使用:子绝父相
      子元素用绝对定位,父元素用相对定位*/
      position: absolute;
      left: 40px;
      top: -10px;
    }
  </style>
</head>
<body>
<ul>
  <li>服装城</li>
  <li>美妆馆</li>
  <li>京东超市</li>
  <li>全球购
    <img src="images/hot.png">
  </li>
  <li>闪购</li>
  <li>团购</li>
  <li>拍卖</li>
  <li>金融</li>
</ul>
</body>
</html>

如何让绝对定位的元素水平居中
只需要设置绝对定位的元素的left:50%;
然后在设置绝对定位元素的margin-left:—元素宽度的一半px;
例如:

ul li img{
      /*单独使用相对定位的弊端:
        相对定位不会脱离标准流,会继续在标准流当中占用一份空间,所以不利于布局界面。*/
      /*position: relative;
      left: -42px;
      top: -18px;*/
      /*单独使用绝对定位的弊端:
      默认情况下绝对定位的元素会以body作为参考点,所以会随着浏览器的宽度高度的变化而变化*/
      /*position: absolute;
      left: 526px;
      top: 90px;*/
      /*绝对定位和相对定位结合使用:子绝父相
      子元素用绝对定位,父元素用相对定位*/
      position: absolute;
      /*left: 40px;*/
      left: 50%;
      margin-left: -12px;
      top: -10px;
    }
<style scoped> .data-management { padding: 20px; } .tab-content { padding: 20px; background: rgba(255, 255, 255, 0.95); border-radius: 8px; min-height: 500px; box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); } .toolbar { margin-bottom: 20px; display: flex; align-items: center; } .pagination { margin-top: 20px; display: flex; justify-content: flex-end; } .dialog-footer { display: flex; justify-content: flex-end; } /* 增强表格文字显示 - 使文字更加显眼 */ .el-table { background-color: #0a0a0a !important; color: #000000 !important; font-size: 16px !important; font-weight: 600 !important; } .el-table__header th { background-color: #0a0a0a !important; color: #000000 !important; font-weight: 800 !important; font-size: 17px !important; border-bottom: 3px solid #a0b8f0; text-align: center; } .el-table__row td { color: #000000 !important; font-size: 16px !important; font-weight: 600 !important; padding: 15px 0 !important; text-align: center; } /* 表格悬停效果 */ .el-table__row:hover td { background-color: #d0e0ff !important; font-weight: 700 !important; } /* 表格选中效果 */ .el-table__row--striped td { background-color: #f0f5ff !important; } /* 表格边框 */ .el-table td, .el-table th { border-bottom: 2px solid #d0d7ff; } /* 增强表单文字显示 */ .el-form-item__label { color: #000000 !important; font-weight: 700 !important; font-size: 17px !important; padding-right: 10px; } .el-input__inner, .el-textarea__inner { background-color: #ffffff !important; color: #000000 !important; border: 3px solid #a0b8f0 !important; font-weight: 600 !important; font-size: 16px !important; padding: 12px; } .el-select .el-input__wrapper { background-color: #ffffff !important; box-shadow: 0 0 0 3px #a0b8f0 inset !important; font-weight: 600 !important; font-size: 16px !important; } /* 表单元素聚焦状态 */ .el-input.is-focus .el-input__wrapper, .el-select .el-input.is-focus .el-input__wrapper { box-shadow: 0 0 0 4px #409eff inset !important; font-weight: 700 !important; } /* 按钮文字增强 */ .el-button { font-weight: 700 !important; font-size: 16px !important; padding: 12px 24px !important; border-width: 2px !important; } /* 主要按钮 */ .el-button--primary { background-color: #409eff !important; border-color: #409eff !important; color: #ffffff !important; box-shadow: 0 4px 8px rgba(64, 158, 255, 0.4); } .el-button--primary:hover { background-color: #66b1ff !important; border-color: #66b1ff !important; box-shadow: 0 6px 12px rgba(64, 158, 255, 0.6); } /* 危险按钮 */ .el-button--danger { background-color: #f56c6c !important; border-color: #f56c6c !important; color: #ffffff !important; box-shadow: 0 4px 8px rgba(245, 108, 108, 0.4); } .el-button--danger:hover { background-color: #f78989 !important; border-color: #f78989 !important; box-shadow: 0 6px 12px rgba(245, 108, 108, 0.6); } /* 对话框标题 */ .el-dialog__title { color: #000000 !important; font-weight: 800 !important; font-size: 22px !important; } /* 分页组件文字 */ .el-pagination { color: #000000 !important; font-weight: 600 !important; font-size: 16px !important; } .el-pagination .el-pager li { color: #000000 !important; font-weight: 600 !important; font-size: 16px !important; min-width: 40px; height: 40px; line-height: 40px; } .el-pagination .el-pager li.active { color: #ffffff !important; background-color: #409eff !important; font-weight: 800 !important; font-size: 17px !important; border-radius: 50%; } /* 下拉选项文字 */ .el-select-dropdown__item { color: #000000 !important; font-weight: 600 !important; font-size: 16px !important; padding: 12px 20px !important; min-height: 45px; line-height: 20px; } .el-select-dropdown__item.hover, .el-select-dropdown__item:hover { background-color: #d0e0ff !important; font-weight: 700 !important; color: #000000 !important; } /* 工具栏按钮 */ .toolbar .el-button--primary { box-shadow: 0 4px 8px rgba(64, 158, 255, 0.4); font-weight: 700 !important; font-size: 16px !important; padding: 12px 24px !important; } /* 搜索框 */ .toolbar .el-input__inner { box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15); font-size: 16px !important; padding: 12px 15px !important; } /* 搜索按钮 */ .toolbar .el-button { height: 100%; border-left: none !important; } /* 标签页 */ .el-tabs__item { color: #666666 !important; font-size: 18px !important; font-weight: 600 !important; padding: 0 30px; } .el-tabs__item.is-active { color: #409eff !important; font-weight: 800 !important; font-size: 19px !important; } /* 对话框 */ .el-dialog { border-radius: 10px !important; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2) !important; } .el-dialog__header { border-bottom: 2px solid #e6f0ff; padding: 20px; } .el-dialog__body { padding: 30px 20px; } .el-dialog__footer { border-top: 2px solid #e6f0ff; padding: 20px; } </style>
最新发布
11-08
解释一下列ts语句的语法,纯文本输出.// sy1\src\styles\icon\iconfont.js !(function(c) { var e var t var o var a var n var i var l = &#39;<svg><symbol id="icon-category" viewBox="0 0 1024 1024"><path d="M345.9584 102.4H224.1536A122.112 122.112 0 0 0 102.4 224.1536v121.8048a122.112 122.112 0 0 0 121.7536 121.7536h121.8048a122.112 122.112 0 0 0 121.7536-121.7536V224.1536A122.112 122.112 0 0 0 345.9584 102.4z m426.1888 0h-121.7536a122.112 122.112 0 0 0-121.8048 121.7536v121.8048a122.112 122.112 0 0 0 121.8048 121.7536h121.7536a122.112 122.112 0 0 0 121.7536-121.7536V224.1536A122.112 122.112 0 0 0 772.1472 102.4z m-426.1888 426.1888H224.1536A122.112 122.112 0 0 0 102.4 650.3936v121.7536a122.112 122.112 0 0 0 121.7536 121.7536h121.8048a122.112 122.112 0 0 0 121.7536-121.7536v-121.7536a122.112 122.112 0 0 0-121.7536-121.8048z m426.1888 0h-121.7536a122.112 122.112 0 0 0-121.8048 121.8048v121.7536a122.112 122.112 0 0 0 121.8048 121.7536h121.7536a122.112 122.112 0 0 0 121.7536-121.7536v-121.7536a122.112 122.112 0 0 0-121.7536-121.8048z" ></path></symbol><symbol id="icon-employee" viewBox="0 0 1024 1024"><path d="M526.7968 51.2C264.192 51.2 51.2 264.2432 51.2 526.7968c0 262.5024 213.0432 475.5968 475.5968 475.5968 262.5024 0 475.5968-213.0944 475.5968-475.648 0-262.5024-213.0944-475.5456-475.648-475.5456z m0 784.7424c-16.1792 0-154.5728-75.6224-154.5728-96.1024 0-20.48 107.52-388.5568 107.52-388.5568L391.68 241.92s-12.8-24.2688 25.7024-24.2688h220.2112c39.0144 0 19.5072 24.2688 19.5072 24.2688L573.952 351.232s107.4688 370.0224 107.4688 388.608c0 18.5344-138.3936 96.0512-154.624 96.0512z" ></path></symbol><symbol id="icon-user" viewBox="0 0 1024 1024"><path d="M512 0c144.704 0 262.016 114.368 262.016 255.488v103.424c0 91.328-49.92 175.68-131.008 221.312V588.8l288.192 150.144a170.176 170.176 0 0 1 91.712 169.856c-7.424 65.6-64.256 115.2-131.968 115.2H133.12C65.28 1024 8.512 974.4 1.088 908.8a170.176 170.176 0 0 1 91.712-169.856L380.992 588.8v-8.576a254.272 254.272 0 0 1-131.008-221.312V255.488C249.984 114.368 367.36 0 512 0z m0 76.8c-98.752 0-179.712 76.288-183.104 172.544l-0.128 6.144v103.424c0 61.44 32.32 118.656 85.76 151.296l5.888 3.52 34.048 19.2a10.24 10.24 0 0 1 5.248 8.832l0.128 86.912a10.24 10.24 0 0 1-5.568 9.024l-324.288 168.96a93.824 93.824 0 0 0-50.56 93.696c2.88 25.344 23.872 44.8 49.536 46.72l4.096 0.128h757.952c27.52 0 50.624-20.224 53.696-46.848a93.632 93.632 0 0 0-45.952-91.072l-4.672-2.56-324.288-169.024a10.24 10.24 0 0 1-5.568-9.024l0.128-86.912a10.24 10.24 0 0 1 5.248-8.832l34.048-19.2a177.92 177.92 0 0 0 91.52-147.904l0.128-6.912V255.488C695.296 156.8 613.248 76.8 512 76.8z" ></path></symbol><symbol id="icon-order" viewBox="0 0 1024 1024"><path d="M835.4816 154.4192h-138.5984c-6.4512-26.88-32.6656-47.616-63.2832-47.616h-68.7104a57.0368 57.0368 0 0 0-53.4016-34.048c-24.064 0-44.7488 13.4656-53.4016 34.0992H388.2496c-30.5152 0-56.7296 20.6848-63.3344 47.616H186.368c-35.9936 0-63.2832 27.904-63.2832 61.952v667.6992c0 34.0992 28.3136 62.0544 63.2832 62.0544h648.0384c35.9936 0 66.56-27.9552 66.56-62.0544V216.4736c1.1264-34.0992-29.44-62.0544-65.4336-62.0544z m-322.9696 30.0032c29.4912 0 52.3776 22.784 52.3776 49.664 0 27.904-24.0128 49.6128-52.3776 49.6128-29.4912 0-52.3776-22.784-52.3776-49.664 0-26.8288 22.9888-49.6128 52.3776-49.6128z m199.68 513.6896c0 12.3904-10.9568 22.784-24.064 22.784H336.896c-13.1072 0-24.064-10.3936-24.064-22.784v-20.6848c0-12.4416 10.9568-22.784 24.064-22.784h351.232c13.1072 0 24.064 10.3424 24.064 22.784v20.6848z m0-209.8688c0 12.4416-10.9568 22.784-24.064 22.784H336.896c-13.1072 0-24.064-10.3424-24.064-22.784v-20.6848c0-12.4416 10.9568-22.784 24.064-22.784h351.232c13.1072 0 24.064 10.3424 24.064 22.784v20.6848z" ></path></symbol><symbol id="icon-combo" viewBox="0 0 1024 1024"><path d="M455.3216 346.8288H160.1024c-23.7056 0-40.96 19.3536-40.96 40.96v107.6736c0 23.6544 19.4048 40.96 40.96 40.96H455.168c23.7056 0 40.96-19.4048 40.96-40.96V387.84a39.5264 39.5264 0 0 0-40.8576-41.0112z m0 217.6H201.1136c-23.7056 0-40.96 19.4048-40.96 40.96v258.6112c0 23.6544 19.4048 40.96 43.1616 40.96h252.1088c23.6544 0 40.96-19.4048 40.96-40.96v-258.56a41.1136 41.1136 0 0 0-41.0624-40.96z m-129.28-445.952c-23.6544 0-68.9664 21.504-81.8176 40.9088-49.5616 68.9664-12.9536 165.888 144.384 165.888 66.816 0 124.928-58.1632 124.928-81.8688 0-23.6544-77.568-120.6272-187.4944-124.928z m127.0784 122.88c-2.0992 15.0016-30.208 34.4576-84.0192 34.4576-60.416 0-107.7248-30.208-105.6256-75.4176 2.1504-28.0064 40.96-38.8096 62.464-38.8096 101.376 0 129.3824 75.4176 127.1808 79.7184z m411.5968 105.472h-295.168c-23.6544 0-40.96 19.3536-40.96 40.96v107.6736c0 23.6544 19.4048 40.96 40.96 40.96h295.168c23.6544 0 40.9088-19.4048 40.9088-40.96V387.84c0-23.7568-17.2544-41.0112-40.96-41.0112z m-230.5536-21.504c152.9344 0 189.6448-94.72 140.0832-165.888-12.9536-19.3024-58.1632-40.9088-79.7184-40.9088-107.7248 4.2496-181.0432 99.0208-181.0432 122.7776 0 25.8048 53.8624 84.0704 120.6784 84.0704z m60.3648-163.7376c21.504 0 58.1632 10.752 60.3648 38.8096 4.3008 47.4112-43.1104 75.4176-101.3248 75.4176-51.712 0-79.7184-19.3536-81.8176-34.5088-2.2016-4.3008 23.552-79.7184 122.7776-79.7184z m129.28 402.8416h-254.2592c-23.6544 0-40.96 19.4048-40.96 40.96v258.6112c0 23.6544 19.4048 40.96 43.1616 40.96h252.1088c23.7056 0 40.96-19.4048 40.96-40.96l2.048-258.56c-2.1504-21.504-19.456-40.96-43.0592-40.96z" ></path></symbol><symbol id="icon-lock" viewBox="0 0 1024 1024"><path d="M512 64c174.656 0 316.224 128.64 316.224 287.424v145.6h26.368c58.24 0 105.408 42.88 105.408 95.808v335.36c0 52.992-47.232 95.872-105.408 95.808H169.408C111.168 1024 64 981.12 64 928.192v-335.36c0-52.928 47.232-95.872 105.408-95.808h26.368V351.36C195.776 192.704 337.28 64 512 64z m342.592 504.832H169.408c-13.376 0-24.576 9.152-26.176 21.184l-0.192 2.816v335.36c0 12.288 10.24 22.4 23.296 23.808l3.072 0.128h685.184c13.376 0 24.576-9.088 26.176-21.12l0.192-2.816v-335.36c0-12.16-10.048-22.4-23.296-23.808l-3.072-0.192z m-289.92 127.552v124.544c0 5.312-4.672 9.6-10.496 9.6h-57.984c-5.824 0-10.56-4.288-10.56-9.6v-124.544c0-5.248 4.736-9.6 10.56-9.6h57.984c5.76 0 10.56 4.352 10.56 9.6zM512 135.872c-128.64 0-233.408 93.12-237.056 209.216l-0.128 6.4v143.68h474.368V351.36c0-116.928-102.4-212.096-230.208-215.488L512 135.872z" ></path></symbol><symbol id="icon-dish" viewBox="0 0 1024 1024"><path d="M989.3888 844.8H85.9648c-19.1488 0-34.7648 17.152-34.7648 38.4512 0 21.1968 15.5136 38.3488 34.816 38.3488h903.2704c19.2 0 34.7136-17.152 34.7136-38.3488 0.1024-21.1968-15.4624-38.4-34.6112-38.4z m-833.8432-38.3488h764.416c9.216 0 18.0224-3.9936 24.576-11.264a40.5504 40.5504 0 0 0 10.1376-27.136v-38.4512c-0.0512-229.888-153.4976-424.448-359.5776-455.936a83.3536 83.3536 0 0 0-1.9456-89.6c-17.9712-26.368-49.152-36.9664-77.5168-26.4704-28.3136 10.496-47.36 39.8336-47.36 72.8576 0 15.4624 4.2496 30.5664 12.1344 43.3152-206.0288 31.488-359.4752 226.048-359.6288 455.936v38.4a40.448 40.448 0 0 0 10.1376 27.136c6.5536 7.1168 15.36 11.1616 24.576 11.264z m82.0224-242.6368c32.6656-71.6288 85.248-129.7408 150.016-165.7344 11.4688-6.3488 25.3952-1.2288 31.0784 11.4176 5.7856 12.6976 1.1264 28.0576-10.3424 34.304-55.9104 31.1808-101.2736 81.3056-129.4336 143.104a22.9888 22.9888 0 0 1-20.7872 14.1312 20.0192 20.0192 0 0 1-10.24-2.816 24.832 24.832 0 0 1-11.5712-14.848 28.3648 28.3648 0 0 1 1.4336-19.6096l-0.1536 0.0512z" ></path></symbol></svg>&#39; var m = (m = document.getElementsByTagName(&#39;script&#39;))[ m.length - 1 ].getAttribute(&#39;data-injectcss&#39;) if (m && !c.__iconfont__svg__cssinject__) { c.__iconfont__svg__cssinject__ = !0 try { document.write( &#39;<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>&#39; ) } catch (c) { console && console.log(c) } } function d() { n || ((n = !0), o()) } ;(e = function() { var c, e, t ;((t = document.createElement(&#39;div&#39;)).innerHTML = l), (l = null), (e = t.getElementsByTagName(&#39;svg&#39;)[0]) && (e.setAttribute(&#39;aria-hidden&#39;, &#39;true&#39;), (e.style.position = &#39;absolute&#39;), (e.style.width = 0), (e.style.height = 0), (e.style.overflow = &#39;hidden&#39;), (c = e), (t = document.body).firstChild ? (e = t.firstChild).parentNode.insertBefore(c, e) : t.appendChild(c)) }), document.addEventListener ? ~[&#39;complete&#39;, &#39;loaded&#39;, &#39;interactive&#39;].indexOf(document.readyState) ? setTimeout(e, 0) : ((t = function() { document.removeEventListener(&#39;DOMContentLoaded&#39;, t, !1), e() }), document.addEventListener(&#39;DOMContentLoaded&#39;, t, !1)) : document.attachEvent && ((o = e), (a = c.document), (n = !1), (i = function() { try { a.documentElement.doScroll(&#39;left&#39;) } catch (c) { return void setTimeout(i, 50) } d() })(), (a.onreadystatechange = function() { a.readyState == &#39;complete&#39; && ((a.onreadystatechange = null), d()) })) })(window)
10-23
该文件是一个用于在网页中动态注入 SVG 图标符号(symbol)的 JavaScript 文件(`iconfont.js`),它将多个图标定义为 `<symbol>` 并插入到页面的 DOM 中,从而实现基于 SVG 的图标系统。相比字体图标,SVG Symbol 方式具有更好的可访问性、颜色控制和清晰度。 以下是对该 `.js` 文件中每一部分语句的语法和作用的逐行详细解释,纯文本输出。 --- ### 一、立即执行函数(IIFE) ```js !(function(c) { ... })(window) ``` - 使用 `!(function(){})()` 是一种常见的 IIFE(Immediately Invoked Function Expression)写法; - 将整个脚本封装在一个匿名函数中,防止变量污染全局作用域; - 参数 `c` 接收外部传入的 `window` 对象; - 最终调用时传入 `window`,使得函数内部可以通过 `c` 访问全局对象。 --- ### 二、变量声明 ```js var e, t, o, a, n, i ``` - 声明多个未初始化的变量: - `e`: 存储主执行函数; - `t`, `o`, `a`, `n`, `i`: 在不同浏览器环境下用于处理 DOM 加载事件的辅助变量; - 使用逗号分隔一次性声明,节省代码体积。 --- ### 三、SVG Sprite 内容字符串 ```js var l = &#39;<svg><symbol id="icon-category" viewBox="0 0 1024 1024">...</symbol><symbol id="icon-employee">...</symbol>...</svg>&#39; ``` - `l` 变量存储一个包含多个 `<symbol>` 的 SVG 字符串; - 每个 `<symbol>` 定义一个图标: - `id`: 图标唯一标识(如 `icon-user`); - `viewBox`: 定义坐标的可视区域,确保图标正确缩放; - `<path d="...">`: 矢量路径数据,描述图形象状; - 所有图标被打包进一个内联 SVG,形成“SVG Sprite”; - 示例图标包括:分类、员工、用户、订单、套餐、锁、菜品等。 --- ### 四、判断是否注入 CSS 样式 ```js var m = (m = document.getElementsByTagName(&#39;script&#39;))[m.length - 1].getAttribute(&#39;data-injectcss&#39;) if (m && !c.__iconfont__svg__cssinject__) { c.__iconfont__svg__cssinject__ = !0 try { document.write( &#39;<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>&#39; ) } catch (c) { console && console.log(c) } } ``` - 获取当前 `<script>` 标签上的 `data-injectcss` 属性值; - 如果存在该属性且尚未注入过样式,则执行以下操作: - 设置全局标记 `__iconfont__svg__cssinject__` 防止重复注入; - 使用 `document.write` 动态写入一段 CSS 样式; - 注入的 `.svgfont` 类作用如下: - `display: inline-block`: 允许设置宽高; - `width: 1em; height: 1em`: 大小随字体变化; - `fill: currentColor`: 填充色跟随文本颜色(便于主题定制); - `vertical-align: -0.1em`: 微调垂直对齐; - `font-size: 16px`: 默认图标大小; - `try-catch` 捕获 `document.write` 可能引发的错误(例如延迟加载时已关闭文档流); - 若出错则打印到控制台。 --- ### 五、DOM 加载完成后的回调函数 `d` ```js function d() { n || ((n = !0), o()) } ``` - 保证只执行一次 `o()` 函数(即图标注入逻辑); - `n` 是一个布尔标志位,防止重复执行; - 当 DOM 准备就绪后调用 `d()` 触发图标渲染。 --- ### 六、主执行函数 `e`:插入 SVG Sprite ```js e = function() { var c, e, t ;((t = document.createElement(&#39;div&#39;)).innerHTML = l), (l = null), (e = t.getElementsByTagName(&#39;svg&#39;)[0]) && (e.setAttribute(&#39;aria-hidden&#39;, &#39;true&#39;), (e.style.position = &#39;absolute&#39;), (e.style.width = 0), (e.style.height = 0), (e.style.overflow = &#39;hidden&#39;), (c = e), (t = document.body).firstChild ? (e = t.firstChild).parentNode.insertBefore(c, e) : t.appendChild(c)) } ``` - 创建一个临时 `<div>`,将 `l` 中的 SVG 字符串解析为 DOM 节点; - 提取其中的 `<svg>` 元素; - 设置 SVG 容器属性: - `aria-hidden="true"`: 屏蔽屏幕阅读器读取,提升无障碍体验; - `position: absolute`: 绝对定位- `width: 0; height: 0`: 不占布局空间; - `overflow: hidden`: 隐藏内容; - 将这个 SVG 插入到 `<body>` 的最前面(`insertBefore`)或末尾(`appendChild`),确保其存在于 DOM 中但不可见; - 此 SVG 成为所有 `use` 引用的“图标库”。 --- ### 七、跨浏览器兼容的 DOM Ready 检测 #### 现代浏览器:使用 `addEventListener` ```js document.addEventListener ? ~[&#39;complete&#39;, &#39;loaded&#39;, &#39;interactive&#39;].indexOf(document.readyState) ? setTimeout(e, 0) : ((t = function() { document.removeEventListener(&#39;DOMContentLoaded&#39;, t, !1), e() }), document.addEventListener(&#39;DOMContentLoaded&#39;, t, !1)) ``` - 判断是否支持 `addEventListener`; - 检查 `document.readyState`: - 如果已是 `"complete"`、`"loaded"` 或 `"interactive"`,说明 DOM 已准备好,异步执行 `e()`; - 否则监听 `DOMContentLoaded` 事件,在 DOM 构建完成后执行 `e()` 并移除监听器; #### 旧版 IE:使用 `attachEvent` ```js : document.attachEvent && ((o = e), (a = c.document), (n = !1), (i = function() { try { a.documentElement.doScroll(&#39;left&#39;) } catch (c) { return void setTimeout(i, 50) } d() })(), (a.onreadystatechange = function() { a.readyState == &#39;complete&#39; && ((a.onreadystatechange = null), d()) })) ``` - 兼容 IE6–8; - `doScroll(&#39;left&#39;)` 是 IE 下检测 DOM 是否就绪的经典方法: - 在 DOM 未完成时调用会抛出异常; - 不再抛异常时表示可以安全操作 DOM; - 通过递归 `setTimeout` 不断尝试; - 同时监听 `onreadystatechange`,当 `readyState === &#39;complete&#39;` 时也触发; - `d()` 被调用后最终执行 `e()` 渲染图标。 --- ### 八、使用方式说明(隐含) 虽然没有注释,但实际使用方式是: ```html <svg class="svgfont"><use xlink:href="#icon-user"></use></svg> ``` - `class="svgfont"` 应用默认样式(由 `document.write` 注入); - `<use xlink:href="#icon-user">` 引用前面注入的 SVG 中的 `#icon-user` 符号; - 浏览器自动渲染对应图标。 可通过 CSS 修改: ```css .svgfont { color: red; font-size: 24px; } ``` 即可改变图标的颜色和大小。 --- ### 九、优势与设计思想 | 特性 | 说明 | |------|------| | **矢量无损** | SVG 放大不失真; | | **颜色可控** | `fill: currentColor` 实现 `color` 控制图标颜色; | | **性能好** | 单次加载所有图标,后续引用无需请求; | | **可访问性强** | 支持 `aria-hidden`,避免干扰辅助设备; | | **兼容性高** | 支持 IE9+ 及现代浏览器; | | **按需注入** | 只有带 `data-injectcss` 的脚本才会添加样式; | ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值