当前位置: 首页 > news >正文

CSS专题之常见布局

前言

石匠敲击石头的第 13 次

作为一名前端开发,在日常开发中,写页面是必不可少的工作,但有时候发现很多的页面结构都是类似的,所以打算写一篇文章来梳理一下日常开发中常见的布局,如果哪里写的有问题欢迎指出。

单列布局

单列布局日常开发中常见的有以下两种:

在这里插入图片描述

  • 一栏布局: headercontentfooter 区域单列等宽,都居中显示
  • 一栏布局(通栏): headerfooter 区域与视口宽度等宽,仅中间 content 区域固定宽度,并居中显示

下面我们来分别看看两种单列布局的实现方式。

一栏布局

这个布局结构比较简单,headercontentfooter 都居中显示。

使用场景: 如博客文章详情页等。

<div class="container"><div class="header">header</div><div class="content">content</div><div class="footer">footer</div>
</div>
.container {max-width: 1000px;margin: 0 auto;
}
/* ...其它样式 */

这里使用了 max-width: 1000px; 为三个区域的父级容器设置最大宽度,以此来确保三个区域等宽。

在线预览效果

⚠️ 注意: 这里也可以使用 width: 1000px;,效果是差不多的,唯一的区别就是当屏幕小于 1000px 的时候表现不一样(width: 1000px; 会出现横向滚动条,max-width: 1000px 则不会,宽度会收缩)。

一栏布局(通栏)

headerfooter 区域宽度设置为 100%,也可以不设置宽度,因为这两个区域都是块级元素,默认会占满整个视口宽度。不过 headerfooter 区域中的内容区域的宽度要和 content 区域的宽度保持一致。

使用场景: 如企业官网等。

<div class="header"><div class="header-content">header</div>
</div>
<div class="content">content</div>
<div class="footer"><div class="footer-content">footer</div>
</div>
.header,
.footer {width: 100%;
}.header-content,
.footer-content {max-width: 1000px;margin: 0 auto;
}.content {margin: 0 auto;max-width: 1000px;
}/* ...其它样式 */

在线预览效果

两列布局

