一、布局方式与盒子模型

1、布局方式

1、基本文档流布局:基本文档流布局是默认的CSS布局方式。

  • HTML元素按照它们在HTML文档中的顺序依次排列。

2、浮动布局(Float Layout):浮动布局是一种早期用于实现网页布局的方法。

  • 通过设置元素的float属性,可以将元素从正常的文档流中浮出,使其靠近其包含的父元素的左侧或右侧。
  • 浮动布局存在一些问题,并且不太适合现代复杂的布局需求。

3、弹性布局(Flexbox Layout):弹性布局是CSS 3引入的一种布局方式。

  • 弹性布局适用于构建导航栏、等高的网格布局、垂直居中等常见布局需求。
  • 弹性布局适用于构建响应式的网页布局。

4、网格布局(Grid Layout):Grid布局是CSS 3引入的一种二维网格布局系统。

  • Grid布局非常适合用于构建复杂的多列布局、网格布局和响应式设计。

2、display属性

block、inline、inline-block、none 和 flex

(1)block

  • 默认情况下独占一行
  • 可为其指定宽高,如果不指定,其中高取决于内容, 由内容撑开,宽自动填满父元素宽度
  • 如果指定宽高,就是指定的宽高,不会被撑开
  • div、p、h1-h6等元素默认的display属性值均为block

(2)inline

  • 默认情况下,与其他行内元素共占一行
  • 不能指定宽高,宽高只能由内容撑开
  • span、a等元素默认的display属性值均为inline

block与inline对比

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>block、inline</title>
    <style>
        div, span {
            margin: 10px;
            border: 1px solid red;
        }

        #div1 {
            width: 200px;
            height: 200px;
        }

        span {
            /*inline没有效果*/
            width: 100px;
            height: 100px;
        }
    </style>
</head>
<body>
<div>div默认布局</div>
<div id="div1">div设置</div>
<div>
    第一行内容<br>
    第二行内容
</div>
<span>span1</span>
<span>span2</span>
<span>span3</span>
</body>
</html>

(3)inline-block

  • 行内块元素既具备行内元素的特性(可以同行显示), 也具备块级元素的特性(可以设置宽高)
  • inputimg元素的display属性值默认为inline-block

(4)none

  • 页面中既不会显示该元素的内容
  • 页面中也不会显示该元素占用的空间(与visibility: hidden; 相区别)

none与inline-bock对比

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>inline-block</title>
    <style>
        input, span {
            border: 1px solid red;
        }

        input {
            width: 100px;
            height: 100px;
        }

        #s1 {
            /*设置display属性*/
            display: inline-block;
            /*设置span的行内块宽度和高度*/
            width: 100px;
            height: 100px;
        }

        #s2 {
            display: none; /*该部分内容隐藏 并且不会占用原来的位置*/
        }

        #s4 {
            /*隐藏标签但是原来的位置仍然占用*/
            visibility: hidden;
        }
    </style>
</head>
<body>
<input type="button" value="input1">
<input type="button" value="input2">
<input type="button" value="input3">
<br>
<span id="s1">span1</span>
<span id="s2">span2</span>
<span>span3</span>
<span id="s4">span4</span>
<span>span5</span>
</body>
</html>

3、盒子模型的属性

1、width 和 height:设置包括内容的盒子的宽度和高度

2、padding:内边距,设置包括内容和边框之间的空白区域,一般用于调整内容与边框的距离

  • padding、padding-top、padding-bottom、padding-left、padding-right

3、border:边框,设置包含内容和内边距的外侧边框的样式、宽度和颜色

  • border、border-xxx-color、border-xxx-style、border-xxx-width
  • 其中xxx代表的是top、left、right、bottom

4、margin:外边距,用于控制元素与其它元素之间的距离,如果两个边框同时设置上下相对的边距,以最大的为准,左右设置相对的边距,距离值为相加

5、box-sizing: 盒子模型的策略,设置盒子元素的尺寸计算方式,有content-box(默认)和 border-box 两种

  • content-box将元素的尺寸计算为内容区域的宽高
  • border-box将元素的尺寸计算为内容区域、内边距、边框的宽高总和

