浅谈前端 | CSS如何让页面更漂亮

这是我参与更文挑战的第28天,活动详情查看: 更文挑战

微信公众号搜索【程序媛小庄】,领取全套python全栈教程,还有小庄整理的不断更新的电子书、面试资料等你来拿哦~

前言

HTML是网页的骨架,架子搭好了就需要为架子添加装饰了,CSS就是为HTML添加样式让其变得更漂亮~

CSS简介

CSS全称Cascading Style Sheet,层叠样式表,用来定义如何显示HTML元素,当浏览器读到一个样式表后,就会按照这个样式表的格式对文档进行渲染。

CSS语法

CSS注释

CSS的注释和HTML的注释格式不同

/*单行注释*/
/*
多行注释1
多行注释2
多行注释3
*/
复制代码

通常我们在写CSS样式的时候也会用注释来划定样式区域(因为HTML代码多所以对应的css代码也会很多)

/*这是小庄个人网站的css样式文件*/
/*顶部导航条样式*/
...
/*左侧菜单栏样式*/
...
/*右侧菜单栏样式*/
复制代码

CSS代码基本语法

每个CSS样式由两部分组成,选择器和声明,声明包括属性和属性值,每个声明之后用分号结束,声明可以简单理解为样式。比如下述代码:

h1 {
    color: red;
    font-size:14px;
}
复制代码

image-20210625170640209

CSS三种引入方式

内联样式

内联样式是在标签的style属性中设定CSS样式,不同声明之间用分号隔开,不推荐大规模使用:

<h1 style='color:red; font-size:20px'>一级标题</h1>
复制代码

内部样式

内部样式是将CSS样式集写在HTML文档中<head></head>标签中的<style></style>标签中,格式如下:

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        h1 {
            color: purple;
            font-size: 60px;
        }
    </style>
</head>
复制代码

外部样式

外部样式就是将CSS写在一个单独的文件中,在HTML页面中的<head>标签中的<link>标签中引入即可,推荐使用此种方式,link标签用来定义文档与外部资源的关系,最常见的用途就是链接样式表:

<!--html文件-->
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="test.css">
    <!--
	link标签属性说明
		rel:规定当前文档与被链接文档的关系,stylesheet表示链接样式表
		href:规定被链接文档的位置,可以是本地文件路径,也可以是url
	-->
</head>
<body>
    <h1 >一级标题</h1>
</body>

<!--css文件-->
h1 {
     color: darkred;
     font-size: 60px;
    }
复制代码

CSS选择器

不止有标签名可以做选择器,选择器的种类很多,一起来康康~

基本选择器

基本选择器又分为标签选择器、id选择器、类选择器和通用选择器。以下面HTML代码为例进行说明:

<!DOCTYPE html>
<html lang="en" xmlns:background="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        
    </style>
</head>
<body>
    <div id="d1" class="c1">div
        <p>div中的p</p>
        <span>div中的span</span>
    </div>
    <p id="d2" class="c1">ppp</p>
    <span id="d3" class="c1 c2">span11</span>
    <span id="d4" class="c3">span22</span>
</body>
</html>
复制代码

元素(标签)选择器

/* 以标签名作为选择器,对所有的p标签进行渲染 */
p {
	color: darkred;
	font-size: 60px;
    }
复制代码

id选择器

/* 以标签的id值加#作为选择器,对id=d1的标签进行渲染 */
#d1 {
    color: aqua;
    font-size: 20px;
}
复制代码

类选择器

/* 以 .class值 作为选择器,对class值包含c1的标签进行渲染 */
.c1{
       color: greenyellow;
    }
复制代码

通用选择器

/* *作为选择器会将html文档中所有标签修改为一种样式 */
* {
      color: blueviolet;
  }
复制代码

组合选择器

在前端中,我们将标签的嵌套用亲戚邻里关系表示层级。以下面的HTML代码为例说明:

<!DOCTYPE html>
<html lang="en" xmlns:background="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
      
    </style>
</head>
<body>
    <span>span1</span>
    <span>span2</span>
    <div>div
        <p>div中的p</p>
        <p>div p
            <span>div p span</span>
        </p>
        <span>div span</span>
    </div>
    <span>span1</span>
    <span>span2</span>
</body>
</html>
复制代码

后代选择器

/* 使用空格表示后代选择器 */
/* div标签内部的span标签变成红色 */
div span {
    color: red;
}
复制代码

儿子选择器

/* 使用>表示儿子选择器,内部第一层 */
/* div标签内部的第一层span标签变成红色 */
div > span {
    color: red;
}
复制代码

