HTML和CSS高级指南之二——定位详解(转)

本文深入探讨了HTML和CSS中的定位技术,包括浮动、定位属性(relative、absolute、fixed)、z-index以及如何有效清除浮动。通过实例演示,详细解释了如何控制页面元素在X轴、Y轴和Z轴上的位置,以及在创建复杂布局时解决常见的问题,如父元素塌陷和样式冲突。

 

HTML和CSS高级指南之二——定位详解原文

 

当在这一个页面上实现布局和定位有几种不同的技术。使用哪种技术,很大程序上取决于内容和目标页面,因为有很多技术比别人的更牛。

 

例如,浮动可以让页面元素并排显示,而且还可以制作一个干净的布局。然而,有时候需要一些严格的定位,这时需要使用其他的技术,包括“relative”和“absolute”定位。

 

在这节课中,我们先来介绍一下浮动的使用,接下来详细介绍定位的技巧,包括如何准确的给元素在X轴、Y轴和Z轴定位。

 

包含浮动

 

创建一全页面的布局时,浮动是一种常用的方法,也是页面元素定位的一种基本功能。浮动可以让元素一个挨着一个。浮动可以创建一个自然流布局,同时充许元素设置自身尺寸和其父元素容器的尺寸大小。

 

当元素浮动时,一个元素的位置依赖于放置在他周边的其他元素。那么围绕在他周边的是哪个元素呢?这个元素会换行吗?这一切都取决于围绕于他的元素的DOM(文档对象模型)。

 

DOM是什么?

DOM是Document Object Model的简称,被译为文档对象模型。是HTML或者XML文档结构的API。在我们的例子中,我们说的是HTML的文档,因此DOM就是代表所有元素以及这些元素之间的关系。

可以考虑树形的表现方式,展元素元素之间的关系。元素嵌套时他们存在父子关系,相同级别的还存在兄弟关系。

 

虽然 浮动相 当的给力,但他们自己还是存在一定的问题。最典型的问题就是一个父元素包含了多个浮动的子元素。页面的内容设置了一个宽度,子元素的浮动确定了他们的位 置,但浮动元素不会影响父元素的宽度。这样做会让父元素塌陷,从而使父元素的高度为“0”,以及忽略其他的属性。很多时候,这种现像都被忽略,特别是在父 元素没有任何样式,以及其子元素看起来都正确的对齐。

 

嵌套的元素不会正确的排列,也会有错误的样式出现。来看看下面的演示,在“.box-set”的div应该有一个高亮的灰色背景,因为所有的子元素浮动后,这个灰色的背景色并不看到。仔细检查后,“.box-set”的高度变成了“0”。

<div class="box-set">
  <div class="box">Box 1</div>
  <div class="box">Box 2</div>
  <div class="box">Box 3</div>
</div>	

 

.box-set {
  background: #e8eae9;
}
.box {
  background: #8ec63f;
  height: 100px;
  float: left;
  margin: 10px;
  width: 200px;
}	

 

 

有一种方法,在容器的结束标签前添加一个空标签,在空标签上直接设置样式“clear:both”。用这种方法来清除浮动,在大多数情况下是有效的,但这不太适合语义化。这取决于一个页面有多少浮动需要清除,这样造成页面上的空标签迅速堆积,而且在页面中没有上下文内容。

 

幸运的是有几种不同方法可以用来清除浮动,而其中用得最多的是“overflow”技巧和"clearfix"技巧。

 

Overflow技巧

 

一种清除浮动的技巧是使用“overflow”属性。在具有浮动元素的父容器中设置“overflow”的属性值为“auto”,这样父容器就会有一个高度存在,在我们例子中的灰色背景也就能看得到了。

 

在IE6里面,父容器是需要设置一个“width”和“height”。因为高度可能是一个变量,宽度为100%,他们将能正常的工作。使用 “overflow:auto;”,在IE浏览器中会给元素添加滚动条,这样一来,最好是直接使用“overflow:hidden;”来清除浮动。

.box-set {
  background: #404853;
  overflow: auto;
}	

 清除浮动后效果

 


使用“overflow”技巧清除浮动,确实存在一些缺点。例如:当你添加样式,或者将嵌套在里面的“span”元素移动到父容器的外面,或者你想给元素添加一个盒子阴影和制作一个下拉菜单。在下面的演示例子中,你可以看到元素的盒子阴影被切断在父元素之内。

