本系列文章,主要是围绕css3属性,实现咱们常见的各类效果,这些效果都是咱们实战开发中常常能够用到的效果:css
- 自适应内部元素
- 精确控制表格列宽
- 根据兄弟元素的数量来设置样式
- 满幅的背景,定宽的内容
- 紧贴底部的页脚
首先,咱们看一下想要获得的效果:html
基本的html结构以下:css3
<div>
<img src="./img/kobe3.png" alt="">
<p>科比布莱恩特,一个伟大的时代,一个伟大的球员,还有一群伟大的球迷</p>
</div>
复制代码
若是没有设置任何样式时,效果以下:浏览器
如何让文字去自适应图片的宽度呢?这就是问题的关键点了,如何让元素去自适应内部元素?而不是去自适应它的父元素呢?答案就是width: min-content: 表示该元素的宽度将被解析为它内部最大的不可断行的元素的宽度(例如:最宽的单词,图片,或者具备固定宽度的盒元素)bash
代码以下:布局
div {
width: min-content;//表示该div的宽度是由内部最大的不可断行元素的宽度所决定
}
复制代码
因为min-content是css3特性,部分浏览器可能不支持,因此咱们须要一个平稳的回退方案,那就是提供一个固定的max-width值post
div {
max-width: 300px;
max-width: min-content;
}
div img{
max-width: inherit;
}
复制代码
你们在实际开发的过程当中,尤为是后台管理系统,表格的使用会很是频繁,可是对于,表格的宽的控制,可能有时候并无达到咱们想要的效果,缘由可能仍是咱们对于表格的相关属性不是很清楚,尤为是table-layout:auto/fixed;字体
首先,咱们看一下auto的效果:flex
代码以下:动画
//html
<table>
<tr>
<th>序号</th>
<th>文案1</th>
<th class="third">文案2</th>
<th>操做</th>
</tr>
<tr>
<td>1</td>
<td>科比布莱恩特,一个伟大的时代,一个伟大的球员,还有一群伟大的球迷</td>
<td class="third">科比布莱恩特,一个伟大的时代,一个伟大的球员,还有一群伟大的球迷科比布莱恩特,一个伟大的时代,一个伟大的球员,还有一群伟大的球迷科比布莱恩特,一个伟大的时代,一个伟大的球员,还有一群伟大的球迷</td>
<td>
<a href="">编辑</a>
</td>
</tr>
</table>
复制代码
//css
table{
width: 800px;
border-collapse: collapse;
width: 100px;// 此时设置了宽度也不会生效,由于此时table-layout为auto。
}
table tr td, table tr th {
border: 1px solid #ddd;
}
复制代码
那咱们在上面的基础上,给table加一个table-layout:fixed,效果以下:
此时,咱们看到部分单元格文本较多,如何隐藏呢?这时,咱们能够用text-overflow:ellipsis , 该属性要同时配合:overflow:hidden;white-space:nowrap;以及一个指定的宽度才能够生效。 代码以下:
table{
width: 800px;
border-collapse: collapse;
table-layout: fixed;
}
table tr td, table tr th {
border: 1px solid #ddd;
}
table tr th:nth-child(3) {
width: 100px;
}
table tr td:nth-child(3) {
width: 100px;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
复制代码
最终的效果以下:
此时,有个细节要注意:咱们直接设置td的宽度为100px,效果是没有生效的,必须设置th的宽度为100px,单元格的宽度才生效。
这是由于table渲染的时候,通常是根据第一行的样式去渲染,此时第一行是th构成的,因此此时th没有设置宽度,即便td设置了宽度,渲染的时候同一列的其余单元格仍是根据th去渲染,因此此处,咱们直接设置td的宽度是无效的,固然你们也能够把th构成的这一行删掉,而后再设置td的宽度,这时就能够生效了,由于此时第一行就是td构成的
咱们在实际开发过程当中,也会遇到下面这种场景:咱们须要根据兄弟元素的数量去设置不一样的样式。
html结构以下:
<ul>
<li></li>
<li></li>
<li></li>
//可能有更多或者更少
</ul>
复制代码
li:only-child {
//表示只有一个子元素的时候的样式
}
复制代码
li:first-chlid:last-chlid {
//表示元素是第一个元素,同时又是最后一个元素,说明此时只有一个子元素
}
复制代码
li:first-child:nth-last-child(4){
//表示第一个元素又是倒数第四个元素,说明此时有四个子元素。
}
复制代码
好啦,这个时候,咱们就知道了,怎么样在css判断兄弟元素的数量。
ul li {
display: inline-block;
width: 50px;
height: 60px;
background: green;
margin: 10px;
}
ul li:first-child:nth-last-child(n + 4) ~ li{
background: red;
}
复制代码
实现的效果以下:
ul li {
display: inline-block;
width: 50px;
height: 60px;
background: green;
margin: 10px;
}
ul li:first-child:nth-last-child(n + 2):nth-last-child(-n + 4) ~ li{
background: red;
}
复制代码
此时,若是ul下面有2到4个li时,就会应用咱们的样式,不然不会。
首先,咱们看一下一个最多见的页脚的效果:背景铺满整个宽度,内容居中
上面的效果就是咱们标题所说的:满幅的背景,定宽的内容,一般遇到这种效果,咱们最直接的解决方案可能就是:外面一层div设置背景,里面再嵌套一个div显示内容,而后设置里面的div居中显示,就这样实现了,这可能也是大多数人的思路,那么,若是只是用一层div去实现呢? 代码以下:
div {
backgroud: #333;
padding: 10px;//部分浏览器不支持calc回退方案
padding: 10px calc(50% - 450px); // 此时,咱们设置的中间内容区域定宽是900px
}
复制代码
首先,html结构以下:
<header>
<p>头部1</p>
<p>头部2</p>
</header>
<main>
内容
</main>
<footer>
<p>尾部1</p>
<p>尾部3</p>
</footer>
复制代码
header {
height: 60px;
background: green;
}
main {
min-height: calc(100% - 60px - 100px);
background: #ddd;
}
footer {
height: 100px;
background: cornflowerblue;
}
复制代码
body {
display: flex;
flex-direction: column;
min-height: 100vh;
}
header{
background: green;
}
main {
background: #ddd;
flex: 1;
}
footer{
background: cornflowerblue;
}
复制代码