CSS及页面布局

CSS层叠样式表

CSS是用于设置和布局网页的计算机语言。会告知浏览器如何渲染页面元素。例如,调整内容的字体,颜色,大小等样式,设置边框的样式,调整模块的间距等。
在这里插入图片描述

页面布局

1.1 盒模型

盒模型是CSS布局中的一个核心概念,它描述了HTML元素在页面上的布局方式。每个元素都可以看作一个盒子,这个盒子包含了元素的内容、内边距、边框和外边距。盒模型的主要作用是帮助我们理解和控制元素在页面上的位置和尺寸。

盒模型主要包括以下四个部分:

  1. 内容区域(content):这是元素实际显示内容的区域,如文本、图片等。内容区域的宽度和高度可以通过 widthheight 属性来设置。

  2. 内边距(padding):内边距位于内容区域与边框之间,它的宽度可以通过 padding-toppadding-rightpadding-bottompadding-left 属性来分别设置。内边距会影响元素的实际尺寸,但不会影响其他元素的布局。

  3. 边框(border):边框位于内边距与外边距之间,它的宽度、样式和颜色可以通过 border-widthborder-styleborder-color 属性来分别设置。边框会影响元素的实际尺寸,也会影响元素周围的布局。

  4. 外边距(margin):外边距位于边框与其他元素之间,它的宽度可以通过 margin-topmargin-rightmargin-bottommargin-left 属性来分别设置。外边距会影响元素的布局,但不会影响元素的实际尺寸。

在计算元素的实际尺寸时,需要把盒模型的这四个部分都考虑进去。例如,一个元素的实际宽度为:width + padding-left + padding-right + border-left-width + border-right-width。一个元素的实际高度为:height + padding-top + padding-bottom + border-top-width + border-bottom-width

此外,盒模型还有两种模式:标准盒模型(content-box)和 IE盒模型(border-box)。在标准盒模型中,widthheight 属性指的是内容区域的宽度和高度;而在IE盒模型中,widthheight 属性指的是内容区域+内边距+边框的宽度和高度。可以通过设置 CSS 的 box-sizing 属性来选择使用哪种盒模型。

案例
<!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>Box-sizing Demo</title>
   <style>
        .box {
            width: 200px;
            height: 200px;
            padding: 20px;
            border: 10px solid black;
            margin: 20px;
        }

        .content-box {
            box-sizing: content-box;
            background-color: lightblue;
        }

        .border-box {
            box-sizing: border-box;
            background-color: lightgreen;
        }
    </style>
</head>
<body>
    <div class="box content-box">
        Content-box
    </div>
    <div class="box border-box">
        Border-box
    </div>
</body>
</html>

在这里插入图片描述

1.2 display

display 属性是 CSS 中用于控制元素的显示类型的重要属性。它可以改变元素的默认显示行为,使其在页面上以不同的方式进行布局。以下是 display 属性的一些常见值及其作用:

  1. block:将元素显示为块级元素。块级元素会独占一行,宽度默认为父元素的宽度,可以设置宽度、高度、内外边距等属性。常见的块级元素有<div><p><h1>等。

  2. inline:将元素显示为行内元素。行内元素不会独占一行,宽度仅为内容的宽度,不能设置宽度、高度、内外边距等属性。常见的行内元素有<span><a><img>等。

  3. inline-block:将元素显示为行内块元素。行内块元素既不会独占一行,也可以设置宽度、高度、内外边距等属性,类似于块级元素。常见的行内块元素有<input><button>等。

  4. none:将元素隐藏,不占据任何空间。通常用于隐藏不需要显示的元素。

  5. flex:将元素显示为弹性盒子。弹性盒子是一种现代布局方式,可以轻松实现响应式布局和自适应对齐。需要注意的是,display: flex 应用于父元素,而不是子元素。

  6. grid:将元素显示为网格容器。网格布局是一种二维布局方式,可以轻松实现复杂的布局需求。需要注意的是,display: grid 应用于父元素,而不是子元素。

以下是一个使用 display 属性的简单示例:

<!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>Display Demo</title>
  <style>
        .block {
            display: block;
            background-color: lightblue;
        }

        .inline {
            display: inline;
            background-color: lightgreen;
        }

        .inline-block {
            display: inline-block;
            background-color: lightyellow;
        }

        .none {
            display: none;
        }
    </style>