不同的浏览器对“overflow”属性解析不一样,在浏览器的显示风格也不一样。看看下面的例子,注意列在不同浏览器的显示效果。

clearfix技巧

根据上下文,清除浮动更好的方法是clearfix技巧。“clearfix”清除浮动的技术是有点复杂,但有有比使用“overflow”技巧清除浮动更好的方法?

“clearfix”技巧是基于在父元素上使用“:before”和“:after”两个伪类。使用这些伪类,我们可以在浮动元素的父容器前面和后 面创建隐藏元素。“:before”伪类是用来防止子元素顶部的外边距塌陷,使用“display: table”创建一个匿名的“table-cell”元素。这也确保在IE6和IE7下具有一致性。“:after”伪类是用来防止子元素的底部的外边距 塌陷,以及用来清除元素的浮动。

在IE6和7的浏览器中,加上“*zoom”属性来触发父元素的hasLayout的机制。决定了元素怎样渲染内容,以及元素与元素之间的相互影响。

采取上面同样的例子,你可以看到容器也清除了浮动,元素也可以移到父容器外面:

.box-set:before,
.box-set:after {
  content: "";
  display: table;
}
.box-set:after {
  clear: both;
}
.box-set {
  *zoom: 1;
}	

 清除浮动后效果


有效的包含浮动

使用哪种技巧来清除浮动,终究要看你自己喜好。有些人坚持使用“clearfix”来清除浮动,因为这种方法可以贯穿整个项目。有些人认为 “clearfix”技巧使用的代码太多,他还是喜欢简单点的。至于使用什么技巧由您来决定,只要在运用了浮动的元素的父容器需要清除浮动。

一个常见的方法是将定义一个类名,把这个类名加到需要清除浮动的容器上。例如使用“clearfix”清除浮动,Dan Cederholm为容器设置了一个类名“group”。在需要清除浮动的容器上添加这个类名“group”。

.group:before,
.group:after {
  content: "";
  display: table;
}
.group:after {
  clear: both;
}
.group {
  *zoom: 1;
}	
 
单个伪类

值得注意的是,目前每个元素只有一个“:before”和“:after”伪类。当你尝试使用其他的“:before”和“:after”的clearfix技巧,你的内容可能无法达到想要的效果。

在上面的例子中,clearfix的样式不应该直接插入到“.box-set”类中,应该是给需要清除浮动的元素中添加类名“group”。

定位属性

很多情况下,你需要控制更多元素的位置,而且超过了浮动所能提供的范围,这个时候我们就需要发挥“position”属性的作用。“position”属性提供五个不同的属性值,每种不同的方式可以给元素提供不同的位置

Position static

元素都有position属性,其默认值是“static”,这也意味着,他们没有也不接受位置属性设置(top、right、bottom、left属性值设置)。另外元素设置了position属性,将会覆盖元素的默认值“static”。

在下面的演示中,所有的盒子都是静态的,每个盒子都在相邻盒子顶部,因为他们都是块元素,而且没有进行浮动设置。

<div class="box-set">
  <div class="box">Box 1</div>
  <div class="box">Box 2</div>
  <div class="box">Box 3</div>
</div>	

 

.box-set {
  background: #e8eae9;
}
.box {
  background: #8ec63f;
  height: 80px;
  width: 80px;
}

 效果

 Position relative

 

 “relative”是“position”的另一个属性值,他和“static”属性值非常的相似。主要的区别是“relative”可以给元素设置位 移(offset)“top、right、bottom和left”属性。通过这些位移属性设置可以给元素进行精确的定位。

 

盒子位移属性是如何工作?

盒子的位移属性有四个“top、right、bottom和left”,用来指定元素的定位位置和方向。这些属性只能在元素的“position”属性设置了“relative、absolute和fixed”属性值,才生效。

 

对于相对定位元素,这些属性的设置让元素从默认位置移动。例如,top设置一个值“20px”在一个相对定位的元素上,这个元素会在原来位置向下移动“20px”。反之,“top”设置一个“-20px”,这个元素会在原来的位置向上移动“20px”。

 

