html加css布局结构,html、css基础复习之布局结构篇

本文深入讲解CSS布局,包括定位布局(相对定位、绝对定位、固定定位和sticky定位)、弹性布局以及盒子模型。通过实例解析了各个属性的工作原理和应用场景,如flex-direction、justify-content、align-items等。此外,还介绍了CSS BFC(块格式化上下文)和外边距重叠现象的解决方案。学习这些基础知识能有效提高UI开发的效率和代码质量。
摘要由CSDN通过智能技术生成

所谓“设计一根线,重构一身汗”,掌握好css基础对于提高UI开发效率,提升代码质量有很大的作用。本文由我大熊主播给大家分享一下css中布局方面的基础。不需要游艇火箭,假如看完后有收获的话就点个赞点个收藏便是极好的。

本文的目录如下,采取的是由大到小的层面去分享:

1.css定位布局

2.css弹性布局

3.css盒子模型

4.css BFC

另预报一下,css动画与即抄即可使用的css常用样式会在下篇中分享,敬请期待。

好,那就开始发车了。

css定位布局

定位布局一般分为下面四类,我们常用的是相对定位,绝对定位和固定定位,而sticky定位是一个比较有趣的定位。

adb99aaa0488352d225b5bcc3366df36.png

相对定位

相对定位是我们最常见最普通的定位了,他有这2方面的特点:

1.元素不脱离文档流

2.相对于自身元素定位。

所谓不脱离文档流,就是设置相对定位后,他还是处于本来的文档流中,保留本来占据的空间。可以看看这个示例,当我设置了和平精英这个元素为相对定位后,他还是像之前一样占据着文档流的空间。

18ed8dd74263c17110c09b71a134fcfa.gif

第二个特点是相对于自身元素定位,意思是当我们设置top,left那些值时,他是相对自身本来的位置离顶部,离左边相应的距离。可以看看这个示例,我给和平精英这个容器设置属性后,他是相对本来的位置进行位移的。

e1e092897c72c0f0b925928d59ed1bb0.gif

绝对定位

接下来说一下绝对定位,他一般用于依赖父元素,位置随便的元素上,例如红点呀,角标啊那些。

055e93e17091c0c509eee24b338efc13.png

他有以下这三点特点:

1.元素脱离文档流

2.宽高由容器里面的内容决定

3.相对于设置了定位的父级元从来定位。

设置了绝对定位后,元素会脱离文档流,不占据文档流的位置,看起来像漂浮在文档流的上方一样。

元素的宽高也会发生变化,他不再占满整行,而是里面的内容能撑起多大的面积就占多大的面积。

可以看看这个示例,当我们给和平精英的元素设置绝对定位后,他就像不占空间一样浮了起来,下面的元素就往上占据了他的位置了,而且这个元素的面积只能恰好包住里面的字吧,这就是宽高由里面的内容决定。当然你可以给他设置宽高的样式,让他变成你想要的宽高。

cff7ad73e8ee181ae5afd259e2821093.gif

绝对定位还有一个特点,是它相对于上一个设置了定位的父级元从来进行定位,假如找不到,则相对于body元素进行定位。

看看这个示例,当我们给这个元素设置绝对定位和top属性后,它一下子就去到最顶部了,由于此时它的父级元素都没有设置定位,它相对于body来定位了。假如我们给最外层第二个元素设置定位,是不是就变成了相对于它来定位啦,而假如这时再给最外层第三个元素设置定位,因为它离绝对定位元素更近,所以绝对定位元素就相对于它来定位了。

0ca31ee0c30b118862d9dfb5db84a242.gif

固定定位

接着讲一下固定定位。它和绝对定位比较类似,设置后元素会脱离文档流,宽高由里面的内容决定。但是他不再相对于父级元素定位,而是根据浏览器窗口定位。可以看看这儿右下角的妲己图标,当页面滚动时它还停在原地不动,这就是相固定定位了。这个就不开展了。

f29a3b5f99458d3839532044847964b5.gif

sticky定位

