position:static | relative | absolute | fixed | center | page | sticky
默认值:static,
center、page、sticky是CSS3中新增加的值。
box-sizing: content-box /*默认值*/
复制代码
box-sizing: border-box /*默认值*/
复制代码
给一个盒子设置display:flex
这个盒子就会变成弹性盒子,有两个轴,一个主轴一个交叉轴,常用属性:
align-items
在伸缩容器上使用它,伸缩容器内部所有的元素都一致地受制于align-items
的值。
但是有些时候,我们希望伸缩容器内部某个元素在侧轴上的排列方式有所差异。此时就不能使用align-items
,因为align-items
作用于整体。
我们希望作用于部分。这就是align-self的发挥场地。 可取值:align-self: auto|stretch|center|flex-start|flex-end|baseline|initial|inherit;
(回答问题的小技巧,比如这个盒子水平垂直居中的问题,可以从项目说起,说我在项目中就经常会遇到需要元素居中的问题,一开始我总用...后来学习了好用的弹性布局...再后来逛博客比如掘金啊什么的,看到了什么什么方法,觉得也挺好用好实现的...)
基本代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
html,body{
height: 100%;
overflow: hidden;
}
.box{
box-sizing: border-box;
width: 100px;
height: 50px;
border: 1px solid #000;
background: brown;
}
</style>
</head>
<body>
<div class="box"></div>
</body>
</html>
复制代码
/* 定位1 */
/* 缺点,必须知道具体的宽高, 但很多时候都不是具体的宽高 */
body{
position: relative;
}
.box{
position: absolute;
top: 50%;
left: 50%;
margin-top: -25px;
margin-left: -50px;
}
复制代码
/* 定位2 */
/* 缺点,盒子必须有宽高,不需要考虑具体宽高 */
body{
position: relative;
}
.box{
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
}
复制代码
/* 定位3 CSS3里的translate神器 */
/* 缺点,浏览器兼容性不好 */
body{
position: relative;
}
.box{
position: absolute;
top: 50%;
left: 50%;
transform:translate(-50%, -50%);
}
复制代码
/*移动端常用
缺点:浏览器兼容性不好*/
body{
display: flex;
/* 主轴居中 */
justify-content: center;
/* 交叉轴居中 */
align-items: center;
}
复制代码
获取当前屏幕的宽高,获取盒子的宽和高,(屏幕宽高-盒子宽高)/2
<style>
body{
position: relative;
}
.box{
position: absolute;
}
</style>
<script>
let HTML = document.documentElement,
winW = HTML.clientWidth,
winH = HTML.clientHeight,
boxW = box.offsetWidth,
boxH = box.offsetHeight;
box.style.position = "absoluteH";
box.style.left = (winW-boxW) / 2 + 'px';
box.style.top = (winH-boxH) / 2 + 'px';
</script>
复制代码
/* 缺点,要求父级有固定宽高, 不能是百分比 */
body{
display: table-cell;
vertical-align: middle;
text-align: center;
/* 固定宽高 */
width: 500px;
height: 500px;
border: 1px solid #000;
}
.box{
display: inline-block;
}
复制代码
行内元素
:
text-align: center; 复制代码
margin-left: -width/2
, 前提是 父元素position: relative
display:inline-block
和text-align:center
实现水平居中。
transform
,translateX
可以移动本身元素的50%
。
相对定位
,子级设置绝对定位
,标签通过margin实现自适应居中
flex
:父级设置display: flex; 子级设置margin为auto实现自适应居中
transform
实现
table
布局,父级通过转换成表格形式,然后子级设置vertical-align
实现。(需要注意的是:vertical-align: middle使用的前提条件是内联元素以及display值为table-cell的元素)。
结合响应式rem那些
flex属性:是 flex-grow、flex-shrink、flex-basis三个属性的缩写。
flex: 1
相当于:
flex-grow:1
自动放大占位flex-shrink:1
如果空间不足,项目缩小flex-basis:0%
<style>
#flex-container {
display: flex; /* 采用 flex 布局 */
flex-direction: row; /* 按行排列 */
}
.box-left {
background: orange;
width: 500px;
}
.box-right {
background: blue;
flex: 1;
}
</style>
</head>
<body>
<div id="flex-container">
<div class="box-left">left</div>
<div class="box-right">right</div>
</div>
</body>
复制代码
<head>
<style>
html,body {
height: 100%;
/* 超出一屏隐藏 */
overflow: hidden;
}
.container{
height: 100%;
/*左右两边要设置200的宽度,所以这边padding左右留出200*/
padding: 0 200px;
}
.left,.right {
width: 200px;
min-height: 200px;
background: lightblue;
}
.center{
/* center其实是占满了container 留出padding之后的全部 */
width: 100%;
min-height: 400px;
background: lightsalmon;
}
.left,.right, .center {
/* 如果不加这个浮动,那么center,left,right这三个就会依次一行一行排下去 */
/* 加了浮动之后,由于center已经占满了第一行,所以left和right会在第二行依次排开 */
float: left;
}
.left{
margin-left: -100%;
position: relative;
left: -200px;
}
.right{
margin-right: -200px;
}
</style>
</head>
<body>
<!-- 圣杯布局 -->
<div class="container clearfix">
<div class="center"></div>
<div class="left"></div>
<div class="right"></div>
</div>
</body>
</html>
复制代码
(不推荐使用,兼容到IE9,一般来说禁止在css里使用表达式去算,因为渲染的很慢,影响性能,所以css里这种运算表达式尽量少写)
.center {
width: calc(100%-400px);
min-height: 400px;
background: #ffa07a;
}
复制代码
<head>
<style>
html, body {
overflow: hidden;
}
.container {
display: flex;
justify-content: space-between;
height: 100%;
}
.left, .right {
/* flex是个组合写法
第一个:放大的比例
第二个:缩小的比例
第三个: 在整个容器里占空间的大小 */
flex: 0 0 200px ;
height: 200px;
background: lightblue;
}
.center {
/* 这里写1的意思是把剩余空间全部占满 */
flex : 1;
min-height: 400px;
background: lightsalmon;
}
</style>
</head>
<body>
<div class="container">
<div class="left"></div>
<div class="center"></div>
<div class="right"></div>
</div>
</body>
</html>
复制代码
<head>
<style>
html, body {
height: 100%;
overflow: hidden;
}
.container {
position: relative;
height: 100%;
}
.left, .right {
position: absolute;
top: 0;
width: 200px;
min-height: 200px;
background: lightskyblue;
}
.left{
left: 0;
}
.right{
right: 0;
}
.center {
margin: 0 200px;
min-height: 400px;
background: lightsalmon;
}
</style>
</head>
<body>
<div class="container">
<div class="center"></div>
<div class="left"></div>
<div class="right"></div>
</div>
</body>
</html>
复制代码
<head>
<style>
html,body{
height: 100%;
overflow: hidden;
}
.container, .left, .right {
/* 浮动,使container,left,right都并排排列 */
/* 但由于container占了百分之百了,所以只有container在第一行 */
/* left和right在第二行 */
float: left;
}
.container {
width: 100%;
}
.container .center {
margin: 0 200px;
min-height: 400px;
background: lightsalmon;
}
.left, .right {
width: 200px;
min-height: 200px;
background: lightblue;
}
.left {
margin-left: -100%;
}
.right {
margin-left: -200px;
}
</style>
</head>
<body>
<!--container2里面只包含中间部分,两边翅膀脱离container-->
<div class="container">
<div class="center"></div>
</div>
<div class="left"></div>
<div class="right"></div>
</body>
</html>
复制代码
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>品字布局</title>
<style>
* {
margin: 0;
padding: 0;
}
body {
overflow: hidden;
}
div {
margin: auto 0;
width: 100px;
height: 100px;
background: red;
font-size: 40px;
line-height: 100px;
color: #fff;
text-align: center;
}
.div1 {
margin: 100px auto 0;
}
.div2 {
margin-left: 50%;
background: green;
float: left;
transform: translateX(-100%);
}
.div3 {
background: blue;
float: left;
transform: translateX(-100%);
}
</style>
</head>
<body>
<div class="div1">1</div>
<div class="div2">2</div>
<div class="div3">3</div>
</body>
</html>
复制代码
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>品字布局</title>
<style>
* {
margin: 0;
padding: 0;
}
div {
width: 100%;
height: 100px;
background: red;
font-size: 40px;
line-height: 100px;
color: #fff;
text-align: center;
}
.div1 {
margin: 0 auto 0;
}
.div2 {
background: green;
float: left;
width: 50%;
}
.div3 {
background: blue;
float: left;
width: 50%;
}
</style>
</head>
<body>
<div class="div1">1</div>
<div class="div2">2</div>
<div class="div3">3</div>
</body>
</html>
复制代码
子题目:(较简单)纯CSS实现一个长宽比始终为2:1的长方形。
问题描述: 实现一个div垂直居中, 其距离屏幕左右两边各10px, 其高度始终是宽度的50%。同时div中有一个文字A,文字需要水平垂直居中。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
html, body {
height: 100%;
width: 100%;
}
.outer_wrapper {
margin: 0 10px;
height: 100%;
/* flex布局让块垂直居中 */
display: flex;
align-items: center;
}
.inner_wrapper{
background: red;
position: relative;
width: 100%;
height: 0;
padding-bottom: 50%;
}
.box{
position: absolute;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
font-size: 20px;
}
</style>
</head>
<body>
<div class="outer_wrapper">
<div class="inner_wrapper">
<div class="box">A</div>
</div>
</div>
</body>
</html>
复制代码
强调两点:
父元素的width值
。
那么对于这个out_wrapper的用意就很好理解了。 CSS呈流式布局,div默认宽度填满,即100%大小,给out_wrapper设置margin: 0 10px;相当于让左右分别减少了10px。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
* {
padding: 0;
margin: 0;
}
html,
body {
width: 100%;
height: 100%;
}
.wrapper {
position: relative;
width: 100%;
height: 100%;
}
.box {
margin-left: 10px;
/* vw是视口的宽度, 1vw代表1%的视口宽度 */
width: calc(100vw - 20px);
/* 宽度的一半 */
height: calc(50vw - 10px);
position: absolute;
background: red;
/* 下面两行让块垂直居中 */
top: 50%;
transform: translateY(-50%);
display: flex;
align-items: center;
justify-content: center;
font-size: 20px;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="box">A</div>
</div>
</body>
</html>
复制代码
当元素浮动以后可以向左或向右移动,直到它的外边缘碰到包含它的框或者另外一个浮动元素的边框为止。
元素浮动以后会脱离正常的文档流,所以文档的普通流中的框就变的好像不存在一样。
最明显的缺点就是浮动元素一旦脱离了文档流,就无法撑起父元素,会造成父级元素的高度塌陷。
<div class="parent"> //添加额外标签并且添加clear属性 <div style="clear:both"></div> //也可以加一个br标签 </div> 复制代码
W3C对BFC的定义如下:浮动元素和绝对定位元素,非块级盒子的块级容器(例如inline-blocks, table-cells, 和table-captions),以及overflow值不为“visiable”的块级盒子,都会为他们的内容创建新的BFC(Block Fromatting Context, 即块级格式上下文)
一个HTML元素要创建BFC,则满足下列的任意一个或多个条件即可:
下列方式会创建块格式化上下文:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.container {
background-color: green;
overflow: hidden;
}
.inner {
background-color: lightblue;
margin: 10px 0;
}
</style>
</head>
<body>
<div class="container">
<div class="inner">1</div>
<div class="bfc">
<div class="inner">2</div>
</div>
<div class="inner">3</div>
</div>
</body>
</html>
复制代码
这时边距是叠在一起的,只会取到10px
/*style 添加*/
.bfc{
overflow: hidden;
}
<div class="container">
<div class="inner">1</div>
<div class="bfc">
<div class="inner">2</div>
</div>
<div class="inner">3</div>
</div>
复制代码
这时可以看到,边距不会叠在一起了,是正常的20px。
现有如下页面代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.container {
border: 10px solid red;
}
.inner {
background: #08BDEB;
height: 100px;
width: 100px;
}
</style>
</head>
<body>
<div class="container">
<div class="inner"></div>
</div>
</body>
</html>
复制代码
接下来将inner元素设为浮动:
.inner {
float: left;
background: #08BDEB;
height: 100px;
width: 100px;
}
复制代码
但如果我们对父元素设置BFC后, 这样的问题就解决了:
.container {
border: 10px solid red;
overflow: hidden;
}
复制代码
同时这也是清除浮动的一种方式。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。