对于绝对定位和固定定位鲜红,这些属性指定了元素与父元素边缘之间的距离,例如,绝对定位的元素设置一个“top”值为“20px”,将使绝对定 位元素相对于其设置了相对定位的祖先元素顶部边缘向下移动“20px”,反之,如果设置一个“top”值为“20px”,将使绝对定位元素相对于其设置了 相对定位的祖先元素顶部边缘向上移动“20px”。(绝对定位的参考点是其祖先元素设置了“relative”或者“absolute”值)。

 

     设置了位移属性的相对定位元素,他在页面中仍然是正常的、静态的,仍属于自然流。在这种情况下,其他元素不会占用相对定们元素当初的位置。此外,其他元素没有进行位置移动时,相对定伴元素可能会和其他元素重叠。

 

在下面的演示中,每个元素还是在另一个元素顶部,然后他们根据自己移位属性,从默认位置进行移动,由于他们移向方向不一样,这些值使元素重叠在一 起。当元素设置了相对定时,周边的元素也能看到相对定位元素的默认位置。(也就是说,相对定位元素的默认位置还是被元素自身占用,别的元素是无法占用的。 也就是说相对定位元素的位移是相对于元素自身的边缘进行位移)。

<div class="box-set">
  <div class="box">Box 1</div>
  <div class="box">Box 2</div>
  <div class="box">Box 3</div>
</div>	

 

.box-set {
  background: #e8eae9;
}
.box {
  background: #8ec63f;
  height: 80px;
  position: relative;
  width: 80px;
}
.box-1 {
    top: 20px;
  }
.box-2 {
  left: 40px;
}
.box-3 {
  bottom: -10px;
  right: 20px;
}	

 效果:

 事实上,一个相对定位元素同时设置了“top”和“bottom”位移属性值,实际上“top”优先级高于“bottom”。然而,一个相对定位元素同时 设置了“left”和“right”位移属性,他们的优先级取决于页面使用的是哪种语言,例如,如果你的页面是英文页面,那么“left”位移属性优先级 高,如果你的页面是阿拉伯语,那么“right”的位移属性优先级高。

 

Position absolute

绝对定位元素也具有盒子位移属性,然而,绝对定位元素会脱离文档流。绝对定位元素直接从文档流中移出,绝对定位元素的位置直接和父容器是否设置了相 对定位(绝对定位)有直接关系。绝对定位元素需要至少一个祖先元素设置了相对定位(绝对定位),不然元素定位会相对于页面的主体进行定位。

 

使用绝对定位的元素可以指定垂直和水平的位移属性,使绝对定位元素相对于设置了相对定们的祖先元素边缘进行移位。例如,一个绝对定位的元素设置了 “top”值为“50px”和一个“right”值为“100px”,绝对定位元素会相对于其设置了相对定位的父元素的顶边向下移动50px;向左移动 100px。

 

然而,使用了绝对定位的元素并没有进行任何盒子位移属性设置,那么绝对定位元素的顶部和左部会和设置了相对定位的父元素的顶边和左边重合。如果设置了一个盒子位移属性,比如说“top”,那么绝对定位元素垂直方向会进行移动,而水平位置默认还是左边对齐。

 

在下面的演示中,你可以看到所有的盒子都相对于div的父元素进行绝对定位,每个元素都从特定的面使用定位值进行移动,而且使用了负值的,元素移动到盒子的外面。

<div class="box-set">
  <div class="box">Box 1</div>
  <div class="box">Box 2</div>
  <div class="box">Box 3</div>
</div>	

 

.box-set {
  background: #e8eae9;
  height: 200px;
  position: relative;
}
.box {
  background: #8ec63f;
  height: 80px;
  position: absolute;
  width: 80px;
}
.box-1 {
  top: 6%;
  left: 2%;
}
.box-2 {
  top: 0;
  right: -40px;
}
.box-3 {
  bottom: -10px;
  right: 20px;
}
.box-4 {
  bottom: 0;
}	

 效果

 

当一个绝对定位的元素有固定的高度和宽度,并且盒子位移同时设置了“top”和“bottom”时,“top”更具优先组,另外和相对定位元素一样,当同时设置了“left”和“right”时,优先级取决于他的页面使用的语言。

 

