Linux基础

Linux基础

一、文件和目录操作

列出当前目录中的文件和子目录

ls 全称List,用于打印当前目录下的子目录和文件。

ls
ls *.txt #显示当前目录中子目录的所有以.txt结尾的文件

ls常用选项

选项 选项全称 作用
-a All 用于显示所有文件和目录,包括隐藏文件和隐藏目录。
-1 将ls的输出变为一列显示,对于查看大量文件或目录时,特别有用,因为它可以更清晰地列出它们。
-l Iong format 以"长格式" 显示文件和目录的详细信息。这个选项通常用于列出文件的权限、所有者、组、文件大小、修改日期等信息。
-h Human-readable 将以人类可读的方式列出当前目录中的文件和子目录,并显示文件大小以K、M、G等单位。
ll  #ls -l的缩写

ll 是一个常见的 Linux 命令的别名或缩写,通常用于列出文件和目录的详细信息。实际上,ll 命令通常是 ls -l 的简写形式。ls -l 用于以长格式列出文件和目录的信息,包括权限、所有者、组、大小、修改时间等等。

所以,运行 ll 命令等同于运行 ls -l 命令,都可以用来查看目录中的文件和目录的详细信息。这样的输出通常更详细,有助于用户更好地了解文件和目录的属性。请注意,ll 命令在一些 Linux 系统中默认是可用的,但在其他系统中可能需要手动设置别名或使用。

如果您在终端中运行 ll 命令,它将列出当前目录中的文件和目录的详细信息,类似于运行 ls -l 的效果。

创建文件

touch 文件名

使用 touch 如果文件不存在则创建,如果存在则 touch 命令可以更新文件的访问时间和修改时间,使其变为当前时间,而文件内容不会改变。

可以使用以下形式多次批量创建文件

touch a1.txt a2.txt a3.txt
touch a{1..3}.txt

在创建文件时 文件名前面加上 . 可以创建隐藏文件

touch .test.txt

使用 ls -a 查看隐藏文件

在Linux中,以点(.)开头的文件和目录被视为隐藏的。通常,使用ls命令只会显示普通的文件和目录,而隐藏的文件和目录不会被列出。但是,当您使用ls -als --all时,它会显示当前目录下的所有文件和目录,包括那些以点开头的隐藏文件和目录。这对于查看隐藏文件或在特定情况下查看所有内容非常有用。

使用'touch'加上路径可以在目标路径中创建文件

# 在当前目录下创建
touch index/css/main.css # 在当前目录下创建
# 指定其他目录创建
touch /tmp/test.txt # 在根目录下的tmp文件夹中创建一个test文本文件

在使用Linux系统时,创建文件夹(目录)时不需要添加 ./ 前缀,直接使用 mkdir test 即可。这是因为Linux默认会在当前目录下创建文件夹,所以不需要额外的路径指定符号。所以,mkdir test 是正确的方式来创建一个名为 test 的文件夹。

创建目录

mkdir 命令的全称是 "make directory",它用于在Linux和Unix操作系统中创建新的目录(文件夹)。这个命令可以让你在文件系统中创建新的目录结构,以组织和存储文件和子目录。

mkdir 目录名 # 创建目录
mkdir -p index/css #创建多级子目录
mkdir a b c # 创建多个目录
mkdir a{1..10} #创建多个目录

切换目录

cd 指令的全称是 "change directory",它用于在命令行界面中改变当前工作目录。这个命令允许用户进入不同的目录或文件夹,以便在文件系统中导航和执行命令。通过使用 cd 命令,用户可以切换到其他目录并在其中执行操作。

cd [目标路径]

在使用cd指令时 可以搭配一些符号快速的定位到目录

符号 作用
~ 表示当前用户的家目录(home directory)。当你运行 cd ~ 时,它会将你的当前工作目录更改为你的家目录。
/ 符号表示根目录(root directory)。根目录是文件系统的最顶层目录,包含了整个文件系统的层次结构。运行 cd / 时,它会将你的当前工作目录更改为根目录。
. 表示当前目录。例如,cd . 不会改变当前工作目录。
.. 表示上一级目录。例如,cd .. 将会将你的当前工作目录更改为上一级目录。 cd../.. 将会将你的当前工作目录更改为上二级目录。
- 表示上一次工作的目录。使用 cd - 可以快速切换回之前所在的目录。

当目标目录没有可执行(x)权限时,你无法使用 cd 命令进入该目录。

删除文件 目录

rm 的全称是 "remove",它是 Linux 和 Unix 操作系统中用于删除文件或目录的命令。

rm 目标文件 # 删除文件
rm -r 目标目录 #删除目录
rm 目标文件1 目标文件2 # 删除多个文件
rm *.txt # 删除以.txt结尾的文件

rm 常用选项

选项 英文全称 作用
-r Recursive 递归删除,用于删除目录及其内容
-f Force 强制删除,无需确认。
-i Interactive 交互式删除,会提示用户确认删除。

在删除文件或目录时,通常需要对目标文件或目录同时具备写权限和执行权限。使用 -f 参数可以绕过权限检查,强制删除,但目标文件的父目录也需要具备足够的权限,包括读、写和执行权限,以确保删除操作成功。需要谨慎使用 -f 参数,因为它可能导致误删除文件或目录。

移动文件 目录 重命名

mv 全称move,它用于在Linux和Unix系统中移动或重命名文件和目录。使用 mv 命令,您可以将文件或目录从一个位置移动到另一个位置,也可以重命名文件或目录。

mv 源文件 将目标文件要移动到的路径 # 移动
mv oldfile.txt newfile.txt # 重命名

当使用mv命令移动文件时,文件的属主和属组信息通常不会发生改变,除非你以超级用户或具有适当权限的用户身份执行mv命令并明确指定要更改文件的属主和属组。此外,需要注意的是,Linux文件系统通常不维护文件的创建时间戳,因此移动文件不会影响到创建时间戳。此外,移动文件不需要读取文件本身的权限,只需要对文件所在目录具有执行权限(用于访问目录)和对目标目录具有写权限(用于将文件移动到目标目录)。

复制文件 目录

cp 全称copy,它用于在Linux和Unix系统中拷贝文件或目录。

cp [源文件] [目标目录或文件]
cp -r [目标目录] [将目标目录拷贝的路径]

cp常用选项

选项 英文全称 作用
-r Recursive 递归复制目录,复制目录及其内容。
-p Preserve 保留文件属性,保留文件的权限、所有者和时间戳等属性。
-f Force 强制覆盖,如果目标文件已经存在,你可以使用-f选项来强制覆盖它。
-v Verbose 显示复制进度
-i Interactive 交互式复制,使用-i选项可以在覆盖目标文件之前进行交互式确认。

要复制一个文件,你需要对源文件具有读权限,同时对目标目录具有写权限。如果目标文件没有读权限,复制操作将失败。

查看文件

常用指令

cat 文件名 # 查看文件
cat -n 文件名 # 查看的同时显示行号
tac 文件名 # 倒序查看
head 文件名 # 查看文件前10行 默认
head -15 文件名 # 查看文件前15行
tail 文件名 #查看文件倒数10行 默认
tail -15 #查看文件倒数15行
tail -f #检测文件变化

统计指令 wc

wc 命令的全称是 "word count",它用于统计文本文件中的字数、行数和字符数。除了这些基本的统计信息,wc 命令还可以提供更多选项,例如统计文件中的字节数、最长行的长度等。它是 Linux 和 Unix 操作系统中非常常用的命令之一,用于文本文件的分析和处理。

wc 文件名

wc 常用选项

选项 英文全称 作用
-l lines 用于统计行数
-w words 用于统计字数(单词数)

匹配指令 grep

grep 的全称是 "Global Regular Expression Print",它是一个用于在文本文件中搜索匹配特定模式(正则表达式)的行的命令。

grep [选项] [模式] [文件名]

基本搜索: 默认情况下,grep 会搜索匹配指定模式的行并将其输出到标准输出。例如,以下命令搜索文件 file.txt 中包含字符串 "pattern" 的行:

grep "pattern" file.txt

正则表达式搜索grep 支持正则表达式,你可以使用 -E 选项来进行扩展正则表达式的搜索。例如,以下命令搜索文件中以字母 "a" 开头的单词:

grep -E "^a\w*" file.txt

忽略大小写: 使用 -i 选项可以忽略搜索时的大小写区分。例如,以下命令搜索文件中包含字符串 "pattern" 的行,不区分大小写:

grep -i "pattern" file.txt

显示行号: 使用 -n 选项可以显示匹配行的行号。例如,以下命令搜索文件中包含字符串 "pattern" 的行,并显示行号:

grep -n "pattern" file.txt

反向匹配: 使用 -v 选项可以输出不包含匹配模式的行。例如,以下命令搜索文件中不包含字符串 "pattern" 的行:

grep -v "pattern" file.txt

