CSS揭秘实战技巧 - 结构与布局[六]

全目录

本系列文章,主要是围绕css3属性,实现咱们常见的各类效果,这些效果都是咱们实战开发中常常能够用到的效果:css

  1. css揭秘实战技巧- 背景与边框 [一]
  2. css揭秘实战技巧- 形状 [二]
  3. css揭秘实战技巧 - 视觉效果[三]
  4. css揭秘实战技巧 - 字体排印[四]
  5. css揭秘实战技巧 - 用户体验[五]
  6. css揭秘实战技巧 - 结构与布局[六]
  7. css揭秘实战技巧 - 过渡与动画[七]

前言

  1. 自适应内部元素
  2. 精确控制表格列宽
  3. 根据兄弟元素的数量来设置样式
  4. 满幅的背景,定宽的内容
  5. 紧贴底部的页脚

一:自适应内部元素

首先,咱们看一下想要获得的效果: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;字体

  1. auto为默认值,表示自适应单元格中的内容,此时设置宽度无效。
  2. 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构成的

三:根据兄弟元素的数量来设置样式

咱们在实际开发过程当中,也会遇到下面这种场景:咱们须要根据兄弟元素的数量去设置不一样的样式。

那么咱们就来看看这种效果到底该如何经过css去实现呢?

html结构以下:

<ul>
    <li></li>
    <li></li>
    <li></li>
    //可能有更多或者更少
</ul>
复制代码
  1. 首先咱们看一下:only-child
li:only-child {
    //表示只有一个子元素的时候的样式
}
复制代码
  1. :first-child:last-child
li:first-chlid:last-chlid {
    //表示元素是第一个元素,同时又是最后一个元素,说明此时只有一个子元素
}
复制代码
  1. 接着上面的思路:
li:first-child:nth-last-child(4){
    //表示第一个元素又是倒数第四个元素,说明此时有四个子元素。
}
复制代码

好啦,这个时候,咱们就知道了,怎么样在css判断兄弟元素的数量。

  1. 接下来,咱们实现一个效果: 有四个或者四个以上元素,且第一个为绿色,从第二个开始其余为红色
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;
}
复制代码

实现的效果以下:

  1. 再进一步,指定一下范围,有2个到4个子元素的时候,设置为红色 代码以下:
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>
复制代码

1. 固定高度的页脚

header {
    height: 60px;
    background: green;
}
main {
    min-height: calc(100% - 60px - 100px);
    background: #ddd;

}
footer {
    height:  100px;
    background: cornflowerblue;
}
复制代码

2. 高度不固定,根据内容自适应高度的页脚

body {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}
header{
    background: green;
}
main {
    background: #ddd;
    flex: 1;
}
footer{
    background: cornflowerblue;
}
复制代码
相关文章
相关标签/搜索