当一个绝对定位的元素没有明确指定高度和宽度,同时使用盒子位移的“top”和“bottom”属性时,会使整个元素的高度跨越整个容器。同样的, 当这个元素同时使用位移“left”和“right”属性值,会使整个元素的宽度跨越整个容器。如果同时使用位移四个属性,可以指定一个宽度和高度显示元 素。(这个时候绝对定位元素的宽度和高度都是100%。)

 

Position fixed

固定定位和绝对定位很类似,但是他定位是相对于浏览器窗口,并且不会随滚动条进行滚动。也就是说,不管用户停留在页面那个地方,固定定位的元素将始 终停留在页面的一个地方。“position”属性值中,仅有“fixed”属性值不能在IE6浏览器下运行,如果你想在IE6正常使用固定定位,那么你 就需要为他写一些Hacks。

 

固定定位元素的盒子位移属性的使用和绝对定位的一样。

 

保持前面盒子移位,可以看到盒子固定定位是相对于浏览器窗口而不是设置了相对定位的父元素。

<div class="box-set">
  <div class="box">Box 1</div>
  <div class="box">Box 2</div>
  <div class="box">Box 3</div>
</div>	

 

.box {
  background: #8ec63f;
  height: 80px;
  position: fixed;
  width: 80px;
}
.box-1 {
  top: 6%;
  left: 2%;
}
.box-2 {
  top: 0;
  right: -40px;
}
.box-3 {
  bottom: -10px;
  right: 20px;
}
.box-4 {
  bottom: 0;
}	

 

 固定页头和页脚

固定定位最常见的一种用途就是在页面中创建一个固定头部、或者脚部、或者固定页面的一个侧面。就算是用户移动浏览器的滚动条,还是固定在页现与用户交流。

 

下面的示例代码能实现。注意如何设置“left”和“right”两个盒子位移,这使得“页脚”跨越了页面的整个宽度,而不需使用margin、border和padding来破坏盒模形就做了收缩自如。

< footer >Fixed Footer </footer>	

 

footer {
  bottom: 0;
  left: 0;
  position: fixed;
  right: 0;
}	

 

 

z-index属性

通常都认为Web页面是二维页面,显示的元素都在X轴和Y轴上。当你的元素有定位时,他们有时候会放置在另一个元素的顶部。要改变这些元素是一个 怎么样的层叠顺序,要知道z轴,z轴是用“z-index”属性来控制的。

 

一般来说,在DOM中,元素出现的时候就放置在z轴上。在Dom中,元素在顶部的要低于底部的。改变这种层叠顺序可以直接使用“z-index”来控制。元素的“z-index”值越高将会出现在越上面,不管元素在Dom哪个位置上。

 

给元素设置“z-index”属性,首先要在这个元素上设置了“position”属性值为“relatvie”、“absolute”或者 “fixed”之一。同样的,你要使用盒子位移属性,你也要先确认元素设置了“positions”属性值为“relative”、“absolute” 或者“fixed”之一。

 

在下面的登例子中,如果每个盒子都不设置“z-index”,那么第一个box在第二个下面,第二个在第三个下面,第三个在第四个下面。如果在盒子中指定“z-index”的值,第二个盒子在第一个和第三个上面,第三个盒子在第四个上面。

<div class="box-set">
  <div class="box">Box 1</div>
  <div class="box">Box 2</div>
  <div class="box">Box 3</div>
</div>  

 

 .box-set {
  background: #e8eae9;
  height: 160px;
  position: relative;
}
.box {
  background: #8ec63f;
  border: 3px solid #f7941d;
  position: absolute;
}
.box-1 {
  left: 10px;
  top: 10px;
}
.box-2 {
  bottom: 10px;
  left: 70px;
  z-index: 3;
}
.box-3 {
  left: 130px;
  top: 10px;
  z-index: 2;
}
.box-4 {
  bottom: 10px;
  left: 190px;
  z-index: 1;
} 

 不设置z-index效果

 设置z-index效果

