本文来自作者 大漠 在 GitChat 上分享 「聊聊 CSS 中的布局模式」, 「阅读原文 」查看交流实录。
「文末高能 」
编辑 | 哈比
一、聊聊 CSS 中的布局模式
在大家的印象中,CSS 非常的简单,在此我想再强调一下,虽然 CSS 简单,但并不代表容易。随着 Web 技术的发展飞快,CSS 经过二十多年的发展,其变化也是非常的大。
CSS 涵盖的技术点也非常的多,其中的每一个点都足够我们发很多的时间去探讨。今天我们就一起来聊聊 CSS 中的布局模式,因为在任何的 Web 网站和 Web 应用都离不开布局。
对于众多的布局模式,我们应该怎样给 Web 产品选择最适合的布局模式呢?希望这篇文章对大家了解或者给 Web 产品选择布局模式有所帮助。
二、Web 的演化路程
在互联网的演化过程中,Web 网站(网页制作)是 Web 1.0 时代的产物,那时网站的主要内容都是静态的,用户使用网站的行为也以浏览为主。
随着网页从学术机构走向公众社会,网页承载的功能便超出了学术范围而变得愈加丰富,因此早期网页的局限性也逐渐显露出来。
2005 年以后,互联网进入了 Web 2.0 时代,各种类似桌面软件的 Web 应用大量涌现,网站的前端也由此发生了翻天覆地的变化。
网页也不再只是承载单一的文字和图片,各种富媒体让网页的内容更加生动,网页上软件化的交互形式为用户提供了更多好的使用体验,这些都是基于前端技术实现。
技术发展日新月异,现在业内人员开始提出 Web 3.0 的概念。
最常见的解释是,网站内的信息可以直接和其他网站相关信息进行交互,能通过第三方信息平台同时对多家网站的信息进行使用;用户在互联网上拥有自己的数据,并能在不同网站上使用;完全基于 Web,用浏览器即可实现复杂系统程序才能实现的系统功有;用户数据审计之后,同步于网络数据。
Web 的整个演化走过了 Web1.0 和 2.0,即将迎接 Web3.0(或者说 Web 3.0 已经到来了),在每个过程都有相应的产物出来,比如下图所示:
上图来自于 evolutionoftheweb.com。这个网站演示了整个网络的演进过程以及演进过程中相应产生的产物。感兴趣的可以至 http://www.evolutionoftheweb.com/?hl=zh-tw 详细了解。
上面的网站只演示到 2012 年,与当今相比,已有近六年的差距,但对于 Web 的前面发展史还是足以帮助我们进行 Web 发展的进程。
今后的发展,将会是 Web 4.0 的世界,智能化机械、生物科技等,可能正如电影 Matrix 所言,做成 “天网” 的电脑智能系统,希望电脑不会控制人类。
扯了这么多,简单的归纳一下 Web(说互联网技术更为准确)的演变的历史大致如下:
1990~2000 年,Web 1.0(Web,网作用:连接知识):主要包括网页搜索引擎、网站、数据库、文件服务器等;
2000~2010 年,Web 2.0(Scocial Web,社会网作用:连接知识):引入了社区、RSS、Wiki、社会化书签、社会化网络等概念;
2005~2020 年,Web 3.0(Sementic Web, 语义网作用:连接知识):由本体、语义查询、人工智能、智能代理、知识结点、语义知识管理等构成;
2015~2030 年,Web 4.0(Ubiquitous,无所不在的网作用:连接情报):具体内容还不大清楚,我想 Web 4.0 的含义关键在于它在任何时候,任何地方能够提供给你任何需要的东西。
用下图来展示 Web 每个阶段的发展历程:
三、布局演变史
通过前面的内容,或许你对 Web 的发展历史有了一定的了解。可以说整个 Web 在不断的演进,那么为 Web 服务的理念与技术等等也在不断的进行演化。
而我们今天要要聊的话题是 Web 布局(Web 网站或 Web 应用程序的布局),它也在 Web 不同的演化过程也有相应的演进。接下来就回到我们今天要聊的主题当中。
在 Web 布局整个演进过程当中,经历了没有任何布局、表格布局、定位布局、浮动布局、Flexbox 布局等布局模式。
除了这些我们常看到的布局之外,即将还会有 Grid、Shapes(类似杂志不规则布局)这些现代的布局模式。这些布局模式从侧面也反映出其自身是 Web 演进过程中的一种产物,都承载了自己在当时那个时期的史命。
用 @Jen Simmons 的一张图来表达,更为贴切一些:
对于布局,我们还可以按类型和功能来进行分类。先来看按类型分类的布局模式:
无任何布局模式;
表格布布局模式;
浮动布局模式;
定位布局模式;
多列布局模式;
Flexbox 布局模式;
Grid 布局模式;
不规则布局模式;
另外除了类型分类,还可以按功能模式来分类:
接下来简单的看看每种布局的模式承载的史命。
1. 无任何布局模式
历史上最早的一个网页是 1990 年 12 月 20 日,欧洲核子研究组织(CERN)的科学家家蒂姆 . 伯纳斯 . 李在瑞士的研究中心创建的,最初仅为 CERN 内部的科学家所使用。
在这个阶段,网站的内容主要是文字内容和图片为主,制作方法非常的简易。比如万维网(WWW),欧洲核子研究组织的一帮科学家为了方便看文档,传论文而创造的。
这个时候的 Web 网页主要是基于 Document。Document 就是用标记语言加上超链接写成的由文字和图片构成的 HTML 页面,这样的功能已经完全能满足学术交流的需要,所以网页的早期形态和 Document 一样,完全基于 HTML 页面,并且所有内容都是静态的。如下图:
2. 表格布局模式
很长的一段时间,,多页就只有文字信息和图片组成,而且只是为了查看内容。为了让页面好看一点,主要装饰还是依赖于 HTML 自带的标签的属性。
随着 Web 技术的发展,HTML 也越来越成熟。而 Web 呈现给用户的不仅仅是文字浏览,网络制作者希望制作出来的页面能更适合用户的浏览,或者想让其能像 Word 这样的排版软件制作出来的文档。
这个时候很多网页开始依赖 HTML 的表格标签来对 Web 进行布局。在那个时候喜欢使用可视化软件来直接制作网页,比如 FrontPage、DW 这样的。
下图就是 DW 制作网页的一个简易图:
比如 2005 年的淘宝页面,就是用表格制作的,如下图所示:
也可以说表格的布局是 Web 早期 CSS 不存在的时候兴趣的,是对table
标签不正规使用(它是表格标签),天生就是用来显示数据的,而不是用来给网页布局的。
W3C 说,表格可以用来容纳文字、图片、链接、表单以及表格等。
但表格不应该单纯用来做网页布局,理由是,当 Web 被非可视化设备渲染的时候,表格会出问题,他们指定是屏幕阅读器以及盲文浏览器。
另外,表格在大型显示设备上会强迫用户左右滚动。虽然 W3C 说不建议用表格来布局,特别是在 CSS 出现之后,更是被人嫌弃,事实上对表格的责难主要有:
代码臃肿;
页面渲染性能问题;
不利于搜索引擎优化;
可访问性差;
不够语义。
事实上,表格也并不是一无是处,他也有自己的优点:
特别是 CSS 越来越成熟的时候,表格对于布局而言已经退出了历史的舞台,但并不是说标签就再也不使用了。
前面也说过了,表生就是用来显示数据的,所以不管什么时候,表格用来显示数据还是最佳的一种方式。
如果你追求完美,又不想使用表格的显示数据,那也不要紧,你可以使用table
和table-cell
来模拟表格的布局模式。比如:
//display:table; //display:table-header-group; //display:table-row; 1 //display:table-cell; 2 //display:table-row-group; 3 4
特别是在移动端,如果你想对底部的工具栏有一个等分列的布局效果,使用display:table
和display:table-cell
将也是种完美的方案。只不过你需要添加width: 100%
和table-layout:fixed
。
3. 定位布局
随着 CSS 的强大和 HTML 更多元素标签的出现,布局不在局限于表格。而对于后端或者说早期的前端人员(网页设计师),常采用的布局是 CSS 中的position
各属性(fixed
、absolute
等)来布局。
这种方式的布局能让你快速达到想要的布局效果。当然也有很多同学直接尝试采用 PSD2HTML 这样的类似工具,直接将设计图转换成 Web 页面。
虽然这种方式能快速实现 Web 的布局效果,但也受到很多的局限性:
需要明确指定元素的大小;
需要明确计算元素位置坐标;
难于维护。
或许其中还有很多其他不利的因素。因此,这样的布局也并算是一种好的布局模式,但对于不太懂 CSS 的同学而言,这是一种简单易懂的布局。
在实际布局当中,模态弹出框和固定页头,页脚有常见定位布局的身影,特别是水平垂直居中:
.center { width: 300px; position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%) }
如果你使用 PSD2HTML 这样的工具转换出来的页面(特别早期的 Photoshop 或者 Firework 制图软件切片导出的页面),基本上都是使用定位布局。
4. 浮动布局
其实 CSS 中的浮动布局,它的初衷并不是用来布局的,而是用来处理文本的一种排版方式。但是广大的 CSSer 发挥其无穷的智慧,硬是将其用于 Web 的布局中。
这种布局方式成为一种主流的布局方式,并且持续了很多年。直到 Flexbox 布局的出现和移动端的兴起,浮动布局才慢慢的被其取替。
特别是在 2004 年傅捷、王宗义和祝军翻译了美国塞尔达曼(Zeldman J.)的著作《网站重构》一书。
这本书受到广大 Web 爱好者的青眯,可以说让国内整个前端行业(那时候还没有前端这样的职位)发生了很大的一个变化。我记得那时候,淘宝 UED 说:“我们要做地球上最优秀的前端”。
这本书称得上是给整个行业带来了革命性的变化,而就这场革命也造就了 “21 世界最大的 IT 冤案”。为什么说是 21 世界最大的 IT 冤案呢?
只要 2004 年以后看了这本书的同学,只要看到 Web 页面源码中有table
标签,就会说这个不行,写这个页面的人不专业,页面也是垃圾,不符合 W3C 规范。
其实这本书从来也没有说网页出现table
标签就是垃圾网页,就是不符合 W3C 标准的页面。
除了造成 21 世纪最大的 IT 冤案之外,还有灾难性的 DIV+CSS 的泛滥。出现最多的词就是div
,大家觉得我会div
,我就很高大上。
而且整个页面下来,除了div
,就是div
。什么p
标签、span
标签基本上是找不到。这个时候就是div
的泛滥,根本也没有什么语义化,可读性一说。
感觉有点跑题了,还是回到正题中来。在使用浮动布局这些年当中,从中还演变出来很多布局方式,比如后面要聊的静态布局、流式布局、自适应布局和响应式布局等。
在 CSS 的布局模式当中,浮动布局经历的时期是最长的,持续了十多年的历史。在这个时期也演变出很多经典的布局。
其中要属 “圣杯” 和 “双飞翼” 两者最为经典。这两种方法实现的都是三栏布局,两边的固定宽度,中间自适应,它们实现的效果是一样的,差别只是实现的思想。
圣杯布局
圣杯布局:左、中、右。中间的宽度为100%
,独占一行。使用负边距(margin-left
)把左右两列拉到和中间列同一行。
左列使用 margin-left:-100%;
右例使用 margin-left: -右列宽度;
同时左、中、右三列的容器设置左右padding
来给左右两列留下相应宽度(左、右列宽度)。
/*CSS*/ .container { width: 480px; margin: 20px auto; padding-left: 240px; padding-right: 240px; overflow: hidden; border: 1px solid red; } .middle { width: 100%; background: green; float: left; } .left { margin-left: -100%; width: 220px; background: orange; position: relative; float: left; left: -240px; } .right { margin-left: -220px; width: 220px; background: yellow; position: relative; right: -240px; float: left; }
双飞翼布局
双飞翼布局和圣杯布局类似,也是左,中,右三列,中列里面会再套一个容器。
实现代码也很简单:
/*CSS*/ .container { width: 960px; margin: 20px auto; overflow: hidden; } .middle { float: left; width: 100%; } .middle-inner { margin: 0 240px; /* 留出距离 */ background-color: yellow; } .left { float: left; width: 220px; margin-left: -100%; background-color: red; } .right { float: left; width: 220px; margin-left: -220px; background-color: green; }
圣杯布局和双飞翼布局解决的问题是一样的,都是两边定宽,中间自适应的三栏布局,中间栏要在放在文档流前面以优先渲染。
这样做主要是因为早年的网络和设备没有现在这么优秀,为了让主要的内容先向用户呈现,所以很多时候都使用这两种布局方式。
甚至可以说,现在很多人都还在使用这两种布局方式。但如果你继续阅读后面的内容之后,你会慢慢放弃浮动布局。
虽然在布局的历史中,他承载了相当长的一段时间的使命,但有更好的,更适合的方式,我们应该要学会选择与放弃。
5. 多列布局
这里要说的多列布局,并不是前面的布局模式产生的多列模式。而是 CSS 的 Multi-column 布局模块。
你可能想得到,这个模块给予了我们脱离position
和float
这些属性,就能在网页上实现多列布局的能力。
同样,根据容器的大小,就可以控制创建栏目的数量,这是非常了不起的一个特点。Multi-column 对应的 CSS 属性还具有以下一些功能:
定义栏目的最大宽度;
定义在多栏目之间的间距;
在多个栏目中平均分配好显示的内容。
Multi-column 好就好在能够自动为你安排好流体内容,你用不着计算确定栏目的数量,让他们排排站好就行了。
这种布局,就算是在现在,使用的人也不多,必须像报纸这样的多列布局的风格并不多,但借助他的特性,我们可以实现一些特殊的布局风格。比如瀑布流的布局:
由于代码过多,就不在这里列出了,如果对代码感兴趣的话,可以至 https://codepen.io/airen/full/ybyvEM/ 查看。具体实现的步骤,可以阅读《纯 CSS 实现瀑布流布局》一文。
除此之外,多列布局还常用于下图这样的布局风格:
6. Flexbox 布局
Flexbox 是 CSS 的一个新特性,这个新特性解决我们以前在 CSS 中很多麻烦问题,比如说内容的伸缩与扩展、垂直居中、等分列、等高列等等。
当然,这个属性也大量的运用于布局当中,特别是在面对品种繁多的移动端的局面下,Flexbox 用于布局的优势也显现的更为强大。从而慢慢的用来取代了 CSS 中的浮动布局。
使用 Flexbox 来布局,现在随处可见。比如 @Zoe Gillenwater 整理的相关教程和资料(https://goo.gl/mB61yM) 。里面有很多关于 Flexbox 的内容。这里我放几张图来演示 Flexbox 实现布局是多么的简单和灵活。
时到今日,使用 Flexbox 的场景也越来越多,在将来使用 Flexbox 场景将会更多(https://www.w3cplus.com/blog/tags/157.html) 。
7. 网格布局
前面说过早期的 Web 页面仅仅是用来展示文本信息和图片。但对于现在的 Web 页面,不仅仅是这样了。
随着这么多年的发展。现在大量的网页设计都是基于网格布局。虽然人们通常注意不到它,但事实上杂乱无章的布局时代确实已经过去了,现在是整齐结构化的天下。
无论从理论、美学和整齐来说,这样的布局都很好平衡。网格结构是所有现代网站的基础,它总能级最终用户完美无暇的设计。
对于网格系统而言,它也经历了一个漫长的演变。表格布局虽然痛苦,但可以说表格是网格系统布局的最初模型。
正因为有表格布局的存在,才有了后面的 CSS 网格系统,不管是早期基于浮动完成的网格系统,还是后期依赖于 Flexbox 完成的网格系统。当然,你可有会说,网格系统的鼻祖不是 960gs(http://960.gs/) ?
虽然 960gs 是最早出现的网格系统(基于浮动布局),但其网格的思路是来源于表格的。因为表格具有明显的栅格风格,只不过是使用其它的布局模式,快速模拟了表格的风格,甚至是嵌套表格的网格。
加上网格系统让 Web 的设计变得结构整齐、布局平衡等。受到众多设计师的青眯,也让撸码的同学更易实现,并且可以依据此思路制定一套系统,比如很多 CSS 的 Framework 都有类似的网格系统布局(不管是浮动还是 Flexbox 实现的)。
不管怎么说,这些网格系统可以达到较好的效果,甚至还可以基于此系统制作工具,通过工具帮助大家快速完成布局。
前面我们说了很多种 Web 的布局模式,但这些布局模式都局限于单维(一维)方向。但对于现代 Web 页面的布局,很多时候我们需要的不仅仅是单维的布局,希望在两个维度都能更好的控制我们的布局。
比如下面这样的一种布局:
前面介绍的每种布局模式都可以实现上图这样的布局效果,但要实现具有可扩展性,并且自适应强的并不容易实现。
归根究底,前面的这些方法都是单维控制的,只能控制一个方向,对于另一个方向就不好控制了。
不过,值得庆幸的是。CSS 推出的 CSS Grid 布局模块,可以很好的解决这个问题。因为 CSS Grid 布局打破了以前所有布局方式的维度,它是一个双维度的布局模块。
它除了可以灵活的控制水平方向之外,还能轻易的控制垂直方向的布局模式。对于上图那样的九宫格布局,它就可以轻而易举的完成。
可以说,CSS Grid 布局才是 Web 中的布局模块,随着浏览器对其支持度越来越强的情况下,它将更会受到青眯。也将成为未来 Web 布局中的霸主。
特别是将 CSS Grid 布局和 Flexbox 布局两种模式结合在一起,那对于布局言就不会有什么难事。比如下图这样的布局:
8. 不规则布局
我们常看到的 Web 布局一般都是遵循按行和列等线性原则,Web 网站的布局到今天为止很大程度上受到这些原则的影响。
虽然 CSS Grid 的出现让布局变得更好,更灵活,但相对于印刷媒体而言,Web 布局总体上还是受到很多的限制,特别是内容流上。
杂志和报纸一直有很好的办法来安排内容。比如文本绕着非矩形排列。
而 CSS 的 Shapes 模块(https://drafts.csswg.org/css-shapes/) 让 Web 布局能像杂志和报纸一样让文本内容实现不规则矩形排列。
CSS Shapes 使网页设计师能更好的实现自己的创意,除了简单的长方形和正方形,还可以实现任何几何图形布局。
扫描下方二维码,阅读完整原文
你可能感兴趣的:(聊聊 CSS 中的布局模式)
男士护肤品哪个牌子好?十大男士护肤品排行榜
高省APP珊珊
很多男生意识到护肤的必要性,开始着手护肤,但不知道该选哪个男士护肤品品牌使用好。目前市面上很多男士护肤品品牌,可谓琳琅满目,让人眼花缭乱。男士挑选护肤品时,根据自己皮肤需求去正规渠道挑选合适的知名护肤品比较放心靠谱。高省APP,是2021年推出的平台,0投资,0风险、高省APP佣金更高,模式更好,终端用户不流失。【高省】是一个自用省钱佣金高,分享推广赚钱多的平台,百度有几百万篇报道,也期待你的加入
三菱PLC全套学习资料及应用手册
good2know
本文还有配套的精品资源,点击获取简介:三菱PLC作为工业自动化领域的核心设备,其系列产品的学习和应用需要全面深入的知识。本次资料包为学习者提供从基础到进阶的全方位学习资源,包括各种型号PLC的操作手册、编程指南、软件操作教程以及实际案例分析,旨在帮助用户系统掌握PLC的编程语言、指令系统及在各类工业应用中的实施。1.三菱PLC基础知识入门1.1PLC的基本概念可编程逻辑控制器(PLC)是工业自动化
移动端城市区县二级联动选择功能实现包
good2know
本文还有配套的精品资源,点击获取简介:本项目是一套为移动端设计的jQuery实现方案,用于简化用户在选择城市和区县时的流程。它包括所有必需文件:HTML、JavaScript、CSS及图片资源。通过动态更新下拉菜单选项,实现城市到区县的联动效果,支持数据异步加载。开发者可以轻松集成此功能到移动网站或应用,并可基于需求进行扩展和优化。1.jQuery移动端解决方案概述jQuery技术简介jQuery
15个小技巧,让我的Windows电脑更好用了!
曹元_
01.桌面及文档处理第一部分的技巧,主要是围绕桌面的一些基本操作,包括主题设置、常用文档文件快捷打开的多种方式等等。主题换色默认情况下,我们的Win界面可能就是白色的文档界面,天蓝色的图表背景,说不出哪里不好看,但是就是觉得不够高级。imageimage说到高级感,本能第一反应就会和暗色模式联想起来,如果我们将整个界面换成黑夜模式的话,它会是这样的。imageimage更改主题颜色及暗色模式,我们
力扣热题100-------54. 螺旋矩阵
海航Java之路
力扣 leetcode 矩阵 java
给你一个m行n列的矩阵matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例1:输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例2:输入:matrix=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]提示:m==matrix.lengthn
C++ 计数排序、归并排序、快速排序
每天搬一点点砖
c++ 数据结构 算法
计数排序:是一种基于哈希的排序算法。他的基本思想是通过统计每个元素的出现次数,然后根据统计结果将元素依次放入排序后的序列中。这种排序算法适用于范围较小的情况,例如整数范围在0到k之间计数排序步骤:1初始化一个长度为最大元素值加1的计数数组,所有元素初始化为02遍历原始数组,将每个元素值作为索引,在计数数组中对应位置加13将数组清空4遍历计数器数组,按照数组中的元素个数放回到元数组中计数排序的优点和
现在发挥你的优势
爱生活的佑嘉
来和我做咨询的一些朋友,涉及到定位的,都会说,我不知道我的优势是什么,你能不能帮我看看?还有一些朋友,喜欢做各种测试来了解自己,测试过后,然并卵。今天,我想来聊聊优势,如何能了解自己的优势是什么。首先,我们要知道,如果要成为“不一般”的人,我们所做的事情,就要基于自身的优势。我做管理者十多年,看到每个员工都有不同的特长,有的擅长数字,有的擅长人际,有的擅长写作。这些知道自己优势并且在这方面刻意练习
Linux系统配置(应用程序)
1风天云月
Linux linux 应用程序 编译安装 rpm http
目录前言一、应用程序概述1、命令与程序的关系2、程序的组成3、软件包封装类型二、RPM1、RPM概述2、RPM用法三、编译安装1、解包2、配置3、编译4、安装5、启用httpd服务结语前言在Linux中的应用程序被视为将软件包安装到系统中后产生的各种文档,其中包括可执行文件、配置文件、用户手册等内容,这些文档被组织为一个有机的整体,为用户提供特定的功能,因此对于“安装软件包”与“安装应用程序”这两
第28章 汇编语言--- 异常处理
hummhumm
汇编 算法 开发语言 程序设计 高级语言 异常处理 汇编语言
在汇编语言中,异常处理是一个重要的概念,它涉及到处理器如何响应和处理程序运行时发生的非正常情况。异常可以是硬件错误(例如除零错误、非法指令)或者软件触发的中断(例如系统调用)。当发生异常时,处理器会暂停当前正在执行的程序,并转移到一个预先定义好的位置来处理这个异常。为了详细阐述第28章关于汇编语言中的异常处理,我们可以考虑一个简化的例子,展示异常处理的基本结构。请注意,实际的代码将取决于具体的处理
JVM 内存模型深度解析:原子性、可见性与有序性的实现
练习时长两年半的程序员小胡
JVM 深度剖析:从面试考点到生产实践 jvm java 内存模型
在了解了JVM的基础架构和类加载机制后,我们需要进一步探索Java程序在多线程环境下的内存交互规则。JVM内存模型(JavaMemoryModel,JMM)定义了线程和主内存之间的抽象关系,它通过规范共享变量的访问方式,解决了多线程并发时的数据一致性问题。本文将从内存模型的核心目标出发,详解原子性、可见性、有序性的实现机制,以及volatile、synchronized等关键字在其中的作用。一、J
Flowable 高级扩展:自定义元素与性能优化实战
练习时长两年半的程序员小胡
Flowable 流程引擎实战指南 流程图 flowable BPMN 流程引擎 java
在前五篇文章中,我们从基础概念、流程设计、API实战、SpringBoot集成,到外部系统协同,逐步构建了Flowable的应用体系。但企业级复杂场景中,原生功能往往难以满足定制化需求——比如需要特殊的审批规则网关、与决策引擎联动实现动态路由,或是在高并发场景下优化流程引擎性能。本文将聚焦Flowable的高级扩展能力,详解如何自定义流程元素、集成规则引擎,并掌握大型系统中的性能调优策略。一、自定
SpringMVC的执行流程
1、什么是MVCMVC是一种设计模式。MVC的原理图如下所示M-Model模型(完成业务逻辑:有javaBean构成,service+dao+entity)V-View视图(做界面的展示jsp,html……)C-Controller控制器(接收请求—>调用模型—>根据结果派发页面2、SpringMVC是什么SpringMVC是一个MVC的开源框架,SpringMVC=Struts2+Spring,
氧惠官方邀请码333777,氧惠邀请码怎么获得?氧惠邀请码有什么套路?
知行导师
问:氧惠邀请码怎么获得?答:氧惠官方邀请码333777返点高佣金高真的高。问:氧惠邀请码有什么套路?答:氧惠官方邀请码333777返点高佣金高真的高。氧惠APP汇聚各大主流电商和生活服务平台优惠,展示全网全品类商品,满足网购爱好者对品质好货与极致性价比的追求,并同时享受大平台购物权益保障。满足用户日常吃喝玩乐衣食住行的聚合APP,独特的商业模式,响应国家号召,为实现全民共富而努力奋斗。氧惠邀请码3
为什么焦虑、抑郁、自残的青少年越来越多?
精神健康
很多家长觉得没缺孩子吃的穿的,他们有安稳的生活,他们有什么可焦虑、抑郁的,但现在的孩子,学习压力越来越大,每天休息的时间越来越少,出现焦虑抑郁是很正常的。从发展的角度看,青少年时期,人的身体、情绪,智力、人格都急剧发展,正从未成熟走向成熟,情绪起伏不定,易冲动,再者,由于缺乏生活经验,以及来自于家长、学校、社会的各种要求和压力,从而不知所措,心中的焦虑、恐惧、彷徨得不到及时的排解,从而导致心理上的
【ARM】FPU,VFP,ASE,NEON,SVE...是什么意思?
亿道电子Emdoor
ARM arm开发 ARM
1、文档目标对执行浮点和SIMD操作的逻辑的各种名称的缩写词进行简要解释。2、问题场景Arm处理器内核中有用于执行浮点和SIMD操作的逻辑,有各种名称。它们通常是一系列的缩写形式,因此本文旨在对每一个缩写词进行简要解释。3、软硬件环境1、软件版本:不涉及2、电脑环境:不涉及4、相关缩写FPU(Floating-PointUnit)浮点单元浮点单元是处理器核心中的一个模块,用于使用浮点数执行算术运算
读书打卡《别想太多啦》
chenchen_68ed
第一,世间之事,不去尝试永远不知道其中的奥秘,在尝试中有失败是必然的。如果担心失败,那什么都学不会。第二,经历的失败越多,越会对失败者抱有宽容的态度,“原来如此,我也经历过类似的失败啦,那只是暂时的”。经历越多失败的长者,越能包容别人,这也就是所谓的“越年长越宽容”。成熟的人,就是在众多失败经历中不断学习,并接纳别人的失败。对于他人的小小过失不吹毛求疵,自己的心态会更加平和。在不断失败中学习,让自
你对待万事万物的态度
行靜
昨晚爸爸把洒水壶灌满水,对我说:你也该去浇浇你阳台上的花咯。这么大的天气,几天没浇水都快死了。我才意识到自己容易突然间忽视一些事情。尤其是身旁的一些事,可能它们呆久了,反而习以为常。想想每天的生活状态就是在不断的重复着一些事,有点固定模式。没有什么特别发生。记录我的一天:上班,挤公交,用手机或电脑,吃饭,上课。没有
京东家电年销售额是去年的1300%,主要来自于他....
Shanshan小课堂
经过大半个月角逐纠缠,时间终于来到6月18日,618全球年中购物节迎来最高潮。作为国内最大的家电零售平台,京东家电从18日0点开始,便开启了飞速狂奔的模式,仅8分钟销售额就突破20亿元!展现出强劲的增长势头与家电主场的王者霸气的同时,也让各家电品牌实现了爆发式增长,美的、海尔、格力、奥克斯均在3分钟内突破1亿元大关。在今年的618中,除了消费者已经熟悉的网购形式外,线上线下联动的融合模式、社交电商
图论算法经典题目解析:DFS、BFS与拓扑排序实战
周童學
数据结构与算法 深度优先 算法 图论
图论算法经典题目解析:DFS、BFS与拓扑排序实战图论问题是算法面试中的高频考点,本博客将通过四道LeetCode经典题目(均来自"Top100Liked"题库),深入讲解图论的核心算法思想和实现技巧。涵盖DFS、BFS、拓扑排序和前缀树等知识点,每道题配有Java实现和易错点分析。1.岛屿数量(DFS遍历)问题描述给定一个由'1'(陆地)和'0'(水)组成的二维网格,计算岛屿的数量。岛屿由水平或
Java 队列
tryxr
java 开发语言 队列
队列一般用什么哪种结构实现队列的特性数据入队列时一定是从尾部插入吗数据出队列时一定是从头部删除吗队列的基本运算有什么队列支持随机访问吗队列的英文表示什么是队列队列从哪进、从哪出队列的进出顺序队列是用哪种结构实现的Queue和Deque有什么区别Queue接口的方法Queue中的add与offer的区别offer、poll、peek的模拟实现如何利用链表实现队列如何利用顺序表实现队列什么叫做双端队列
践行8.0~第六周11.25-12.02
初队长
突破后的喜悦最可怕的不是自己不清楚,而是自己清楚了,却依然不心动,我想这就是我们每个人的惰性存在,在这一周的践行,我发现自己依然是停留在自己的模式当中,不断的恶性的轮回,虽然的话,那再晨间日记方面是纸质的填写,但是对一天的工作没有起到应有的计划和推动的作用而我自己呢,也有些时候的话会处于一个相对来讲放松的一个状态,时间的把控的话也有一些点的消极,所以在这周的间隙,重点是关注自己的三大目标为目标来进
四百八十九章. 春晓客栈鲁易寒
巨木擎天
邓林他们在打量别人的时候,而别人,自然也是在打量他们了。邓林就看见在这大堂里,散散啦啦的有四个人在,其中两个,只是僵直站立,眼眶中燃烧着橙色骨火的骷髅,而另外两个坐着的,才是眼眶中点燃黄色魂火的骨族人。这两个骨族人中的一个,在邓林他们刚一进来的时候,就把注意力都放在了伊莲娜娜的身上,似乎在确认着什么,当看到伊莲娜娜冲着自己点了点头以后,他有些激动的走过来几步,口中说道:“真的是伊莲娜娜公主殿下?您
STM32入门之TIM基本定时器
嵌入式白话
STM32入门学习 stm32 嵌入式硬件 单片机
一、定时器简介定时器是嵌入式系统中的关键外设之一,它可以用于生成精确的延时、周期性中断、PWM波形生成等功能。在STM32F1系列单片机中,定时器不仅能为系统提供精确的时钟,还支持外部事件的捕获以及信号输出。对于定时器的功能,我们可以通过一个生活中非常常见的例子来形象地描述:微波炉的定时器。想象你正在使用微波炉加热食物。在微波炉里,定时器的作用就是帮助你控制食物加热的时间。当你设置了加热时间后,定
JVM 内存分配与回收策略:从对象创建到内存释放的全流程
在JVM的运行机制中,内存分配与回收策略是连接对象生命周期与垃圾收集器的桥梁。它决定了对象在堆内存中的创建位置、存活过程中的区域迁移,以及最终被回收的时机。合理的内存分配策略能减少GC频率、降低停顿时间,是优化Java应用性能的核心环节。本文将系统解析JVM的内存分配规则、对象晋升机制,以及实战中的内存优化技巧。一、对象优先在Eden区分配:新生代的“临时缓冲区”大多数情况下,Java对象在新生代
北斗短报文兜底、5G-A增强:AORO P1100三防平板构建应急通信网络
公网中断的灾区现场,泥石流阻断了最后一条光缆。一支救援队却在废墟间有序穿行,队长手中的三防平板正闪烁着北斗卫星信号,定位坐标与伤亡信息化作一行行短报文,穿透通信孤岛直达指挥中心。这是AOROP1100三防平板搭载的北斗短报文功能在应急救援中的真实场景,更代表了工业移动终端在极端环境下的能力跃迁。AOROP1100三防平板作为遨游通讯2025年推出的旗舰三防设备,AOROP1100三防平板的技术基底
js操作样式
郝加升
DOM样式属性和方法:指定的元素,它的style有这么几个属性和方法:cssText:通过这个属性可以访问到元素的特性style设置的属性,并且可以直接赋值设置。removeProperty(属性名称):从样式中删除给定属性。setProperty(属性名称,值,权重):可以通过这个方法设置给定样式的同时设置其权重,可以传入”important”或者一个空字符串。获取计算后样式:window.ge
猎板 PCB 控深槽工艺:5G 基站散热模块的关键支撑
猎板PCB黄浩
5G 运维 数据库
PCB控深槽工艺在5G基站散热模块中的关键作用:猎板PCB的技术突破在5G基站的密集高频信号与高功率运行环境下,散热性能直接决定了设备的稳定性和寿命。猎板PCB通过创新性的控深槽工艺(控深锣/控深铣),结合材料科学与结构优化,为5G基站散热模块提供了高精度、高可靠性的解决方案,有效攻克了高热负荷下的技术瓶颈。一、5G基站散热的核心挑战热负荷激增:5G基站的射频功放(PA)、电源管理模块等器件功耗显
提升在直返APP中的等级:解锁更多特权与收益的秘诀
古楼
在直返APP的世界里,每个用户都渴望提升自己的等级,以解锁更多特权与收益。那么,如何提升在直返APP中的等级呢?接下来,我们将为您揭示这一秘密。【高省】APP(高佣金领导者)是一个自用省钱佣金高,分享推广赚钱多的平台,百度有几百万篇报道,运行三年,稳定可靠。高省APP,是2021年推出的平台,0投资,0风险、高省APP佣金更高,模式更好,终端用户不流失。高省是公认的返利最高的软件。古楼导师高省邀请
D124:如何训练独立思考力?
大栗子_
当我们要判断一个理论或者思想是否正确,需要有三个层次,分别是体验、解释和分析。首先看体验。很多时候,我们会相信“听上去、感觉是对的”的事情。我们之前讲的太空笔的故事之所以大多数人都认为是对的,就是有一些看似真实的关键词,比如美国,NASA,设计等,这些词看起来非常权威,但是离我们又遥远,这时候我们的大脑就会放松警惕了。于是,我们毫不犹豫就接受了。说到这里,你有没有发现之前的电视广告中的各种高让我们
社交电商平台有哪些?社交电商怎么做?
氧惠评测
社交电商平台有很多,以下是一些常见的社交电商平台:氧惠APP是与以往完全不同的抖客+淘客app!2024全新模式,我的直推也会放到你下面。主打:带货高补贴,深受各位带货团队长喜爱(训练营导师每天出单带货几万单)。注册即可享受高补贴+0撸+捡漏等带货新体验。送万元推广大礼包,教你如何1年做到百万团队。珊珊导师氧惠邀请码888999,注册送万元推广大礼包,教你如何1年做到百万团队。氧惠app:氧惠ap
js动画html标签(持续更新中)
843977358
html js 动画 media opacity
1.jQuery 效果 - animate() 方法 改变 "div" 元素的高度: $(".btn1").click(function(){ $("#box").animate({height:"300px
springMVC学习笔记
caoyong
springMVC
1、搭建开发环境
a>、添加jar文件,在ioc所需jar包的基础上添加spring-web.jar,spring-webmvc.jar
b>、在web.xml中配置前端控制器
<servlet>
&nbs
POI中设置Excel单元格格式
107x
poi style 列宽 合并单元格 自动换行
引用:http://apps.hi.baidu.com/share/detail/17249059
POI中可能会用到一些需要设置EXCEL单元格格式的操作小结:
先获取工作薄对象:
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();
HSSFCellStyle setBorder = wb.
jquery 获取A href 触发js方法的this参数 无效的情况
一炮送你回车库
jquery
html如下:
<td class=\"bord-r-n bord-l-n c-333\">
<a class=\"table-icon edit\" onclick=\"editTrValues(this);\">修改</a>
</td>"
j
md5
3213213333332132
MD5
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MDFive {
public static void main(String[] args) {
String md5Str = "cq
完全卸载干净Oracle11g
sophia天雪
orale数据库 卸载干净 清理注册表
完全卸载干净Oracle11g
A、存在OUI卸载工具的情况下:
第一步:停用所有Oracle相关的已启动的服务;
第二步:找到OUI卸载工具:在“开始”菜单中找到“oracle_OraDb11g_home”文件夹中
&
apache 的access.log 日志文件太大如何解决
darkranger
apache
CustomLog logs/access.log common 此写法导致日志数据一致自增变大。
直接注释上面的语法
#CustomLog logs/access.log common
增加:
CustomLog "|bin/rotatelogs.exe -l logs/access-%Y-%m-d.log 
Hadoop单机模式环境搭建关键步骤
aijuans
分布式
Hadoop环境需要sshd服务一直开启,故,在服务器上需要按照ssh服务,以Ubuntu Linux为例,按照ssh服务如下:
sudo apt-get install ssh
sudo apt-get install rsync
编辑HADOOP_HOME/conf/hadoop-env.sh文件,将JAVA_HOME设置为Java
PL/SQL DEVELOPER 使用的一些技巧
atongyeye
java sql
1 记住密码
这是个有争议的功能,因为记住密码会给带来数据安全的问题。 但假如是开发用的库,密码甚至可以和用户名相同,每次输入密码实在没什么意义,可以考虑让PLSQL Developer记住密码。 位置:Tools菜单--Preferences--Oracle--Logon HIstory--Store with password
2 特殊Copy
在SQL Window
PHP:在对象上动态添加一个新的方法
bardo
方法 动态添加 闭包
有关在一个对象上动态添加方法,如果你来自Ruby语言或您熟悉这门语言,你已经知道它是什么...... Ruby提供给你一种方式来获得一个instancied对象,并给这个对象添加一个额外的方法。
好!不说Ruby了,让我们来谈谈PHP
PHP未提供一个“标准的方式”做这样的事情,这也是没有核心的一部分...
但无论如何,它并没有说我们不能做这样
ThreadLocal与线程安全
bijian1013
java java多线程 threadLocal
首先来看一下线程安全问题产生的两个前提条件:
1.数据共享,多个线程访问同样的数据。
2.共享数据是可变的,多个线程对访问的共享数据作出了修改。
实例:
定义一个共享数据:
public static int a = 0;
Tomcat 架包冲突解决
征客丶
tomcat Web
环境:
Tomcat 7.0.6
win7 x64
错误表象:【我的冲突的架包是:catalina.jar 与 tomcat-catalina-7.0.61.jar 冲突,不知道其他架包冲突时是不是也报这个错误】
严重: End event threw exception
java.lang.NoSuchMethodException: org.apache.catalina.dep
【Scala三】分析Spark源代码总结的Scala语法一
bit1129
scala
Scala语法 1. classOf运算符
Scala中的classOf[T]是一个class对象,等价于Java的T.class,比如classOf[TextInputFormat]等价于TextInputFormat.class
2. 方法默认值
defaultMinPartitions就是一个默认值,类似C++的方法默认值
java 线程池管理机制
BlueSkator
java线程池 管理机制
编辑
Add
Tools
jdk线程池
一、引言
第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
关于hql中使用本地sql函数的问题(问-答)
BreakingBad
HQL 存储函数
转自于:http://www.iteye.com/problems/23775
问:
我在开发过程中,使用hql进行查询(mysql5)使用到了mysql自带的函数find_in_set()这个函数作为匹配字符串的来讲效率非常好,但是我直接把它写在hql语句里面(from ForumMemberInfo fm,ForumArea fa where find_in_set(fm.userId,f
读《研磨设计模式》-代码笔记-迭代器模式-Iterator
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
import java.util.Arrays;
import java.util.List;
/**
* Iterator模式提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象内部表示
*
* 个人觉得,为了不暴露该
常用SQL
chenjunt3
oracle sql C++ c C#
--NC建库
CREATE TABLESPACE NNC_DATA01 DATAFILE 'E:\oracle\product\10.2.0\oradata\orcl\nnc_data01.dbf' SIZE 500M AUTOEXTEND ON NEXT 50M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 256K ;
CREATE TABLESPA
数学是科学技术的语言
comsci
工作 活动 领域模型
从小学到大学都在学习数学,从小学开始了解数字的概念和背诵九九表到大学学习复变函数和离散数学,看起来好像掌握了这些数学知识,但是在工作中却很少真正用到这些知识,为什么?
最近在研究一种开源软件-CARROT2的源代码的时候,又一次感觉到数学在计算机技术中的不可动摇的基础作用,CARROT2是一种用于自动语言分类(聚类)的工具性软件,用JAVA语言编写,它
Linux系统手动安装rzsz 软件包
daizj
linux sz rz
1、下载软件 rzsz-3.34.tar.gz。登录linux,用命令
wget http://freeware.sgi.com/source/rzsz/rzsz-3.48.tar.gz下载。
2、解压 tar zxvf rzsz-3.34.tar.gz
3、安装 cd rzsz-3.34 ; make posix 。注意:这个软件安装与常规的GNU软件不
读源码之:ArrayBlockingQueue
dieslrae
java
ArrayBlockingQueue是concurrent包提供的一个线程安全的队列,由一个数组来保存队列元素.通过
takeIndex和
putIndex来分别记录出队列和入队列的下标,以保证在出队列时
不进行元素移动.
//在出队列或者入队列的时候对takeIndex或者putIndex进行累加,如果已经到了数组末尾就又从0开始,保证数
C语言学习九枚举的定义和应用
dcj3sjt126com
c
枚举的定义
# include <stdio.h>
enum WeekDay
{
MonDay, TuesDay, WednesDay, ThursDay, FriDay, SaturDay, SunDay
};
int main(void)
{
//int day; //day定义成int类型不合适
enum WeekDay day = Wedne
Vagrant 三种网络配置详解
dcj3sjt126com
vagrant
Forwarded port
Private network
Public network
Vagrant 中一共有三种网络配置,下面我们将会详解三种网络配置各自优缺点。
端口映射(Forwarded port),顾名思义是指把宿主计算机的端口映射到虚拟机的某一个端口上,访问宿主计算机端口时,请求实际是被转发到虚拟机上指定端口的。Vagrantfile中设定语法为:
c
16.性能优化-完结
frank1234
性能优化
性能调优是一个宏大的工程,需要从宏观架构(比如拆分,冗余,读写分离,集群,缓存等), 软件设计(比如多线程并行化,选择合适的数据结构), 数据库设计层面(合理的表设计,汇总表,索引,分区,拆分,冗余等) 以及微观(软件的配置,SQL语句的编写,操作系统配置等)根据软件的应用场景做综合的考虑和权衡,并经验实际测试验证才能达到最优。
性能水很深, 笔者经验尚浅 ,赶脚也就了解了点皮毛而已,我觉得
Word Search
hcx2013
search
Given a 2D board and a word, find if the word exists in the grid.
The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or ve
Spring4新特性——Web开发的增强
jinnianshilongnian
spring spring mvc spring4
Spring4新特性——泛型限定式依赖注入
Spring4新特性——核心容器的其他改进
Spring4新特性——Web开发的增强
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
Spring4新特性——Groovy Bean定义DSL
Spring4新特性——更好的Java泛型操作API
Spring4新
CentOS安装配置tengine并设置开机启动
liuxingguome
centos
yum install gcc-c++
yum install pcre pcre-devel
yum install zlib zlib-devel
yum install openssl openssl-devel
Ubuntu上可以这样安装
sudo aptitude install libdmalloc-dev libcurl4-opens
第14章 工具函数(上)
onestopweb
函数
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/
Xelsius 2008 and SAP BW at a glance
blueoxygen
BO Xelsius
Xelsius提供了丰富多样的数据连接方式,其中为SAP BW专属提供的是BICS。那么Xelsius的各种连接的优缺点比较以及Xelsius是如何直接连接到BEx Query的呢? 以下Wiki文章应该提供了全面的概览。
http://wiki.sdn.sap.com/wiki/display/BOBJ/Xcelsius+2008+and+SAP+NetWeaver+BW+Co
oracle表空间相关
tongsh6
oracle
在oracle数据库中,一个用户对应一个表空间,当表空间不足时,可以采用增加表空间的数据文件容量,也可以增加数据文件,方法有如下几种:
1.给表空间增加数据文件
ALTER TABLESPACE "表空间的名字" ADD DATAFILE
'表空间的数据文件路径' SIZE 50M;
&nb
.Net framework4.0安装失败
yangjuanjava
.net windows
上午的.net framework 4.0,各种失败,查了好多答案,各种不靠谱,最后终于找到答案了
和Windows Update有关系,给目录名重命名一下再次安装,即安装成功了!
下载地址:http://www.microsoft.com/en-us/download/details.aspx?id=17113
方法:
1.运行cmd,输入net stop WuAuServ
2.点击开