</head>
<body>
    <div class="block">
        Block element
    </div>
    <span class="inline">
        Inline element
    </span>
    <div class="inline-block">
        Inline-block element
    </div>
    <div class="none">
        Hidden element
    </div>
</body>
</html>

在这里插入图片描述

在这个例子中,我们创建了四个不同显示类型的元素,并分别应用了 blockinlineinline-blocknone 属性。通过观察这些元素的布局和显示效果,我们可以更好地理解display属性的作用。

1.3 浮动(float)

float布局

float是CSS中的一个浮动属性,它可以使元素脱离正常的文档流,并根据指定的方向(左或右)浮动到其父元素的边缘。float布局主要用于实现文本环绕图片等效果,但也可以用于布局页面中的其他元素。

以下是float属性的一些常见值及其作用:

  1. left:将元素浮动到其父元素的左边缘,文本和其他元素将围绕该元素排列。
  2. right:将元素浮动到其父元素的右边缘,文本和其他元素将围绕该元素排列。
  3. none:取消元素的浮动效果,使其回到正常的文档流中。

以下是一个使用float布局的简单示例:

<!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>Float Layout Demo</title>
 <style>
        .container {
            width: 100%;
            background-color: lightgray;
        }

        .left {
            float: left;
            width: 30%;
            background-color: lightblue;
            padding: 10px;
            margin: 10px;
        }

        .right {
            float: right;
            width: 30%;
            background-color: lightgreen;
            padding: 10px;
            margin: 10px;
        }
    </style>
</head>
<body>
    <div class="container">
        <div>
            <div class="left">
                <img src="asset/img/ctrl.jpg" alt="ctrl.jpg" height="100%" width="100%">
            </div>

            <div class="right">
                <img src="asset/img/ctrl.jpg" alt="ctrl.jpg" height="100%" width="100%">
            </div>
        </div>
		
        <p>
            只因你太美 baby 只因你太美 baby
            只因你实在是太美 baby
            只因你太美 baby
            迎面走来的你让我如此蠢蠢欲动
            这种感觉我从未有
            Cause I got a crush on you who you
            你是我的我是你的谁
            再多一眼看一眼就会爆炸
            再近一点靠近点快被融化
            想要把你占为己有 baby bae
            不管走到哪里
            都会想起的人是你 you you
            我应该拿你怎样
            Uh 所有人都在看着你
            我的心总是不安
            Oh 我现在已病入膏肓
            Eh oh
            难道真的因你而疯狂吗
            我本来不是这种人
            因你变成奇怪的人
            第一次呀变成这样的我
            不管我怎么去否认
        </p>
    </div>
</body>
</html>

在这里插入图片描述

在这个例子中,我们创建了一个包含两个浮动元素和一个段落的容器。左侧的浮动元素使用 float: left,右侧的浮动元素使用 float: right。段落文本将围绕这两个浮动元素排列。

需要注意的是,float 布局有一些局限性,例如需要清除浮动效果以避免影响后续元素的布局。在现代布局中,更推荐使用 flexgrid 布局来实现更简单、直观和响应式的页面布局。

float 塌陷

float 塌陷是指浮动元素的父元素高度不能自动适应浮动元素的高度,导致父元素高度塌陷的现象。这会影响到后续元素的布局,使它们与浮动元素重叠。

解决办法

  1. 清除浮动(clearfix):清除浮动是最常用的解决方法。我们可以为父元素添加一个伪元素(::after),并设置 clear: both 属性,以清除浮动效果。这样,父元素的高度就能自动适应浮动元素的高度,避免塌陷。

    .clearfix::after {
        content: "";
        clear: both;
        display: block;
    }
    
  2. 使用 overflow 属性:我们可以为父元素设置 overflow 属性(如 overflow: autooverflow: hidden),以创建一个新的块格式化上下文(BFC)。这样,父元素的高度就能自动适应浮动元素的高度,避免塌陷。

    .parent {
        overflow: auto;
    }
    
  3. 使用 Flexbox 或 Grid 布局:现代布局中,我们更推荐使用 Flexbox 或 Grid 布局来替代 float 布局。这些布局方式可以更简单、直观地实现元素的排列和对齐,同时避免了 float 塌陷的问题。

    .parent {
        display: flex;
    }
    

