css布局--2016.3.17

本文详细解读了CSS布局中的关键概念,包括width、height的基本作用,百分比外、内边距的计算规则,外边距合并原理,以及普通流、浮动和绝对定位的区别。同时,介绍了position属性的应用,包括static、relative、absolute的特性,以及如何合理使用relative与absolute结合定位,浮点的破坏性及清除方法。最后,总结了CSS布局中的核心知识点,帮助开发者更深入地掌握网页布局技巧。

关于css布局梳理一下几个知识点:

1.css中,width,height指的是内容区域的宽度和高度,增加内边距,边框,外边距不会影响内容区域的尺寸,但是会增加元素框的总尺寸。

2.外,内边距的百分比数值:百分比是相对于其父元素的width计算的,宽度参照宽度这点毫无疑问,但高度参照的也是宽度。

3.外边距合并:当两个垂直外边距相遇时,它们将形成一个外边距。合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者。
css外边距合并的几种情况

5.只有普通文档流中块框的垂直外边距才会发生外边距合并。行内框浮动框绝对定位之间的外边距不会合并。

6.一切皆为框:块框(行框),行内框.

7.CSS 有三种基本的定位机制:普通流、浮动和绝对定位。

8.css position:

  • static 元素框正常生成。块级元素生成一个矩形框,作为文档流的一部分,行内元素则会创建一个或多个行框,置于其父元素中。
  • relative 相对于元素本身在文档中应该出现的位置来移动这个元素,该元素依然占据文档中原有的位置,只是视觉上相对原来的位置有移动。
  • absolute
    脱离了文本流(即在文档中已经不占据位置)。参照浏览器的左上角通过top,right,bottom,left(简称TRBL)定位。可以选取具有定位的父级对象或者body坐标原点进行定位,也可以通过z-index进行层次分级。absolute在没有设定TRBL值时是根据父级对象的坐标作为始的,当设定TRBL值后则根据浏览器的左上角作为原始点。只要父级元素设了position并且不是static(默认既是static),那么设定了absolute的子元素即以此为包含块(最近的)。绝对定位(Absolute positioning)元素定位的参照物是其包含块,既相对于其包含块进行定位,不一定是其父元素。只要父级元素设了position并且不是static(默认既是static),那么设定absolute的子元素即以此为包含块(最近的)。

9.relative与absolute的结合使用
如果一个元素绝对定位后,其参照物是以离自身最近元素是否设置了相对定位,如果有设置将以离自己最近元素定位,如果没有将往其祖先元素寻找相对定位元素,一直找到html为止。
十步图解position

10.float:多列布局
任何元素设置了“float”都会改变文档的默认流,换句话说浮动元素改变了当初的文档流,造成其父元素无法自动伸展其高度,为了让浮动元素的周围元素能恢复到正常文档流,我们需要想办法来关闭浮动元素。总而言之,你的元素开始了浮动,你就要想办法去关闭浮动。

float的破坏性:

浮动的最初意义就是文本围绕图片。文本为什么会围绕含有 float 属性的图片,那是因为浮动 破坏了正常的 line boxes 。

浮动的塌陷:

如果父元素只包含 浮动元素,且父元素未设置高度和宽度的时候。那 么它的高度就会塌缩为零。当一个元素是浮动的,如果没有关闭浮动时,其父元素不会包含这个浮动元素,因为此时浮动元素从文档流中脱离。

清除浮动:

clear:both
清除浮动的几种方式

11.with:100%;
1. 对于使用position:relative的子类元素而言,width:100%也始终是基于基父级元素而并不会基于其上层元素中的relative。
2. 对于绝对定位的子无素,要是其外层的所有元素中都没有用position:relative,则width:100%是基于body,否则就是离基最近的一个position:relative的元素。
3. 而对于position:fixed的元素,其一直是基于body,所以其宽度100%就是基于body。

解释一下列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` 的脚本才会添加样式; | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值