两列布局也是日常开发中常见的布局,通常由 一个固定宽度的侧边栏(sidebar一个自适应宽度的主内容(main 区域组成。

使用场景: 如后台管理页面、文档导航页面、博客主页等。

在这里插入图片描述

Float 实现

在过去,没有 Flex 和 Grid 的时候,通常使用 Float 实现两列布局。

<div class="container"><div class="sidebar">sidebar</div><div class="main">main</div>
</div>
.container {overflow: hidden; /* 清除浮动,防止高度坍塌 */zoom: 1; /* 兼容 IE6/IE7,用来触发 hasLayout, 确保元素正确渲染和包含其内部浮动元素 */
}.sidebar {float: left;width: 240px;margin-right: 20px;
}.main {overflow: hidden; /* 触发 BFC,使其不会与 sidebar 重叠 */height: 100%;zoom: 1; /* 兼容 IE6/IE7,用来触发 hasLayout, 确保元素正确渲染和包含其内部浮动元素 */
}/* ...其它样式 */

在线预览效果

⚠️ 注意:

  • 该代码兼容 IE6 及以上的浏览器版本,对于维护老项目仍存在价值,对于新项目更加建议优先使用 Flex 或 Grid 来实现两列布局

  • 如果 sidebar 区域要放右边,需要注意渲染顺序,先写侧边栏,后写主内容

    <div class="container"><!-- 依旧保证先写侧边栏 --><div class="sidebar">sidebar</div><div class="main">main</div>
    </div>
    
    .container {overflow: hidden;zoom: 1;
    }.sidebar {float: right; /* 调整浮动方向 */width: 240px;margin-left: 20px; /* 调整外边距方向 */
    }.main {overflow: hidden;height: 100%;zoom: 1;
    }/* ...其它样式 */
    

Flex 实现

/* HTML 部分同上 */
.container {display: flex;
}.sidebar {width: 240px;margin-right: 20px;
}.main {flex: 1;
}/* ...其它样式 */

Grid 实现

Grid 实现方式相比 Flex 方式代码更加简洁。

/* HTML 部分同上 */
.container {display: grid;grid-template-columns: 240px 1fr;gap: 20px;
}/* ...其它样式 */

三列布局

三列布局通常是由一个自适应宽度的主内容(main夹在左右两个固定宽度的 leftright 区域的中间组成。

使用场景: 如门户首页、资讯平台、后台系统页面等。

在这里插入图片描述

圣杯布局

通过 Float 实现三列布局通常有两种方式,最经典的就是 “圣杯布局” 和 “双飞翼布局”,我们先来看看 “圣杯” 布局。

“圣杯(Holy Grail)” 布局最早出自于国外的 Matthew Levine 前辈在 2006 年写的一篇文章 《In Search of the Holy Grail》中。

在常规情况下,我们都是按从上到下,从左到右的顺序写页面。

<div class="container"><div class="left">left</div><div class="main">main</div><div class="right">right</div>
</div>

这样布局的效果是没有什么问题,但如果我们希望 main 区域的内容优先加载出来,就需要进行布局优化。

浏览器的渲染引擎在构建和渲染树是异步的(谁先构建好谁先显示),所以我们只需要将 main 区域放到提前的位置就可以优先渲染。

<div class="container"><!-- 将 main 区域放到提前的位置,确保优先渲染 --><div class="main">main</div><div class="left">left</div><div class="right">right</div>
</div>

所以就提出了 “圣杯” 布局,目的是通过 CSS 的方式配合上面的 DOM 结构,优化 DOM 渲染,以下是具体 CSS 相关的代码。

/* 为容器设置左右内边距,给左右栏腾出空间 */
.container {padding-left: 116px;padding-right: 116px;overflow: hidden;
}.main {float: left;width: 100%;height: 800px;
}.left {float: left;position: relative;left: -116px;margin-left: -100%;width: 100px;height: 800px;
}.right {float: left;position: relative;right: -116px;margin-left: -100px;width: 100px;height: 800px;
}/* ...其它样式 */

它的原理很简单,我们简单来分析一下:

  1. 首先给容器设置一个左右的内边距,并清除浮动

    • padding-left 的值等于 左侧区域宽度(100px) + 与主区域的间隔(16px),所以上述例子的值为 116px
    • padding-right 的值也是同理
  2. 将容器内部的三个区域都设置为左浮动,并且设置宽度,例如上面例子中的我们设置了如下宽度:

    • left 区域宽度:100px
    • main 区域宽度:100%
    • right 区域宽度:100px

    此时的界面效果应该是这样的

    在这里插入图片描述

  3. 通过 margin-left: -100%; 移动 main 区域所占的 100% 宽度,就可以将 left 区域移动到 main 区域的最左侧

    在这里插入图片描述

  4. 再通过 position: relative; 相对定位,向左偏移到之前第一步容器 padding-left: 116px; 内边距所占的位置,这样就完成了 left 区域位置的调整

    在这里插入图片描述

  5. 再然后是 right 区域,具体步骤跟 left 区域一样,不过需要注意不是使用 margin-left: -100%;,而是通过 margin-left: -100px; 移动跟自身宽度一样的距离就可以调整到 main 区域的最右侧

    在这里插入图片描述

  6. 最后就是通过 position: relative; 相对定位,将 right 区域向右偏移到之前第一步容器 padding-right: 116px; 内边距所占的位置

    在这里插入图片描述

在线预览效果

圣杯布局的问题

圣杯布局中的 container 容器的宽度不能小于 left 区域的宽度,否则会导致布局发生错乱。

在这里插入图片描述

双飞翼布局

“双飞翼” 布局是 “圣杯” 布局的改进方案,起源于淘宝 UED 的实践,据说最早由玉伯前辈提出的,解决了 “圣杯” 布局的缺点。

  1. 首先是调整页面结构

    <div class="container"><div class="main"><!-- 增加了一个内层元素 --><div class="inner">main</div></div><div class="left">left</div><div class="right">right</div>
    </div>
    
  2. 去除容器左右的内边距,并且设置最小宽度

    .container {min-width: 300px;overflow: hidden;
    }
    

    这里 300px 的值是通过 2倍 left 区域的宽度 + right 区域的宽度 得来的,以此确保 main 中的内容可以显示出来。

  3. 去除 left 区域和 right 区域中的 position: relative; 相关的代码

    .left {float: left;width: 100px;margin-left: -100%;
    }.right {float: left;width: 100px;margin-left: -100px;
    }
    
  4. 最后给 main 区域中的 inner 区域添加左右的外边距

    .main .inner {margin: 0 116px;
    }
    

    这边左外边距的值等于 左侧区域宽度(100px) + 与主区域的间隔(16px),右外边距的值也同理。

    在这里插入图片描述

上述步骤合在一起代码如下:

.container {min-width: 300px;overflow: hidden;
}.main {float: left;width: 100%;height: 800px;
}.main .inner {margin: 0 116px;
}.left {float: left;margin-left: -100%;width: 100px;height: 800px;
}.right {float: left;margin-left: -100px;width: 100px;height: 800px;
}/* ...其它样式 */

在线预览效果

⚠️ 注意: 该方案兼容 IE 浏览器,对于维护老项目仍存在价值,对于新项目更加建议优先使用 Flex 或 Grid 来实现三列布局

Flex 实现

/* HTML 部分同上 */
.container {display: flex;
}.left,
.right,
.main {width: 100px;height: 800px;
}.main {flex: 1;margin: 0 16px;
}.left {/* 通过 CSS 调整左侧区域的位置 */order: -1;
}/* ...其它样式 */

⚠️ 注意:上述代码 HTML 页面结构部分依旧是 main 区域在最前面,只是通过 CSS 改变了视觉上的位置,依旧是中间部分先加载。

Grid 实现

/* HTML 部分同上 */
.container {display: grid;grid-template-columns: 100px 1fr 100px;gap: 16px;
}.left,
.right,
.main {height: 800px;/* 三列都设置在同一行中 */grid-row: 1;
}.main {/* 设置主区域在第二列中 */grid-column: 2;
}.left {/* 设置 left 区域在第一列中 */grid-column: 1;
}.right {/* 设置 right 区域在第三列中 */grid-column: 3;
}/* ...其它样式 */

⚠️ 注意: 也是通过 CSS 改变了视觉上的位置,但写法上相比 Flex 有些繁琐,推荐优先使用 Flex 布局实现三列布局

等高列布局

等高列布局是指在一个容器中,多个并排的元素(列)即使内容不一样多,其高度也始终保持一致,从而实现底部对齐的视觉效果。

在这里插入图片描述

例如前面 “圣杯” 布局和 “双飞翼” 布局的案例的高度都是统一写死 800px但在实际开发中往往不会指定元素固定的高度

正 padding + 负 margin

在 Flex 和 Grid 出现之前,这是一种比较常用的方法。

例如我们把前面 “双飞翼” 布局的代码修改一下,去除固定高度,只用内容撑开高度。

<div class="container"><div class="main"><div class="inner">文本<br />文本<br />文本<br />文本<br />文本<br />文本<br />文本<br /></div></div><div class="left">文本<br />文本<br /></div><div class="right">文本<br />文本<br />文本<br />文本<br /></div>
</div>

在这里插入图片描述

接下来介绍如何让它实现等高列。

  1. 首先给容器内的并排元素(列)统一设置一个大数值的 padding-bottom,再设置一个相同数值的负的 margin-bottom

    .left,
    .right,
    .main {/* 其它样式... */padding-bottom: 10000px;margin-bottom: -10000px;
    }
    

    在这里插入图片描述

    通过 padding-bottom: 1000px 人为的把元素高度撑的很高,再通过 margin-bottom: -1000px 将多出的部分拉回来,让布局不会真的变高。

    虽然真实高度没有变,但背景色、边框等视觉效果会从上到下延伸到相同的位置

  2. 给并排元素(列)外部的容器设置 overflow:hidden,通过触发 BFC 来包含浮动元素真实高度,并把溢出的背景截断

    .container {/* 其它样式... */overflow: hidden;
    }
    

    在这里插入图片描述

    在线预览效果

    ⚠️ 注意: 该方案兼容 IE 浏览器,对于维护老项目仍存在价值,对于新项目更加建议优先使用 Flex 或 Grid 来实现等高列布局

CSS 模拟表格布局

我们也可以使用 display: table; CSS 模拟表格来实现等高列。

<div class="container"><div class="row"><div class="left">文本<br />文本<br /></div><div class="main">文本<br />文本<br />文本<br />文本<br />文本<br />文本<br />文本<br /></div><div class="right">文本<br />文本<br />文本<br />文本<br /></div></div>
</div>
.container {display: table;width: 100%;
}.left,
.right,
.main {display: table-cell;background: #999;color: #fff;font-size: 20px;
}.row {display: table-row;
}

在这里插入图片描述

⚠️ 注意:

  • 该方案兼容 IE8+,不支持 IE6 ~7
  • 该方案只适用于常规的三列布局实现等高列,不适用于传统的 “圣杯” 布局和 “双飞翼” 布局

Flex 实现

Flex 布局原生支持等高列,推荐使用,具体实现代码与三列布局中的 Flex 实现相同。

Grid 实现

Grid 布局原生支持等高列,推荐使用,具体实现代码与三列布局中的 Grid 实现相同。

粘连布局

粘连布局(Sticky Footer Layout) 目的是确保页面底部的元素(通常是 <footer>)在以下两种情况下都能合理显示:

  • 当页面内容较少时,页脚“粘附”在视口底部,避免悬空
  • 当页面内容较多时,页脚自然地出现在内容区域之后,随内容推至页面底部

使用场景: 如官网版权信息固定在底部、任何希望页脚始终贴近屏幕底部的场景等。

在这里插入图片描述

负 margin 实现

在过去没有 Flex 和 Grid,我们可以使用如下步骤来实现粘连布局。

  1. 首先确定页面结构,并设置基础样式

    <div class="wrapper"><div class="main">文本 <br />文本 <br />文本 <br /></div>
    </div>
    <div class="footer">footer</div>
    
    body {margin: 0;background: #f3f3f3;padding: 16px;
    }.footer,
    .main {font-size: 20px;color: #fff;
    }.main {background: #999;
    }.footer {/* 设置底部区域的高度 */height: 50px;line-height: 50px;text-align: center;background: #999;
    }
    

    在这里插入图片描述

    ⚠️ 注意: 这一步需要确保 footer 区域是独立的,wrapper 没有任何嵌套关系

  2. wrapper 区域设置 min-height: 100%,高度与视口高度相同

    .wrapper {min-height: 100%;
    }
    

    在这里插入图片描述

  3. footer 区域设置负的 margin-top,值与自身高度相同

    .footer {/* 与底部区域高度相同,不过是负值 */margin-top: -50px;
    }
    

    在这里插入图片描述

  4. 到前面一步为止就已经实现了基本的粘连效果,但是存在一个问题,当 main 区域的内容增加,导致高度变大的时候,内容会与底部区域重叠

    在这里插入图片描述

    这时我们只需要main 区域增加一个底部内边距,内边距的大小跟 footer 区域高度相同即可解决这个问题。

    .main {padding-bottom: 50px;
    }
    

    在这里插入图片描述

    如果需要设置 footer 区域跟 main 区域之间的间距,可以给 wrapper 区域设置一个底部内边距,内边距的值等于 footer 区域的高度 + 间距大小

    .wrapper {/* footer 区域高度 50px + 16px 间距大小 */padding-bottom: 66px;
    }
    

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    在线预览效果

    ⚠️ 注意: 该方案兼容 IE 浏览器,对于维护老项目仍存在价值,对于新项目更加建议优先使用 Flex 或 Grid 来实现粘连布局

Flex 实现

<div class="container"><div class="main"><div class="inner">文本 <br />文本 <br />文本 <br /></div></div><div class="footer">footer</div>
</div>
.container {height: 100%;display: flex;flex-direction: column;
}.main {flex: 1; /* 主体区域填满剩余空间 */margin-bottom: 16px; /* 与 footer 之间的间距 */
}.footer {height: 50px;line-height: 50px;text-align: center;
}/* ...其它样式 */

在线预览效果

Grid 实现

.container {display: grid;grid-template-rows: 1fr auto;height: 100%;gap: 16px; /* 与 footer 之间的间距 */
}.footer {height: 50px;line-height: 50px;text-align: center;
}/* ...其它样式 */

在线预览效果

瀑布流布局

瀑布流布局(Masonry Layout) 通常都是多列排布,高度不一但是紧凑排列。

使用场景: 如图片墙、商品展示页等,瀑布流具体的例子可以参考小红书、花瓣网。

在这里插入图片描述

JavaScript 实现

该方案是最早期也是兼容性最好的瀑布流方案,它的主要原理是在页面加载或者窗口大小变化时,通过 JavaScript 动态计算每个 item 元素的位置,手动设置其 topleft 或使用 transform

因为涉及 JavaScript,本篇文章主要讲解的是 CSS 相关的布局,具体的就不在此赘述了,感兴趣的可以看 @討厭吃香菜 前辈的这篇文章。

⚠️ 注意: 通常还需要后台返回图片的尺寸信息(宽高)。

砌体布局实现

<div class="container"><img src="https://dummyimage.com/300x400/999/fff" /><img src="https://dummyimage.com/300x200/999/fff" /><img src="https://dummyimage.com/300x500/999/fff" /><img src="https://dummyimage.com/300x300/999/fff" /><img src="https://dummyimage.com/300x250/999/fff" /><img src="https://dummyimage.com/300x450/999/fff" /><img src="https://dummyimage.com/300x350/999/fff" /><img src="https://dummyimage.com/300x150/999/fff" /><img src="https://dummyimage.com/300x380/999/fff" /><img src="https://dummyimage.com/300x420/999/fff" />
</div>
.container {columns: 300px;/* 设置列之间的间距 */column-gap: 16px;
}.container img {width: 100%;margin-bottom: 16px;display: block;
}/* ...其它样式 */

columns: 300px; 用来设置列的宽度为 300px,浏览器会自动根据容器宽度计算能放下多少列,比如容器宽度为 960px 时,300px + 16px(间距) 可放 3 列,剩余宽度自动分配。

在线预览效果

⚠️ 注意:

  • 该方案兼容 IE9+ 以上的浏览器
  • 内容的排列顺序是由浏览器自动控制的,无法精确指定内容在哪一列显示,如果需要控制显示顺序,建议使用 JavaScript 实现的方案
  • 当内容很多时,会导致布局和渲染计算不断进行,使得网站卡顿,性能不佳,需要通过分页或者延迟加载。

Grid + JavaScript 实现

<div class="container" id="grid"><div class="item"><img src="https://dummyimage.com/300x400/999/fff" /></div><div class="item"><img src="https://dummyimage.com/300x200/999/fff" /></div><div class="item"><img src="https://dummyimage.com/300x500/999/fff" /></div><div class="item"><img src="https://dummyimage.com/300x300/999/fff" /></div><div class="item"><img src="https://dummyimage.com/300x250/999/fff" /></div><div class="item"><img src="https://dummyimage.com/300x450/999/fff" /></div><div class="item"><img src="https://dummyimage.com/300x350/999/fff" /></div><div class="item"><img src="https://dummyimage.com/300x150/999/fff" /></div><div class="item"><img src="https://dummyimage.com/300x380/999/fff" /></div><div class="item"><img src="https://dummyimage.com/300x420/999/fff" /></div>
</div>
.container {display: grid;grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));grid-auto-rows: 10px; /* 关键基准行高 */gap: 16px;
}.item {overflow: hidden;
}.item img {width: 100%;display: block;
}/* ...其它样式 */
function resizeGridItems() {const grid = document.getElementById('grid');const rowHeight = parseInt(window.getComputedStyle(grid).getPropertyValue('grid-auto-rows'));const rowGap = parseInt(window.getComputedStyle(grid).getPropertyValue('gap'));grid.querySelectorAll('.item').forEach((item) => {const contentHeight = item.querySelector('img').getBoundingClientRect().height;// 计算跨几行const rowSpan = Math.ceil((contentHeight + rowGap) / (rowHeight + rowGap));item.style.gridRowEnd = `span ${rowSpan}`;});
}// 等待图片加载完毕再计算高度
window.addEventListener('load', resizeGridItems);
window.addEventListener('resize', resizeGridItems);

该方案需要结合 JavaScript 动态计算元素跨几行,HTML 元素的排列顺序是你自己写的顺序,不会被浏览器自动打乱(不像砌体布局那样)。

在线预览效果

总结

  • CSS 有如下常见布局:

    • 单列布局

    • 两列布局

    • 三列布局

    • 等高列布局

    • 粘连布局

    • 瀑布流布局

  • 每种布局都有多种实现方案,每种方案都有自己的优缺点,最好根据实际情况选择使用

参考文章

  • 几种常见的CSS布局其中实现三栏布局有多种方式,本文着重介绍圣杯布局和双飞翼布局。另外几种可以猛戳实现三栏布局的几种方法 - 掘金
  • CSS-圣杯布局和双飞翼布局我正在参加「掘金·启航计划」 ## 前言 圣杯布局来源于文章In Search of the - 掘金
  • 【布局】聊聊为什么淘宝要提出「双飞翼」布局 · Issue #11 · zwwill/blog
  • 如何实现侧边两栏宽度固定,中间栏宽度自适应的布局?——双飞翼布局、圣杯(Holy Grails)布局-阿里云开发者社区
  • CSS砌体布局:颠覆你认知的最疯狂的CSS最强布局🤡,一行代码解决布局问题!事情起因是这样的,大家在刷抖音,小红书等短 - 掘金

博客地址:https://github.com/wjw020206/blog

相关文章:

CSS专题之常见布局

前言 石匠敲击石头的第 13 次 作为一名前端开发&#xff0c;在日常开发中&#xff0c;写页面是必不可少的工作&#xff0c;但有时候发现很多的页面结构都是类似的&#xff0c;所以打算写一篇文章来梳理一下日常开发中常见的布局&#xff0c;如果哪里写的有问题欢迎指出。 单列…...

CentOS 7连接公司网络配置指南

在物理主机上安装了一个CentOS 7&#xff0c;需要连接公司的网络&#xff0c;但是公司的网络需要输入用户名密码才能连接 解决方案 需要 同时设置 wifi-sec.key-mgmt 和 802-1x 参数。以下是分步操作&#xff1a; 1. 创建基础 Wi-Fi 连接 sudo nmcli con add con-name &quo…...

RustDesk CentOS自建中继节点

一、需开放端口 TCP: 21115, 21116, 21117, 21118, 21119 UDP: 21116 二、安装docker 1.使用 root 权限登录 CentOS。确保 yum 包更新到最新 yum update 2. 卸载旧版本 yum remove docker 3. 安装 Docker 所需依赖 yum -y install yum-utils device-mapper-persistent-d…...

CentOS 7上部署BIND9 DNS服务器指南

场景假设&#xff1a; 我们要为内部网络 192.168.1.0/24 搭建一个权威 DNS 服务器。 域名&#xff1a;mylab.localDNS 服务器 IP&#xff1a;192.168.1.10我们将配置正向解析 (hostname -> IP) 和反向解析 (IP -> hostname)。 一、安装 BIND9 更新系统并安装 BIND 及工…...

面试突击:消息中间件之RabbitMQ

一&#xff1a;你们项目中哪里用到了RabbitMQ ? 难易程度&#xff1a;☆☆☆ 出现频率&#xff1a;☆☆☆☆ 我们项目中很多地方都使用了RabbitMQ , RabbitMQ 是我们项目中服务通信的主要方式之一 , 我们项目中服务通信主要有两种方式实现 : 通过Feign实现服务调用通过MQ实现服…...

基于 ESP32 与 AWS 全托管服务的 IoT 架构:MQTT + WebSocket 实现设备-云-APP 高效互联

目录 一、总体架构图 二、设备端(ESP32)低功耗设计(适配 AWS IoT) 1.MQTT 设置(ESP32 连接 AWS IoT Core) 2.低功耗策略总结(ESP32) 三、云端架构(基于 AWS Serverless + IoT Core) 1.AWS IoT Core 接入 2.云端 → APP:WebSocket 推送方案 流程: 3.数据存…...

将 /dev/vdb1 的空间全部合并到 /dev/mapper/centos-root(即扩展 CentOS 的根分区)

要将 /dev/vdb1 的 1TB 空间合并到 /dev/mapper/centos-root&#xff08;即扩展 CentOS 的根分区&#xff09;&#xff0c;可以采用 LVM&#xff08;逻辑卷管理&#xff09; 的方式。以下是详细步骤&#xff1a; 步骤 1&#xff1a;检查当前磁盘和 LVM 情况 1.1 确认 /dev/vdb…...

CentOS Stream安装MinIO教程

1. 下载 MinIO 二进制文件 # 进入 MinIO 安装目录 sudo cd /usr/local/bin/# 下载 MinIO 二进制文件&#xff08;替换为最新版本链接&#xff09; wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod x minio2. 创建专用用户和存储目录 # 创建 minio 用户…...

游戏引擎学习第299天:改进排序键 第二部分

回顾并为当天内容做准备 我们会现场编写完整的游戏代码。回顾上周发现自己对游戏中正确的排序规则并没有清晰的理解。主要原因是我们更擅长三维游戏开发&#xff0c;缺乏二维游戏和二维游戏技术的经验&#xff0c;对于二维精灵排序、模拟三维效果的最佳方案等没有太多技巧和经…...

设计模式----软考中级软件设计师(自用学习笔记)

目录 1、设计模式的要素 2、设计模式的分类 3、简单工厂模式 4、工厂方法 5、抽象工厂 6、生成器 7、原型 8、单例模式 9、适配器 10、桥接 11、组合模式 12、装饰 13、外观 14、享元 15、代理 16、责任链 17、命令 18、解释器 19、迭代器 20、中介者 21、…...

uniapp如何设置uni.request可变请求ip地址

文章目录 简介方法一&#xff1a;直接在请求URL中嵌入变量方法二&#xff1a;使用全局变量方法三&#xff1a;使用环境变量方法四&#xff1a;服务端配置方法五&#xff1a;使用配置文件&#xff08;如config.js&#xff09;:总结 简介 在uni-app中&#xff0c;uni.request 用…...

Centos上搭建 OpenResty

一、OpenResty简介 OpenResty 是基于 Nginx 的扩展平台&#xff0c;完全兼容 Nginx 的核心功能&#xff08;如 HTTP 服务和反向代理&#xff09;&#xff0c;同时通过内嵌 LuaJIT 支持&#xff0c;允许开发者用 Lua 脚本灵活扩展业务逻辑。它简化了动态逻辑的实现。 二、安装…...

Kotlin与物联网(IoT):Android Things开发探索

在物联网&#xff08;IoT&#xff09;领域&#xff0c;Kotlin 凭借其简洁性、安全性和与 Java 生态的无缝兼容性&#xff0c;逐渐成为 Android Things 开发的有力工具。尽管 Google 已于 2022 年宣布停止对 Android Things 的官方支持&#xff0c;但其技术思想仍值得探索&#…...

WIFI信号状态信息 CSI 深度学习篇之CNN(Python)

本博客是一篇非新手导向的CNN处理CSI图像帧的教程&#xff0c;基于tensorflow框架构建CNN模型进行训练&#xff0c;训练对象依然是前述博客中所提到的CSI图像帧&#xff08;500 x 90 x 1&#xff09;。代码里用到了深度可分离卷积&#xff0c;这种结构在减少计算量和参数数量方…...

深度学习实战 04:卷积神经网络之 VGG16 复现三(训练)

在后续的系列文章中&#xff0c;我们将逐步深入探讨 VGG16 相关的核心内容&#xff0c;具体涵盖以下几个方面&#xff1a; 卷积原理篇&#xff1a;详细剖析 VGG 的 “堆叠小卷积核” 设计理念&#xff0c;深入解读为何 332 卷积操作等效于 55 卷积&#xff0c;以及 333 卷积操作…...

欧拉系统离线部署docker

https://www.cnblogs.com/hsh96/p/18150538 Docker 离线安装指南 本文介绍了如何在 Linux 系统上进行 Docker 的离线安装。首先&#xff0c;确保欧拉系统安装的是server版本&#xff0c;否则没有tar工具。 您需要下载 Docker 的离线安装包。您可以从以下链接获取所需的安装包&a…...

Java 中 final 与 static 的区别

Java 中 final 与 static 的区别 在 Java 中&#xff0c;final 和 static 是两个不同的关键字&#xff0c;它们的核心作用和不可变性特性有本质区别&#xff1a; 一、final 的核心作用 1. 变量&#xff08;不可变引用&#xff09; 不可重新赋值&#xff1a;final 修饰的变量…...

多模态实时交互边界的高效语音语言模型 VITA-Audio 介绍

介绍 VITA-Audio是由Zuwei Long等研究者提出的端到端大型语音语言模型&#xff0c;其核心目标是通过跨模态令牌生成技术&#xff0c;解决传统语音交互系统中首音频令牌生成延迟高的问题。该模型的创新点主要体现在&#xff1a; 低延迟&#xff1a;VITA-Audio 是首个能够在初次…...

LLM | 论文精读 | NAACL 2025 | Clarify When Necessary:教语言模型何时该“问一句”再答!

&#x1f50d; 解读 NAACL 2025 重磅论文《Clarify When Necessary》&#xff1a;教语言模型何时该“问一句”再答&#xff01; &#x1f9e9; 一、现实问题&#xff1a;大模型“看不懂装懂”有多危险&#xff1f; 我们每天用的 ChatGPT、Claude 等大型语言模型&#xff08;LL…...

MySQL 8.0 OCP 英文题库解析(七)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题51~60 试题51:…...

深度解析Vue项目Webpack打包分包策略 从基础配置到高级优化,全面掌握性能优化核心技巧

深度解析Vue项目Webpack打包分包策略 从基础配置到高级优化&#xff0c;全面掌握性能优化核心技巧 一、分包核心价值与基本原理 1.1 为什么需要分包 首屏加载优化&#xff1a;减少主包体积&#xff0c;提升TTI&#xff08;Time to Interactive&#xff09;缓存利用率提升&am…...

MySQL——基本查询内置函数

目录 CRUD Create Retrieve where order by limit Update Delete 去重操作 聚合函数 聚合统计 内置函数 日期函数 字符函数 数学函数 其它函数 实战OJ 批量插入数据 找出所有员工当前薪水salary情况 查找最晚入职员工的所有信息 查找入职员工时间升序排…...

实现图片自动压缩算法,canvas压缩图片方法

背景&#xff1a; 在使用某些支持webgl的图形库&#xff08;eg&#xff1a;PIXI.js&#xff0c;fabric.js&#xff09;场景中&#xff0c;如果加载的纹理超过webgl可处理的最大纹理限制&#xff0c;会导致渲染的纹理缺失&#xff0c;甚至无法显示。 方案 实现图片自动压缩算…...

零基础设计模式——创建型模式 - 单例模式

第二部分&#xff1a;创建型模式 - 单例模式 (Singleton Pattern) 欢迎来到创建型模式的第一站——单例模式&#xff01;这是最简单也最常用的设计模式之一。 核心思想&#xff1a;关注对象的创建过程&#xff0c;将对象的创建与使用分离&#xff0c;降低系统的耦合度。 单例…...

数据挖掘:从数据堆里“淘金”,你的数据价值被挖掘了吗?

数据挖掘&#xff1a;从数据堆里“淘金”&#xff0c;你的数据价值被挖掘了吗&#xff1f; 在这个数据爆炸的时代&#xff0c;我们每天都在产生海量信息&#xff1a;社交媒体上的点赞、网购时的浏览记录&#xff0c;甚至是健身手环记录下的步数。这些数据本身可能看似杂乱无章…...

k8s1.27版本集群部署minio分布式

需求&#xff1a; 1.创建4个pv&#xff0c;一个pv一个minio-pod。使用sts动态分配pvc(根据存储类找到pv)。----持久化 2.暴露minio的9001端口。&#xff08;nodeport&#xff09;----管理界面 镜像&#xff1a;minio/minio:RELEASE.2023-03-20T20-16-18Z--->换国内源 说明…...

雷军:芯片,手机,平板,SUV一起发

大家好&#xff0c;我是小悟。 5月19日&#xff0c;雷军在微博上宣布&#xff0c;5月22日晚7点将举办小米战略新品发布会。 这场被官方称为“人车家全生态”战略升级的重要活动&#xff0c;一口气带来了小米手机SoC芯片“玄戒O1”、旗舰手机小米15S Pro、小米平板7 Ultra&…...

使用Dockerfile构建含私有Maven仓库依赖包的Java容器

背景 需要用JDBC方式访问ArgoDB星环提供了ArgoDB jar包应用将以Container的方式运行我希望打包成镜像之后&#xff0c;镜像启动就能测试连接是否成功连接URL串需要能够传递进去 失败的方案一&#xff1a;本地文件导入POM pom.xml 配置本地路径 <dependency><groupI…...

AI指令模板综述(Prompt Review)

文章目录 DeepSeek DeepSeek 参考&#xff1a;DeepSeek学术指令大全 找到有价值的研究方向 "作为我的学术研究助手&#xff0c;你需要基于以下要求为我生成5个具有学术价值的创新选题&#xff1a; 请聚焦于[具体研究领域&#xff0c;如’社交媒体用户行为’或’深度学习…...

软件架构之-论分布式架构设计及其实现

论分布式架构设计及其实现 摘要正文 摘要 2023年2月&#xff0c;本人所在集团公司承接了长三角地区某省渔船图纸电子化审查项目开发&#xff0c;该项目旨在为长三角地区渔船建造设计院、渔船审图机构提供一个便捷化的服务平台。在次项目中&#xff0c;我作为项目成员参与了整个…...

零售EDI:Belk Stores EDI需求分析

Belk Stores 成立于 1888 年&#xff0c;是美国历史最悠久的家族百货连锁品牌之一&#xff0c;总部位于北卡罗来纳州夏洛特市。作为美国东南部领先的零售企业&#xff0c;Belk 在16个州拥有近300家门店&#xff0c;主要经营服装、鞋履、美妆、家居用品等多个品类&#xff0c;服…...

LangChain4j入门(六)整合提示词(Prompt)

前言 提示词&#xff08;Prompt&#xff09;是用户输入给AI模型的一段文字或指令&#xff0c;用于引导模型生成特定类型的内容。通过提示词&#xff0c;用户可以告诉AI“做什么”、 “如何做”以及“输出格式”&#xff0c;从而在满足需求的同时最大程度减少无关信息的生成。有…...

【HarmonyOS 5】金融应用开发鸿蒙组件实践

【HarmonyOS 5】金融应用开发鸿蒙组件实践 一、鸿蒙生态观察 2024 年 1 月 18 日&#xff1a; 发布 原生鸿蒙操作系统星河版&#xff0c;面向开发者开放申请&#xff0c;余承东宣布鸿蒙生态设备数达 8 亿台&#xff1b;建设银行、邮储银行等完成鸿蒙原生应用 Beta 版本开发。 …...

cv2.VideoWriter_fourcc(*‘mp4v‘)生成的视频无法在浏览器展

看这个博主的博客&#xff0c;跟我碰到的问题的一致&#xff0c;都是使用AVC1写视频时报编码器不存在的异常&#xff0c;手动编译opencv-python或者使用conda install -c conda-forge opencv安装依赖即可。 博主博客&#xff1a;Python OpenCV生成视频无法浏览器播放问题说明及…...

MD编辑器推荐【Obsidian】含下载安装和实用教程

为什么推荐 Obsidian &#xff1f; 免费 &#xff08;Typora 开始收费了&#xff09;Typora 实现的功能&#xff0c;它都有&#xff01;代码块可一键复制 文件目录支持文件夹 大纲支持折叠、搜索 特色功能 – 白板 特色功能 – 关系图谱 下载 https://pan.baidu.com/s/1I1fSly…...

新书速览|GraphPad Prism图表可视化与统计数据分析:视频教学版

《GraphPad Prism图表可视化与统计数据分析:视频教学版 》 本书内容 《GraphPad Prism图表可视化与统计数据分析:视频教学版 》以GraphPad Prism 10为平台&#xff0c;讲述统计分析软件GraphPad Prism的具体应用方法。在介绍《GraphPad Prism图表可视化与统计数据分析:视频教学…...

波峰波谷策略

这是一个基于数据分布的峰度(kurtosis)和偏度(skewness)的交易策略。 当数据呈现趋势性,并且潜在趋势为正时,我们做多。 当数据呈现趋势性,并且潜在趋势为负时,我们做空。 当趋势发生反转后,我们平仓。 那么,我们如何确定趋势和趋势的强度呢?让我们先来复习一下峰…...

【综述】视频目标分割VOS

目录 1、Associating Objects with Transformers for Video Object Segmentation1&#xff09;背景知识2&#xff09;研究方法3&#xff09;实验结果4&#xff09;结论 2、Rethinking Space-Time Networks with Improved Memory Coverage for Efficient Video Object Segmentat…...

基于线性回归的数据预测

1. 自主选择一个公开回归任务数据集&#xff08;如房价预测、医疗数据、空气质量预测等&#xff0c;可Kaggle&#xff09;。 2. 数据预处理&#xff1a;完成标准化&#xff08;Normalization&#xff09;、特征选择或缺失值处理等步骤。 3. 使用线性回归模型进行建模。采用80…...

第5天-python饼图绘制

一、基础饼图绘制(Matplotlib) 1. 环境准备 python 复制 下载 pip install matplotlib numpy 2. 基础饼图代码 python 复制 下载 import matplotlib.pyplot as plt# 数据准备 labels = [1, 2, 3, 4] sizes = [30, 25, 15, 30] # 各部分占比(总和建议100) colors…...

c++学习方向选择说明

文章目录 前言一、什么样的人适合用c找编程相关工作二、c可以投递什么岗位三、应届生c怎么学才可以找到好工作那这样的话&#xff0c;校招生搞c应该怎么学才能凸显自己的优势呢&#xff1f;那有人就问了&#xff0c;那我应该学啥啊&#xff1f; 四、零基础学习c路线 前言 做了…...

采集需要登录网站的教程

有些网站需要用户登录才能显示相关信息&#xff0c;如果要采集这类网站&#xff0c;有以下几个方法&#xff1a; 1. 写发布模块来抓包获取post的数据&#xff1b; 2. 有些采集器内置浏览器获取这些信息&#xff0c;但是经常获取的不准确&#xff0c;可靠性太低&#xff1b; 3. …...

在hadoop中实现序列化与反序列化

在 Hadoop 分布式计算环境中&#xff0c;序列化与反序列化是数据处理的核心机制之一。由于 Hadoop 需要在集群节点间高效传输数据并进行分布式计算&#xff0c;其序列化框架不仅要支持对象的序列化与反序列化&#xff0c;还要满足高效、紧凑、可扩展等特殊需求。本文将深入探讨…...

数据结构*排序

排序的一些相关概念 稳定性 假设在待排序序列中&#xff0c;存在两个元素A和B&#xff0c;A和B的值相同。在排序后&#xff0c;A和B的相对位置没有变化&#xff0c;就说这排序是稳定的。反之不稳定。 内部排序与外部排序 内部排序&#xff1a;数据完全存储在内存中&#xf…...

新浪《经济新闻》丨珈和科技联合蒲江政府打造“数字茶园+智能工厂+文旅综合体“创新模式

5月14日&#xff0c;新浪网《经济新闻》频道专题报道珈和科技在第十四届四川国际茶业博览会上的精彩亮相&#xff0c;并深度聚焦我司以数字技术赋能川茶产业高质量发展创新技术路径&#xff0c;及在成都市“茶业建圈强链”主题推介会上&#xff0c;珈和科技与蒲江县人民政府就智…...

【Linux】第二十三章 控制启动过程

1. 请简要说明 RHEL9的启动过程。 &#xff08;1&#xff09;计算机通电。系统固件 (UEFI 或 BIOS) 开机自检 (POST)&#xff0c;并初始化部分硬件&#xff0c;然后&#xff0c;固件会寻找启动设备&#xff08;如硬盘、USB、网络等&#xff09;&#xff0c;并将控制权交给引导…...

深信服golang面经

for range 中赋值的变量&#xff0c;这个变量指向的是真实的地址吗&#xff0c;还是临时变量 不是真实地址&#xff0c;是临时变量 package mainimport "fmt"func main() {slice : []int{4, 2, 3}for _, v : range slice {fmt.Println(v, &v) // 这里的 v 是临…...

基于 Netty + SpringBoot + Vue 的高并发实时聊天系统设计与实现

一、系统架构设计 1.1 整体架构图 ------------------ WebSocket (wss) ------------------ Netty TCP ------------------ | Vue前端 | <-------------------------> | SpringBoot网关 | <------------------> | Netty服务集…...

根据当前日期计算并选取上一个月和上一个季度的日期范围,用于日期控件的快捷选取功能

代码如下&#xff1a; <el-date-picker v-model"value" type"monthrange" align"right" unlink-panels range-separator"至"start-placeholder"开始月份" end-placeholder"结束月份" :picker-options"pic…...

Spring Boot 使用 jasypt配置明文密码加密

引入依赖 <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.4</version> </dependency>添加配置 jasypt:encryptor:password: pssw0rd&Hubt2ec…...