盒子模型

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>外边距</title>
    <style>
        div {
            border: 1px solid red;
        }

        #d1, #d2 {
            width: 100px;
            height: 100px;
        }

        #d1 {
            margin-left: 50px;
            margin-bottom: 50px;
        }

        #s1{
            border: 1px solid red;
            /*span、a等行内元素设置上下外边距无效*/
            margin-top: 5000px;
            margin-right: 50px;
        }

        #s2 {
            border: 1px solid red;
            /*左右相邻的两个元素,设置相对的外边距,距离是两者外边距相加*/
            margin-left: 50px;
        }

        #d3 {
            background-color: red;
            width: 200px;
            height: 200px;
            margin-top: 50px;
            padding-left: 50px;
        }

        #d4 {
            width: 50px;
            height: 50px;
            background-color: blue;
        }
    </style>
</head>
<body>
<div id="d1">div1</div>
<div id="d2">div2</div>
<span id="s1">span1</span>
<span id="s2">span2</span>
<div id="d3">
    <div id="d4">
    </div>
</div>
</body>
</html>

效果展示:

外边距

内边距实例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>内边距</title>
    <style>
        * {
            /*去掉所有标签默认的内边距和外边距*/
            margin: 0;
            padding: 0;
        }

        #d1 {
            width: 100px;
            height: 100px;
            border: 5px solid red;
            /*设置圆角,超过宽高的一半则是正圆*/
            border-radius: 5px;
        }

        #d2 {
            width: 100px;
            height: 100px;
            border: 1px solid blue;
            /*内边距会影响元素本身的宽高,可以通过box-sizing取消*/
            padding-left: 50px;
            box-sizing: border-box;
        }

    </style>
</head>
<body>
<h1>这是一个h1</h1>
<div id="d2">内边距</div>
<div id="d1">边框</div>
</body>
</html>

效果展示:

内边距

4、CSS三大属性

(1)层叠性

浏览器在渲染网页时,遵循一定的规则将多个CSS规则应用到同一个元素,并生成最终的样式。这些规则包括了外部样式表、内部样式表、行内样式以及浏览器默认样式等来源。遵循就近原则

(2)继承性

子标签可以继承父标签的样式,可以继承的样式属性如下:

  • 字体属性(font、font-family、font-size、font-style、font-weight)
  • 文本属性(text-align、text-shadow、line-height、word-spacing、letter-spacing)
  • 颜色属性(color、background-color、border-color)
  • 其他CSS属性(visibility、cursor、opacity、list-style、text-transform)

(3)优先级

  • 第一优先级:在属性后面使用!important,它会覆盖页面内任何位置定义的元素样式
  • 第二优先级:元素标签中的style属性,即内联样式
  • 第三优先级:ID选择器定义的样式
  • 第四优先级:类选择器、属性选择器、伪类选择器定义的样式
  • 第五优先级:标签选择器定义的样式
  • 第六优先级:通配符选择器,“*”

实例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>特性</title>
    <style>
        div {
            /*子类继承父类的属性*/
            border: 1px solid red;
            color: red;
        }

        p {
            /*第一优先级*/
            color: #0aa1ed !important;
        }

        #p2 {
            color: red;
        }

        body > div {
            /*父类的高度不会被继承*/
            height: 300px;
        }
    </style>
</head>
<body>
<div>
    <p>p1</p>
    <p id="p2">p2</p>
    <div>
        <span>span1</span>
        <span style="color: green">span2</span>
    </div>
    <a href="">超链接</a>
</div>
</body>
</html>

二、JavaScript

1、JavaScript的特点

1、能够为网页添加交互性和动态效果,JS可用于改变网页中的内容、样式和布局等。

2、作为一种解释性语言,在运行时动态解析代码,不需要预编译。

3、支持面向对象编程,提供了类、继承、封装等概念,使其更易于开发复杂应用。

4、具有函数式编程的优点,支持高阶函数等概念。

5、安全性强:JS在浏览器中运行时处于一个被称为安全沙箱的环境中,只能访问浏览器提供的API,不能访问操作系统和其他软件的资源。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>引入JS的方式</title>
    <!--内部方式-->
    <script type="text/javascript">
        //JS注释 ,在控制台显示一句话
        console.log("内部方式")
    </script>
    <!--外部方式-->
    <script type="text/javascript" src="my.js"></script>
</head>
<body>
<!--内联式-->
<input type="button" onclick="alert('内联式')" value="点击一下">
</body>
</html>

my.js内容
console.log("外部方式")

2、变量与数据类型

(1)弱数据类型语言