第三方支付功能的技术人员;尤其适合从事电商、在线教育、SaaS类项目开发的工程师。; 使用场景及目标:① 实现微信与支付宝的Native、网页/APP等主流支付方式接入;② 掌握支付过程中关键的安全机制如签名验签、证书管理与敏感信息保护;③ 构建完整的支付闭环,包括下单、支付、异步通知、订单状态更新、退款与对账功能;④ 通过定时任务处理内容支付超时与概要状态不一致问题:本文详细讲解了Java,提升系统健壮性。; 阅读应用接入支付宝建议:建议结合官方文档与沙微信支付的全流程,涵盖支付产品介绍、开发环境搭建箱环境边学边练,重点关注、安全机制、配置管理、签名核心API调用及验签逻辑、异步通知的幂等处理实际代码实现。重点与异常边界情况;包括商户号与AppID获取、API注意生产环境中的密密钥与证书配置钥安全与接口调用频率控制、使用官方SDK进行支付。下单、异步通知处理、订单查询、退款、账单下载等功能,并深入解析签名与验签、加密解密、内网穿透等关键技术环节,帮助开发者构建安全可靠的支付系统。; 适合人群:具备一定Java开发基础,熟悉Spring框架HTTP协议,有1-3年工作经验的后端研发人员或希望快速掌握第三方支付集成的开发者。; 使用场景及目标:① 实现微信支付Native模式与支付宝PC网页支付的接入;② 掌握支付过程中核心的安全机制如签名验签、证书管理、敏感数据加密;③ 处理支付结果异步通知、订单状态核对、定时任务补偿、退款及对账等生产级功能; 阅读建议:建议结合文档中的代码示例与官方API文档同步实践,重点关注支付流程的状态一致性控制、幂等性处理异常边界情况,建议在沙箱环境中完成全流程测试后再上线。
matlab2python 这是一个Python脚本,用于将Matlab文件或代码行换为Python。此项目处于alpha阶段。 该实现严重依赖于Victor Leikehman的SMOP项目。 当前实现围绕SMOP构建,具有以下差异: 力图生成不依赖libsmop的代码,仅使用如numpy这样的标准Python模块。 使用常见缩写如np而非全称numpy。 尝试重排数组循环索引,从0开始而不是1。 不使用来自libsmop的外部类matlabarraycellarray。 增加了对Matlab类的基本支持,类体中声明的属性在构造函数中初始化。 因上述改动,产出代码“安全性较低”,但可能更接近用户自然编写的代码。 实现相对直接,主要通过替换SMOP使用的后端脚本,这里称为smop\backend_m2py.py。 一些函数替换直接在那里添加。 额外的类支持、导入模块以及其他微调替换(或说是黑客技巧)在matlabparser\parser.py文件中完成。 安装 代码用Python编写,可按如下方式获取: git clone https://github.com/ebranlard/matlab2python cd matlab2python # 安装依赖项 python -m pip install --user -r requirements.txt # 让包在任何目录下都可用 python -m pip install -e . # 可选:运行测试 pytest # 可选:立即尝试 python matlab2python.py tests/files/fSpectrum.m -o fSpectrum.py 使用方法 主脚本 存储库根目录下的主脚本可执行,并带有一些命令行标志(部分直接取自SMOP)。要将文件file.m换为file.py,只需输入:
【信号识别】识别半监督粗糙模糊拉普拉斯特征图(Matlab代码实现)内容概要:本文档围绕“信号识别”主题,重点介绍了基于半监督粗糙模糊拉普拉斯特征图的信号识别方法,并提供了完整的Matlab代码实现。该方法结合了半监督学习、粗糙集理论、模糊逻辑与拉普拉斯特征映射技术,用于提升在标签样本稀缺情况下的信号分类性能,尤其适用于复杂背景噪声下的信号特征提取与识别任务。文中详细阐述了算法原理、数学模型构建过程及关键步骤的编程实现,旨在帮助科研人员深入理解并应用该混合智能识别技术。; 适合人群:具备一定信号处理基础Matlab编程能力的研究生、科研人员及从事通信、雷达、电子系统等领域工程开发的技术人员;熟悉机器学习与模式识别的基本概念者更佳; 使用场景及目标:①应用于低标注成本、高噪声环境下的信号分类任务,如雷达信号识别、通信信号监测等;②用于学术研究中对半监督学习与特征降维融合方法的探索与性能验证;③作为撰写相关领域论文或项目开发的技术参考与代码基础; 阅读建议:建议读者结合文档中的理论推导与Matlab代码逐段分析,动手运行并调试程序以加深理解;可尝试在不同信号数据集上进行实验对比,进一步优化参数设置与模型结构,提升实际应用场景下的识别精度与鲁棒性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值