PHP代码怎么处理多线程_ PHP多线程模拟与任务调度详述

PHP不支持原生多线程,但可通过多进程、异步I/O或任务队列实现并发。1. PCNTL扩展在Unix系统下创建子进程处理并行任务;2. Swoole/ReactPHP利用事件循环和协程实现高性能异步I/O;3. 任务队列(如Redis、RabbitMQ)将耗时任务解耦,由独立Worker进程处理;4. Cron等调度器用于周期性批处理。选择方案需根据性能需求、系统复杂度及团队技术栈综合权衡。

php代码怎么处理多线程_ php多线程模拟与任务调度详述

PHP代码处理多线程,这本身就是一个带点“误解”的说法。准确地讲,PHP在语言层面并不支持原生多线程,它更倾向于“多进程”或“异步非阻塞”的方式来模拟并发,以应对高性能和长任务处理的需求。在我看来,这并非PHP的缺陷,反而是其独特设计哲学——“请求-响应”模式的自然延伸,让我们在处理并发时,需要转换思路,从操作系统层面的线程模型,转向更适合PHP生态的并发策略。

解决方案

要让PHP代码“模拟”多线程,或者更准确地说,实现并发任务处理,我们通常会采用以下几种核心策略:

进程派生(PCNTL扩展):这是最接近传统多线程概念的方式,通过

pcntl_fork()

函数创建子进程,每个子进程独立执行任务。这在Unix-like系统上非常有效,但进程间的通信和资源管理需要额外处理。异步非阻塞I/O与事件循环:利用Swoole、ReactPHP这类框架,构建基于事件循环的应用程序。在这种模式下,PHP不再是传统的短生命周期脚本,而是可以长期运行的服务,通过协程或回调函数处理并发I/O操作,实现高性能。任务队列与消息中间件:将耗时任务从主应用中剥离,推送到消息队列(如Redis、RabbitMQ、Kafka)。独立的PHP worker进程异步地从队列中取出任务并执行。这是处理后台任务、解耦系统、实现分布式并发最常见且健壮的方式。外部任务调度器:利用操作系统的

cron

supervisord

,或者云服务提供的调度功能,定期或在特定事件触发时启动多个PHP脚本实例,各自独立完成任务。这是一种简单粗暴但有效的并发手段,尤其适用于批处理任务。

PHP为什么没有原生多线程?这带来了哪些挑战?

谈到PHP没有原生多线程,这事儿还得从它的设计哲学和运行环境说起。最初,PHP是为Web设计的,它的核心模型是“共享-无状态”的。每一次HTTP请求,PHP解释器都会启动一个独立的进程(或者在FastCGI/PHP-FPM模式下,从进程池中取出一个),处理完请求后,这个进程的资源就会被释放或回收。这种模型天然地避免了多线程带来的复杂性,比如锁机制、死锁、线程安全问题等。你不用担心全局变量在不同线程间的数据竞争,因为每个请求都是一个“干净”的开始。

然而,这种简洁也带来了显而易见的挑战。一个PHP脚本通常是同步执行的,如果其中包含耗时的I/O操作(比如数据库查询、文件读写、API调用),整个脚本就会被阻塞,直到I/O完成。这意味着在处理高并发请求时,服务器的响应能力会大打折扣。对于长连接、实时通信、或者需要大量后台计算的场景,传统的PHP模式显得力不从心。你不可能让一个Web请求一直挂着等待一个耗时几分钟的图片处理任务完成,这既不现实也不高效。这迫使我们不得不去寻找“曲线救国”的方案,来模拟或实现并发。

立即学习“PHP免费学习笔记(深入)”;

使用PCNTL扩展模拟多进程并发:原理与实践

PCNTL扩展是PHP在Unix-like系统上提供的一套进程控制API,它允许我们创建子进程,这在概念上与多线程有些相似,但本质上是操作系统层面的多进程。核心函数是

pcntl_fork()

。当你调用它时,当前进程会“分裂”成两个几乎一模一样的进程:父进程和子进程。

pcntl_fork()

会返回两次,父进程会得到子进程的PID(Process ID),而子进程会得到

0

。通过判断返回值,我们就能让父子进程执行不同的代码逻辑。

工作原理:

进程复制

pcntl_fork()

会复制当前进程的内存空间、文件描述符等资源,创建出一个新的子进程。这意味着子进程会继承父进程的所有变量和状态,但在