最后我们说一下很有趣的sticky定位。我们看一下右边的导航栏,它一开始还是在文档流中的,向上滑动后后就黏在屏幕顶部,向下滑动后又回到文档流中。可以认为,当它在屏幕里时是相对定位,当它离开屏幕时是固定定位。设置也很简单,只要要对导航栏元素设置position:sticky和top属性就行了。当然假如你想它黏在屏幕底部,那就设置bottom属性。

3b65f94a5c056b28e48a61b3e87ad05a.gif

用这个属性时要注意以下6点,但在我的使用经验来看,一般就是要特别注意第4第6第7点就行了。

1.sticky不会触发BFC,

2.z-index无效,

3.当父元素的height:100%时,页面滑动到肯定高度之后sticky属性会失效。

4.父元素不能有overflow:hidden或者者overflow:auto属性。

5.父元素高度不能低于sticky高度。

6.必需指定top、bottom、left、right4个值之一

7.安卓4.4和ios7之前的低端手机不兼容,可用js使导航栏在固定定位与相对定位间切换。

定位属性

定位属性包含位置属性及层级属性。位置属性包括top、bottom、left、right,这些属性指的是目标元素相对于参照物的距离。

508d0d9de27a03ce6c1c9878ddccba44.png

而层级属性,表示哪一个显示得更前面一点。我们可以看一下这个例子,当我给第3个盒子增加z-index后,他是不是盖在最上面了啦,而我再给第4个盒子增加更大的z-index后,它就盖在第3个盒子上面了。

314d1c21c10c677b0d5943a95b507e5f.gif

css弹性布局

掌握好css弹性布局,做UI开发时会更得心应手、事半功倍。(重点,敲黑板!!!)

要实现弹性布局也很简单,只要要对容器增加display:flex;即可以了。

接下来看一下弹性布局包含的内容。下图是一个弹性布局的示用意,在一个大的container容器里,横放着三个item项目。main axis意思是主轴,就是item按哪条轴来排列的,cross axis是侧轴或者者交叉轴,就是和主轴垂直的那条轴。start 和 end 分别表示轴的开头和结尾。接下来我一个一个属性详情一下。

cb1e2231d3e920c6dd25fac6bd55cf09.png

flex-direction

先说容器属性,flex-direction表示主轴的方向,即项目是要横着排还是竖着排。一般我们只用到row和column,分别是横着排和竖着排。加上了reverse表示反方向排列。接下来我们先假设项目都是默认的横着排的。

454921c499e8108a30915edba227da06.png

justify-content

justify-content定义项目在主轴上是怎样对齐的,分别有下图五点。要注意的是,假如使用了space-around的话,两侧项目到边缘的距离是项目与项目之间间距的一半,这个也比较好了解,每个项目都有间距,那两边的项目只有一个间距就到边缘,而中间那些项目左一个间距右一个间距,自然就是边缘的间距的两倍了。

d034221f5049275cc148b93f7e290cfd.png

align-items

既然有主轴的对齐就一定有交叉轴的对齐了,属性值也和上一个有点类似。这儿就不多说了。用得最多的就是center属性,拿来做垂直居中对齐。一般弹性布局用得最多的容器属性就是这两个属性了。

06506ed0916ac38d4aeedc702a135ea7.png

flex-wrap

flex-wrap定义假如一行放不下,应该怎样办,默认是不换行,也有换行及反着换行的选择。使用换行的话,即可以实现出九宫格,瀑布流之类的效果了。

e0e751cef43912c51998edd2f1617268.png

flex-grow

接下来要详情的是项目的属性了,就是在一个个item里设置的属性。用得最多的是flex-grow,一般我们直接只写flex,表示item占据空间的比例,假如每个item都是1那就是平均分,假如其中一个item设为2,那么他占的空间是别的item的两倍。

cac73ba80b6f591ecc71a3e029b6f68d.png

很多时候我会用这个属性来做图文横排的样式,给文字设个flex=1,即可以把除了图片以外的空间都占满了。

66a02aa8c7cc445db7e0e386f69511d6.png

align-self

align-self定义单个项目的交叉轴对齐方式,比方某个项目不想按正常套路排列,即可以用这个属性来设置了,可选值和前面说的align-item是一样的。