毗邻选择器

/* 使用+表示毗邻关系,同级别紧挨着的下一个标签 */
/* 将紧挨着div的同级别的span标签样式变成红色 */
div + span {
    color: red;
}
复制代码

弟弟选择器

/* 使用~表示弟弟关系,弟弟关系表示同级别的所有标签 */
/* 将div同级别的所有标签样式变成红色 */
div ~ span {
    color: red;
}
复制代码

属性选择器

属性选择器是根据标签是否有某个属性或者某个属性有指定值来对标签进行渲染。以下面HTML代码为例进行说明:

<!DOCTYPE html>
<html lang="en" xmlns:background="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
    </style>
</head>
<body>
    <input type="text" username>
    <input type="text" username="python">
    <input type="text" username="go">
    <p username="java">java</p>
    <div username="go">let's go</div>
    <span username="python">人生苦短</span>
</body>
</html>
复制代码

指定属性名

[属性名]{
	/*将所有含有指定属性名的标签将其样式进行渲染*/
}

/*  将所有含有属性名是username的标签的背景颜色改为greenyellow */
[username]{
    background: greenyellow;
}
复制代码

指定属性名和属性值

[属性名=值]{
	/*找到所有指定属性名=某个属性值的标签,对其样式进行渲染*/
}
/* 找到所有属性名是username并且属性值是python的标签进行渲染 */
[username='python'] {
    background: greenyellow;
}
复制代码

指定属性名、属性值和标签

标签名[属性名=值]{
	/*找到所有指定属性名=某个属性值的指定的标签名,对其样式进行渲染*/
}

/*找到所有指定属性名是username并且属性值等于python的input标签,对其样式进行渲染*/
input[username='python']{
    background: greenyellow;
}
复制代码

选择器分组嵌套

当几个选择器的样式相同时可以进行分组,不同选择器之间用都和隔开:

h1,.c1 {
    color:red;
}
复制代码

伪类选择器

表示标签状态,比如a链接标签默认没被点过是蓝色,点击不松手是红色,点击后是紫色,可以通过CSS样式进行渲染:

body {
           background: blanchedalmond;
       }
        /*链接初始颜色*/
        a:link {
            color:red;
        }
        /*鼠标悬浮在链接上,链接的颜色*/
        a:hover{
            color:blue;
        }
        /*点击链接不松手,链接的颜色*/
        a:active{
            color: aquamarine;
        }
        /*链接点击后,链接的文本颜色*/
        a:visited{
            color:darkgray;
        }

        /*鼠标悬浮在文本上显示的颜色*/
        p:hover {
            color: crimson;
        }

        /*input框获取焦点(鼠标点了input框)*/
        input:focus {
            color: crimson;
            background: black;
}
复制代码

伪元素选择器

first-letter

/* 给首字母设置特殊样式 */
p:first-letter {
  font-size: 48px;
  color: red;
}
复制代码

before/after

在标签之前/之后添加有样式的内容,通过before/after添加的内容无法被选中,通常before/after用来清除浮动(文章后面会介绍)带来的影响:

p:before {
  content:"*";  /* 添加的内容 */
  color:red;  /* 添加内容的样式 */
}
p:after {
  content:"*";
  color:red;
}
复制代码

选择器的优先级

上面介绍了很多选择器,就是说在一个HTML页面中有很多种方式找到一个元素并为其设置样式,那么浏览器事是根据什么来决定应该用哪种样式呢?就是按照不同选择器的权重来决定的,具体的选择器的权重请看下图:

image-20210625211433110

CSS属性

标签宽高和背景颜色

块级标签:宽度不修改的情况下默认占浏览器一整行,块级标签的高度也是取决与标签内部的文本的高度,也可以通过CSS设置;

行内标签:宽度和高度都是由内部文本决定的,行内标签是无法设置长宽的。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        p {
            background: blanchedalmond;
            height: 500px;
            width: 500px;
        }
        span {
            /*行内标签无法设置长宽,就算设置了,也不会生效*/
            background: darkgray;
            height: 30px;
            width: 20px;
        }
    </style>
</head>
<body>
    <p>ppp</p>
    <span>span</span>
</body>
</html>
复制代码

字体属性