总之,float 布局是 CSS 中的一种浮动布局方式,它可以使元素脱离正常的文档流并根据指定的方向浮动到其父元素的边缘。在实际项目中,使用 float 布局可以实现文本环绕图片等效果,但在现代布局中,更推荐使用 flexgrid 布局来实现更简单、直观和响应式的页面布局。

以下是一个 float 塌陷的例子:

<!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>Float Collapse Example</title>
<style>
        .container {
            background-color: lightgray;
			/* overflow: hidden; */
        }

        .left {
            float: left;
            width: 30%;
            height: 200px;
            background-color: lightblue;
            margin: 10px;
        }

        .right {
            float: right;
            width: 30%;
            height: 300px;
            background-color: lightgreen;
            margin: 10px;
        }
		
		.clearfix::after {
			content: "";
			clear: both;
			display: block;
		}
    </style>
</head>
<body>
    <div class="container clearfix">
        <div class="left">
            <img src="asset/img/ctrl.jpg" alt="ctrl.jpg" height="100%" width="100%">
        </div>
        <div class="right">
            <img src="asset/img/kk.jpg" alt="ctrl.jpg" height="100%" width="100%">
        </div>
    </div>
	
	<!-- 不推荐 <div class="clearfix"></div> -->
	
    <p>
        只因你太美 baby 只因你太美 baby
        只因你实在是太美 baby
        只因你太美 baby
        迎面走来的你让我如此蠢蠢欲动
        这种感觉我从未有
        Cause I got a crush on you who you
        你是我的我是你的谁
        再多一眼看一眼就会爆炸
        再近一点靠近点快被融化
        想要把你占为己有 baby bae
        不管走到哪里
        都会想起的人是你 you you
        我应该拿你怎样
        Uh 所有人都在看着你
        我的心总是不安
        Oh 我现在已病入膏肓
        Eh oh
        难道真的因你而疯狂吗
        我本来不是这种人
        因你变成奇怪的人
        第一次呀变成这样的我
        不管我怎么去否认
    </p>
</body>
</html>

在这里插入图片描述

在这个例子中,我们创建了一个包含两个浮动元素(左侧蓝色和右侧绿色)的容器。由于浮动元素脱离了正常的文档流,容器的高度无法自动适应浮动元素的高度,导致容器高度塌陷。这将影响后续元素(如段落)的布局,使其与浮动元素重叠。

为了解决这个问题,我们可以使用清除浮动、设置 overflow 属性或使用Flexbox或Grid布局等方法。在现代布局中,更推荐使用Flexbox或Grid布局来替代 float 布局,以实现更简单、直观和响应式的页面布局。

1.4 弹性布局(Flexbox)

Flex 布局教程:语法篇

弹性布局(Flexbox)是 CSS 中的一种布局模式,它可以让我们更简单、直观地实现元素的排列和对齐。Flexbox 布局主要用于一维布局,即在水平或垂直方向上排列元素。

以下是 Flexbox 布局的一些常见概念和属性:

  1. 容器(Flex Container):应用了 display: flexdisplay: inline-flex 属性的元素被称为弹性容器。弹性容器内的子元素将按照弹性布局进行排列。

  2. 项目(Flex Item):弹性容器的子元素被称为弹性项目。它们将按照弹性布局进行排列和对齐。

  3. 主轴(Main Axis):弹性容器内的项目沿着主轴排列。主轴的方向由 flex-direction 属性决定。

  4. 侧轴(Cross Axis):弹性容器内的项目沿着侧轴对齐。侧轴的方向与主轴垂直。

  5. flex-direction:用于设置弹性容器的主轴方向。可选值有 row(默认值,水平方向)、row-reverse(水平方向,反向排列)、column(垂直方向)和 column-reverse(垂直方向,反向排列)。

  6. flex-wrap:用于设置弹性容器内的项目是否换行。可选值有 nowrap(默认值,不换行)、wrap(换行)和 wrap-reverse(换行,反向排列)。

  7. justify-content:用于设置弹性容器内的项目在主轴上的对齐方式。可选值有 flex-start(默认值,左对齐)、flex-end(右对齐)、center(居中对齐)、space-between(两端对齐,项目之间的间隔相等)和 space-around(每个项目两侧的间隔相等)。

  8. align-items:用于设置弹性容器内的项目在侧轴上的对齐方式。可选值有 flex-start(起点对齐)、flex-end(终点对齐)、center(居中对齐)、baseline(基线对齐)和 stretch(默认值,如果项目未设置高度或设为auto,将占满整个容器的高度)。

  9. align-content:用于设置弹性容器内的多行项目在侧轴上的对齐方式。可选值与 align-items 相同。

  10. order:用于设置弹性项目的排列顺序。数值越小,排列越靠前,默认为0。

  11. flex-grow:用于设置弹性项目的放大比例。默认为0,即如果存在剩余空间,也不放大。

  12. flex-shrink:用于设置弹性项目的缩小比例。默认为1,即如果空间不足,该项目将缩小。

  13. flex-basis:用于设置弹性项目在主轴方向上的初始大小。可以是长度值(如 200px)或百分比(如 50%)。

  14. flexflex-growflex-shrinkflex-basis 的简写属性。默认值为 0 1 auto

  15. align-self:用于设置单个弹性项目在侧轴上的对齐方式,覆盖 align-items 属性。可选值与 align-items 相同。