弱数据类型语言是指在变量声明或使用时,不需要显式地指定其类型或进行类型检查。

常见的弱数据类型语言包括JavaScript、PHP、Python、Ruby等。

(2)声明变量

1、使用 "var" 关键字声明变量,语法为:

var variableName;

使用上述方式,变量被定义,但没有明确的值。可以稍后在代码中赋值给它,也可以在声明变量时直接赋值:

var variableName = 20;

2、使用 "let" 关键字声明变量,(假设有这个变量)语法为:

let variableName;

3、使用 "const" 关键字声明变量,定义好后不能修改,用于定义常量,语法为:

const variableName = "example";

(3)var和let的区别

1、作用域

var:使用var关键字声明的变量具有函数作用域(Function Scope),意味着它们在声明的函数内部有效,而在函数外部无效

let: 使用let关键字声明的变量具有块级作用域(Block Scope),意味着它们在声明的块(通常是由花括号 {} 包围的代码块,如if语句、for循环等)内有效,而在块外部无效。

2、变量提升

var: 使用var声明的变量会进行变量提升,即变量在当前作用域内的声明会被提升至作用域的顶部。这意味着可以在变量声明之前访问该变量,但其值为undefined。

let: 使用let声明的变量不会进行变量提升,所以在声明之前访问该变量会报错。

3、重复声明

var: 可以对同一个变量使用var关键字进行多次声明,不会报错,但后续的声明将会覆盖前面的声明。

let: 不允许对同一个变量使用let进行多次声明,否则会报错。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>声明变量</title>
</head>
<body>
<script type="text/javascript">
    //定义一个函数
    function exampleVar() {
        // 使用var 声明变量
        if (true) {
            // 局部变量
            var varVariable = "一个var变量";
            console.log("在代码块内部声明的变量:" + varVariable)
            var varVariable = "重复声明的var变量";
        }
        console.log("在代码块外部访问变量:" + varVariable)
    }

    //调用函数
    exampleVar();

    function exampleLet() {
        //使用let声明变量
        if (true) {
            let letVariable = "一个let变量";
            console.log("在代码块中声明变量:" + letVariable)
            // 不能重复定义(报错) let letVariable
        }
        //在代码块外不能访问局部变量
        console.log("在代码块外访问变量:" + letVariable)
    }

    //调用函数
    exampleLet();

    //声明一个常量,在声明时需要赋初始值
    const PI = 3.14; //不能修改
    console.log(PI)
</script>
</body>
</html>

(4)JavaScript中的数据类型

1、数字类型 (Number):代表数字,包括整数和小数。

2、字符串类型 (String):代表文本字符序列,通常用单引号或双引号包裹。

3、布尔类型 (Boolean):代表逻辑值,只有true和false两个值。

4、空类型 (null):表示空值,值仅有一种,为null。

5、未定义类型 (undefined):表示未定义的值,值仅有一种,为undefined。

6、符号类型 (Symbol)(了解):表示唯一的标识符,是ES6新增的一种基本数据类型,表示独一无二的值。它们是一种可用作对象属性键的新类型,用于定义对象属性时避免命名冲突。

7、对象类型 (Object):表示复杂的数据结构,例如数组和函数。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>变量类型</title>
</head>
<body>
<script type="text/javascript">
    let a = 10.5;
    console.log("变量a的类型:" + typeof a) //number
    a = "hello";
    console.log("变量a的类型:" + typeof a) //string
    a = null;
    console.log("变量a的类型:" + typeof a) //object
    let b; // 声明了但是没有给值
    console.log(b) //undefined
    console.log("变量b的类型:" + typeof b) //undefined
</script>
</body>
</html>

(5)null 和 undefined的区别

  • null表示一个有意设置为空的值,而undefined表示一个还未定义或还未赋值的值
  • null需要被手动赋值,而undefined是未赋值时的默认值
  • 类型运算符typeof(null) 返回"object",null被认为是一个被放置在对象容器中的特殊对象
  • 类型运算符typeof(undefined) 返回"undefined",表明变量的值未定义

3、运算符与流程控制语句

1、JavaScript中的除法运算会自动根据结果转换整数或小数。

  • 5/2 = 2.5, 10/2 = 5

2、"=="和"===": JavaScript中使用"=="和"==="比较两个值的时候,它们具有不同的含义

  • 先统一两个变量的类型再比较值,例如"666"==666的结果为true
  • 先比较类型,类型相同之后再比较值,"666"===666的结果为false