p {
    /* 字体属性,如果不支持第一个则会尝试下一个 */
    font-family: "Microsoft Yahei", "微软雅黑", "Arial", sans-serif;
    
    /* 字体大小,如果设置成inherit表示继承父元素的字体大小 */
    font-size:14px;
    font-size:inherit;
    
    /* 字体的粗细 */
    font-weight:normal(默认值)/bold(粗体)/bolder(更粗一点)/lighter(更细一点)/100-900(设置具体粗细,400等同于normal,而700等同于bold)/inherit(继承父元素字体的粗细值)
        
    /* 文本颜色 */
    color: red;  /* 直接写文本颜色 */
    color: #ee762e;  /* 颜色编号 */
    color: rgb(128,23,45);  /* 三基色 */
    color: rgba(23, 128, 91, 0.9);  /* 三基色,第四个参数是透明度,范围是0-1 */ 
}
复制代码

文本属性

p {
    /*文本居中*/
    text-align: center;
    
    /*文本居左*/
    text-align: left;
    
    /*文本居右*/
    text-align: right;
    
    /*文本两端对齐*/
    text-align: justify;

    /*文本添加下划线*/
    text-decoration: underline;
    
    /*文本添加上划线*/
    text-decoration: overline;
    
    /*文本添加删除线*/
    text-decoration: line-through;
    
    /*文本首行缩进*/
    text-indent2em
}

a {
    /*主要用于给链接去掉下划线*/
    text-decoration: none;
}
复制代码

背景图片

div {
  height: 1200px;
  width: 1500px;

  /*背景图片的地址,可以是网络地址也可以是本地地址*/
  background-image: url("https://w.wallhaven.cc/full/rd/wallhaven-rdyyjm.png");

  /*背景图片固定,不会因为页面滚动而滚动*/
  background-attachment: fixed;

  /* 图片不平铺只显示一张*/
  background-repeat: no-repeat;
  /* 图片在X方向平铺 */
  background-repeat: repeat-x;
    /* 图片在Y方向平铺 */
  background-repeat: repeat-y;
}

/*可以简写*/
div {
  background: url("https://w.wallhaven.cc/full/rd/wallhaven-rdyyjm.png") fixed no-repeat;
  height: 500px;
}
复制代码

边框

/*可以为块级标签设置边框*/
p {
    border-width: 1px;  /*边框的宽度*/
    border-style: solid; /*边框样式,none()无边框 dotted(点状虚线) dashed(矩形虚线) soild(实线)*/
    border-color: red; /*边框颜色*/
    border-radius: 20%; /*画圆,如果长宽不相等,就是椭圆,大于等于50%是椭圆/圆形,小于50%是圆角形状*/
}

/*上述代码可以简写*/
p {
    border: 2px soild red;
     border-radius: 20%;
}

/*可以为单独某一个边框设置样式*/
p {
  border-top-style:dotted;
  border-top-color: red;
  border-right-style:solid;
  border-bottom-style:dotted;
}
 
复制代码

display属性

display属性用来控制HTML元素的显示效果。

意义
display:”none” HTML文档中元素存在,但是在浏览器中不显示。一般用于配合JavaScript代码使用。
display:”block” 默认占满整个页面宽度,如果设置了指定宽度,则会用margin填充剩下的部分。
display:”inline” 按行内元素显示,此时再设置元素的width、height、margin-top、margin-bottom和float属性都不会有什么影响。
display:”inline-block” 使元素同时具有行内元素和块级元素的特点。

display:”none”与visibility:hidden的区别:

visibility:hidden: 可以隐藏某个元素,但隐藏的元素仍需占用与未隐藏之前一样的空间。也就是说,该元素虽然被隐藏了,但仍然会影响布局。

display:none: 可以隐藏某个元素,且隐藏的元素不会占用任何空间。也就是说,该元素不但被隐藏了,而且该元素原本占用的空间也会从页面布局中消失。

p {
    background: red;
    height: 100px;
    width:200px;
    /*p标签具有行内标签的特点*/
    display:inline;
}
#d1 {
    background: green;
    height: 100px;
    width:200px;
    /*div标签具有行内标签的特点*/
    display: inline;
    /*隐藏,并且原来的位置也没了*/
    display:none;
    /*只隐藏,位置还在*/
    visibility:hidden
}

span {
    background: blue;
    height: 100px;
    width:200px;
    /*span标签具有块级标签的属性*/
    display: block;
}

#p1 {
    background: aquamarine;
    height: 100px;
    width:100px;
    /*p标签具有行内标签的特点又可以在一行内设置长宽*/
    display: inline-block;
}
复制代码

盒子模型

以快递盒为例,快递盒与快递盒之间的距离(标签与标签之间的距离 margin外边距) ,盒子的厚度(标签的边框 border) ,盒子里面的物体到盒子的距离(内容到边框的距离 padding内边距) ,物体的大小(内容 content)。