以下是一个使用 Flexbox 布局的简单示例:

<!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>Flexbox Example</title><style>
        .container {
            display: flex;
            justify-content: space-between;
            align-items: center;
            height: 100px;
            background-color: lightgray;
        }

        .item {
            width: 100px;
            height: 100px;
            background-color: lightblue;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="item">
            <img src="asset/img/ctrl.jpg" alt="ctrl.jpg" height="100%" width="100%">
        </div>
        <div class="item">
            <img src="asset/img/ctrl.jpg" alt="ctrl.jpg" height="100%" width="100%">
        </div>
        <div class="item">
            <img src="asset/img/ctrl.jpg" alt="ctrl.jpg" height="100%" width="100%">
        </div>
    </div>
</body>
</html>

在这里插入图片描述

在这个例子中,我们创建了一个包含三个项目的弹性容器。项目在主轴上两端对齐,侧轴上居中对齐。

总之,弹性布局(Flexbox)是 CSS 中的一种布局模式,它可以让我们更简单、直观地实现元素的排列和对齐。Flexbox 布局主要用于一维布局,即在水平或垂直方向上排列元素。在现代布局中,更推荐使用 Flexbox 或 Grid 布局来替代 float 布局,以实现更简单、直观和响应式的页面布局。

1.5 网格布局(Grid Layout)

网格布局(Grid Layout)是CSS中的一种新型布局方式,它允许我们在二维空间中对元素进行精确定位和对齐。网格布局的主要目的是实现复杂的布局需求,使页面的布局更加简单、直观和易于维护。

网格布局主要包括以下几个部分:

  1. 容器(Container):网格容器是网格布局的最外层元素,它用于包裹整个网格。要将一个元素设置为网格容器,需要将其 display 属性设置为 grid

  2. 行和列(Rows and Columns):网格布局中的行和列用于定义网格的结构。行和列的数量和宽度可以通过 grid-template-rowsgrid-template-columns 属性来设置。

  3. 单元格(Cells):单元格是网格布局中的基本单位,用于放置实际的内容。单元格的位置和大小由行和列的宽度和数量决定。

  4. 项目(Items):项目是放置在单元格中的实际内容。项目的位置和对齐可以通过 grid-rowgrid-columnjustify-selfalign-self 等属性来设置。

  5. 间距(Gaps):网格布局中的行和列之间可以设置间距,以便在元素之间留出空白。间距可以通过 grid-row-gapgrid-column-gap 属性来设置。

以下是一个简单的网格布局示例:

<!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>Grid Layout Demo</title>
  <style>
        .container {
            display: grid;
            grid-template-columns: repeat(3, 1fr);
            grid-row-gap: 10px;
            grid-column-gap: 10px;
        }

        .item {
            background-color: lightblue;
            padding: 10px;
            text-align: center;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="item">只因你太美</div>
        <div class="item">只因你太美</div>
        <div class="item">只因你太美</div>
        <div class="item">只因你太美</div>
        <div class="item">只因你太美</div>
        <div class="item">只因你太美</div>
        <div class="item">只因你太美</div>
        <div class="item">只因你太美</div>
        <div class="item">只因你太美</div>
    </div>
</body>
</html>

在这里插入图片描述

在这个例子中,我们创建了一个3x3的网格布局,每个单元格的大小和位置由行和列的宽度和数量决定。通过观察这个网格布局的布局效果,我们可以更好地理解网格布局的原理和应用。

在CSS网格布局中,1fr 是一个表示剩余可用空间的单位。fr 是 “fraction” 的缩写,表示一个分数部分。当我们在 grid-template-rowsgrid-template-columns 属性中使用 fr 单位时,它会根据网格容器的可用空间来分配行和列的宽度。

在上述示例中,我们使用了 repeat(3, 1fr) 来定义网格的行和列。这意味着我们创建了一个 3x3 的网格,每行和每列的宽度都是 1fr。由于我们没有指定网格容器的宽度和高度,它们将自动适应其父元素的大小。因此,1fr 将根据网格容器的可用空间来分配每行和每列的宽度,从而实现均匀分布。

需要注意的是,fr 单位可以与其他长度单位(如 pxem% 等)混合使用,以实现更复杂的布局需求。例如,我们可以使用 grid-template-columns: 1fr 2fr 1fr 来创建一个 3 列的网格,其中第二列的宽度是第一列和第三列的两倍。

1.6 栅格系统(Grid System)

栅格系统(Grid System)是一种用于布局和排版的设计方法,它将页面划分为等宽的多列,以便在这些列中放置内容。栅格系统的主要目的是实现页面的一致性、可读性和易于维护。在响应式设计中,栅格系统尤为重要,因为它可以帮助我们在不同设备和屏幕尺寸上实现自适应布局。

栅格系统通常由以下几个部分组成:

  1. 容器(Container):容器是栅格系统的最外层元素,它用于包裹整个页面的内容。容器的宽度可以是固定的(例如1200px)或者是百分比(例如100%),以适应不同设备的屏幕尺寸。

  2. 行(Row):行是容器内的水平分隔,用于放置列。每一行都包含一定数量的列,列的宽度之和等于100%。

  3. 列(Column):列是栅格系统的基本单位,用于放置实际的内容。列的宽度是等分的,通常以百分比表示。例如,一个12列的栅格系统中,每个列的宽度为100%/12。

  4. 响应式类(Responsive classes):栅格系统通常提供一组响应式类,用于在不同设备和屏幕尺寸上调整列的宽度。例如,.col-md-6表示在中等屏幕尺寸(如桌面显示器)上,该列的宽度为50%;.col-sm-12表示在小屏幕尺寸(如平板电脑)上,该列的宽度为100%。

以下是一个简单的栅格系统示例:

<!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>Grid System Demo</title>
   <style>
        .container {
            width: 100%;
            max-width: 1200px;
            margin: 0 auto;
            text-align: center;
        }

        .row {
            display: flex;
            flex-wrap: wrap;
        }

        .col {
            box-sizing: border-box;
            padding: 10px;
        }

        .col-12 {
            width: 100%;
        }

        .col-6 {
            width: 50%;
        }

        .col-4 {
            width: 33.33%;
        }

        .col-3 {
            width: 25%;
        }

        .col-2 {
            width: 16.67%;
        }

        .col-1 {
            width: 8.33%;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="row">
            <div class="col col-12" style="background-color: lightblue;">
                整行
            </div>
        </div>
        <div class="row">
            <div class="col col-6" style="background-color: lightgreen;">
                二分之一
            </div>
            <div class="col col-6" style="background-color: lightyellow;">
                二分之一
            </div>
        </div>
        <div class="row">
            <div class="col col-4" style="background-color: lightyellow;">
                三分之一
            </div>
            <div class="col col-4" style="background-color: lightblue;">
                三分之一
            </div>
            <div class="col col-4" style="background-color: lightgreen;">
                三分之一
            </div>
        </div>
        <div class="row">
            <div class="col col-3" style="background-color: lightblue;">
                四分之一
            </div>
            <div class="col col-3" style="background-color: lightgreen;">
                四分之一
            </div>
            <div class="col col-3" style="background-color: lightyellow;">
                四分之一
            </div>
            <div class="col col-3" style="background-color: lightpink;">
                四分之一
            </div>
             
        </div>
    </div>
</body>
</html>

在这里插入图片描述

在这个例子中,我们创建了一个简单的栅格系统,包含一个容器、三个行和不同宽度的列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值