月度归档: 2024 年 11 月

  • nginx 如何部署ssl证书

    编辑 Nginx 配置文件:

    打开你的 Nginx 配置文件(通常是 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/default)。

    server {
        listen 443 ssl;
        server_name yourdomain.com;
    
        ssl_certificate /path/to/your/fullchain.crt;  # 你的证书文件,可能包括中间证书
        ssl_certificate_key /path/to/your/private.key;  # 你的私钥文件
    
        ssl_protocols TLSv1.2 TLSv1.3;  # 仅启用安全的协议
        ssl_ciphers HIGH:!aNULL:!MD5;  # 启用强大的加密算法
    
        # 其他配置,如 location 块
        location / {
            root /var/www/html;
            index index.html index.htm index.nginx-debian.html;
        }
    }

    重定向 HTTP 到 HTTPS:

    server {
        listen 80;
        server_name yourdomain.com;
    
        return 301 https://$host$request_uri;
    }

    测试 Nginx 配置:

    在重启 Nginx 之前,确保你的配置是正确的。

    nginx -t

    重启 Nginx:

    如果配置正确,重启 Nginx 以应用更改。

    sudo systemctl restart nginx
    #或者
    nginx -s reload
  • PHP HTML解析器

    PHPHtmlParser是一款简单灵活的HTML解析器,允许您使用任何CSS选择器来选取标签,类似于jQuery的方式。其目标是为那些需要快速简便地抓取HTML(无论是否合法)的工具提供帮助!

    安装 通过Composer安装最新版本。

    $ composer require paquettg/php-html-parser

    本包可在Packagist上找到,并推荐通过Composer加载。我们支持PHP 7.2、7.3和7.4。

    基本用法 在测试目录中,您可以找到关于如何使用DOM解析器及其各部分(很可能您永远不会直接触碰)的许多示例。这些测试使用PHPUnit编写,非常简短,每个只有几行,是开始学习的好地方。即便如此,我仍会展示一些如何使用该包的基本例子。以下是一个非常简单的使用示例:

    // 假设您已通过Composer安装:

    require "vendor/autoload.php";
    use PHPHtmlParser\Dom;
    
    $dom = new Dom;
    $dom->loadStr('<div class="all"><p>嘿,兄弟,<a href="https://gitcode.com/gh_mirrors/ph/php-html-parser/blob/master/google.com">点击这里</a>
    <br /> :)</p></div>');
    $a = $dom->find('a')[0];
    echo $a->text; // 输出 "点击这里"

    这段代码将输出“点击这里”。简单吧?从DOM获取相同结果的方式有很多种,比如$dom->getElementsByTagName(‘a’)[0]或$dom->find(‘a’, 0),更多用法可参考测试案例或源码本身。

    支持PHP Html Parser的资金赞助 获取受支持的Monolog,并通过Tidelift订阅资助该项目。

    Tidelift为您的应用所依赖的开源依赖项提供了商业级别的支持与维护。节省时间,降低风险,改善代码健康状况,同时支持您实际使用的依赖项的维护者。

    加载文件 您也可以无缝地将文件加载到DOM中而不是字符串,这更方便,也是我认为大多数开发者加载HTML的方式。以下示例源自我们的测试,使用了其中的"big.html"文件。

    // 假设您已通过Composer安装:
    require "vendor/autoload.php";
    use PHPHtmlParser\Dom;
    
    $dom = new Dom;
    $dom->loadFromFile('tests/data/big.html');
    $contents = $dom->find('.content-border');
    echo count($contents); // 输出 10
    
    foreach ($contents as $content) {
        // 获取类属性
        $class = $content->getAttribute('class');
    
        // 对HTML进行处理
        $html = $content->innerHtml;
    
        // 或进一步细化查找
        $child   = $content->firstChild();
        $sibling = $child->nextSibling();
    }

    此例从"big.html"(一个真实的在线页面)加载HTML,获取所有.content-border类以进行处理,并展示了可以对节点执行的一些操作,但并非节点可用方法的完整列表。

    加载URL 加载URL的方式与从文件加载HTML非常相似。

    // 假设您已通过Composer安装:
    require "vendor/autoload.php";
    use PHPHtmlParser\Dom;
    
    $dom = new Dom;
    $dom->loadFromUrl('http://google.com');
    $html = $dom->outerHtml;

    // 或者

    $dom->loadFromUrl('http://google.com');
    $html = $dom->outerHtml; // 结果与第一个示例相同
    默认情况下,loadFromUrl使用\Psr\Http\Client\ClientInterface的一个实现来执行HTTP请求,并使用一个默认的\Psr\Http\Message\RequestInterface实现来构造请求体。您可以轻松实现自己的客户端或请求版本,以便在使用loadFromUrl时使用自定义的HTTP连接。
    
    // 假设您已通过Composer安装:
    require "vendor/autoload.php";
    use PHPHtmlParser\Dom;
    use App\Services\MyClient;
    
    $dom = new Dom;
    $dom->loadFromUrl('http://google.com', null, new MyClient());
    $html = $dom->outerHtml;
    只要客户端对象正确实现了接口,它就会使用那个对象来获取URL的内容。

    加载字符串 直接加载字符串也非常简单。

    // 假设您已通过Composer安装:

    require "vendor/autoload.php";
    use PHPHtmlParser\Dom;
    
    $dom = new Dom;
    $dom->loadStr('
    <html>字符串</html>');
    $html = $dom->outerHtml;

    配置选项 您还可以设置影响解析引擎行为的解析选项。可以通过Dom对象的setOptions方法设置全局选项数组,或者将选项作为load方法的额外(可选)参数添加来设定实例特定的选项。

    // 假设您已通过Composer安装:
    require "vendor/autoload.php";
    use PHPHtmlParser\Dom;
    use PHPHtmlParser\Options;
    
    $dom = new Dom;
    $dom->setOptions(
        // 这被设置为全局选项级别。
        (new Options())
            ->setStrict(true)
    );
    
    $dom->loadFromUrl('http://google.com', 
        (new Options())->setWhitespaceTextNode(false) // 只在此加载中适用。
    );
    
    $dom->loadFromUrl('http://gmail.com'); // 将不会设置whitespaceTextNode为false。

    目前,我们支持12个配置选项。

    严格模式 默认关闭,当发现HTML不严格合规(所有标签都必须有闭合标签,没有无值属性等)时抛出StrictException。

    空白文本节点 默认开启,告诉解析器保存即使是空内容(仅空白字符)的文本节点。设置为假则忽略文档中的所有仅空白文本节点。

    强制编码 默认为空,用于指定读取内容和返回内容时使用的字符集。若设为null,则尝试从给定字符串的内容中推断编码。

    其余选项还包括清理输入阶段控制(cleanupInput)、移除脚本和样式标签、保留换行符、去除双倍空格、移除Smarty脚本以及HTML特殊字符解码等功能,它们各自都有详细的描述和默认值,使用户能根据需求定制解析过程。

    静态外观(Static Facade) 您还可以为 Dom 对象安装一个静态外观。

    PHPHtmlParser\StaticDom::mount();
    
    Dom::loadFromFile('tests/big.html');
    $objects = Dom::find('.content-border');

    上述 PHP 代码块与第一个示例执行相同的操作,但使用了静态外观,该外观支持在 Dom 对象中找到的所有公共方法。

    修改 DOM 您可以随时修改通过任何加载方法创建的 DOM。要更改节点的属性,只需调用 setAttribute 方法。

    use PHPHtmlParser\Dom;
    
    $dom = new Dom;
    $dom->loadStr('<div class="all"><p>Hey bro, <a href="https://gitcode.com/gh_mirrors/ph/php-html-parser/blob/master/google.com">click here</a>
    <br /> :)</p></div>');
    $a = $dom->find('a')[0];
    $a->setAttribute('class', 'foo');
    echo $a->getAttribute('class'); // "foo"

    您还可以直接获取 PHPHtmlParser\Dom\Tag 类并按需操作它。

    use PHPHtmlParser\Dom;
    
    $dom = new Dom;
    $dom->loadStr('<div class="all"><p>Hey bro, <a href="https://gitcode.com/gh_mirrors/ph/php-html-parser/blob/master/google.com">click here</a>
    <br /> :)</p></div>');
    /** @var Dom\Node\AbstractNode $a */
    $a   = $dom->find('a')[0];
    $tag = $a->getTag();
    $tag->setAttribute('class', 'foo');
    echo $a->getAttribute('class'); // "foo"

    也可以从树中删除节点。只需对任何节点调用 delete 方法即可将其从树中移除。重要的是要注意,在从 DOM 中删除节点后应将其取消设置,否则它仍会占用内存。

    use PHPHtmlParser\Dom;
    
    $dom = new Dom;
    $dom->loadStr('<div class="all"><p>Hey bro, <a href="https://gitcode.com/gh_mirrors/ph/php-html-parser/blob/master/google.com">click here</a>
    <br /> :)</p></div>');
    /** @var Dom\Node\AbstractNode $a */
    $a   = $dom->find('a')[0];
    $a->delete();
    unset($a);
    echo $dom; // '<div class="all"><p>Hey bro, <br /> :)</p></div>';

    您可以轻松地修改 TextNode 对象的文本。请注意,如果您设置了编码,新文本将使用现有编码进行编码。

    use PHPHtmlParser\Dom;
    
    $dom = new Dom;
    $dom->loadStr('<div class="all"><p>Hey bro, <a href="https://gitcode.com/gh_mirrors/ph/php-html-parser/blob/master/google.com">click here</a>
    <br /> :)</p></div>');
    /** @var Dom\Node\InnerNode $a */
    $a   = $dom->find('a')[0];
    $a->firstChild()->setText('biz baz');
    echo $dom; // '<div class="all"><p>Hey bro, <a href="https://gitcode.com/gh_mirrors/ph/php-html-parser/blob/master/google.com">biz baz</a>
    <br /> :)</p></div>'
  • ssl证书各个平台价格对比

    华为云:336.15元/年

    image.png

    阿里云:336.15元/年

    image.png

    腾讯云:532元/年

    image.png

    西部数码:38元/年

    image.png

  • 立即下载使用 swoole-cli

    1. swoole 版本由 v5.1.4 升级为 v5.1.5 , swoole v5.1.4 info
    2. 修复发版时 swoole 版本错误
    3. 修复 macos 环境 mongodb 扩展构建错误
    4. 修复 libxml2, libxslt URL
    5. 删除 docker build –progress=plain 参数,非通用参数,部分 docker 版本不支持
    6. 为 make.sh 添加可执行属性
    7. 设置 加载 php.ini 默认目录(/usr/local/swoole-cli/etc/php.ini)
    8. 优化同步 PHP 源码脚本
    9. 优化macos 环境下构建流程
    
    curl -fSL https://github.com/swoole/swoole-cli/blob/main/setup-swoole-cli-runtime.sh?raw=true | bash
    
    # 来自 https://www.swoole.com/download
    curl -fSL https://github.com/swoole/swoole-cli/blob/main/setup-swoole-cli-runtime.sh?raw=true | bash -s -- --mirror china
    
  • 解决Mysql:1055 – Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated

    解决:

    方法一:修改配置。去掉ONLY_FULL_GROUP_BY

    如果是Linux,就在配置文件(my.cnf)中修改 sql_mode 的配置(在/usr/local/etc/my.cnf路径下)并重启mysql服务。

    $ vim /usr/local/etc/my.cnf
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    set @@sql_mode 
    ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

    如果要永久生效需要在MySQL的my.ini配置文件中去修改:

    在[mysqld]下添加sql_mode=’STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION’,然后保存并重启服务。

  • CentOS7安装MySQL8(亲测无坑百分百安装成功)

    环境介绍

    操作系统:Centos7.6 MySQL版本: 8.0.30

    本文使用的是当前最新8.0.30版本,如果需要安装的版本比8.0.30高或者低,只要是8.0.*版本,那就可以按照本文说明安装,基本不会有任何问题。

    一、安装前准备

    1.卸载MariaDB

    安装MySQL的话会和MariaDB的文件冲突,所以需要先卸载掉MariaDB。

    1.1 查看是否安装mariadb

    rpm -qa|grep mariadb

    1.2 卸载

    rpm -e --nodeps 文件名

    1.3 检查是否卸载干净

    rpm -qa|grep mariadb

    2.检查依赖

    2.1 查看是否安装libaio

    rpm -qa|grep libaio

    如果没有安装则执行

    yum -y install libaio //安装libaio 

    2.2 查看是否安装numactl

    rpm -qa|grep numactl

    如果没有安装则执行

    yum -y install numactl //安装numactl 

    二、安装MySQL

    1.下载资源包

    可以在官网下载安装包或者在服务器直接使用wget下载。

    1.1 官网下载

    MySQL官网下载地址:https://dev.mysql.com/downloads/mysql/ 在这里插入图片描述

    1.2 wget下载

    wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.30-el7-x86_64.tar

    2.解压

    注:本文安装包上传到了 /usr/local/ 目录下

    进入安装包目录

    cd /usr/local/

    拆分tar包

    tar -xvf mysql-8.0.30-el7-x86_64.tar

    解压安装包

    tar -zxvf mysql-8.0.30-el7-x86_64.tar.gz

    3.重命名

    将解压后的文件夹重命名为mysql

    mv mysql-8.0.30-el7-x86_64/ mysql

    4.创建存储数据文件

    在重命名后的mysql文件夹中创建data文件夹

    mkdir mysql/data

    5.设置用户组并赋权

    创建用户组

    groupadd mysql

    创建用户 -r:创建系统用户 -g:指定用户组

    useradd -r -g mysql mysql

    更改属主和数组

    chown -R mysql:mysql /usr/local/mysql/

    更改权限

    chmod -R 755 /usr/local/mysql/

    6.初始化MySQL

    进入MySQL的bin目录

    cd /usr/local/mysql/bin/

    初始化

    ./mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql

    初始化完成后会打印一个随机密码,后面会用到。 在这里插入图片描述

    7.配置参数文件

    vi /etc/my.cnf

    配置文件修改为以下内容,也可以根据自己需要设置参数。

    [client]
    port = 3306
    socket = /usr/local/mysql/data/mysql.sock
    default-character-set = utf8mb4
    
    [mysql]  
    default-character-set = utf8mb4
    
    [mysqld]  
    character-set-client-handshake = FALSE
    character-set-server = utf8mb4
    collation-server = utf8mb4_general_ci
    init_connect = 'SET NAMES utf8mb4'
    
    port = 3306
    socket = /usr/local/mysql/data/mysql.sock
    skip-external-locking
    key_buffer_size = 16M
    max_allowed_packet = 1M
    table_open_cache = 64
    sort_buffer_size = 512K
    net_buffer_length = 8K
    read_buffer_size = 256K
    read_rnd_buffer_size = 512K
    myisam_sort_buffer_size = 8M
    datadir = /usr/local/mysql/data
    #lower_case_table_names=1
    #如果要设置lower_case_table_names可以在初始化里面设置 ./mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql --lower_case_table_names=1
    
    [mysqldump]
    quick
    max_allowed_packet = 16M
    
    [mysql]
    no-auto-rehash
    
    [myisamchk]
    key_buffer_size = 20M
    sort_buffer_size = 20M
    read_buffer = 2M
    write_buffer = 2M
    
    [mysqlhotcopy]
    interactive-timeout

    配置后修改 /etc/my.cnf 的权限为777

    chmod 777 /etc/my.cnf 1

    8.启动MySQL

    /usr/local/mysql/support-files/mysql.server start

    9.设置软连接,并重启MySQL

    ln -s /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
    ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
    ln -s /usr/local/mysql/mysql.sock /var/mysql.sock
    service mysql restart

    10.登录并更改密码

    [root@localhost bin]# mysql -uroot -p
    Enter password: 输入初始化随机密码

    两种改密方式二选一

    alter user 'root'@'localhost' identified by '123456';
    set password for root@localhost = '123456';

    11.开放远程连接

    mysql>use mysql;
    msyql>update user set user.Host='%' where user.User='root';
    mysql>flush privileges;    //刷新权限

    12.连接工具测试连接MySQL 在这里插入图片描述 如果服务器本地可以连接,但是连接工具远程连接不进去,则需要检查一下防火墙是否放行3306端口,也可以暂时先关闭防火墙后重试。

    关闭防火墙

    systemctl stop firewalld

    13.MySQL启动和停止 CentOS6和CentOS7命令都可以使用。

    启动

    service mysql start
    systemctl start mysql

    停止

    service mysql stop
    systemctl stop mysql

    重启

    service mysql restart
    systemctl restart mysql

    查看状态

    service mysql status
    systemctl status mysql

    三、设置开机自启动(可选)

    将服务文件拷贝到 /etc/init.d下,并重命名为mysqld

    cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

    赋予可执行权限

    chmod +x /etc/init.d/mysqld

    添加服务

    chkconfig --add mysqld

    显示服务列表

    chkconfig --list

    注:如果看到mysqld的服务,并且3,4,5都是on的话则成功,如果是off,则执行

    chkconfig --level 345 mysqld on

    重启系统

    reboot

    重启后查看mysql是否开机自启动

    ps -ef|grep mysql
  • 思源笔记 搭建

    docker run -d \
      -v workspace_dir_host:workspace_dir_container \
      -p 6806:6806 \
      -e PUID=1001 -e PGID=1002 \
      b3log/siyuan \
      --workspace=workspace_dir_container \
      --accessAuthCode=xxx
    version: "3.9"
    services:
      main:
        image: b3log/siyuan
        command: ['--workspace=/siyuan/workspace/', '--accessAuthCode=${AuthCode}']
        ports:
          - 6806:6806
        volumes:
          - /siyuan/workspace:/siyuan/workspace
        restart: unless-stopped
        environment:
          # A list of time zone identifiers can be found at https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
          - TZ=${YOUR_TIME_ZONE}
          - PUID=${YOUR_USER_PUID}  # 自定义用户 ID
          - PGID=${YOUR_USER_PGID}  # 自定义组 ID
  • 最好用的免费开源博客系统安装搭建

    下载地址

    blossom-1.16.0-web-blog.zip 1.76 MB

    blossom-1.16.0-web-client.zip 16.53 MB

    服务安装

    docker run -d \
      --name blossom-backend \
      -p 9999:9999 \
      -v /home/bl/:/home/bl/ \
      blossom:latest \
      --spring.datasource.url="jdbc:mysql://192.168.1.110:3306/blossom?useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true&allowMultiQueries=true&useSSL=false&&serverTimezone=GMT%2B8" \
      --spring.datasource.username=root \
      --spring.datasource.password=123456
  • javascript 删除数组元素

    在 JavaScript 中,数组是一种常见的数据类型,可以存储多个元素。有时候,我们需要从数组中删除某些特定的元素。本文将介绍如何使用 JavaScript 删除数组中指定的元素。

    1.使用splice()方法删除元素

    JavaScript 中的 splice() 方法可用于在数组中添加或删除元素。如果我们需要删除数组中的元素,可以使用 splice() 方法。该方法接受两个参数,第一个参数指定要删除的元素的位置,第二个参数指定要删除的元素个数。例如,我们可以使用以下代码删除数组中的第二个元素:

    let myArray = ["apple", "banana", "orange", "grape"];
    myArray.splice(1, 1);
    console.log(myArray); // ["apple", "orange", "grape"]

    输出结果为:["apple", "orange", "grape"]

    2.使用filter()方法删除元素

    除了使用 splice() 方法,我们还可以使用 filter() 方法来删除数组中的元素。该方法可用于创建一个新的数组,其中包含符合特定条件的元素。我们可以使用以下代码删除数组中的所有 “banana” 元素:

    let myArray = ["apple", "banana", "orange", "grape"];
    myArray = myArray.filter(function(item) {
      return item !== "banana"
    });
    console.log(myArray); // ["apple", "orange", "grape"]

    输出结果为:["apple", "orange", "grape"]

    3.使用pop()和shift()方法删除元素

    pop() 和 shift() 方法可用于删除数组的最后一个元素和第一个元素。如果我们想删除数组中的特定元素,可以使用这些方法与 indexOf() 方法结合使用。例如,以下代码可以删除数组中的第二个元素:

    let myArray = ["apple", "banana", "orange", "grape"];
    let index = myArray.indexOf("banana");
    if (index !== -1) {
      myArray.splice(index, 1);
    }
    console.log(myArray); // ["apple", "orange", "grape"]

    输出结果为:["apple", "orange", "grape"]

    4.使用slice()方法删除元素

    slice() 方法是一个纯函数,它不会改变原始数组,而是返回一个新的数组,该数组包含从开始到结束(不包含结束)的元素。我们可以使用以下代码删除数组中的第二个元素:

    let myArray = ["apple", "banana", "orange", "grape"];
    let newArray = myArray.slice(0, 1).concat(myArray.slice(2));
    console.log(newArray); //["apple", "orange", "grape"]

    输出结果为:["apple", "orange", "grape"]

    5.使用ES6的filter()方法删除元素

    ES6 中的 filter() 方法也可以用于删除数组中的元素。我们可以使用以下代码删除数组中的所有 “banana” 元素:

    let myArray = ["apple", "banana", "orange", "grape"];
    myArray = myArray.filter(item => item !== "banana");
    console.log(myArray); // ["apple", "orange", "grape"]

    输出结果为:["apple", "orange", "grape"]

    总结 以上是 JavaScript 删除数组中指定元素的多种方法。我们可以根据需求选择适合自己的方法来删除数组中的元素。希望这篇文章能够帮助你更好地掌握 JavaScript 中的数组操作。

  • CSS 设置垂直居中

    一、设置文字垂直居中

    1、line-height 使文字垂直居中

    
    <template>
        <div class="container">
            line-height 使文字垂直居中
        </div>
    </template>
    
    <style>
        .container{
            margin: 20px 0px;
            width: 100%;
            height: 100px;
            line-height: 100px;
            background-color: pink;
        }
    </style>

    2、flex布局 使文字垂直居中

    
    <template>
        <div class="container">
            flex布局 使文字垂直居中
        </div>
     </template>
    
    <style>
        .container{
            margin: 20px 0px;
            width: 100%;
            height: 100px;
            display: flex;
            align-items: center;
            background-color: pink;
        }
     </style>

    3、使用display和vertical-align 使文字垂直居中

    3.1 display: table和vertical-align: middle

    
    <template>
        <div class="parent">
            <div class="child">
    
    <div>使用display和vertical-align 使文字垂直居中</div>
    
    <div>使用display和vertical-align 使文字垂直居中</div>
            </div>
        </div>
    </template>
    
    <style>
        .parent {
            display: table;
            width: 100%;
            height: 100px;
            background-color: skyblue;
        }
    
        .child {
            display: table-cell;
            vertical-align: middle;
            background-color: pink;
        }
    </style>

    3.2 display: table-cell和vertical-align: middle

    
    <template>
        <div class="parent">
            <div class="child">
    
    <div>使用display和vertical-align 使文字垂直居中</div>
    
    <div>使用display和vertical-align 使文字垂直居中</div>
            </div>
        </div>
    </template>
    
    <style>
        .parent {
            width: 100%;
            height: 100px;
            background-color: skyblue;
            display: table-cell;
            vertical-align: middle;
        }
    
        .child {
            background-color: pink;
        }
    </style>

    二、设置块状元素垂直居中

    1、使用绝对定位和transform 使块状元素垂直居中(未知块状元素高度)

    
    <template>
        <div class="parent">
            <div class="child">
    
    <div>
                    使用绝对定位和transform 使块状元素垂直居中
                </div>
    
    <div>
                    使用绝对定位和transform 使块状元素垂直居中
                </div>
            </div>
        </div>
    </template>
    
    <style>
        .parent {
            width: 100%;
            height: 100vh;
            background-color: skyblue;
        }
    
        .child {
            width: 100%;
            position: absolute;
            top: 50%;
            transform: translate(0, -50%);
            background-color: pink;
        }
    </style>

    2、使用flex布局 使块状元素垂直居中(未知块状元素高度)

    2.1 display: flex和align-items: center

    
    <template>
        <div class="parent">
            <div class="child">
    
    <div>
                    使用flex布局 使块状元素垂直居中
                </div>
    
    <div>
                    使用flex布局 使块状元素垂直居中
                </div>
            </div>
        </div>
    </template>
    
    <style>
        .parent {
            width: 100%;
            height: 100vh;
            display: flex;
            align-items: center;
            background-color: skyblue;
        }
    
        .child {
            width: 100%;
            background-color: pink;
        }
    </style>

    2.2 display: flex和align-self: center

    
    <template>
        <div class="parent">
            <div class="child">
    
    <div>
                    使用flex布局 使块状元素垂直居中
                </div>
    
    <div>
                    使用flex布局 使块状元素垂直居中
                </div>
            </div>
        </div>
    </template>
    
    <style>
        .parent {
            width: 100%;
            height: 100vh;
            display: flex;
            background-color: skyblue;
        }
    
        .child {
            align-self: center;
            width: 100%;
            background-color: pink;
        }
    </style>

    3、使用绝对定位和margin 使块状元素垂直居中(已知块状元素高度)

    3.1 绝对定位和margin: auto

    
    <template>
        <div class="parent">
            <div class="child">
    
    <div>
                    使用绝对定位和margin 使块状元素垂直居中
                </div>
    
    <div>
                    使用绝对定位和margin 使块状元素垂直居中
                </div>
            </div>
        </div>
    </template>
    
    <style>
        .parent {
            width: 100%;
            height: 100vh;
            background-color: skyblue;
        }
    
        .child {
            width: 100%;
            height: 100px;
            position: absolute;
            top: 0;
            bottom: 0;
            left: 0;
            right: 0;
            margin: auto;
            background-color: pink;
        }
    </style>

    3.2 绝对定位和margin-top

    
    <template>
        <div class="parent">
            <div class="child">
    
    <div>
                    使用绝对定位和margin 使块状元素垂直居中
                </div>
    
    <div>
                    使用绝对定位和margin 使块状元素垂直居中
                </div>
            </div>
        </div>
    </template>
    
    <style>
        .parent {
            width: 100%;
            height: 100vh;
            background-color: skyblue;
            position: relative;
        }
    
        .child {
            width: 100%;
            height: 100px;
            position: absolute;
            top: 50%;
            margin-top: -50px;/* 高度的一半 */
            background-color: pink;
        }
    </style>

    4、使用padding 使块状元素垂直居中(已知元素高度)

    
    <template>
        <div class="parent">
            <div class="child">
    
    <div>使用padding 使块状元素垂直居中</div>
    
    <div>使用padding 使块状元素垂直居中</div>
            </div>
        </div>
    </template>
    
    <style>
        .parent {
            width: 100%;
            height: 300px;
            background-color: skyblue;
            padding: 100px 0;
            box-sizing: border-box;
        }
    
        .child {
            position: relative;
            width: 100%;
            height: 100px;
            background-color: pink;
        }
    </style>

    5、使用grid布局 使块状元素垂直居中(未知元素高度)

    
    <template>
        <div class="parent">
            <div class="child">
    
    <div>
                    使用grid布局 使块状元素垂直居中
                </div>
    
    <div>
                    使用grid布局 使块状元素垂直居中
                </div>
            </div>
        </div>
    </template>
    
    <style>
        .parent {
            width: 100%;
            height: 100vh;
            display: grid;
            background-color: skyblue;
        }
    
        .child {
            align-self: center;
            width: 100%;
            background-color: pink;
        }
    </style>

    6、使用伪元素:before 使块状元素垂直居中(未知元素高度)

    
    <template>
        <div class="parent">
            <div class="child">
    
    <div>
                    使用伪元素:before 使块状元素垂直居中
                </div>
    
    <div>
                    使用伪元素:before 使块状元素垂直居中
                </div>
            </div>
        </div>
    </template>
    
    <style>
        .parent {
            width: 100%;
            height: 100px;
            display: block;
            background-color: skyblue;
        }
    
        .parent:before {
            content: '';
            height: 100%;
            display: inline-block;
            vertical-align: middle;
        }
    
        .child {
            width: 100%;
            display: inline-block;
            vertical-align: middle;
            background-color: pink;
        }
    </style>