image.png

如果你想要调整标签与标签之间的距离 你就可以调整margin ,浏览器会自带8px的margin,一般情况下我们在写页面的时候,就会先将body的margin去除。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body {
            /*上下左右的外边距都是0*/
            /*margin: 0;*/
            /*第一个上下外边距,第二个左右外边距*/
            /*margin: 10px 20px;*/
            /*第一个上外边距,第二个左右外边距,第三个下外边距*/
            /*margin: 10px 20px 30px;*/
            /*上 右 下 左*/
            margin: 10px 20px 30px 40px;
        }
        #d1 {
            margin-left: 10px;
            margin-bottom: 20px;
            margin-right: 30px;
            margin-top: 40px;
        }
        /*两个标签挨着,上一个标签的下外边距与下一个标签的上外边距都有值的时候,不会叠加*/
        #d2 {
            margin-bottom: 30px;
        }
        #d3 {
            margin-top:15px;
        }


        #d4 {
            /*标签的水平居中*/
            margin: 0 auto;
        }
        #d6 {
            border:5px red solid;
            /*padding用法与margin相同*/
            padding:10px
        }
    </style>

</head>
<body>
    <p id="d1">p</p>
    <p id="d2">p1</p>
    <p id="d3">p2</p>
    <div id="d4">div
        <span>div span</span>
    </div>
    <span id="d5">span</span>
    <p id="d6">pppppp</p>
</body>
</html>
复制代码

浮动float

浮动的元素没有块级一说,本身多大浮起来之后就占多大,只要是涉及到页面的布局一般都用浮动提前规划好:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #d1 {
            background: pink;
            height: 200px;
            width:200px;
            /*浮动  浮到空中往左飘*/
            float:left;
        }
        #d2 {
            background: red;
            height: 200px;
            width: 200px;
            /*浮动  浮到空中往左飘*/
            float:right;
        }
    </style>

</head>
<body>
    <div id="d1">d1</div>
    <div id="d2">d2</div>
</body>
</html>
复制代码

但是浮动会带来父标签塌陷的问题:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body {
            margin:0;}
        #d1{
            border:3px solid black;
        }

        #d2 {
            height: 100px;
            width:100px;
            background: hotpink;
            float: left;
        }
         #d3 {
            height: 100px;
            width:100px;
            background:green;
            float: left;
        }

    </style>
</head>
<body>
    <div id="d1">
        <div id="d2"></div>
        <div id="d3"></div>
  
    </div>
</body>
</html>
复制代码

解决父标签塌陷,可以自己添加div标签设置高度,但是有一种通用的解决浮动带来的影响的解决方式,就是在css代码文件或者style标签中添加下述css代码,该代码表示只要标签出现了塌陷问题就给改标签添加一个clearfix属性:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body {
            margin:0;}
        #d1{
            border:3px solid black;
        }

        #d2 {
            height: 100px;
            width:100px;
            background: hotpink;
            float: left;
        }
         #d3 {
            height: 100px;
            width:100px;
            background:green;
            float: left;
        }
        /* 解决浮动问题的代码 */
        .clearerfix:after {
            content: "";
            display: block;
            clear: both;
        }
    </style>
</head>
<body>
    <div id="d1" class="clearerfix">
        <div id="d2"></div>
        <div id="d3"></div>

    </div>
</body>
</html>
复制代码

overflow溢出属性

当文字或者图片超出了设定的大小范围就可以使用溢出属性进行处理。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
    p {
        height: 100px;
        width:50px;
        border:3px solid red;
        /*默认就是visible,溢出还是溢出*/
        /*overflow: visible;*/

        /*超出的部分直接隐藏*/
        /*overflow: hidden;*/

        /*设置成上下滚动条的形式*/
        /*overflow: scroll;*/

        /*和滚动效果差不多*/
        /*overflow: auto;*/
    }
    </style>
</head>
<body>
    <p>采蘑菇的小姑娘采蘑菇的小姑娘采蘑菇的小姑娘采蘑菇的小姑娘采蘑菇的小姑娘采蘑菇的小姑娘采蘑菇的小姑娘采蘑菇的小姑娘</p>
</body>
</html>
复制代码

溢出属性有一个非常常用的场景就是圆形头像:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body {
            margin:0;
            background: #4e4e4e;
        }
        #d1{
            height: 120px;
            width:200px;
            border-radius: 50%;
            border: 5px solid white;
            margin:0 auto;
            overflow: hidden;
        }
        
        #d1>img {
            /*占标签的100%比例*/
            /*max-width: 100%;*/
            width:100%
        }
    </style>