3、"!="和"!==":与"=="和"==="相似,可以用于比较两个值是否不相等,且前者只比较值,后者比较类型和值

4、"typeof":在JavaScript中,有一个特殊的运算符"typeof",可以用于检查变量的数据类型

  • typeof 12会返回number
  • 特别注意,typeof是运算符而不是方法,使用时不需要加( )
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>运算符</title>
</head>
<body>
<script type="text/javascript">
    console.log(12 / 5); //返回小数 2.4
    console.log(12 / 4); //返回整数 3
    console.log(10 / 3); //返回3.3333333333333335

    // == 比较内容,内容一致类型不一致也可以
    console.log("666" == 666); //true
    // === 比较类型和内容,两者都要相等
    console.log("666" === 666); //false
    console.log("666" != 666);  //false
    console.log("666" !== 666); //true

    //typeof 判断数据类型
    let v1 = "abc";
    let v2;
    console.log(typeof v1) //string
    console.log(typeof v2) //undefined
</script>
</body>
</html>

4、数据类型转换

1、显式转换

显式转换是指通过代码直接将一种数据类型转换为另一种数据类型。

  • 字符串转换为数字:使用Number()、parseInt()或parseFloat()函数将字符串转换为数字类型
  • 数字转换为字符串:使用toString()方法将数字转换为字符串类型

2、隐式转换

隐式转换是指在代码执行过程中,JavaScript引擎自动将一种数据类型转换为另一种数据类型。

操作符隐式转换:某些操作符在执行时自动将一个数据类型转换为另一个数据类型。

比较操作符隐式转换:在比较操作符执行时,JavaScript会自动将两个操作数转换为相同的数据类型。

布尔类型隐式转换:在执行逻辑运算时,JavaScript会自动将非布尔类型的数据转换为布尔类型。

JS类型转换表

注释:infinity表示无穷大,NaN(Not a Number)表示不是数字

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>数据类型转换</title>
</head>
<body>
<script type="text/javascript">
    // 定义一个变量
    let num = 123; // 数字类型
    let str = num.toString(); //将数字类型转换为字符串
    console.log(typeof str + ":" + str); //string:123

    let str1 = "456";
    let num1 = parseInt(str1);
    console.log(typeof num1 + ":" + num1); //number:456

    let str2 = "abc";
    let num2 = parseInt(str2);
    console.log(typeof num2 + ":" + num2); //number:NaN

    let str3 = "123abc"; // 如果是12.3,那么输出的是12,这里的.会解析为字符
    let num3 = parseInt(str3);
    console.log(typeof num3 + ":" + num3);//number:123 当遇到非数字字符时,输出结束

    let flag = true;
    let num4 = parseInt(flag);
    console.log(typeof num4 + ":" + num4);

    //隐式转换
    let a = 5;
    let b = "10";
    let c = a + b;
    console.log(typeof c + ":" + c); //string:510

    console.log(true == 1); //true
    console.log(true == "1"); //true 先把布尔类型转数字
    console.log(true =="true"); //false true转化为1
</script>
</body>
</html>

5、函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>函数</title>
</head>
<body>
<script type="text/javascript">
    //声明一个无参无返回值的函数
    function fun1() {
        console.log("fun1")
    }

    //调用函数
    fun1();

    //声明有参无返回值的函数
    function fun2(name, age) {
        console.log(name + ":" + age);
    }

    //调用函数
    fun2("SmallG", 18);//SmallG:18

    //声明一个有参有返回值的函数
    function fun3(x, y) {
        return x + y;
    }

    let sum = fun3(3, 4);
    console.log(sum); //7

    //在函数声明前调用函数
    fun4(); //fun4

    function fun4() {
        console.log("fun4");
    }

    //函数表达式,调用表达式需要在声明后调用
    let fn = function () {
        console.log("fn")
    }
    fn(); //fn 不能再函数声明前调用 
</script>
</body>
</html>

6、内置类和对象

(1)JS中的内置类*

  • String类:用于处理字符串的类,包括各种字符串的方法和属性
  • Number类:用于处理数字的类,包括各种数字的方法和属性
  • Date类:用于处理日期和时间的类,包括各种日期和时间的方法和属性
  • RegExp类:用于处理正则表达式的类,包括创建和使用正则表达式的方法和属性
  • Array类:用于处理数组的类,包括各种数组的方法和属性
  • Math类:提供了各种与数学有关的常量和函数