aa16c80196925cb1a8661366ce95f3ff.png

order

order定义项目的排列顺序,数值越小,排列越靠前,默认为0。有时候假如想做一个九宫格抽奖的效果,即可以做一个按钮再做八个奖品项,而后用order来调整他们的顺序了,而不用像以前那样,先做四个奖品项,再做一个按钮,再做四个奖品项了。

511c94176261322442f79df6002930ab.png

可视化工具

弹性布局的详情到此就完了,这里再详情一个直观的可视化工具flexbox playground,给容器和项目设置不同的值,看看他们的体现。

c6f0d5760aa71906946a2ae402fe6bb1.gif

这是另一个可视化工具flexbox.help,和之前的相比,可以生成css代码,但不能给单个项目设置属性看效果。

75ab643f0ae7d332b813c40e189ed61a.png

css盒子模型

刚刚说完元素之间的布局后,接下来我要说的是更小层面的东西了,就是单个元素的组成结构,我们表示为盒子模型。

大家先看看下图这个画框,框的中间是一副画,在css里表示content,画与画框之间的间距,我们叫padding,画框相当于border,而画框外面的间距就是margin了。css的盒子模型就是长这样的了。

e1ed028cf04c27616f74d1f9b9eb486e.png

模型的宽与高,在默认标准模式下,就是指content的宽与高。

d208bb0054f6e8dbf33556918c1ede2d.png

但当我们设置box-sizing: border-box时,模型的宽与高就是content+padding+border的宽高了。

984aaaeec59ded5d20168cf9c35cfcbd.png

说这个有什么用呢?用处可大了。以下面这个例子为例,假设容器宽高是固定的,这时我们需要调小padding间距,假如不用border-box,那模型的宽就是content的宽,我们调小多少padding,就要把content调大相应的尺寸,这样最终容器的宽高才能保持一致。

6c2dc43438c45475404de309d0c0028f.gif

而假如用了border-box,此时模型的宽就是content+padding+border的宽,我们调小padding就行了,content会自动撑满整个容器,就是自动调大了尺寸了,一步到位了。所以很多时候我挺喜欢用这个属性的。

e8de090a1dfdc47811f94ae65d42e882.gif

css BFC

说完border-box,我再说一个有趣的现象,叫外边距重叠现象。比方你写了两个列表项,分别设置了这样的间距,而后你用浏览器打开一看,发现他们的间距合并在一起了。这个现象是正当的,由于你原本按着设计稿量的尺寸设置了每个列表项的外边距,结果浏览器却显示了2倍的间距,这样就很奇怪了吧。不过为了减少这个现象的影响,我一般是只设置一边的间距,比方只设置列表项的下边距之类的。

119cd6780e484c827d6cd00bc75e0bdc.png

有的时候可能你还是不想外边距重叠,那处理办法就是创立BFC。创立了BFC后,元素自成了一个环境,环境里面与外面的的样式和体现互相独立,互不影响。所以就两个外间距都出现了。

39c98e2a056bb11cd5375120d85bc9c5.png

那怎样创立BFC呢?这里有4个办法。

1.overflow不为visible;

2.float的值不为none;

3.position的值为absolute、fixed;

4.display属性为inline-blocks,table, table-cell,table-caption,flex,inline-flex;

示例演示的是第一个办法,设置overflow属性。可以看到,一开始元素之间的外边距是重叠了的,这时候让我来创立一个bfc。前面说了要创立一个环境,让环境里面的与外面的互不影响,所以这时我要在p标签外面增加一个div,而后设置div的overflow属性,让div成为一个bfc,使得里面的p样式不受外面影响。设置完后,可以看到两者的外间距就分开了。

e564160090b01aa830d29ad49597da59.gif

结语

关于布局、结构方面的知识点我就分享完了,不知本文是否帮得到大家呢?在下篇文章中,我会继续分享css动画和即抄即可使用的css常用样式,敬请期待。大家有什么想分享的欢迎留言,也欢迎大家收藏点赞,说不定哪个时候忽然需要复习和参考一下呢。(。ӧ◡ӧ。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值