</head>
<body>
    <div id="d1">
        <img src="头像.jpg" alt="">
    </div>
</body>
</html>
复制代码

定位

静态static

所有的标签默认都是静态的的,无法改变位置,并且设置标签的left,top等值是不起作用的。

相对定位relative

相对于钙元素原来的位置做移动,但即使设定了元素的相对定位以及偏移值,元素还占有着原来的位置,即占据文档流空间。对象遵循正常文档流,但将依据top,right,bottom,left等属性在正常文档流中偏移位置。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body {
            margin:0;

        }
        #d1 {
            height:100px;
            width:100px ;
            background: deeppink;

            /*从左往右移动50px 如果是负数方向相反*/
            left: 50px;
            /*从上往下移动50px  如果是负数方向相反*/
            top: 50px;


            /*默认是static,静态,无法修改位置*/
            /*position: static;*/

            /*改为相对定位,标签由static变为relative它的性质就从原来美誉定位的标签变成已经定位过的标签,哪怕你没有动,性质也改变了*/
            position: relative;
        }
    </style>
</head>
<body>
    <div id="d1"></div>
</body>
</html>
复制代码

绝对定位absolute

相对于已经定位过的父标签做移动,如果没有父标签就以body标签作为参照,设置为绝对定位的元素框从文档流完全删除,元素原先在正常文档流中所占的空间会关闭,就好像该元素原来不存在一样。元素定位后生成一个块级框,而不论原来它在正常流中生成何种类型的框。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body {
            margin:0;

        }
   
        #d2 {
            height: 100px;
            width: 200px;
            background: hotpink;

            /*父标签定位操作*/
            position: relative;
        }

        #d3 {
            height: 200px;
            width: 400px;
            background: green;
            position:absolute;;
            /*left:200px;*/
            top:100px
        }    
    </style>
</head>
<body>
    
    <div id="d2">
        <div id="d3"></div>
    </div>
</body>
</html>
复制代码

固定定位fixed

相对于浏览器窗口固定在某个位置, 一个元素若设置了 position:absolute | fixed; 则该元素就不能设置float。这 是一个常识性的知识点,因为这是两个不同的流,一个是浮动流,另一个是“定位流”。但是 relative 却可以。因为它原本所占的空间仍然占据文档流。在理论上,被设置为fixed的元素会被定位于浏览器窗口的一个指定坐标,不论窗口是否滚动,它都会固定在这个位置。可以参照一些网站上的回到顶部操作。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body {
            margin:0;

        }

        #d4 {
            /*写了fixed之后,定位就是依据浏览器窗口*/
            position: fixed;
            bottom: 20px;
            right: 20px;
            height: 50px;
            width: 100px;
            background: hotpink;
            border: 3px solid black;
        }

    </style>
</head>
<body>
 

<div style="height: 500px;background: red"></div>
<div style="height: 500px;background: black"></div>
<div style="height: 500px;background: green"></div>
<div id="d4">回到顶部</div>

</body>
</html>
复制代码

模态框z-index

模态框用来设置对象的层叠顺序,示例可参考网页版百度点击登录后的效果:

image-20210628152332104

可以想象成纵向的坐标,离用户最近的白色区域的值最大(如z=100),中间黑色透明区域的值处于中间位置(如z=99),最底部的正常内容是离用户最远值最小(如z=0),代码实现如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body {
            margin: 0
        }
        .cover {
            position: fixed;
            left: 0;
            top: 0;
            right: 0;
            bottom: 0;
            background: rgba(0,0,0,0.4);
            z-index: 99;
        }
        .modal {
            background: white;
            height: 200px;
            width: 400px;
            position: fixed;

            /*根据框的顶点居中*/
            left:50%;
            top: 50%;
            z-index: 100;
            /*将注册框居中*/
            margin-left: -200px;
            margin-top: -100px;
        }

    </style>
</head>
<body>
    <div>最底层内容</div>
    <div class="cover"></div>
    <div class="modal">
        <h1>注册</h1>
        <p>usrname:<input type="text"></p>
        <p>password:<input type="text"></p>
        <p>password:<input type="submit"></p>
    </div>
</body>
</html>
复制代码

结语

文章首发于微信公众号程序媛小庄,同步于掘金知乎

码字不易,转载请说明出处,走过路过的小伙伴们伸出可爱的小指头点个赞再走吧(╹▽╹)

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享