fork

之后,它们就完全独立了。独立执行:父子进程可以并行执行不同的任务。父进程可以继续监听请求或管理子进程,子进程则专注于执行耗时任务。进程管理:父进程需要使用

pcntl_waitpid()

pcntl_wait()

来等待子进程结束,并回收其资源,避免产生僵尸进程。

实践示例:

<?phpif (!extension_loaded('pcntl')) {    die("PCNTL extension is not loaded. This script requires a Unix-like system.n");}echo "主进程开始执行,PID: " . getmypid() . "n";$workers = [];$numTasks = 5;for ($i = 0; $i  0) {    // -1 表示等待任何子进程,WNOHANG表示非阻塞    $status = 0;    $childPid = pcntl_waitpid(-1, $status, WNOHANG);    if ($childPid > 0) {        // 子进程已退出        $taskFinished = pcntl_wexitstatus($status); // 获取子进程的退出状态码        echo "父进程(" . getmypid() . ")回收了子进程 " . $childPid . ",任务 " . $workers[$childPid] . " 已完成,退出状态码: " . $taskFinished . "n";        unset($workers[$childPid]);    } else if ($childPid == 0) {        // 仍有子进程在运行,且WNOHANG模式下没有子进程退出        // 可以做一些其他事情,或者短暂休眠以避免CPU空转        usleep(100000); // 100毫秒    } else {        // 没有子进程了,或者发生错误        break;    }}echo "所有子进程任务已完成,主进程退出。n";?>

这个例子展示了如何使用

pcntl_fork

创建多个子进程来并行执行任务。需要注意的是,PCNTL适用于CPU密集型或短时I/O密集型任务,但由于进程创建和销毁的开销,以及进程间通信的复杂性,它并不适合超高并发的I/O密集型场景。

异步IO与事件循环:Swoole/ReactPHP如何实现高性能并发?

当传统的多进程模型在处理大量并发连接(如WebSockets、长轮询)或高并发I/O操作时显得力不从心,异步I/O和事件循环就成了PHP高性能并发的另一条康庄大道。Swoole和ReactPHP是其中最杰出的代表。它们将PHP从一个短生命周期的脚本语言,转变为一个可以长期运行的服务端应用,能够以非阻塞的方式处理大量并发请求。

核心思想:

传统的PHP是同步阻塞的:当发起一个I/O请求(比如数据库查询),程序会暂停执行,直到I/O操作完成并返回结果。而异步I/O和事件循环则不同:当发起I/O请求后,程序不会等待,而是立即去处理其他任务。当I/O操作完成后,系统会通过事件循环通知程序,并执行预先注册的回调函数来处理结果。

Swoole的实现:

Swoole是一个PHP的C扩展,它为PHP带来了高性能的异步、并行、协程网络通信引擎。它允许PHP开发者编写高性能的TCP/UDP服务器、WebSockets服务器、HTTP服务器等。

事件驱动:Swoole的核心是事件循环。当网络事件(如新连接、数据接收、连接关闭)发生时,Swoole会触发相应的回调函数。多进程/多线程模型:Swoole服务器通常采用Master-Worker/Tasker模型。Master进程负责管理,Worker进程处理客户端请求,Tasker进程处理耗时任务,它们之间通过IPC通信。协程(Coroutine):这是Swoole最强大的特性之一。协程是一种轻量级的用户态线程,它可以在I/O操作时自动切换,让异步代码写起来像同步代码一样直观。例如,一个HTTP请求处理函数中,当调用

Co::sleep()

CoMySQL::query()

时,当前协程会暂停,让出CPU给其他协程执行,直到I/O完成再恢复。这极大地提高了I/O密集型应用的并发能力。

Swoole简单HTTP服务器示例:

on("start", function ($server) {    echo "Swoole http server is started at http://127.0.0.1:9501n";});$http->on("request", function ($request, $response) {    // 模拟一个耗时的I/O操作,例如数据库查询或API调用    // 在协程环境下,Co::sleep() 不会阻塞整个进程,只会暂停当前协程    Co::sleep(1); // 暂停1秒    $response->header("Content-Type", "text/plain");    $response->end("Hello, " . ($request->get['name'] ?? 'Swoole') . "! This is a concurrent request.n");});$http->start();?>

运行

php server.php

,然后用浏览器或

curl

工具多次访问

http://127.0.0.1:9501?name=Alice

http://127.0.0.1:9501?name=Bob

,你会发现它们几乎同时得到响应,而不是互相等待。这就是Swoole协程带来的并发效果。

ReactPHP的实现:

ReactPHP是一个用纯PHP编写的事件驱动的非阻塞I/O库。它提供了一套组件,可以用来构建高性能的网络应用,例如事件循环、流处理、HTTP客户端/服务器等。与Swoole相比,ReactPHP是纯PHP实现,更容易部署和调试,但性能上通常略逊于Swoole。

无论是Swoole还是ReactPHP,它们都通过事件循环和非阻塞I/O改变了PHP的运行模式,让PHP在处理高并发、实时通信等场景时,拥有了与Node.js、Go等语言相媲美的能力。

任务队列与消息中间件:构建分布式任务调度系统

对于那些不适合在Web请求生命周期内完成的长时间运行任务(比如图片处理、邮件发送、数据导入导出、视频转码),或者需要高度可伸缩、高可用性的场景,任务队列和消息中间件无疑是最佳选择。这是一种“解耦”的并发处理方式,将任务的提交和执行完全分开。

核心思想:

生产者(Producer):Web应用或任何其他服务作为生产者,将需要执行的任务打包成消息,推送到消息队列中。这个过程通常非常快,不会阻塞主应用的响应。消息队列(Message Queue):作为任务的“缓冲区”,负责存储这些待处理的消息。常见的消息队列有:Redis:作为简单的列表或Streams,可以实现轻量级的任务队列。RabbitMQ:功能强大、成熟的消息代理,支持多种消息模式,适用于复杂的企业级应用。Kafka:高吞吐量的分布式流平台,适合处理大量实时数据流和日志。消费者/工作进程(Consumer/Worker):独立的PHP进程(或多个进程)作为消费者,持续地从消息队列中拉取任务。一旦拉取到任务,就执行相应的业务逻辑。这些Worker进程通常由

supervisord

systemd

或其他进程管理工具守护,确保它们持续运行,并在崩溃时自动重启。

优势:

解耦:生产者和消费者之间没有直接依赖,系统模块化程度更高。异步处理:主应用无需等待耗时任务完成,可以立即响应用户请求,提升用户体验。削峰填谷:当系统瞬时请求量很大时,消息队列可以缓冲任务,防止后端服务过载。弹性伸缩:可以根据任务负载,动态地增加或减少Worker进程的数量。高可用性与容错:即使某个Worker进程崩溃,任务仍在队列中,可以由其他Worker重新处理。消息队列本身也通常支持集群部署,保证高可用。

实践示例(以Laravel队列和Redis为例):

在Laravel框架中,集成任务队列非常方便。

定义任务(Job)

// app/Jobs/ProcessImage.phpnamespace AppJobs;use IlluminateBusQueueable;use IlluminateContractsQueueShouldQueue;use IlluminateFoundationBusDispatchable;use IlluminateQueueInteractsWithQueue;use IlluminateQueueSerializesModels;class ProcessImage implements ShouldQueue{    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;    protected $imagePath;    public function __construct(string $imagePath)    {        $this->imagePath = $imagePath;    }    public function handle()    {        // 模拟图片处理的耗时操作        sleep(5);        file_put_contents(storage_path('logs/image_processed.log'), "Processed image: " . $this->imagePath . " at " . now() . "n", FILE_APPEND);        echo "Image {$this->imagePath} processed.n";    }}

调度任务(Dispatch Job):在控制器或服务中,将任务推送到队列。

// app/Http/Controllers/ImageController.phpnamespace AppHttpControllers;use AppJobsProcessImage;use IlluminateHttpRequest;class ImageController extends Controller{    public function upload(Request $request)    {        // 假设图片已上传并保存到某个路径        $imagePath = '/path/to/uploaded/image.jpg';        // 将图片处理任务推送到队列        ProcessImage::dispatch($imagePath);        return response()->json(['message' => 'Image upload successful, processing in background.']);    }}

启动队列工作进程(Queue Worker):在服务器上,通过Artisan命令启动一个或多个Worker进程。

php artisan queue:work --queue=default --tries=3 --timeout=60

这个命令会启动一个PHP进程,它会持续监听

default

队列,一旦有任务进来,就会拉取并执行。

--tries

指定失败重试次数,

--timeout

指定任务执行超时时间。为了确保Worker进程持续运行,通常会结合

supervisord

等工具进行守护。

这种模式是构建现代、可伸缩的PHP应用不可或缺的一部分,它将PHP的并发能力提升到了一个新的维度。

如何选择适合的并发处理方案?

面对多种“模拟多线程”的方案,选择哪一种,确实是个需要深思熟虑的问题。这没有绝对的答案,关键在于你的项目需求、技术栈、团队经验以及对性能、复杂度和可维护性的权衡。

PCNTL扩展:适用于特定场景下的“内部”并行

何时选择:如果你需要在单个PHP脚本内部,并行执行几个CPU密集型或短时I/O密集型任务,并且你的服务器是Unix-like系统,PCNTL是一个直接且相对简单的选择。例如,一个脚本需要同时处理几个文件,或者并行调用几个内部函数。注意事项:进程间通信(IPC)需要手动实现,比如使用共享内存、管道或消息队列。进程创建和销毁的开销相对较大,不适合创建成百上千的并发进程。Windows系统不支持。

Swoole/ReactPHP:高性能、实时、I/O密集型应用的首选

何时选择:当你的应用需要处理大量并发连接(如WebSockets、实时聊天)、构建高性能API服务、长连接服务、或者需要极致I/O性能时,Swoole或ReactPHP是理想之选。它们将PHP的性能推向了新的高度。注意事项:这会改变PHP传统的请求-响应模型,需要你以服务的方式来思考和编写代码。学习曲线相对较陡峭,对开发者的异步编程思维有一定要求。Swoole是C扩展,部署可能需要额外配置;ReactPHP是纯PHP,更易部署但性能略低。

任务队列与消息中间件:分布式、高可用、后台任务处理的核心

何时选择:这是最通用、最健壮、最适合处理后台任务和构建分布式系统的方案。任何耗时、需要异步执行、或者对主应用响应时间有严格要求的任务,都应该考虑放入任务队列。例如,邮件发送、图片处理、数据同步、报表生成等。注意事项:引入了额外的基础设施(如Redis、RabbitMQ),增加了系统的复杂性。需要额外的Worker进程来消费任务,并需要进程管理工具(如

supervisord

)来确保Worker的稳定运行。但这种复杂性通常是值得的,因为它带来了巨大的可伸缩性和容错能力。

外部任务调度器(Cron等):简单、周期性任务的解决方案

何时选择:对于简单的、周期性的、不需要实时响应的批处理任务,例如每天凌晨的数据清理、每小时的统计报表生成,

cron

配合多个PHP脚本是足够且有效的。注意事项:不适合实时并发处理,调度粒度通常是分钟级或小时级。任务之间没有直接的通信或协调机制。

综合考量:

项目规模和复杂性:小型项目可能只需简单的PCNTL或Cron;大型、高并发、分布式系统则离不开Swoole和消息队列。性能要求:对实时性、响应速度有极高要求的,Swoole是强项;对吞吐量和后台处理能力有要求的,消息队列是核心。可维护性和可伸缩性:消息队列提供了最好的解耦和弹性伸缩能力。团队经验:选择团队熟悉的技术栈可以降低风险和学习成本。

在我看来,现代PHP应用,尤其是那些需要处理复杂业务和高并发的系统,往往会是多种方案的组合。例如,Web前端由PHP-FPM处理,耗时任务通过消息队列异步处理,而核心的高性能服务(如WebSocket)则由Swoole构建。没有银弹,只有最适合你当前场景的组合拳。

以上就是PHP代码怎么处理多线程_ PHP多线程模拟与任务调度详述的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1319961.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月12日 06:21:53
下一篇 2025年12月12日 06:22:05

相关推荐

  • HTMLrev 上的免费 HTML 网站模板

    HTMLrev 是唯一的人工策划的库专门专注于免费 HTML 模板,适用于由来自世界各地慷慨的模板创建者制作的网站、登陆页面、投资组合、博客、电子商务和管理仪表板世界。 这个人就是我自己 Devluc,我已经工作了 1 年多来构建、改进和更新这个很棒的免费资源。我自己就是一名模板制作者,所以我知道如…

    2025年12月24日
    300
  • 如何使用 Laravel 框架轻松整合微信支付与支付宝支付?

    如何通过 laravel 框架整合微信支付与支付宝支付 在 laravel 开发中,为电商网站或应用程序整合支付网关至关重要。其中,微信支付和支付宝是中国最流行的支付平台。本文将介绍如何使用 laravel 框架封装这两大支付平台。 一个简单有效的方法是使用业内认可的 easywechat lara…

    2025年12月24日
    000
  • Laravel 框架中如何无缝集成微信支付和支付宝支付?

    laravel 框架中微信支付和支付宝支付的封装 如何将微信支付和支付宝支付无缝集成到 laravel 框架中? 建议解决方案 考虑使用 easywechat 的 laravel 版本。easywechat 是一个成熟、维护良好的库,由腾讯官方人员开发,专为处理微信相关功能而设计。其 laravel…

    2025年12月24日
    300
  • 如何在 Laravel 框架中轻松集成微信支付和支付宝支付?

    如何用 laravel 框架集成微信支付和支付宝支付 问题:如何在 laravel 框架中集成微信支付和支付宝支付? 回答: 建议使用 easywechat 的 laravel 版,easywechat 是一个由腾讯工程师开发的高质量微信开放平台 sdk,已被广泛地应用于许多 laravel 项目中…

    2025年12月24日
    000
  • 使用Laravel框架如何整合微信支付和支付宝支付?

    使用 Laravel 框架整合微信支付和支付宝支付 在使用 Laravel 框架开发项目时,整合支付网关是常见的需求。对于微信支付和支付宝支付,推荐采用以下方法: 使用第三方库:EasyWeChat 的 Laravel 版本 建议直接使用现有的 EasyWeChat 的 Laravel 版本。该库由…

    2025年12月24日
    000
  • 如何将微信支付和支付宝支付无缝集成到 Laravel 框架中?

    如何简洁集成微信和支付宝支付到 Laravel 问题: 如何将微信支付和支付宝支付无缝集成到 Laravel 框架中? 答案: 强烈推荐使用流行的 Laravel 包 EasyWeChat,它由腾讯开发者维护。多年来,它一直保持更新,提供了一个稳定可靠的解决方案。 集成步骤: 安装 Laravel …

    2025年12月24日
    100
  • 网络进化!

    Web 应用程序从静态网站到动态网页的演变是由对更具交互性、用户友好性和功能丰富的 Web 体验的需求推动的。以下是这种范式转变的概述: 1. 静态网站(1990 年代) 定义:静态网站由用 HTML 编写的固定内容组成。每个页面都是预先构建并存储在服务器上,并且向每个用户传递相同的内容。技术:HT…

    2025年12月24日
    000
  • 为什么多年的经验让我选择全栈而不是平均栈

    在全栈和平均栈开发方面工作了 6 年多,我可以告诉您,虽然这两种方法都是流行且有效的方法,但它们满足不同的需求,并且有自己的优点和缺点。这两个堆栈都可以帮助您创建 Web 应用程序,但它们的实现方式却截然不同。如果您在两者之间难以选择,我希望我在两者之间的经验能给您一些有用的见解。 在这篇文章中,我…

    2025年12月24日
    000
  • 为什么前端固定定位会发生移动问题?

    前端固定定位为什么会出现移动现象? 在进行前端开发时,我们经常会使用CSS中的position属性来控制元素的定位。其中,固定定位(position: fixed)是一种常用的定位方式,它可以让元素相对于浏览器窗口进行定位,保持在页面的固定位置不动。 然而,有时候我们会遇到一个问题:在使用固定定位时…

    2025年12月24日
    000
  • 从初学到专业:掌握这五种前端CSS框架

    CSS是网站设计中重要的一部分,它控制着网站的外观和布局。前端开发人员为了让页面更加美观和易于使用,通常使用CSS框架。这篇文章将带领您了解这五种前端CSS框架,从入门到精通。 Bootstrap Bootstrap是最受欢迎的CSS框架之一。它由Twitter公司开发,具有可定制的响应式网格系统、…

    2025年12月24日
    200
  • 克服害怕做选择的恐惧症:这五个前端CSS框架将为你解决问题

    选择恐惧症?这五个前端CSS框架能帮你解决问题 近年来,前端开发者已经进入了一个黄金时代。随着互联网的快速发展,人们对于网页设计和用户体验的要求也越来越高。然而,要想快速高效地构建出漂亮的网页并不容易,特别是对于那些可能对CSS编码感到畏惧的人来说。所幸的是,前端开发者们早已为我们准备好了一些CSS…

    2025年12月24日
    200
  • 深入理解CSS框架与JS之间的关系

    深入理解CSS框架与JS之间的关系 在现代web开发中,CSS框架和JavaScript (JS) 是两个常用的工具。CSS框架通过提供一系列样式和布局选项,可以帮助我们快速构建美观的网页。而JS则提供了一套功能强大的脚本语言,可以为网页添加交互和动态效果。本文将深入探讨CSS框架和JS之间的关系,…

    2025年12月24日
    000
  • is与where选择器:提升前端编程效率的秘密武器

    is与where选择器:提升前端编程效率的秘密武器 在前端开发中,选择器是一种非常重要的工具。它们用于选择文档中的元素,从而对其进行操作和样式设置。随着前端技术的不断发展,选择器也在不断演化。而其中,is与where选择器成为了提升前端编程效率的秘密武器。 is选择器是CSS Selectors L…

    2025年12月24日
    000
  • 前端技巧分享:使用CSS3 fit-content让元素水平居中

    前端技巧分享:使用CSS3 fit-content让元素水平居中 在前端开发中,我们常常会遇到需要将某个元素水平居中的情况。使用CSS3的fit-content属性可以很方便地实现这个效果。本文将介绍fit-content属性的使用方法,并提供代码示例。 fit-content属性是一个相对于元素父…

    2025年12月24日
    000
  • 前端技术分享:利用fit-content实现页面元素的水平对齐效果

    前端技术分享:利用fit-content实现页面元素的水平对齐效果 在前端开发中,实现页面元素的水平对齐是一个常见的需求。尤其在响应式布局中,我们经常需要让元素根据设备的屏幕大小自动调整位置,使页面更加美观和易读。在本文中,我将分享一种利用CSS属性fit-content来实现页面元素的水平对齐效果…

    2025年12月24日
    000
  • 聊聊怎么利用CSS实现波浪进度条效果

    本篇文章给大家分享css 高阶技巧,介绍一下如何使用css实现波浪进度条效果,希望对大家有所帮助! 本文是 CSS Houdini 之 CSS Painting API 系列第三篇。 现代 CSS 之高阶图片渐隐消失术现代 CSS 高阶技巧,像 Canvas 一样自由绘图构建样式! 在上两篇中,我们…

    2025年12月24日 好文分享
    200
  • 13 个实用CSS技巧,助你提升前端开发效率!

    本篇文章整理分享13 个前端可能用得上的 css技巧,包括修改输入占位符样式、多行文本溢出、隐藏滚动条、修改光标颜色等,希望对大家有所帮助! 修改输入占位符样式、多行文本溢出、隐藏滚动条、修改光标颜色、水平和垂直居中。多么熟悉的场景!前端开发者几乎每天都会和它们打交道,本文收集 13 个CSS技巧,…

    2025年12月24日
    000
  • 巧用距离、角度及光影制作炫酷的 3D 文字特效

    如何利用 css 实现3d立体的数字?下面本篇文章就带大家巧用视觉障眼法,构建不一样的 3d 文字特效,希望对大家有所帮助! 最近群里有这样一个有意思的问题,大家在讨论,使用 CSS 3D 能否实现如下所示的效果: 这里的核心难点在于,如何利用 CSS 实现一个立体的数字?CSS 能做到吗? 不是特…

    2025年12月24日 好文分享
    000
  • CSS高阶技巧:实现图片渐隐消的多种方法

    将专注于实现复杂布局,兼容设备差异,制作酷炫动画,制作复杂交互,提升可访问性及构建奇思妙想效果等方面的内容。 在兼顾基础概述的同时,注重对技巧的挖掘,结合实际进行运用,欢迎大家关注。 正文从这里开始。 在过往,我们想要实现一个图片的渐隐消失。最常见的莫过于整体透明度的变化,像是这样: 立即学习“前端…

    2025年12月24日 好文分享
    000
  • 聊聊CSS中怎么让auto height支持过渡动画

    css如何让auto height完美支持过渡动画?下面本篇文章带大家聊聊css中让auto height支持过渡动画的方法,希望对大家有所帮助! 众所周知,高度在设置成auto关键词时是不会触发transition过渡动画的,下面是伪代码 div{ height: 0; transition: 1…

    2025年12月24日 好文分享
    000

发表回复

登录后才能评论
关注微信