(2)对象的创建方式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>对象创建</title>
</head>
<body>
<script type="text/javascript">
    //1、使用new创建对象
    let d = new Date(); //创建日期对象
    console.log(d.getDay());//获取结果是0-6,0代表星期日。。。 1
    console.log(d.getDate()); //返回这个月的第几日 28
    console.log(d.getMonth()); //返回0-11,分别对应的是1-12月

    //2、使用构造函数的形式声明一个类并创建对象
    //js本身并没有类的概念
    function Person(name, age) {
        //声明属性
        this.name = name;
        this.age = age;
        this.location = "中国";
        //声明方法 一定要加this.
        this.getName = function () {
            return this.name;
        }
        this.getAge = function () {
            return this.age;
        }
    }

    //创建对象
    let p1 = new Person("张三", 20);
    //访问类的属性
    console.log(p1.name + ":" + p1.age); //张三:20
    //修改类的属性
    p1.name = "李四";
    //访问类的方法
    console.log(p1.getName() + ":" + p1.getAge() + ":" + p1.location); //李四:20:中国

    //3、字面量创建对象
    let person = {
        firstName: "Tom",
        lastName: "Cat",
        age: 15,
        getInfo: function () {
            return this.firstName + " " + this.lastName + ":age=" + this.age;
        }
    };
    //访问属性
    console.log(person.firstName + " " + person.lastName);//Tom Cat
    //访问方法
    console.log(person.getInfo()) //Tom Cat:age=15
</script>
</body>
</html>

三、练习

1 开发注册页面

请根据图片要求,开发注册页面。页面效果及样式数据如下所示:

练习1

提示:

1、验证码是一张静态图片,无需实现动态更换的效果

2、请在父任务的附件中下载相关静态资源

练习2

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        #div1 {
            width: 1534px;
            height: 705px;
            background-image: url("../img/zc.jpg");
            background-size: cover;
            background-repeat: no-repeat;
            overflow: hidden;
        }

        .table_p {
            margin-left: 45%;

        }

        h1 {
            margin-left: 45%;
            margin-top: 8%;
            margin-bottom: 25px;
            color: #990000;
        }

        .right_p > input {
            border: 1px solid #ccc;
            border-radius: 2px;
            width: 150px;
            height: 22px;

        }

        .left_p {
            margin: 2px;
            font-size: 18px;
            text-align: right;
            font-family:"Microsoft YaHei";
        }

        .p1 > input {
            border: 1px solid #ccc;
            margin-top: 2px;
            height: 22px;
            width: 80px;
            border-radius: 2px;
        }

        .p1 {
            display: flex;
        }

        img {
            display: block;
            width: 80px;
            margin-top: 2px;
            margin-left: 1px;
        }

        .button {
            border: none;
            border-radius: 2px;
            width: 127px;
            height: 44px;
            font-size: 20px;
            color: white;
            font-weight: bold;
            background-image: url("../img/zc_btn01.jpg");
            margin-top: 8px;
            position: absolute;
            left: 49vw;
        }

    </style>
</head>
<body>
<div id="div1">
    <h1>欢迎注册EasyMail</h1>
    <table class="table_p">
        <tr>
            <td class="left_p">用户名:</td>
            <td class="right_p"><input type="text"></td>
        </tr>
        <tr>
            <td class="left_p">密码:</td>
            <td class="right_p"><input type="password"></td>
        </tr>
        <tr>
            <td class="left_p">确认密码:</td>
            <td class="right_p"><input type="password"></td>
        </tr>
        <tr>
            <td class="left_p">昵称:</td>
            <td class="right_p"><input type="text"></td>
        </tr>
        <tr>
            <td class="left_p">邮箱:</td>
            <td class="right_p"><input type="text"></td>
        </tr>
        <tr>
            <td class="left_p ">验证码:</td>
            <td class="p1">
                <input type="text">
                <img src="../img/yzm.jpg"></td>
        </tr>
        <tr>
            <td rowspan="2">
                <input class="button" type="submit" value="注册用户">
            </td>
        </tr>
    </table>
</div>
</body>
</html>
最后修改:2023 年 08 月 29 日
如果觉得我的文章对你有用,请随意赞赏