精确匹配: 使用 `-w 选项可以输出包含莫一个单词的行。例如,以下命令搜索文件中不包含字符串 "pattern" 的行:

grep -w "pattern" file.txt

列数据匹配 awk

awk 是从其三位创始人的姓名首字母派生而来的,这三位创始人是 Alfred V. Aho、Peter J. Weinberger 和 Brian W. Kernighan。

awk '{print $1}' # 取第一列数据
awk -F ',' '{print $1}' # 以,为分隔符

排序 sort

sort 指令用于对文本文件的内容进行排序并将结果输出到标准输出。

sort [选项] [文件名]

sort 常用选项

选项 英文全称 作用
-r Reverse 逆序排序,即从大到小排序。
-n Numeric-sort 选项可以按数字顺序而不是字典顺序进行排序。
-b Blanks 可以在排序时忽略前导空格。

去重 uniq

uniq 是 "unique" 的缩写,它用于从已排序的文本文件中删除或报告重复的行,并将结果输出到标准输出。需要注意的是,如果文件没有排序,则 uniq 无法正确去重。

uniq [选项] [输入文件]

uniq 常用选项

选项 英文全称 作用
-c count 显示每个重复行出现的次数。使用此选项,uniq 将在每个行的前面显示该行出现的次数。

二、Linux目录结构

Linux没有盘符的概念,而是一个单根文件系统,根目录/是最顶级的目录。

/ 根目录是整个Linux文件系统的起点,包含了所有其他目录和文件。
├── bin  (二进制文件 Binaries)bin存放了系统启动和基本操作所需的核心命令,这些命令通常被系统启动过程中使用,因此需要在根文件系统中。
├── boot    (引导文件)boot目录包含了引导加载程序和内核镜像,用于引导Linux系统。这些文件是启动计算机时所需的。
├── dev (设备文件 Device)dev包含设备文件,用于访问系统硬件设备,如磁盘驱动器、键盘、鼠标等。在Linux中,一切皆文件,因此硬件设备也以文件的形式表示。
├── etc (配置文件 Etcetera)etc存放系统的配置文件,包括网络配置、用户和组信息、软件包配置等。系统管理员可以在这里配置系统的行为和各种服务。
├── home    (用户主目录)home目录包含了每个用户的主目录,每个用户有自己的子目录。
│   └── user1 (user1用户主目录)用户通常在自己的主目录下存储个人文件和设置。
├── lib     (库 Library)32位库文件 lib存放系统和应用程序所需的共享库文件。共享库包含了可供多个程序共享使用的代码和函数。
├── lib64   64位库文件
├── media (可移动媒体)media用于挂载可移动媒体设备,如USB驱动器、光盘等。
├── mnt(挂载点 mouent) mnt目录通常用于手动挂载其他文件系统,例如临时挂载其他硬盘分区或网络文件共享。
├── opt (可选软件包) opt通常用于存放可选的、独立安装的软件包。一些应用程序和服务可以选择安装在这个目录下。
├── proc    (进程和系统信息)proc包含虚拟文件系统,用于访问内核和进程信息。
├── root    (超级用户主目录)root是超级用户(管理员)的主目录。超级用户可以在这里存储个人文件和配置。
├── run (运行时文件)run包含运行时数据,如临时文件和进程信息。
├── sbin    (系统二进制文件)sbin存放系统管理和维护所需的二进制可执行文件,通常只能由超级用户运行。
├── srv (服务数据 Serve)srv通常用于存储服务相关的数据文件,例如Web服务器的文档根目录。
├── sys (内核和设备信息 system)sys包含了内核和设备的信息,可以用于配置和监视硬件设备和内核参数。
├── tmp (临时文件)tmp用于存储临时文件,这些文件在系统重启时通常会被清除。
├── usr (用户安装的软件和文件) usr包含用户安装的软件包、应用程序和文件
└── var(变化的数据)var包含变化的数据,如日志文件、缓存、邮件队列等。这些文件经常被写入和修改。

网安常用目录

路径 描述
/etc/skel 用作新用户的默认home目录模板。当系统管理员创建新用户时,系统会使用 /etc/skel 目录中的文件和文件夹作为新用户家目录的初始内容。这些文件和文件夹包含了一些默认的配置文件、示例文件以及其他系统和用户环境所需的基本文件。
/etc/passwd 用于存储有关系统中用户账户的基本信息。每行记录代表一个用户账户,并由冒号分隔的字段组成。
/etc/group 用于存储系统中用户组信息的文件。在Linux和Unix系统中,用户通常被组织成不同的用户组,这有助于管理和授权文件和资源的访问。
/etc/shadow 通常用于存储 Linux 和 Unix 操作系统中的用户密码信息。它包含了一些关键的安全性数据,用于保护用户账户的密码。
/var/spool/mail 用于存储用户的电子邮件邮箱(邮件信箱)文件。每个用户通常都有一个与其用户名相关联的邮箱文件,该文件包含了用户接收的电子邮件消息。

可执行程序特殊目录(环境变量目录)

在Linux中,有一个特殊的目录,被称为可执行程序的特殊目录,通常是 /usr/local/bin/usr/bin,其中包含了系统中安装的可执行程序的文件。这些可执行程序可以直接从命令行运行,而无需提供完整的文件路径。以下是有关这个特殊目录的解释:

  1. 目的:可执行程序的特殊目录用于存放系统上安装的可执行二进制文件(也就是可运行的程序)。这些程序可以是系统工具、应用程序或其他可以通过命令行或脚本调用的工具。
  2. 环境变量:Linux系统中有一个叫做 $PATH 的环境变量,它包含了一系列目录的路径,系统会在这些目录中查找可执行程序。当你在命令行输入一个命令时,系统会按照 $PATH 中列出的目录顺序来查找对应的可执行程序,一旦找到,就可以运行它。默认情况下,可执行程序的特殊目录通常被包含在 $PATH 变量中。
  3. 系统与用户级别:在Linux系统中,有两个主要的可执行程序目录,分别是 /usr/bin/usr/local/bin
    • /usr/bin:包含系统级别的可执行程序,通常由Linux发行版提供和维护,包括系统工具和常见的应用程序。
    • /usr/local/bin:通常包含由管理员或用户安装的本地可执行程序。这个目录用于存放不属于Linux发行版默认安装的自定义或第三方程序。
  4. 权限和安全性:这些目录通常设置为具有较高的安全性,只有超级用户(root)或具有适当权限的用户才能将可执行程序复制或安装到这些目录中。这有助于确保系统上的可执行程序是受信任和安全的。

总之,可执行程序的特殊目录在Linux系统中起着重要作用,使用户能够轻松地运行各种命令和应用程序,同时保持了系统的安全性和组织性。通过设置正确的 $PATH 环境变量和合适的权限,Linux系统能够有效地管理和运行可执行程序。

echo $PATH #可以通过echo指令打印PATH变量获得可执行程序特殊目录

三、用户与用户组

在Linux系统中,用户(User)和用户组(User Group)是关键的身份和权限管理概念,用于管理系统上的访问和资源分配。

用户相关操作

  • 用户是Linux系统中的个体身份,它用于标识和区分不同的系统用户。
  • 每个用户都有一个唯一的用户名(Username),例如 "john" 或 "mary"。
  • 每个用户都有自己的主目录(Home Directory),通常位于 /home 目录下,用于存储用户的个人文件和配置。
  • 用户可以登录到系统,执行命令,访问文件,以及拥有自己的文件和目录权限。
  • 用户通常分为普通用户(普通用户)和超级用户(root用户)。超级用户拥有系统上的最高权限,可以执行任何操作。

创建用户

useradd [用户名] #新建用户 如果没有指定组名则创建一个与用户名相同的组,并且将该用户归于此下。
useradd -g [组名] [用户名] #新建用户 指定组

在创建用户后,可以使用 id 命令来检查是否创建成功。如果 id 命令输出用户的 UID、GID 以及所属的组信息,那么说明用户已成功创建。然而,此时仍然无法正常登录,原因在于尚未为该用户设置密码。

值得注意的是,在执行成功的时刻,系统会在用户的主目录下生成一个目录,该目录的名称与用户的 ID 相匹配,并且其内容是从 /etc/skel 复制而来的。

passwd [用户名] #设置或修改密码

在用户设置完成密码后,可以正常登录。

删除用户

userdel [用户名]  # 仅删除用户账户,不删除用户的主目录和邮件队列
userdel -r [用户名] # 不仅用户账户被删除,还会连同用户的主目录和邮件队列一起删除。

如果您希望仅删除用户账户而保留用户的数据(如主目录中的文件),则使用 userdel。如果您想要彻底删除用户账户及其所有相关数据,包括主目录 邮件队列,那么可以使用 userdel -r

修改用户

使用 usermod 指令可以修改用户状态

usermod [选项] [用户名]

usermod 常用选项

选项 英文全称 作用
-L Lock 锁定用户账号
-U Unlock 解锁用户账号
-G Groups 给用户添加一个新的组
-g gid 修改用户主组

查看用户

id [用户名] # 命令输出用户的 UID、GID 以及所属的组信息
lchage -l [用户名] # 查看用户状态
W   #查看当前登录了几个用户或者打开了多少个终端

用户组相关操作

  • 用户组是一组用户的集合,它用于管理和分配权限。
  • 每个用户可以属于一个或多个用户组。
  • 用户组可以协助在多个用户之间共享文件和资源,使权限管理更灵活和有效。
  • 通常,每个用户创建时都会自动分配一个与其用户名相同的用户组,称为主用户组。
  • 用户也可以加入其他用户组,以便与其他用户协作并访问特定资源。

创建组

groupadd [组名]

删除组

groupdel [组名]

修改组名

groupmod -n [旧组名] [新组名]

四、权限管理

在Linux操作系统中,文件和目录的权限是一个重要的概念,用于控制谁可以访问、修改或执行它们。Linux使用一种称为“权限位”(permission bits)的系统来管理文件和目录的权限。每个文件或目录都有一个与之相关联的权限设置,这些权限设置分为三个主要类别:用户权限、组权限和其他人权限。

  1. 用户权限(User Permissions):
    • 读权限(Read):表示用户是否可以查看文件的内容。如果文件有读权限,则用户可以读取文件的内容。
    • 写权限(Write):表示用户是否可以修改文件。如果文件有写权限,则用户可以编辑、修改或删除文件。
    • 执行权限(Execute):表示用户是否可以执行文件。对于二进制文件(如可执行程序),执行权限允许用户运行文件。对于目录,执行权限允许用户访问目录内的文件列表。
  2. 组权限(Group Permissions):
    • 与用户权限类似,组权限决定了属于同一用户组的用户对文件或目录的访问权限。这些权限通常适用于多个用户属于同一用户组的情况。
  3. 其他人权限(Other Permissions):
    • 这些权限适用于不是文件拥有者或不属于文件所在组的其他用户。这些权限通常适用于所有其他用户。

每个文件或目录的权限位以一种特殊的方式表示,通常以以下形式显示:rwxrwxrwx。这个字符串分为三组,每组包含三个权限位,分别表示用户权限、组权限和其他人权限。每个权限位可以用一个字母或一个符号表示:

  • r:读权限
  • w:写权限
  • x:执行权限
  • -:无权限

例如,rw-r--r-- 表示文件拥有者有读和写权限,但没有执行权限;文件所在组和其他人只有读权限,没有写和执行权限。

文件权限

输入ls -lll指令可以,以"长格式" 显示文件和目录的详细信息。

总用量 4
-rw-------. 1 root root 1304 8月  25 20:45 anaconda-ks.cfg
drwxr-xr-x  2 root root    6 9月  20 02:12 doc
-rw-r--r--  1 root root    0 9月  20 02:04 op.txt

当你到像 -rw-r--r-- 这样的字符串时,它表示文件或目录的权限设置。这个字符串总共包含了十个字符,可以分成四组,每组包含三个字符。每一组都代表了不同的访问权限,分别是用户权限、用户组权限和其他用户权限。具体来说,这个字符串可以解释如下:

  • rw-:这是用户权限部分,表示文件或目录的拥有者(用户)具有读取(r)和写入(w)的权限,但没有执行(x)的权限。
  • r--:这是用户组权限部分,表示与文件或目录属于相同用户组的人只有读取(r)的权限,没有写入(w)或执行(x)的权限。
  • r--:这是其他用户权限部分,表示所有其他用户都只有读取(r)的权限,没有写入(w)或执行(x)的权限。

因此,-rw-r--r-- 表示文件或目录的拥有者可以读取和写入,与文件或目录属于相同用户组的人可以读取,而所有其他用户也只能读取,没有其他的权限。文件类型字符 - 表示这是一个普通文件。如果文件类型字符是 d,则表示这是一个目录。

使用chmod指令修改文件或文件夹权限

chmod [选项位] [文件/文件夹]
chomd -r anaconda-ks.cfg #去除掉三组所有的读权限
chomd o+r anaconda-ks.cfg #只给其他人添加读取权限

在选项位中,权限的基本格式是 权限体系ugo + 或 - 权限符号rwx。你可以按需使用这些符号来配置文件或目录的权限。如果省略权限体系位,则所设置的权限将对所有三个权限体系(用户、组、其他用户)都生效。同时,你也可以组合不同的权限设置来达到特定的权限配置目的。

例如,chmod ug+rwx anaconda-ks.cfg 表示给文件 "anaconda-ks.cfg" 的用户和组添加读、写和执行权限。

目录权限

与文件权限相同目录文件的权限也是用rwx表示。

  1. r(读权限 - Read):读取目录内容的权限。如果一个用户具有读权限,他们可以列出目录中的文件和子目录,查看文件和目录的属性信息,但不能对目录内的文件执行写入或删除操作。
  2. w(写权限 - Write):写入目录的权限。如果一个用户具有写权限,他们可以在目录中创建新文件或子目录,也可以删除已存在的文件或子目录。写权限还允许用户更改目录的属性,如修改目录的名称。
  3. x(执行权限 - Execute):执行目录的权限。虽然执行权限通常与文件相关联,但在目录上具有执行权限允许用户进入(或"切换到")该目录。用户需要具有执行权限才能访问目录中的文件,即使他们知道文件的名称。

权限值

在Linux和Unix系统中,文件和目录的权限是用数字值来表示的,通常是一个三位的八进制数。这个三位数字代表了不同的权限组:文件的拥有者权限、文件所属用户组的权限和其他用户的权限。每个权限组都由三个比特位组成,每个比特位可以是以下几个值:

  1. r(读权限 - Read):用数字表示为4。如果这个位被设置为4,表示拥有该权限。
  2. w(写权限 - Write):用数字表示为2。如果这个位被设置为2,表示拥有该权限。
  3. x(执行权限 - Execute):用数字表示为1。如果这个位被设置为1,表示拥有该权限。
  4. -(无权限):用数字表示为0。如果这个位被设置为0,表示没有该权限。

这三个比特位对应于每个权限组的读、写和执行权限。将它们组合在一起,可以创建一个三位的数字权限值,例如:

  • rwxr-xr-- 权限对应的数字权限值是 751。
  • rw-rw-r-- 权限对应的数字权限值是 664。
  • rwxr-x--- 权限对应的数字权限值是 750。

了解了权限值后就可以使用权限值快速的操作文件权限,例如:

chomd 751 anaconda-ks.cfg #创建他的用户有读写执行权限,用户组有读和执行权限,其他用户只有执行权限。

修改文件/目录所属

只有超级用户(root)或具有足够权限的用户可以将文件的属主更改为其他用户,即使文件的当前属主和目标用户属于同一用户组,普通用户也不能直接执行这个操作。

chown test1 index.html #将index.html的属主交给test1
chown test:test1 #将index.html的属组和属组交给test1 [用户名:组名]
chown 1001:1001 #也可以通过uid和gid进行修改   [uid:gid]

五、压缩与解压缩

linux系统下不太的压缩格式是需要不同命令操作

tar

tar -zcf [压缩包路径/文件名称] [文件] #压缩 文件可以使用空格指定多个
tar -zxf [压缩包路径] [解压路径] #解压
tar -cf [归档路径/文件名称] [文件] #归档 文件可以使用空格指定多个
tar -tf [压缩包路径] #查看压缩包内容

归档通常指的是将一组文件或目录集合在一起但不压缩,以便将它们存储为单个文件或目录,以便于备份、传输或存档目的。

在命名时 tar压缩一般是用文件名.tar.gz的格式书写

常用参数

选项 全称 作用
z gzip 使用 gzip 压缩归档文件(需要与-c-x一起使用)。
c Create 用于创建新的归档文件。
f Fire 指定归档/提取文件的名称。
x Extract 用于从归档文件中提取文件。
t List 使用tf列出归档文件中包含的文件和目录。
v Verbose 启用详细模式观察压/接压缩过程进度。

gzip

gzip [文件] #压缩 后面可以跟多个文件 但是无法像tar一样压缩成一个文件 gzip会一个文件打一个压缩包
gzip -u [文件] #解压

在命名时gzip一般使用文件名.gz

zip

zip -r [压缩包名] [文件] #压缩 后面可以跟多个文件压缩成一个文件
unzip [压缩包名] #将文件直接解压到与压缩包同级位置

关于rar

由于rar是windows上常用的压缩格式在Linux上较难解压,需要安装额外的工具。

https://www.linuxprobe.com/lqsjyrwjzwsy.html

六、文件传输

网站下载文件

curl -o [本地路径] [文件网址]
wget [文件网址]

注意 wget虽然好用但是不是Linux系统自带的文件下载工具需要自行安装

yum install -y wget

与其他操作系统直接上传下载

在Windows 10及更高版本中,内置了SSH客户端,允许你使用scp指令来从远程服务器下载文件。然而,要被动地接收文件,需要远程服务器上运行SSH服务器服务。对于其他类Unix系统(如Linux和macOS),同样需要运行SSH服务器以接收文件。

简而言之,无论是在Windows 10还是其他类Unix系统上,使用scp指令下载文件是可行的,但要被动地接收文件,需要确保远程服务器上已启用SSH服务器服务,因为SSH服务器服务是接收文件的关键。

scp [文件路径] [用户名@主机地址]:/[文件被上传的位置] #文件上传
scp [用户名@主机地址]:/[文件位置] [文件路径] #文件下载

scp ./test.txt root@192.168.0.1:/home #文件上传
scp root@192.168.0.1:/home . #文件下载

使用rz sz

rzsz是一对用于在串口连接或SSH终端中进行文件传输的命令行工具,通常用于从本地计算机发送文件到远程计算机或从远程计算机接收文件。

这两个命令通常与终端仿真软件(如Minicom、PuTTY、xshell等)一起使用,用于在计算机和嵌入式系统之间进行文件传输。

linux默认是不带这两个工具需要自行安装

yum install lrzsz -y
#上传 直接将文件拖入到模拟终端(xshell)即可完成上传操作
#下载
sz [要下载的文件] #使用模拟终端可以打开选择保存位置的GUI完成下载

极大程度上方便了本地计算机与远程计算机之间文件传输过程 如果还是觉得麻烦那么Xftp将是终极解决方案。

七、软件安装

编译安装

以安装nginx为例子

# 首先第一步去官网下载nginx的源码
wget https://nginx.org/download/nginx-1.24.0.tar.gz
# 下载到本地后解压
tar -zxf nginx-1.24.0.tar.gz
# cd到nginx-1.24.0
cd nginx-1.24.0
# 执行编译配置脚本并且使用指定安装目录参数
./configure --prefix=/usr/local/nginx
# 执行完成编译配置脚本后会多出Makefile文件 使用make就可读取Makefile文件中的信息进行编译
make
# 此时我们的程序已经编译完成 编译后内容在ojbs文件夹中 使用make install指令复制到指定好的目录中去
make install
# 最后进入/usr/local/nginx/sbin文件夹中 启动nginx
./nginx
# 如果发现在浏览器中无法访问服务器的ip 需要将防火墙关闭
systemctl stop firewalld
systemctl disable firewalld

"configure" 文件通常是一个由软件开发者提供的脚本,用于配置和准备软件在特定系统上编译和运行。这个脚本通常命名为 "configure",但也可能具有不同的名称,例如 "configure.sh" 或 "configure.py",具体取决于软件开发者的偏好。

make 是一个命令行工具,用于执行 Makefile 中定义的构建任务。通过运行 make 命令,您可以自动化地执行编译、链接和其他构建任务,而无需手动输入编译器和链接器的命令。

make install 是一个常见的命令,通常用于在使用 Makefile 构建的软件项目中安装已编译的程序或库文件到系统中。这个命令通常会执行以下操作:

  1. 复制文件:将已编译的可执行文件、库文件或其他必要的文件复制到系统的指定位置。这通常是系统的标准二进制目录,例如 /usr/bin/usr/local/bin(对于可执行文件)或 /usr/lib/usr/local/lib(对于库文件)。
  2. 设置权限:确保复制的文件具有适当的文件权限,以便它们可以被系统中的其他用户访问和执行。
  3. 创建符号链接:在某些情况下,make install 也可能创建符号链接,将安装的文件链接到系统中的标准位置,以便用户可以方便地访问它们。

rpm安装

一些 Linux 发行版厂商为了方便使用者,通常会在编译过程繁琐的情况下,将常用软件编译完成后打包,然后提供给用户下载。Red Hat 和 Debian 等发行版厂商都拥有自己的包管理工具,使用户能够轻松地安装和管理这些预编译的软件包。

redhat系打包出来的叫做rpm包,debina系打包出来的叫deb包。

# 手动安装rpm包示例:不需要编译安装、也不用yum安装。
# 安装wget
yum install wget -y
# 使用wget下载rpm包
wget https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/Packages/tree-1.6.0-
10.el7.x86_64.rpm
# 安装rpm包 #rpm -i是安装,vh是显示安装进度条的意思。
rpm -ivh tree-1.6.0-10.el7.x86_64.rpm 
# 卸载
rpm -e tree
# 升级
rpm -Uvh xxx.rpm
# 查看已安装的软件
rpm -qa|grep httpd

rpm安装软件个小问题:

比如:安装vim,会提示安装失败,需要各种依赖包,需要先去安装依赖包。
wget http://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/Packages/vimenhanced-7.4.629-7.el7.x86_64.rpm
rpm -ivh vim-enhanced-7.4.629-7.el7.x86_64.rpm

所以,用rpm安装软件不好解决依赖包的问题,所以出来了下面的yum安装方式,自动下载安装需要的 依赖包。以后都用yum来安装。

yum安装

#自动解决rpm依赖
#yum安装扩展yum仓库
yum install epel-release -y
#yum安装nginx
yum install nginx -y
#yum移除nginx
yum remove nginx -y
#查看仓库rpm的数量
yum repolist

安装方法总结:

编译安装:优点: 自由定制 痛点:难度高,步骤繁琐

rpm安装:优点:安装简单 痛点:需要自己解决依赖,不支持定制

yum安装:优点:自动解决依赖,默认安装最新版 痛点:不支持定制

八、文件查找

文件查找,我们在windows用的比较多,系统自带的搜索方式、第三方搜索工具everything等。 linux上没有图形化界面,就要借助find指令来查了。

#文件查找
例子1:普通查询
find   /etc   -maxdepth 1  -type f  -name "pa*"
命令   目录...   查找深度     类型   文件名称包含  
# -type文件类型:f表示文件,不指定类型的话,文件和目录都会查找
# -maxdepth查找深度:目录层级的意思,不指定的话,就按照最大深度来查找
# "pa*": *表示匹配任意pa开头的内容,*号还可以写在开头

九、进程管理

进程是计算机中正在执行的程序的实例,它拥有独立的内存空间和系统资源。

查看进程

ps -ef #显示当前系统上所有正在运行的进程的详细信息

ps 表示 "进程状态"(Process Status)命令,用于查看系统中的进程信息。

-efps 命令的选项参数,具有以下含义:

  • -e 选项用于显示所有进程,包括当前用户和其他用户的。
  • -f 选项用于显示详细的进程信息,包括进程的PID(进程标识符)、PPID(父进程的PID)、CPU 使用率、内存使用量、启动时间等。

因此,运行 ps -ef 命令会列出系统中所有进程的详细信息,这对于系统管理和排查问题时非常有用。通常,ps -ef 结果会显示在终端上,以便用户查看和分析。

ps -ef 命令的输出结果包含多个字段,每个字段提供了关于系统中运行进程的详细信息。以下是常见的字段说明:

  1. UID:这是进程所属的用户ID。它显示了哪个用户启动了进程。
  2. PID:进程ID,是每个进程的唯一标识符。
  3. PPID:父进程ID,表示启动当前进程的父进程的PID。
  4. C:CPU 使用率的百分比。它表示进程在CPU上的占用情况。
  5. STIME:进程的启动时间,通常以HH:MM(小时:分钟)格式显示。
  6. TTY:终端类型。显示了与进程关联的终端,如果没有关联终端,则显示 "?"。
  7. TIME:进程累计的CPU时间,通常以分钟:秒(MM:SS)格式显示。
  8. CMD:命令行或进程的名称。这是启动进程时使用的命令,可以告诉您进程在做什么。 如果被[]包裹起来它也可能是是系统进程或内核进程。

结束进程

kill [PID] #结束进程
pkill [进程名称] #批量结束进程 慎用容易误伤

kill -9 [PID] #强制结束进程
pkill -9 [进程名称] #批量强制结束进程

当在网络安全检查中发现可疑的Shell登录时,需要终止与该Shell会话相关的进程以中断连接。通常情况下,SSH登录会话涉及SSH服务器(通常是sshd进程)启动一个子Shell进程来处理用户的命令。因此,如果要终止用户的Shell会话,必须终止其父进程,即sshd进程。

要找到需要终止的sshd进程,可以查看进程的PPID(父进程ID)字段。但需要谨慎操作,因为终止sshd进程将中断所有通过SSH连接到服务器的会话,而不仅仅是可疑的会话。因此,在执行此操作之前,必须慎重考虑后果,并确保只终止真正可疑或不必要的会话,以避免不必要的服务中断。

此外,为了执行此操作,通常需要具备足够的权限,通常需要以管理员或超级用户身份执行终止进程的命令。否则,可能无法终止关键的系统进程。

在Unix和类Unix操作系统中,kill 命令用于终止或发送信号给进程。-9kill 命令的一个选项参数,表示要发送的信号编号。具体地说,-9 对应的信号是SIGKILL。

SIGKILL 是一种特殊的信号,它强制终止目标进程,无论该进程是否愿意终止。使用 -9 选项,你可以强制终止一个进程,即使它处于不响应或僵死状态。

需要注意的是,虽然SIGKILL可以确保进程终止,但它也可能导致数据损坏或未完成的操作。因此,在使用 -9 选项之前,应该优先考虑发送其他信号,如SIGTERM(15)(软件终止信号),以便让进程有机会进行清理工作和资源释放。只有在其他信号无效或无法终止目标进程时,才使用SIGKILL。

十、计算机硬件信息

lscpu 查看cpu信息

free -h 查看内存信息

df -h 查看硬盘信息

top 类似于进程管理器

十一、定时任务

crontab -l #查看定时任务
crontab -e #编辑定时任务

编辑定时任务

在定时任务(通常在类Unix系统中使用)中,时间表达式是用来指定定时任务执行的时间和频率的一种方式。时间表达式通常由5字段组成,每个字段之间由空格分隔。在这5个字段中,"*" 是一个特殊的通配符,表示匹配所有可能的值。下面是这5个字段的含义:

  1. 第一个字段:分(Minutes) - 取值范围为0到59,表示一小时内的分钟数。
  2. 第二个字段:时(Hours) - 取值范围为0到23,表示一天内的小时数。
  3. 第三个字段:日(Day of month) - 取值范围为1到31,表示一个月内的某一天。
  4. 第四个字段:月(Month) - 取值范围为1到12,表示一年内的月份。
  5. 第五个字段:星期(Day of week) - 取值范围为0到7,其中0和7通常都表示星期日,1表示星期一,以此类推,6表示星期六。
*   *   *   *   *   *   [cmd]
分   时   日   月   星
分 0-59
时   0-23
日 0-31
月 1-12
星 1-7
如果直接 * * * * * [cmd] 则是每一分钟执行一次

有的时候cmd指令无效 需要使用可执行程序的绝对路径执行。 which

十二、服务管理

服务程序通常指的是在计算机系统中运行的一种特殊类型的程序,其主要目的是为其他程序或用户提供特定的功能或服务。这些服务可以是网络服务、文件服务、打印服务、数据库服务等等。服务程序通常在后台运行,不需要用户交互,并且可以随时为其他程序或用户提供所需的服务。

以下是一些常见的服务程序类型:

  1. Web 服务器: Web 服务器是用于托管网站和应用程序的服务程序,它接受来自客户端浏览器的请求,并向其发送网页内容或数据。
  2. 文件服务器: 文件服务器存储和管理文件,并允许用户或其他计算机通过网络访问这些文件。这有助于文件共享和协作。
  3. 数据库服务器: 数据库服务器用于存储、管理和提供数据库中的数据。其他应用程序可以通过数据库服务器与数据库交互。
  4. 邮件服务器: 邮件服务器负责接收、存储和传递电子邮件消息。它还提供用户电子邮件账户的管理功能。
  5. 打印服务器: 打印服务器允许多台计算机共享一台打印机。用户可以将打印任务发送到打印服务器,然后服务器将任务传递给打印机。
  6. DNS 服务器: DNS(域名系统)服务器将域名转换为相应的 IP 地址,以便互联网上的设备可以相互通信。
  7. 应用程序服务器: 应用程序服务器运行特定的应用程序,为用户或其他程序提供功能和数据。例如,许多在线游戏使用应用程序服务器来处理游戏逻辑和多人游戏。
  8. 虚拟专用网络(VPN)服务器: VPN 服务器允许远程用户通过加密的连接访问公司或机构的内部网络。

这里以web服务 httpd举例

# 安装服务
yum install httpd -y
# 启动服务
systemctl start [服务名称]
# 停止服务
systemctl stop [服务名称]
# 服务开机自启动
systemctl enable [服务名称]
# 关闭服务自启动
systemctl disable [服务名称]
# 重启服务
systemctl restart [服务名称]
# 查看服务列表
systemctl list-unit-files
# 查看指定服务状态
systemctl status [服务名称]

其他常用指令

打印当前工作目录

pwd全称Print Working Directory 它用于打印当前工作目录

pwd

打印历史指令

history

生成序列号

seq 命令的全称是 "sequence",它用于生成一个数字序列并将其输出到标准输出。

seq 起始值 结束值

查询是否开启selinux模式

sestatus

查询文件状态

stat index.html

查看文件类型

file [文件]

历史指令记录

history

在网安过程中,进攻方的在目标机上所有输入的指令都会被history所记录,所以这里涉及到一个擦除历史指令记录的操作。

使用history -c可以清除内存中的历史记录,但此时并没有完全清除,原因是在用户目录下有一个隐藏文件 .bash_history 需要将这个文件一同删除才能做到清楚历史指令痕迹的操作。

.bash_history默认会记录最近1000条指令可以通过/etc/profile进行修改

...

# Path manipulation
if [ "$EUID" = "0" ]; then
    pathmunge /usr/sbin
    pathmunge /usr/local/sbin
else
    pathmunge /usr/local/sbin after
    pathmunge /usr/sbin after
fi

HOSTNAME=`/usr/bin/hostname 2>/dev/null`
HISTSIZE=1000   #修改这行增加或减少记录条数
if [ "$HISTCONTROL" = "ignorespace" ] ; then
    export HISTCONTROL=ignoreboth
else
    export HISTCONTROL=ignoredups
fi

export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL

...

命令别名

alias # 查看当前系统中别名的指令
alias cxip='ip addr|grep -w "inet"' # 添加一个指令别名
unalias cxip # 去除别名

但是请注意使用指令添加的别名仅在当前shell生效 用户退出或者关闭则消失。想要永久添加别名需要修改 /用户目录/.bashrc 文件。

查看时间日期

date #查看时间信息
date +%F #查看日期
date +%T #查看时间
date +%F\ %T #查看时间加日期

date -s '20230923 7:00:00' #修改日期和时间
systemctl restart chronyd #请求网络时间同步到本地

查询可执行程序路径

which [程序名]

vi文件编辑器

vi 是一款常用的文本编辑器,特别是在Unix和Linux系统中。

# 如果文件存在则进入常规模式 如果文件不存在则创建文件并且直接进入常规模式常规模式
vi [文件名]

当使用vi编辑器一共有三个模式,分别是 常规模式、编辑模式、命令模式。

常规模式

  • 常规模式是 vi 的默认模式,你在打开文件后就处于这个模式。
  • 在常规模式下,你可以执行各种操作,如移动光标、删除字符、查找文本等。
  • 从常规模式进入其他模式的方式是按下特定的键:
    • i 进入编辑模式,允许你插入文本(在光标前插入)。
    • a 进入编辑模式,允许你插入文本(在光标后插入)。
    • o 进入编辑模式,允许你插入文本(新起一行)。
    • : 进入命令模式,允许你执行高级命令。

编辑模式

  • 编辑模式用于实际编辑文本内容,你可以输入或编辑文本。
  • 要从常规模式进入编辑模式,按下 i 键(在光标前插入)或 o 键(在光标后插入)。
  • 要返回常规模式,按下 Esc 键。

命令模式

  • 命令模式用于执行高级命令,如保存文件、退出编辑器等。
  • 要从常规模式进入命令模式,按下 : 键。
  • 要返回常规模式,也是按下 Esc 键。

这三个模式之间的切换允许你在编辑文本时执行各种操作,从简单的文本导航和编辑到高级命令执行。你可以在这些模式之间灵活切换以满足不同的编辑需求。

常规模式下快捷键

快捷键 作用
h 向左移动一个字符
j 向下移动一行
k 向上移动一行
l 向右移动一个字符
w 向前移动一个单词
b 向后移动一个单词
0 (数字0) 移到行首
$ 移到行尾
G 移到文件末尾
gg 移到文件开头
x 删除光标处的字符
dd 删除当前行
yy 复制当前行
p 粘贴剪贴板中的文本
u 撤销上一步操作
/ 查找文本,然后按回车键查找下一个匹配项
? 反向查找文本,然后按回车键查找上一个匹配项
n 在查找模式下,继续查找下一个匹配项
N 在查找模式下,继续查找上一个匹配项
数字 gg 快速跳转到所输入数字的那一行
: 进入命令模式

常用命令

命令 作用
:q 退出编辑器
:wq 保存并退出编辑器
:! 强制模式 例如强制保存:!wq 强制退出!q
:set number 标注行号

特殊符号

管道符 |

在 Linux 中,管道符 | 是一个强大的工具,用于将命令的输出传递给另一个命令的输入。它的作用是将多个命令串联在一起,让它们协同工作,以便处理和转换数据流。理解 Linux 管道符的关键点包括以下几个方面:

  1. 命令连接:管道符 | 允许你将一个命令的输出连接到另一个命令的输入。这意味着第一个命令的输出将成为第二个命令的输入。

  2. 数据流动:通过管道,数据可以在多个命令之间自由流动。这样,你可以将一个命令的输出作为另一个命令的输入,从而在命令之间传递和处理数据。

  3. 实例:以下是一个简单的示例,说明如何使用管道来处理数据。假设你有一个包含文本的文件 data.txt,你可以使用以下命令来查找其中包含特定关键词的行并对其进行排序:

    cat data.txt | grep "关键词" | sort

    这个命令首先使用 cat 命令显示文件内容,然后将其输出通过管道传递给 grep 命令,以查找包含关键词的行,最后将 grep 的输出通过管道传递给 sort 命令,以对结果进行排序。

  4. 数据处理:管道允许你使用多个命令来处理和转换数据。你可以将多个命令组合在一起,以便进行筛选、排序、计数、格式化等各种操作。

  5. 灵活性:管道是 Linux 系统中的强大工具,使你能够以不同的方式组合命令来执行各种任务。它提供了很大的灵活性,允许你根据需要创建复杂的数据处理流程。

总之,Linux 管道符 | 是一个强大的工具,用于将命令串联在一起,以便处理和转换数据流。通过合理使用管道,你可以在 Linux 系统上高效地执行各种数据处理任务。

调用历史指令 !

在Linux命令行中,!符号通常用于执行历史命令的扩展和引用。具体来说,!后面可以跟随不同的操作,以便执行以前使用过的命令。以下是一些常见用法和作用:

  1. 执行上一条命令:使用!!可以快速执行上一条命令,而不必重新输入它。例如:

    $ ls -l
    $ !! # 等同于使用ls -l

    上面的!!将再次执行ls -l命令。

  2. 执行带有特定前缀的命令:你可以使用!后面跟随特定前缀来执行最后一个以该前缀开头的命令。例如,如果你之前运行了多个grep命令,可以使用!grep来执行最后一个grep命令。

  3. 执行历史中的特定命令:使用!后面可以跟随一个数字,来执行历史中对应位置的命令。例如,!5将执行历史中的第五个命令。

  4. 执行包含特定字符串的命令:你可以使用!后面跟随一个字符串,以执行包含该字符串的最后一个命令。例如,如果你之前运行了多个命令包含了单词"error",你可以使用!error来执行最后一个包含"error"的命令。

输出重定向 >

输出重定向是一种将命令的标准输出(通常是显示在终端上的结果)重定向到文件或另一个设备的过程。这允许你将命令的输出保存到文件中,而不是在屏幕上显示它,或者将输出发送到另一个命令或设备中。

ip addr>ip.txt #将ip addr的标准输出保存到ip.txt中

! 不过需要格外注意的是,输出重定向符号会完全覆盖原本文件中的内容。想要保留原本文件内容需要使用 >> 将ip输出追加到文件中。

ip addr>>ip.txt #将ip addr的标准输出追加保存到ip.txt中

也可以在输出重定向左侧什么也不输入达到清空文件内容的效果

>ip.txt

标准错误输出

如果指令执行错误,可以将错误的结果输出到文件中。

ip abbr 1>ip.txt 2>error.txt # 如果指令执行正确将结果保存在ip.txt中 错误则保存在error.txt中
ip abbr 1>>ip.txt 2>>error.txt # 同样可以使用追加重定向符号

输入重定向 <

在Linux中,输入重定向是一种将命令的输入从键盘或标准输入设备重定向到文件或另一个命令的过程。这允许你从文件中读取数据,而不是手动输入,或者将一个命令的输出作为另一个命令的输入。

head -10 < xiaoshuo.txt #将小说的内容交给head处理 因为head有-10参数所以只会输出小说的前10行

追加输入

head -3 << 0 #可以输入多行内容直到碰到0按下回车结束

注释

用于注释指令 #号后面内容不执行

命令分割 ;

用于一次性多次执行指令

ls;ps -ef #先执行ls 后执行ps 可以衔接更多

系统优化

现在的操作系统需要优化的地方不多了,甚至直接就可以使用,之前的老系统都需要好多优化才行。

#1.优化ssh,以防连接过慢
vi /etc/ssh/sshd_config  # 改配置文件之前,最好先做好备份,cp /etc/ssh/sshd_config
/etc/ssh/sshd_config.bak
#79行:GSSAPIAuthentication no
#115行:UseDNS no  # 别忘了删除前面的注释符号#
systemctl restart sshd

2.优化selinux
#修改配置文件,永久关闭
vi /etc/selinux/config
#第7行修改为
SELINUX=disabled
#需要重启生效
#立即生效,临时的 #有时候有些服务器不让重启,就可以先这样临时用一下
setenforce 0

#3.关闭firewalld
systemctl stop firewalld
systemctl disable firewalld

#4.安装常用软件
yum install lrzsz vim tree wget net-tools screen bash-completion tcpdump -y
# net-tools:网络相关工具,比如ifconfig、ifconfig ens33(只看某个网卡的ip),rpm -qa是查看
安装了哪些rpm包,具体这个软件有哪些命令,可以通过rpm -ql net-tools来查看。
# screen:屏幕工具。
 # 我们以后可能要远程连接某个服务器,比如服务器在国外,那么我们通过本地xshell等远程连接到目
标服务器,那么中间有要经过很多个网络设备的传输,很容易断掉连接,如果我们正在执行某个程序,突然断
开连接了,那么我们执行的程序也会自动中断,如果我们不想让程序终端,就可以用到screen命令了。
   [root@localhost ~]# screen # 会单独再给我们开启一个终端
   [root@localhost ~]# sleep 100
    # 然后模拟一下,断开连接,在重新连接回来,还可以通过screen恢复到之前的窗口状态,发现程序还
在继续执行着。
   [root@localhost ~]# screen -ls
   There is a screen on:
        16389.pts-1.localhost (Detached)
    1 Socket in /var/run/screen/S-root.
   [root@localhost ~]# screen -r 16389 # 恢复窗口
    # 所以当网络不稳定的时候最好用screen来操作。
# bash-completion:这个软件很神奇,叫做超级自动补全。这个包安装完之后,要重新登录一下才行。
# 这个工具是tab键的加强版,输入-然后再使用tab的时候可以提示我们有哪些参数了,也就是提示信息更全
了。
[root@localhost ~]# find /etc/ -size 10k -
-amin                   -ignore_readdir_race    -path
-anewer                 -ilname                 -perm
-atime                  -iname                  -print
# 再比如我们想下载某个软件,我记得好像是psm,然后一个tab键就自动补全包名了

[CSS小技巧] 多行文本垂直居中

一般我们进行文本居中对齐我们会给文本标签设置行高的属性使文本在容器内居中对齐。

.box{
   height:200px;
}
.box span{
  line-height:200px;
}

但是一旦文本换行产生多行时行高属性就会破坏布局,这里我提供两种方法解决并且实现效果。
文本垂直居中问题.png

解决方案一
父元素使用display: table;,子元素使用display:table-cell属性模拟表格,随后设置vertical-align: middle即可实现多行垂直居中。
文本垂直居中问题-解决方案1.png

解决方案二
父元素使用flex布局,更改主軸方向为垂直,随后设置flex对齐方式居中即可。
文本垂直居中问题-解决方案2.png

[Vue 原生JS] flex布局最后一行元素左对齐

在开发过程中使用flex布局经常会遇到最后一行不满足个数导致布局混乱的问题如下:
Screenshot_20211007_044538.png

可以看到因为使用了 justify-content: space-between; 确实实现了平均分配但是最后一行我们希望他靠左对齐并且还拥有间距这时怎么办?
这里我们可以计算出差多少能填满该行,以达到效果。
具体算法如下:
列数减去(数据长度)余列数 即:col-(serveData.length)%col
演算一下,假设服务端有18条数据 前端dom结构5列1行即:
5-18= -13
-13%5= 2
至此我们计算出了还差多少元素填满,我们使用vue的话可以直接新增一个循环,向后追加空元素。
我们还需考虑到服务器返回的数据正好满足前端列数的填充终止追加。

<li style="background: none" v-for="(item,index) in 5-(serveData.length)%5" :key="index" v-if="(serveData.length)%5 > 0"></li>


按照这个思路原生js代码如下:

其实更好的解决方案是使用grid布局,因为不会产生额外的dom。

但是在微信小程序中或者uniapp对都卿点flex布局,所以还是需要掌握。

不想要额外的dom结构并且还使用flex可以自己按照上面的思路封装一个方法,取出最后一排元素不进行flex布局,改为传统的内联块配合边距。

光速入门HTML

HTML基础

本文内容过多推荐使用typora阅读器打开文档,获取更优质的阅读体验。
文档下载
配套Demo
[TOC]

HTML是什么

超文本标记语言(英语:Hyper Text Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。HTML是一种基础技术,常与CSSJavaScript一起被众多网站用于设计网页、网页应用程序以及移动应用程序的用户界面。网页浏览器可以读取HTML文件,并将其渲染成可视化网页。HTML描述了一个网站的结构语义随着线索的呈现,使之成为一种标记语言而非编程语言

HTML元素是构建网站的基石。HTML允许嵌入图像与对象,并且可以用于创建交互式表单,它被用来结构化信息——例如标题、段落和列表等等,也可用来在一定程度上描述文档的外观和语义。HTML的语言形式为尖括号包围的HTML元素(如<html>),浏览器使用HTML标签和脚本来诠释网页内容,但不会将它们显示在页面上。

HTML可以嵌入如JavaScript脚本语言,它们会影响HTML网页的行为。网页浏览器也可以引用层叠样式表(CSS)来定义文本和其它元素的外观与布局。维护HTML和CSS标准的组织万维网联盟(W3C)鼓励人们使用CSS替代一些用于表现的HTML元素。

引用自维基百科

HTML文档结构

<!doctype html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>HELLO WORLD</title>
</head>
<body>

</body>
</html>

首先要明白html文档是以标签组合编写的标签又分为单闭合标签以及双闭合标签,以上面的Demo meta等,单独存在的就是单闭合标签,成对出现的则是多闭合标签例如 html head body等。 但请注意 !doctype 声明不属于 HTML 标签他是一条指令告诉浏览器编写页面使用的HTML版本。

doctype

<!doctype html>

<!DOCTYPE>声明必须位于 HTML5 文档中的第一行,也就是位于html标签之前。该标签告知浏览器文档所使用的 HTML 规范。

虽然在本文档中所提及的代码均是HTML4规范但是这里依然使用了HTML5的声明,其原因是文档标准可以向下兼容。而且HTML4的文档声明又吃臭又长即:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

这只是其中一种,还有两种不展开了也没必要。

html

<html lang="zh-CN">
    ...
</html>

此元素可告知浏览器其自身是一个 HTML 文档。

<html></html> 标签限定了文档的开始点和结束点,在它们之间是文档的头部 head 和主体 body

lang="zh-CN"用法为标签属性与属性值,也就是html可以定义语言属性告知浏览器您的网站主体内容是什么语言编写(有的浏览器会检测本地语言与网页语言定义不一致会触发翻译功能 例如chrome浏览器)。

/2021/09/22/zA5g2JbRQkYZFHy.png图像异常

/2021/09/22/A54rfDaTN2uUz8n.png图像异常

其中 lang 是属性 zh-CN 为属性值,即为中文。

ISO 语言代码

HTML ISO 国家/地区代码参考手册

head

<head>
    <meta charset="UTF-8">
    <title>HELLO WORLD</title>
</head>

head中一般是进行声明或者引用的地方,例如声明网页的字符集合,网站标题,引入css、js等(当然js最好放置到文档末端以防止js载入阻塞影响网页视图)。

可以这么抽象理解 head里的内容就是一个人的姓名 年龄 血型等虽然不能直接识别出来,但事实上是存在且起作用的。

meta

<head>
    <meta charset="UTF-8">
    ...
</head>

<meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词,字符集设定等。

<meta> 标签位于文档的头部,不包含任何内容。<meta> 标签的属性定义了与文档相关联的名称/值对。

在以上demo中使用了 charset属性设置文档字符集为 UTF-8 不设定字符集可能会导致文本异常出现乱码,所以必须声明。

关于meta其他属性用法

关于字符集

title

<head>
    <title>HELLO WORLD</title>
    ...
</head>

title标签定义了网页在浏览器中tab标签上的文本

body

body中包含网页中所有可见元素。

如果head是人的抽象属性body则是一个人的具体属性例如 性别 头发长度 眼睛大小等。

<body>
    ...
</body>

文本级标签

指在网页中显示文本作用的标签

标题标签

HTML中可以定义6种不同程度的标题标签 他们的默认文本的大小,粗细都不一致,例如:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>标题标签使用</title>
</head>
<body>
    <h1>一级标题</h1>
    <h2>二级标题</h2>
    <h3>三级标题</h3>
    <h4>四级标题</h4>
    <h5>五级标题</h5>
    <h6>六级标题</h6>
</body>
</html>

段落标签

p标签全称paragraph译为段落

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>段落标签</title>
</head>
<body>
    <p>我是一个段落可以帮助你给内容分段~</p>
    <p>哦,楼上你我确实分段了!</p>
</body>
</html>

与标题标签组合demo:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>段落标签</title>
</head>
<body>
    <h1>赤壁赋</h1>
    <h3>【作者】苏轼 </h3>
    <p>
        壬戌之秋,七月既望,苏子与客泛舟游于赤壁之下。清风徐来,水波不兴。举酒属客,诵明月之诗,歌窈窕之章。少焉,月出于东山之上,徘徊于斗
        牛之间。白露横江,水光接天。纵一苇之所如,凌万顷之茫然。浩浩乎如冯虚御风,而不知其所止;飘飘乎如遗世独立,羽化而登仙。
    </p>
    <p>
        于是饮酒乐甚,扣舷而歌之。歌曰:“桂棹兮兰桨,击空明兮溯流光。渺渺兮予怀,望美人兮天一方。”客有吹洞箫者,倚歌而和之。其声呜呜然,
        如怨如慕,如泣如诉,余音袅袅,不绝如缕。舞幽壑之潜蛟,泣孤舟之嫠妇。
    </p>
    <p>
        苏子愀然,正襟危坐而问客曰:“何为其然也?”客曰:“月明星稀,乌鹊南飞,此非曹孟德之诗乎?西望夏口,东望武昌,山川相缪,郁乎苍苍,
        此非孟德之困于周郎者乎?方其破荆州,下江陵,顺流而东也,舳舻千里,旌旗蔽空,酾酒临江,横槊赋诗,固一世之雄也,而今安在哉?况吾与子
        渔樵于江渚之上,侣鱼虾而友麋鹿,驾一叶之扁舟,举匏樽以相属。寄蜉蝣于天地,渺沧海之一粟。哀吾生之须臾,羡长江之无穷。挟飞仙以遨游,
        抱明月而长终。知不可乎骤得,托遗响于悲风。”
    </p>
    <p>
        苏子曰:“客亦知夫水与月乎?逝者如斯,而未尝往也;盈虚者如彼,而卒莫消长也。盖将自其变者而观之,则天地曾不能以一瞬;自其不变者而观
        之,则物与我皆无尽也,而又何羡乎!且夫天地之间,物各有主,苟非吾之所有,虽一毫而莫取。惟江上之清风,与山间之明月,耳得之而为声,目遇
        之而成色,取之无禁,用之不竭,是造物者之无尽藏也,而吾与子之所共适。”
    </p>
    <p>
        客喜而笑,洗盏更酌。肴核既尽,杯盘狼籍。相与枕藉乎舟中,不知东方之既白。
    </p>
</body>
</html>

注意代码中的换行并不会让网页视图中文本换行,这是html的一个空白折叠特性导致的。

空白折叠

在源代码中的连续空白字符(空格、换行、制表符tab),在页面显示时,会被折叠为一个空格。

<pre>标签中中的内容不会出现空白折叠,会按照源码中的格式显示到页面上,一般用来显示代码。

demo:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>段落标签</title>
</head>
<body>
    <h1>赤壁赋</h1>
    <h3>【作者】苏轼 </h3>
    <pre>
壬戌之秋,七月既望,苏子与客泛舟游于赤壁之下。清风徐来,水波不兴。举酒属客,诵明月之诗,歌窈窕之章。少焉,月出于东山之上,徘徊于斗牛之间。白露横江,水光接天。纵一苇之所如,凌万顷之茫然。浩浩乎如冯虚御风,而不知其所止;飘飘乎如遗世独立,羽化而登仙。
于是饮酒乐甚,扣舷而歌之。歌曰:“桂棹兮兰桨,击空明兮溯流光。渺渺兮予怀,望美人兮天一方。”客有吹洞箫者,倚歌而和之。其声呜呜然,如怨如慕,如泣如诉,余音袅袅,不绝如缕。舞幽壑之潜蛟,泣孤舟之嫠妇。
苏子愀然,正襟危坐而问客曰:“何为其然也?”客曰:“月明星稀,乌鹊南飞,此非曹孟德之诗乎?西望夏口,东望武昌,山川相缪,郁乎苍苍,此非孟德之困于周郎者乎?方其破荆州,下江陵,顺流而东也,舳舻千里,旌旗蔽空,酾酒临江,横槊赋诗,固一世之雄也,而今安在哉?况吾与子渔樵于江渚之上,侣鱼虾而友麋鹿,驾一叶之扁舟,举匏樽以相属。寄蜉蝣于天地,渺沧海之一粟。哀吾生之须臾,羡长江之无穷。挟飞仙以遨游,抱明月而长终。知不可乎骤得,托遗响于悲风。”
苏子曰:“客亦知夫水与月乎?逝者如斯,而未尝往也;盈虚者如彼,而卒莫消长也。盖将自其变者而观之,则天地曾不能以一瞬;自其不变者而观之,则物与我皆无尽也,而又何羡乎!且夫天地之间,物各有主,苟非吾之所有,虽一毫而莫取。惟江上之清风,与山间之明月,耳得之而为声,目遇之而成色,取之无禁,用之不竭,是造物者之无尽藏也,而吾与子之所共适。”客喜而笑,洗盏更酌。肴核既尽,杯盘狼籍。相与枕藉乎舟中,不知东方之既白。
    </pre>
</body>
</html>

这种方法会在网页中按照源码内容缩进空格等展示,但是这种方法会破坏文档结构使其难以维护,并不推荐用来展示常规文本内容!

如果想要在内容中插入连续多个空格可以使用转移字符,例如:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>段落标签</title>
</head>
<body>
    <p>芙兰   达</p>
</body>
</html>

这里的    就是一个转义字符 指代空格,更多[转义字符](## 转移字符)在下边有提到。

span标签

span 标签被用来组合文档中的行内元素。

<p>壬戌之秋,<span>七月既望</span>,苏子与客泛舟游于赤壁之下。</p>

如果不对 span 应用样式,那么 span 元素中的文本与其他文本不会任何视觉上的差异。尽管如此,上例中的 span 元素仍然为 p 元素增加了额外的结构。

我们可以给span单独设置样式,达到重点的效果。(这一部分使用到了内联css)

<p>壬戌之秋,<span style="color:red">七月既望</span>,苏子与客泛舟游于赤壁之下。</p>

强调标签

在网页中想突出某几个字可以使用强调标签。em表示强调 strong表示更强烈的强调,多用于关键词提醒,价格等。

strong

<p>推理根本没有什么高低,更没有什么胜负。这是因为……<strong>因为真相永远只有一个!</strong></p>    

被strong包裹起来的部分加粗了。

em

<p>推理根本没有什么高低,更没有什么胜负。这是因为……<strong>因为真相永远只有一个!</strong>  ----<em>江户川柯南</em></p>

被em包裹起来的部分变成斜体了。

图像标签

<!--相对路径-->
<img src="./img/bgc3.jpg" alt="图像载入失败">
<!--绝对路径-->
<img src="file:///home/f_picacho/Code/HTML/demo/img/bgc3.jpg" alt="图像载入失败">
<!--网络路径-->
<img src="https://th.bing.com/th/id/OIP.FC3KxFuGel1fFAh-2HHMhQHaEo?pid=ImgDet&rs=1" alt="图像载入失败">

关于html中路径用法在下方关于路径中有提到。

src 属性填写图像地址 alt属性则为读取图像失败后提示文本。

其他常用属性例如 width height 调整图像宽高。

超链接标签

a标签 即anchnro锚点,指的是一个位置到另外一个位置的跳转关系,多用于跳转至其他网站或者页面或本页面特定位置。

基本使用

<a href="https://baidu.com">百度一下</a>

a 标签内使用 href 属性指定要跳转的协议以及地址。

在上面这个案例当中 https 是访问协议其他的还有例如 http: ftp: file: javascript:等等...

后面的部分则是执行结果渲染的页面。在基本使用中简单的理解成,跳转的位置即可。

使用 target 属性,使页面在浏览器中新的页面打开。

<a href="https://baidu.com" target="_blank">百度一下</a>

使用锚点在页面中跳转

要想看出效果得先撑高页面高度,这里直接使用css。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>超链接使用</title>
</head>
<body>
    <a href="#koko">页面内跳转</a>
    <div style="height: 3000px"></div>
    <p id="koko">我在这里~</p>
    <div style="height: 3000px"></div>
</body>
</html>

要跳转的目标首先帮顶一个 id 属性,其次在 a 标签内 href 属性内填写 #id 即可。

使用协议让超链接进行不同的行为

使用不同的协议可以使a标签表现不同的行为,例如发送邮件,拨打电话,下载文件等等...

<a href="mailto:fpicachodl@gmail.com">发送邮件</a>
<a href="tel:18888888888">拨打电话</a>

排版级标签

指在网页中帮助布局排版的标签

换行/分割标签

br换行,hr分割

br

br可以指定内容进行换行,不会产生空白折叠现象。

<!doctype html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>换行与分割标签使用</title>
</head>
<body>
    <h1>月下独酌四首·其一</h1>
    <h3>李白</h3>
    <p>
        花间一壶酒,独酌无相亲。<br>
        举杯邀明月,对影成三人。<br>
        月既不解饮,影徒随我身。<br>
        暂伴月将影,行乐须及春。<br>
        我歌月徘徊,我舞影零乱。<br>
        醒时相交欢,醉后各分散。<br>
        永结无情游,相期邈云汉。
    </p>
</body>
</html>

br在想要换行的位置添加即可换行,但请注意 br 是一个单闭合标签。

hr

hr标签可以插入一个分割线,区分上下文或布局。

<!doctype html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>换行与分割标签使用</title>
</head>
<body>
    <h1>月下独酌四首·其一</h1>
    <h3>李白</h3>
    <hr>
    <p>
        花间一壶酒,独酌无相亲。<br>
        举杯邀明月,对影成三人。<br>
        月既不解饮,影徒随我身。<br>
        暂伴月将影,行乐须及春。<br>
        我歌月徘徊,我舞影零乱。<br>
        醒时相交欢,醉后各分散。<br>
        永结无情游,相期邈云汉。
    </p>
</body>
</html>

列表标签

HTML支持有序列表、无序列表、定义列表三种,在开发过程中多用于内容展示或排版。

无序列表

无序列表会在列表项前追加一个实心圆圈。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>列表标签使用</title>
</head>
<body>
    <!--无序列表-->
    <h1>2020十大傻雕新闻</h1>
    <ul>
        <li>一大仙在公安局“跳大神” 对周围人发功说:“你今晚必死无疑”</li>
        <li>广西两男子为博领导赏识,多次挖领导祖坟盗尸骨,说是想等领导找不到时拿出来“邀功”</li>
        <li>男子爬到山顶举起手杖 指天大喊:赐予我力量吧 结果被雷劈了</li>
        <li>男子与情人同居2年卷走15万 把钱全都上交老婆称是工资</li>
        <li>江苏男子连偷三晚玉米 没工具纯靠手捧了2400多趟 总共偷走1200余斤</li>
        <li>女子女扮男装 与2任女友同居5年 诈骗100多万元</li>
        <li>小偷夜晚入室盗窃 想学影视剧用“手刀”敲晕主人 结果给人打醒了</li>
        <li>男子嫌上次关押时间短 没学会缝纫技术 遂再次盗窃回去学技术</li>
        <li>安徽一女子 因家里人多厕所不够用 偷走移动公厕</li>
        <li>“强迫症”犯人被判9年8个月 当庭上诉要求判十年整</li>
    </ul>
</body>
</html>

使用 ul 定义无序列表,内嵌套 li 定义列表项目。

有序列表

有序列表会根据代码自上而下的顺序自动追加顺序数字,从1开始。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>列表标签使用</title>
</head>
<body>
    <!--有序列表-->
    <h1>2020十大傻雕新闻</h1>
    <ol>
        <li>一大仙在公安局“跳大神” 对周围人发功说:“你今晚必死无疑”</li>
        <li>广西两男子为博领导赏识,多次挖领导祖坟盗尸骨,说是想等领导找不到时拿出来“邀功”</li>
        <li>男子爬到山顶举起手杖 指天大喊:赐予我力量吧 结果被雷劈了</li>
        <li>男子与情人同居2年卷走15万 把钱全都上交老婆称是工资</li>
        <li>江苏男子连偷三晚玉米 没工具纯靠手捧了2400多趟 总共偷走1200余斤</li>
        <li>女子女扮男装 与2任女友同居5年 诈骗100多万元</li>
        <li>小偷夜晚入室盗窃 想学影视剧用“手刀”敲晕主人 结果给人打醒了</li>
        <li>男子嫌上次关押时间短 没学会缝纫技术 遂再次盗窃回去学技术</li>
        <li>安徽一女子 因家里人多厕所不够用 偷走移动公厕</li>
        <li>“强迫症”犯人被判9年8个月 当庭上诉要求判十年整</li>
    </ol>
</body>
</html>

使用 ol 定义无序列表,内嵌套 li 定义列表项目。

定义列表

定义列表就相对抽象一点,dl声明一个定义列表,内嵌套 dt 定义列表中的项目 dd 描述列表中的项目。

一个定义列表可以嵌套多组列表项和项目。

例如下图的苹果官网的footer部分就使用了定义列表(实际上是lable实现的,但是定义列表或者table标签结合css也可以达到同样的效果)。

/2021/09/23/jq2avJKO4T3P17y.png图像异常

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>列表标签使用</title>
</head>
<body>
    <!--定义列表-->
    <dl>
        <dt>选购及了解</dt>
        <dd>Mac</dd>
        <dd>iPad</dd>
        <dd>iPhone</dd>
        <dd>Watch</dd>
        <dd>Music</dd>
        <dd>AirPods</dd>
        <dd>HomePod mini</dd>
        <dd>iPod touch</dd>
        <dd>AirTag</dd>
    </dl>
</body>
</html>

表格标签

在hrml中想要实现类似于excel表格效果或者更为复杂的表格例如淘宝的购买清单,可以使用 table 标签

Screenshot_20210923_125954.png

一个完整的表格需要四部分组成分别是 table tr th td

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>表格标签使用</title>
</head>
<body>
    <table>
        <tr>
            <th>产品名称</th>
            <th>品牌</th>
            <th>数量</th>
            <th>入库时间</th>
        </tr>
        <tr>
            <td>电视机</td>
            <td>海尔</td>
            <td>500</td>
            <td>2021-10-1</td>
        </tr>
        <tr>
            <td>手机</td>
            <td>三星</td>
            <td>600</td>
            <td>2021-10-1</td>
        </tr>
        <tr>
            <td>自行车</td>
            <td>上海</td>
            <td>1000</td>
            <td>2021-10-1</td>
        </tr>
    </table>
</body>
</html>

table声明一个表格 tr 指每一行的内容 th 表示单元格表头 td表示单元项目。

表格属性

我们也可以使用table标签属性 border添加表格边框

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title border="1">表格标签使用</title>
</head>
<body>
    <table>
        ...
    </table>
</body>
</html>

但是请注意 border 熟悉已被web标准弃用,并且推荐使用css方式添加。虽然已经被弃用,但是一些浏览器仍然可以使用该属性,可以但不推荐 相关链接

使用 cellspacing 熟悉定义边框间距。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title border="1" cellspacing="0">表格标签使用</title>
</head>
<body>
    <table>
        ...
    </table>
</body>
</html>

同样这个属性也被弃用了,并且推荐使用css方式修改,相关链接

1px表格实现

上面的两个熟悉确实是把两条线的边框变成一条线了,但是实际上我们是通过调整两条边框之间的间距实现的,事实上边框是2px很不美观。

要实现1px边框必须借助css,这里就简单的写一些css。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>表格标签使用</title>
    <style>
        table{
            background: red;
        }
        table tr,td{
            background: #fff;
        }
    </style>
</head>
<body>
    <table border="0" cellspacing="1">
        <tr>
            <th>产品名称</th>
            <th>品牌</th>
            <th>数量</th>
            <th>入库时间</th>
        </tr>
        <tr>
            <td>电视机</td>
            <td>海尔</td>
            <td>500</td>
            <td>2021-10-1</td>
        </tr>
        <tr>
            <td>手机</td>
            <td>三星</td>
            <td>600</td>
            <td>2021-10-1</td>
        </tr>
        <tr>
            <td>自行车</td>
            <td>上海</td>
            <td>1000</td>
            <td>2021-10-1</td>
        </tr>
    </table>
</body>
</html>

相比之前的demo我们在 head 中添加了一个 style 标签用于编写该页面的样式表,随后使用 border cellspacing 两个属性调整边框大小以及间距,最后在css中添加背景色。感觉上出现了1px的边框 实际上是边距+背景色的实现效果。关于css这里不过多展开。

表格标题

使用 caption 标签为你的表格添加标题。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>表格标签使用</title>
</head>
<body>
    <table>
        <caption>商品列表</caption>
        <tr>
            <th>产品名称</th>
            <th>品牌</th>
            <th>数量</th>
            <th>入库时间</th>
        </tr>
        <tr>
            <td>电视机</td>
            <td>海尔</td>
            <td>500</td>
            <td>2021-10-1</td>
        </tr>
        <tr>
            <td>手机</td>
            <td>三星</td>
            <td>600</td>
            <td>2021-10-1</td>
        </tr>
        <tr>
            <td>自行车</td>
            <td>上海</td>
            <td>1000</td>
            <td>2021-10-1</td>
        </tr>
    </table>
</body>
</html>

合并行列

使用 colspan 进行列合并 使用 rowspan 进行行合并

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>表格标签使用</title>
</head>
<body>
    <table border="0" cellspacing="1">
        <caption>商品清单</caption>
        <tr>
            <th>产品名称</th>
            <th>品牌</th>
            <th colspan="2">数量和入库时间</th>
        </tr>
        <tr>
            <td>电视机</td>
            <td>海尔</td>
            <td>500</td>
            <td>2021-10-1</td>
        </tr>
        <tr>
            <td>手机</td>
            <td rowspan="2">三星</td>
            <td>600</td>
            <td>2021-10-1</td>
        </tr>
        <tr>
            <td>自行车</td>
            <td>1000</td>
            <td>2021-10-1</td>
        </tr>
    </table>
</body>
</html>

两个属性的属性值均为合并的单元格数量。

表单标签

表单通常用户将前台数据发送至后端进行操作,需要一些服务器相关知识,这里不过多展开。这里只介绍相关展示控件为后续铺路。

使用form标签声明一块表单域,在表单域中使用表单组件

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>表单使用</title>
</head>
<body>
    <form action="">
        表单控件 例如输入框 单选框 复选框...
    </form>
</body>
</html>

注意 form标签有两个常用属性分别是 action 指你要把这些数据提交到哪里。

method指的是请求方式,通常就两种请求方式 GETPOST

将数据以post的方式提交至bilibili就像如下:

<form action="https://www.bilibili.com/" method="POST">
    <input type="text">
    <input type="submit" value="立即注册">
</form>

在form表单中使用input标签定义一个表单项,使用value制定项目类型。例如上方的demo,分别是一个文本输入框text和表单提交按钮submit。

根据不同的 type 属性值,输入字段拥有很多种形式。输入字段可以是文本字段、复选框、掩码后的文本控件、单选按钮、按钮等等。

输入框

输入框常用于搜集用户输入信息,例如账户密码等等....

<form action="https://www.bilibili.com/" method="POST">
    <!-- 普通文本输入框 -->
    <input type="text" placeholder="请输入用户名">
    <!-- 密码输入框 -->
    <input type="password" placeholder="请输入密码">
</form>

placeholder是输入值为空时的提示,placeholder中的内容不会被提交至服务器。

单选框

常用于在一定规定范围内单选选择,例如性别,血型等..

<form action="https://www.bilibili.com/" method="POST">
    <div>
        男:<input type="radio" name="sex">
        女:<input type="radio" name="sex">
     </div>
     <input type="submit" value="立即注册">
</form>

需要注意 必须给radio组件设置name属性设置相同属性值才能产生互斥效果。

上面的demo使用了div标签辅助布局将两个单选框归类以方便后期维护排版。

复选框

常用于在一定规定范围内多选,例如“选出你最喜欢的几个作品” "兴趣爱好"等等...

<form action="https://www.bilibili.com/" method="POST">
    ...
    <div>
        抽烟 <input type="checkbox">
        喝酒 <input type="checkbox">
        烫头 <input type="checkbox">
        上网 <input type="checkbox">
        姑娘 <input type="checkbox">
    </div>
    ...
</form>

下拉列表

常用于在一定范围内选择且数据量大不方便展示时,例如地区选择。

<form action="https://www.bilibili.com/" method="POST">
    ...
    <select>
        <option>北京</option>
        <option>上海</option>
        <option>广州</option>
        <option>牡丹江</option>
    </select>
    ...
</form>

下拉列表是一个独立的标签 并不是input的一个属性需要注意。select声明列表框,option声明列表项。

可以在select上添加multiple="multiple" 属性实现多选。

多行文本输入

常用于大量文本输入,例如文章编辑,个人介绍等等...

<form action="https://www.bilibili.com/" method="POST">
    ...
    <textarea cols="30" rows="10"></textarea>
    ...
</form>

textarea标签定义一个文本域,输入内容可以自动换行,自行放大缩小。

可以使用cols rows指定默认的宽高

formButton

在表单中有两种按钮可以使用 分别是type=submit的提交行为按钮,另外一种就是 type=resect 的重置表单行为按钮。

<form action="https://www.bilibili.com/" method="POST">
    ...
    <input type="submit" value="立即注册">
    <input type="reset" value="重置">
    ...
</form>

使用value可以指定按钮文本。

lable标签应用

label 元素不会向用户呈现任何特殊效果。不过,它为鼠标用户改进了可用性。如果您在 label 元素内点击文本,就会触发此控件。就是说,当用户选择该标签时,浏览器就会自动将焦点转到和标签相关的表单控件上。

label 标签的for 属性应当与相关元素的 id 属性相同。

<form action="https://www.bilibili.com/" method="POST">
    ...
    <label for="name">用户名</label>
    <input type="text" placeholder="请输入用户名" id="name"> <br>
    <label for="pwd">密码</label>
    <input type="password" placeholder="请输入密码" id="pwd">
    ...
</form>

完整表单

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>表单使用</title>
</head>
<body>
    <form action="https://www.bilibili.com/" method="POST">
        <label for="name">用户名</label>
        <input type="text" placeholder="请输入用户名" id="name"> <br>
        <label for="pwd">密码</label>
        <input type="password" placeholder="请输入密码" id="pwd"> <br>
        <div>
            男:<input type="radio" name="sex">
            女:<input type="radio" name="sex">
        </div>
        <div>
            抽烟 <input type="checkbox">
            喝酒 <input type="checkbox">
            烫头 <input type="checkbox">
            上网 <input type="checkbox">
            姑娘 <input type="checkbox">
        </div>
        <div>
            <span>地区</span>
            <select>
                <option>北京</option>
                <option>上海</option>
                <option>广州</option>
                <option>牡丹江</option>
            </select>
        </div>
        <textarea cols="30" rows="10"></textarea>

    </form>
</body>
</html>

容器标签

div标签没有直接的视觉效果,他的主要作用是进行“分类”,可以把文档内容分割为独立的、不同的部分。它可以用作严格的组织工具,并且不使用任何格式与其关联。

在之前的表单demo中有使用过。

转移字符

在段落一节中我们使用过转意字符去解决html中无法输入连续的空格问题。转义字符有很多,但是不用完全记住,只需要记住几个常用的就好,剩余的用到了再查询。

在 HTML 中,某些字符是预留的。

在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签。

如果希望正确地显示预留字符,我们必须在 HTML 源代码中使用转义字符(character entities)。

引用自 w3school

!但请注意转义字符对大小写敏感,例如 &COPy; 就是一个错误写法。

常用转义字符

字符 十进制 转义字符
" " "
& & &
< < <
> > >
不断开空格(non-breaking space)    
版权声明 © ©

全部转义字符对照表

关于路径

相对路径与绝对路径

关于语义化

标签语义化即“什么情况下使用此标签合理”

举个例子:?

网页中文章标题可以使用标题标签 即h1~h6标签,文章段落放置到p标签内,文章中使用强调语气尽量使用em或者strong标签等等...

当然H5(HTML5)标准引入了更多语义化标签,这里不过多展开,以上标签配合CSS足够使用。

说了这么多语义化,他到底有什么好处?

  • 更容易被搜索引擎收录
  • 更容易让屏幕阅读器读出网页内容
  • 更易于开发者后期维护

标签的作用

  • 使网站结构更加清晰
  • 网站制作的基石
  • 被搜索引擎收录

题外话

Q:为什么不介绍H5标签?

A:本文档仅帮助新手快速入门,H5标签虽然不多也不复杂,但是想用好H5标签多半需要JS去操作,例如媒体标签虽然是“开箱及用”但是真正的企业项目大多数都要用js封装重新操作一遍,以维持不同浏览器下的样式或迁就业务逻辑等。还有绘图标签canvas等,没有js基础根本玩不了,徒增学习压力,没必要。至于H5的文章会写但不是现在。

Q:没有编程基础或者不是相关专业是不是学起来很难?

A:并没有 我艺术生大学专业数字媒体虽然也有前端网页制作的课程但是讲的很浅,说实话真的不如再寝室自己学,事实上我大部分都是在寝室自学。课上内容作为入门确实可以,但是进阶还是得靠自己。假如课堂上没有相关课程可以自己去网上搜索教程入门这里我推荐一个up主 小马哥_老师 我的文档内容也多半来源于这位老师的课程。

Q:既然有视频了我为什么要看文档or写文档?

A:确实新手入门看视频是最好的选择,因为我觉得编程这个东西入门和精通很难,但是会确实是很简单的。没有一个人引导你入门,自己找方向是很困难的。至于文档是提升的手断,毕竟看视频获取信息速度慢,而且身为一个程序员也得锻炼自己看文档的能力,包括我现在总结写出来的文档,都是锻炼提升的过程。

Q:关于更新频率

A:H4的内容很少大概一天就能完事,但是css js的内容会很多,不可能一天之内更新出来。但是博客和公众号会保持一天一更的频率更新,会定期分享一些代码片段。

结束

作者:F_picacho

校验:F_picacho

团队:登阳自行车研发中心

首发于:F_picachoの领域

同步发表:登阳自行车研发中心微信公众号

感谢:刘建伟老师小马哥老师白菜、洋洋洋、Web-Tian、此刻你不在。对我在技术之路上的指导。

《某科学的超电磁炮》《精灵宝可梦》系列动画陪伴我无聊的时光。

vueCli3下移动端响应式解决方案

vueCli3下移动端响应式解决方案

flexible

  • 主要是用来响应式改变根元素的字体大小
  • 安装命令 npm install lib-flexible --save
  • 在main.js里面导入命令import 'lib-flexible'

要把index.html里面的<meta name='viewport'>标签删除;因为会自动添加

postcss-plugin-px2rem配置内容解释

  • 将px转换成rem
  • 安装命令 npm i --save postcss-plugin-px2rem
  • 在根目录创建一个名为vue.config.js的文件写入
module.exports = {
  css: {
    loaderOptions: {
      postcss: {
        plugins: [
          require("postcss-plugin-px2rem")({
            rootValue: 37.5, //换算基数,1rem相当于10px,值为37.5时,1rem为20px,淘宝的flex默认为1rem为10px
            exclude: /(node_module)/, //默认false,可以(reg)利用正则表达式排除某些文件夹的方法,例如/(node_module)\/如果想把前端UI框架内的px也转换成rem,请把此属性设为默认值
            mediaQuery: false, //(布尔值)允许在媒体查询中转换px。
            minPixelValue: 3,
          }),
        ],
      },
    },
  },
};

!注意 某些元素不想进行转换可以直接写行内或者使用Px PX绕过postcss-plugin-px2rem

vue3 使用teleport(传送门)组件实现一个模态框

vue3 使用teleport(传送门)组件实现一个模态框

vue3teleport功能类似于reactPortalsportals提供了一种将子节点渲染到存在于父组件以外都dom节点解决方案,vue3teleportreactPortals功能类似,且更加好用。

在vue2下 要实现类似功能需要通过portal-vue库去实现。

我们为什么需要Teleport

teleport是一种能将我们的模板移动到DOM中Vue App之外的技术,有点类似多啦A梦的“传送门”

使用场景:像modalstoast等这样的元素,很多情况下我们将它完全和我们的Vue应用DOM完全剥离,管理起来相反会方便许多

原因在于如果我们嵌套在Vue某个组件内部,那么处理组件的定位、z-index和样式就会变得很困难

另外,像modals,toats等这样的元素需要使用到Vue组件状态的值我们可能需要将状态放入到Vuex中同一管理,而teleport可以直接使用组件的data或prpos。然后在Vue应用范围之外渲染它。

以上引用自Gopal1 Vue 3 任意传送门——Teleport

修改了“另外,想modals.....然后在Vue应用范围之外渲染它”

使用Teleport实现一个模态框Deom

新建一个模态框组件 ./src/components/modal.vue
注意 在Vue3中拥有Fragments特特性可以允许组件存在多个根,所以一下模板写法是合法的。

<template>
  <button @click="modalOpen = true">开启模态框</button>
  <teleport to="body">
    <div v-if="modalOpen" class="modal">
      <div>
        我是一个模态框
        <button @click="modalOpen = false">关闭模态框</button>
      </div>
    </div>
  </teleport>
</template>

<script>
export default {
  data() {
    return {
      modalOpen: false,
    };
  },
};
</script>

注意 teleportVue3中的一个全局组件你可以在任意地方使用

其中的to属性是要把组件下内容挂载到哪里去,参数是一个选择器 我这里就直接挂载到body标签下<teleport to="body"> teleport标签内是你要“传送的内容” 我们可以直接使用模板下的data状态对模态框的显示进行操作。

随后追加上css

<style scopde>
.modal {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background-color: rgba(0, 0, 0, 0.5);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}
.modal div {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  background: white;
  width: 300px;
  height: 300px;
  padding: 5px;
}
</style>

然后你就可以在任意组件使用我们的模态框了但是注意

!如果你是使用Vite构建的项目在引入组件时必须携带组件后缀,让Vite知道该如何处理这个文件

import Modal from "./modal.vue";

然后就可以使用了。

vue多国语言方案

Vue国际化实现方案

原文地址:此刻_你不在

  1. 安装vue-i18n
npm i vue-i18n -S
  1. src/main.js中 实例化/注册`vue-i18n
