CSS实用技巧(中)
前言
我们经常使用CSS
,但是却不怎么了解CSS
,本文主要对vertical-align
、BFC
、position
中开发过程不怎么注意的特性进行简要总结,从本文中,你将了解到以下内容:
vertical-align
为何时灵时不灵BFC
是什么?有何作用- 绝对定位的奇淫技巧
CSS特性
vertical-align为什么时灵时不灵
生效条件
只能应用在display
为inline
、inline-block
、inline-table
、table-cell
上。
有个高频面试题,“如何使一个不定宽高div
垂直水平居中?”,有的萌新竟然回答用vertical-align: middle
。这个回答是减分的,至少在某种程度上给人一种感觉CSS
基础比较薄弱。
内联元素垂直居中对齐
开发中会遇到用字幕x
代替关闭icon
,用...
显示溢出或者加载中。但是会发现字母x
、省略号并没有与文本垂直方向居中对齐,这是因为文本默认是基线对齐,x
、省略号默认底部在基线处。如下图所示:
如下,为文本对齐demo
:
<div class="container">
<span>你好,世界</span>
<span class="more">...</span>
</div>
实际显示效果如下:
如果要实现垂直居中,利用vertical-align
,搭配line-height
即可,vertical-align
不仅可以设置middle/top/bottom/baseline...
关键字,也可以设置常用的度量单位,正负值均可,使用比较灵活。为什么要给.more
设置line-height
属性呢?其实是因为line-height
属性可以继承,如果不缩小.more
的行高,就会撑大父元素的尺寸。
<style>
.container{
font-size: 64px;
line-height: 64px;
}
.more{
line-height: 16px;
vertical-align: 16px;
}
</style>
BFC究竟有什么作用
什么是BFC
BFC
全称block formatting context
,即“块状格式化上下文”,与外界元素相对独立的一片区域,具有以下特性:
- 计算
BFC
高度时,浮动元素也参与计算 - 属于同一
BFC
容器的元素垂直方向的margin
会合并 BFC
容器是独立容器,不会影响外部元素的布局
利用BFC
的特性,我们可以实现以下功能:
- 清除浮动
- 防止垂直方向
margin
合并 - 实现多栏弹性布局
BFC的生效条件
以下CSS
属性会触发元素生成BFC
结界:
- 根元素(
<html>
) - 浮动元素(元素的
float
不是none
) - 绝对定位元素(元素的
position
为absolute
或fixed
) - 行内块元素(元素的
display
为inline-block
) - 表格单元格(元素的
display
为table-cell
,HTML
表格单元格默认为该值) - 表格标题(元素的
display
为table-caption
,HTML
表格标题默认为该值) - 匿名表格单元格元素(元素的
display
为table
、table-row
、table-row-group
、table-header-group
、table-footer-group
(分别- 是HTML table
、row
、tbody
、thead
、tfoot
的默认属性)或inline-table
) overflow
计算值(Computed
)不为visible
的块元素display
值为flow-root
的元素contain
值为layout
、content
或paint
的元素- 弹性元素(
display
为flex
或inline-flex
元素的直接子元素) - 网格元素(
display
为grid
或inline-grid
元素的直接子元素) - 多列容器(元素的
column-count
或column-width
不为auto
,包括column-count
为 1) column-span
为all
的元素始终会创建一个新的BFc
BFC使用案例
- 清除浮动
<style>
.container{
/* overflow: hidden; */
/* position: absolute; */
/* float: left; */
}
.left{
float: left;
width: 200px;
height: 200px;
}
</style>
<div class="container">
<div class="left"></div>
</div>
以上代码,container
容器高度为0
,因为子元素left
浮动。我们只需要把container
容器转成BFC
容器,即可清楚浮动,注释的几种方法都可以。
- 防止垂直方向
margin
合并
<style>
.blue, .red-inner {
height: 50px;
margin: 10px 0;
}
.blue {
background: blue;
}
.red-outer {
overflow: hidden;
background: red;
}
</style>
<div class="blue"></div>
<div class="red-outer">
<div class="red-inner">red inner</div>
</div>
- 自适应布局
左侧固定,右侧自适应。
<style>
.left{
height: 200px;
width: 200px;
float: left;
background-color: burlywood;
}
.right{
height: 200px;
margin-left: 200px;
background-color: cadetblue;
}
</style>
<div class="container">
<div class="left"></div>
<div class="right"></div>
</div>
绝对定位还能玩出什么花样
简介
绝对定位使用场景非常多。绝对定位元素脱离文档流,相对于最近的非 static
祖先元素定位,可以利用left/right/top/bottom
定位元素位置。我们通常都是设置垂直方向与水平方向的的位置,如果四个方向都不设置或者四个方向都设置会出现什么彩蛋呢?下文会给出揭晓。
left/top/right/bottom都有值的定位
- 当对立位置(
left
与right
,top
与bottom
)都设置值且元素没用固定宽高
此时元素的宽高是根据元素位置决定的,张鑫旭大佬在《CSS
世界》中定义为格式化宽高,如下代码,最终box-item
的宽高计算为:width = 200 - 50 -50 = 100px;width = 200 - 50 -50 = 100px;
<style>
.box{
position: relative;
width: 200px;
height: 200px;
margin: 50px;
background-color: bisque;
}
.box-item{
position: absolute;
left: 50px;
right: 50px;
top: 50px;
bottom: 50px;
background-color: coral;
}
</style>
<div class="box">
<div class="box-item"></div>
</div>
这种行为特性对于我们做自适应布局非常有用,而且兼容性非常好,比如我们要做左侧固定宽度,右侧自适应,除了以上BFC
的写法,我们还可以采用以下方法:
<style>
.container{
position: absolute;
top: 100px;
bottom: 100px;
left: 0;
right: 0;
}
.left{
position: absolute;
top: 0;
bottom: 0;
width: 200px;
background-color: burlywood;
}
.right{
position: absolute;
left: 200px;
right: 0;
top: 0;
bottom: 0;
background-color: cadetblue;
}
</style>
<div class="container">
<div class="left"></div>
<div class="right"></div>
</div>
- 当对立位置都设置了值且元素设置了固定宽高
这个时候你会发现,元素的宽高时以width/height
为准,上述说的格式化宽度、高度并没有生效。这是因为在高度计算过程中,元素的内部尺寸优先级大于外部尺寸,width/height
影响的是元素内部尺寸,绝对定位影响的是外部尺寸,当元素绝对定位四个方向都设置值,此时外部尺寸会被内部尺寸覆盖,导致实际元素宽度是width/height
的值。
我们经常用margin: 0 auto;
实现元素水平居中,但是不定宽高元素垂直水平居中就有些麻烦。但是有个神奇的现象,绝对定位配合margin: auto;
,可以实现元素垂直水平居中,如下所示:
<style>
.box{
position: relative;
width: 200px;
height: 200px;
margin: 50px;
background-color: bisque;
}
.box-item{
position: absolute;
margin: auto;
width: 50px;
height: 50px;
left: 0;
right: 0;
top: 0;
bottom: 0;
background-color: coral;
}
</style>
<div class="box">
<div class="box-item"></div>
</div>
出现这种现象是因为margin:auto
本质上是平分元素剩余可用空间,块级元素一般是水平方向自动充满,垂直方向顺序排列。平常我们用margin: 0 auto;
之所以能够使块级元素水平居中,是因为水平方向元素存在剩余可用空间,而auto
平分剩余可用空间,因此就产生居中效果。而垂直方向不存在剩余可用空间,因此无法垂直居中。
上述demo
,box-item
之所以能够垂直居中,得益于top/bottom
设置了值,使元素产生高度100%
的外部尺寸,而width/height
固定元素的内部尺寸,使得 外部尺寸高度-内部尺寸高度=元素剩余可用空间高度,而auto
等分剩余可用空间,可以使元素达到垂直居中效果。可以尝试调整四个方向的值,看看box-item
位置是怎么移动的。
无依赖的绝对定位
当绝对定位没有设置四周定位尺寸时,会发生神奇的一幕,当前元素没有相对于最近的非 static
祖先元素定位,而是在当前位置不变,并且当前元素脱离文档流,不占据页面空间。这个特性某些情况下非常有用,比如给box-card
加一个图标,借助无依赖定位 + padding/margin
即可。写法比较简洁,建议尝试一下。
小结
比起其他的开发语言,想要深入了解CSS
,并不是一件容易事,大多数人都是停留在用的基础上,知道这个属性/方法,至于为什么会这样了解较少。张鑫旭大佬CSS
高度让人叹为观止,继续加油吧!!!
参考资料
- 《
CSS
世界》 - BFC
CSS实用技巧(中)的更多相关文章
- 响应式设计的5个CSS实用技巧
正如我在教程响应式Web设计三步走当中所讲的,响应式的Web设计其实并不难,但是要让元素在布局切换时能够平滑过渡就比较考验技巧了.现在我分享在编码时常用的五个CSS技巧并举例说明.这些技巧都是使用简单 ...
- CSS 实用技巧:制作三角形
实现如图所示的三角形图标: html代码如下: <div class="arrow-up"></div> <div class="arrow ...
- CSS效果:CSS实用技巧制作三角形以及箭头效果
实现如图所示的三角形图标: html代码如下: <div class="arrow-up"></div> <div class="arrow ...
- iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式
iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https:// ...
- 《CSS动画实用技巧》课程笔记
概述 这是我学习[CSS动画实用技巧][1]的课程笔记 常用动画属性--transition [常用动画属性--transition][2] .change img{ display:block; w ...
- CentOS系统中的passwd命令实用技巧小结
这篇文章主要介绍了Linux系统中的passwd命令实用技巧小结,是Linux入门学习中的基础知识,需要的朋友可以参考下 先来回顾一下passwd命令的基本用法: Linux passwd命令用来 ...
- CSS 代码技巧与维护 ★ Mozilla Hacks – the Web developer blog
原文链接:https://hacks.mozilla.org/2016/05/css-coding-techniques/ 译文链接 :http://www.zcfy.cc/article/css-c ...
- JavaScript函数作用域与对象以及实用技巧
1. JS作用域 1.1 全局作用域和局部作用域 函数外面声明的就是 全局作用域 函数内是局部作用域 全局变量可以直接在函数内修改和使用 变量,使用var是声明,没有var是使用变量. 如果在函数内使 ...
- 【CSS】381- 提升你的CSS选择器技巧
我已经使用CSS多年了,但直到最近我才深入研究了一下CSS选择器. 我为什么要这样做呢?我们都知道选择器,但麻烦的是随着时间的推移,很容易习惯于在每个项目中使用相同的可信任选择器来实现你需要做的事情. ...
随机推荐
- Thinkphp中取消url中的index.php 和 Home 默认模块
将配置文件中改: <?phpreturn array( //'配置项'=>'配置值' 'URL_MODEL'=>'2', //去掉url中index.php ' ...
- SaltStack 任意文件读写漏洞(CVE-2020-11652)
漏洞影响 SaltStack < 2019.2.4 SaltStack < 3000.2 同CVE-2020-11651 poc git clone https://github.com/ ...
- Python - 函数实战
前言 参考的是慕课网提供的实战,自己编码 http://www.imooc.com/wiki/pythonlesson1/function2.html 什么是模块化程序设计 在进行程序设计时将一个大程 ...
- POJ 1190 生日蛋糕题解
题目地址:http://poj.org/problem?id=1190 一道很有趣的搜索题--主要是剪枝-- 我弄了5个剪枝: 1.当前剩余层数>=上层半径,剪掉 2.当前剩余层数>=上层 ...
- 教你如何使用FusionInsight SqoopShell
摘要:Sqoop-shell是一个Loader的shell工具,其所有功能都是通过执行脚本"sqoop2-shell"来实现的. 本文分享自华为云社区<FusionInsig ...
- Linux命令(一)之目录结构、Linux终端操作、关机重启等一些基本操作
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- 深入理解SPI机制
一.什么是SPI SPI ,全称为 Service Provider Interface,是一种服务发现机制.它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加 ...
- SpringCloud升级之路2020.0.x版-17.Eureka的实例配置
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 上一节我们提到过, ...
- 官宣 .NET 6 预览版 6
我们很高兴宣布.NET 6 预览版6问世啦.预览版6 是我们RC版发布之前的倒数第二个预览版. 我们将有两个RC版. 此版本本身相对较小,而预览版7会更大. 在那之后,我们将进行质量修复,直到11 月 ...
- IntelliJ IDEA lombok插件的安装配置和使用
一.安装 1.首先我们需要安装IntelliJ IDEA中的lombok插件,打开IntelliJ IDEA后点击菜单栏中的File-->Settings,或者使用快捷键Ctrl+Alt+S进入 ...