...
import VueI18n from "vue-i18n"; // 引入组件

Vue.use(VueI18n); //注册组件

const i18n = new VueI18n({
  locale: "zh", //语言标识 默认语言
    // CommonJS规范引入语言文件
  messages: { 
    zh: require("@/assets/lang/zh"),
    en: require("@/assets/lang/en"),
  },
});

new Vue({
  i18n, //在Vue实例上挂在组件
  render: (h) => h(App),
}).$mount("#app");
  1. src/assets目录下创建语言包lang并且创建语言文件
assets  
└─lang
        en.js
        zh.js

生成 tree 视图: tree -I "node_modules|dist" (tree.exe)
assets/lang/zh.js

module.exports = {
  classical: {
    title: "木兰诗",
    content: `唧唧复唧唧,木兰当户织。不闻机杼声,唯闻女叹息。`
  },
};

assets/lang/en.js

module.exports = {
  classical: {
    title: "Mulan Poetry",
    content: `Haw and haw, Magnolia weaving. I don't hear the sound of the loom, but I hear the sigh of the girl.
  },
};

至此 一切准备工作准备完毕,接下来让我们使用它。

在任意组件中可以使用

this.$t('classical.title');

获取当前语言配置版本的文本,在模板中使用{{$t('classical.title')}} 也能达到效果,且更直接。

语言配置切换

methods: {
  chooseLang(langType) {
    this.$i18n.locale = langType;
},

langType参数为src/main.jsmessages的key

附录:各国语言简写

Countries and Regions 国家或地区 *国际域名缩写*
Angola 安哥拉 AO
Afghanistan 阿富汗 AF
Albania 阿尔巴尼亚 AL
Algeria 阿尔及利亚 DZ
Andorra 安道尔共和国 AD
Anguilla 安圭拉岛 AI
Antigua and Barbuda 安提瓜和巴布达 AG
Argentina 阿根廷 AR
Armenia 亚美尼亚 AM
Ascension 阿森松
Australia 澳大利亚 AU
Austria 奥地利 AT
Azerbaijan 阿塞拜疆 AZ
Bahamas 巴哈马 BS
Bahrain 巴林 BH
Bangladesh 孟加拉国 BD
Barbados 巴巴多斯 BB
Belarus 白俄罗斯 BY
Belgium 比利时 BE
Belize 伯利兹 BZ
Benin 贝宁 BJ
Bermuda Is. 百慕大群岛 BM
Bolivia 玻利维亚 BO
Botswana 博茨瓦纳 BW
Brazil 巴西 BR
Brunei 文莱 BN
Bulgaria 保加利亚 BG
Burkina-faso 布基纳法索 BF
Burma 缅甸 MM
Burundi 布隆迪 BI
Cameroon 喀麦隆 CM
Canada 加拿大 CA
Cayman Is. 开曼群岛
Central African Republic 中非共和国 CF
Chad 乍得 TD
Chile 智利 CL
China 中国 CN
Colombia 哥伦比亚 CO
Congo 刚果 CG
Cook Is. 库克群岛 CK
Costa Rica 哥斯达黎加 CR
Cuba 古巴 CU
Cyprus 塞浦路斯 CY
Czech Republic 捷克 CZ
Denmark 丹麦 DK
Djibouti 吉布提 DJ
Dominica Rep. 多米尼加共和国 DO
Ecuador 厄瓜多尔 EC
Egypt 埃及 EG
EI Salvador 萨尔瓦多 SV
Estonia 爱沙尼亚 EE
Ethiopia 埃塞俄比亚 ET
Fiji 斐济 FJ
Finland 芬兰 FI
France 法国 FR
French Guiana 法属圭亚那 GF
Gabon 加蓬 GA
Gambia 冈比亚 GM
Georgia 格鲁吉亚 GE
Germany 德国 DE
Ghana 加纳 GH
Gibraltar 直布罗陀 GI
Greece 希腊 GR
Grenada 格林纳达 GD
Guam 关岛 GU
Guatemala 危地马拉 GT
Guinea 几内亚 GN
Guyana 圭亚那 GY
Haiti 海地 HT
Honduras 洪都拉斯 HN
Hongkong 香港 HK
Hungary 匈牙利 HU
Iceland 冰岛 IS
India 印度 IN
Indonesia 印度尼西亚 ID
Iran 伊朗 IR
Iraq 伊拉克 IQ
Ireland 爱尔兰 IE
Israel 以色列 IL
Italy 意大利 IT
Ivory Coast 科特迪瓦
Jamaica 牙买加 JM
Japan 日本 JP
Jordan 约旦 JO
Kampuchea (Cambodia ) 柬埔寨 KH
Kazakstan 哈萨克斯坦 KZ
Kenya 肯尼亚 KE
Korea 韩国 KR
Kuwait 科威特 KW
Kyrgyzstan 吉尔吉斯坦 KG
Laos 老挝 LA
Latvia 拉脱维亚 LV
Lebanon 黎巴嫩 LB
Lesotho 莱索托 LS
Liberia 利比里亚 LR
Libya 利比亚 LY
Liechtenstein 列支敦士登 LI
Lithuania 立陶宛 LT
Luxembourg 卢森堡 LU
Macao 澳门 MO
Madagascar 马达加斯加 MG
Malawi 马拉维 MW
Malaysia 马来西亚 MY
Maldives 马尔代夫 MV
Mali 马里 ML
Malta 马耳他 MT
Mariana Is 马里亚那群岛
Martinique 马提尼克
Mauritius 毛里求斯 MU
Mexico 墨西哥 MX
Moldova, Republic of 摩尔多瓦 MD
Monaco 摩纳哥 MC
Mongolia 蒙古 MN
Montserrat Is 蒙特塞拉特岛 MS
Morocco 摩洛哥 MA
Mozambique 莫桑比克 MZ
Namibia 纳米比亚 NA
Nauru 瑙鲁 NR
Nepal 尼泊尔 NP
Netheriands Antilles 荷属安的列斯
Netherlands 荷兰 NL
New Zealand 新西兰 NZ
Nicaragua 尼加拉瓜 NI
Niger 尼日尔 NE
Nigeria 尼日利亚 NG
North Korea 朝鲜 KP
Norway 挪威 NO
Oman 阿曼 OM
Pakistan 巴基斯坦 PK
Panama 巴拿马 PA
Papua New Cuinea 巴布亚新几内亚 PG
Paraguay 巴拉圭 PY
Peru 秘鲁 PE
Philippines 菲律宾 PH
Poland 波兰 PL
French Polynesia 法属玻利尼西亚 PF
Portugal 葡萄牙 PT
Puerto Rico 波多黎各 PR
Qatar 卡塔尔 QA
Reunion 留尼旺
Romania 罗马尼亚 RO
Russia 俄罗斯 RU
Saint Lueia 圣卢西亚 LC
Saint Vincent 圣文森特岛 VC
Samoa Eastern 东萨摩亚(美)
Samoa Western 西萨摩亚
San Marino 圣马力诺 SM
Sao Tome and Principe 圣多美和普林西比 ST
Saudi Arabia 沙特阿拉伯 SA
Senegal 塞内加尔 SN
Seychelles 塞舌尔 SC
Sierra Leone 塞拉利昂 SL
Singapore 新加坡 SG
Slovakia 斯洛伐克 SK
Slovenia 斯洛文尼亚 SI
Solomon Is 所罗门群岛 SB
Somali 索马里 SO
South Africa 南非 ZA
Spain 西班牙 ES
Sri Lanka 斯里兰卡 LK
St.Lucia 圣卢西亚 LC
St.Vincent 圣文森特 VC
Sudan 苏丹 SD
Suriname 苏里南 SR
Swaziland 斯威士兰 SZ
Sweden 瑞典 SE
Switzerland 瑞士 CH
Syria 叙利亚 SY
Taiwan 台湾省 TW
Tajikstan 塔吉克斯坦 TJ
Tanzania 坦桑尼亚 TZ
Thailand 泰国 TH
Togo 多哥 TG
Tonga 汤加 TO
Trinidad and Tobago 特立尼达和多巴哥 TT
Tunisia 突尼斯 TN
Turkey 土耳其 TR
Turkmenistan 土库曼斯坦 TM
Uganda 乌干达 UG
Ukraine 乌克兰 UA
United Arab Emirates 阿拉伯联合酋长国 AE
United Kiongdom 英国 GB
United States of America 美国 US
Uruguay 乌拉圭 UY
Uzbekistan 乌兹别克斯坦 UZ
Venezuela 委内瑞拉 VE
Vietnam 越南 VN
Yemen 也门 YE
Yugoslavia 南斯拉夫 YU
Zimbabwe 津巴布韦 ZW
Zaire 扎伊尔 ZR
Zambia 赞比亚 ZM

vueCli3下pc多分辨率自适应解决方案

!注意仅为适应各种分辨率屏幕,不包含平板以及移动设备。单纯做移动设备响应适配请移步到flexible+px2rem 解决方案

vueCli3下自适应解决方案

postcss-plugin-px2rem

  • 将css中px转换为rem
  • 安装命令 npm i -S postcss-plugin-px2rem
  • 项目根目录下新建 vue.config.js 配置文件
module.exports = {
  css: {
    loaderOptions: {
      postcss: {
        plugins: [
          require("postcss-plugin-px2rem")({
            rootValue: 192, //设计稿宽度/10
            exclude: /(node_module)/, //默认false,可以(reg)利用正则表达式排除某些文件夹的方法,例如/(node_module)\/如果想把前端UI框架内的px也转换成rem,请把此属性设为默认值
            // unitPrecision: 5, //允许REM单位增长到的十进制数字。
            //propWhiteList: [],  //默认值是一个空数组,这意味着禁用白名单并启用所有属性。
            // propBlackList: [], //黑名单
            // selectorBlackList: [], //要忽略并保留为px的选择器
            // ignoreIdentifier: false,  //(boolean/string)忽略单个属性的方法,启用ignoreidentifier后,replace将自动设置为true。
            // replace: true, // (布尔值)替换包含REM的规则,而不是添加回退。
            // mediaQuery: false, //(布尔值)允许在媒体查询中转换px。
            // minPixelValue: 3, //设置要替换的最小像素值(3px会被转rem)。 默认 0
          }),
        ],
      },
    },
  },
};
  • 在src目录下新建rem.js文件
export function setRemInit() {
  // postcss-px2rem的内容
  // 基准大小
  const baseSize = 192;
  // 设置 rem 函数
  function setRem() {
    // 当前页面宽度相对于 1920 px(设计稿尺寸)的缩放比例,可根据自己需要修改。
    const scale = document.documentElement.clientWidth / 1920;
    // 设置页面根节点字体大小
    document.documentElement.style.fontSize = `${baseSize * scale}px`;
  }
  // 初始化
  setRem();
  // 改变窗口大小时重新设置 rem
  window.addEventListener("resize", setRem);
}

在main.js中引用rem.js


import { setRemInit } from '../src/rem';

setRemInit(); *//进行初始化立即运行*

vscode安装JetBrainsMono字体

已经弃用webstrom大半年了,使用vscode的过程非常愉快。但是我还是忘不了jb家的JetBrainsMono字体,所以今天给vscode也整一个。

  1. 下载字体文件 官网下载
  2. 打开压缩包进入 /ttf文件夹,将所有字体进行安装
  3. 打开vscode 快捷键Ctrl+,搜索settings.json进行编辑
  4. 添加
"editor.fontFamily": "JetBrains Mono",
"editor.fontLigatures": true

完事 手动滑稽