找到
177
篇与
技术教程
相关的结果
- 第 14 页
-
Joe再续前缘实现自动更新 首先,在宝塔终端执行添加主题安全目录到 Git 全局配置的命令 # 主题目录示例:/www/wwwroot/blog.yihang.info/usr/themes/Joe git config --global --add safe.directory 这里填写你的主题目录添加主题安全目录到 Git 全局配置的命令执行完成后会没有任何返回内容,这代表已经成功了添加主题安全目录到 Git 的全局配置后在宝塔计划任务处添加Shell脚本或bat脚本,脚本内容为 #!/bin/bash echo "开始检测更新" # 主题目录示例:/www/wwwroot/blog.yihang.info/usr/themes/Joe gitPath="这里填写你的主题目录" # git 网址 gitHttp="https://gitee.com/yh-it/Joe" echo "Web站点路径:$gitPath" #判断项目路径是否存在 if [ -d "$gitPath" ]; then cd $gitPath #判断是否存在git目录 if [ ! -d ".git" ]; then echo "在该目录下克隆 git" git clone $gitHttp gittemp mv gittemp/.git . rm -rf gittemp fi #拉取最新的项目文件 sudo git reset --hard origin/master sudo git pull #设置目录权限 chown -R www:www $gitPath echo "更新完毕" exit else echo "该项目路径不存在" exit fi示例 宝塔计划任务 Joe再续前缘自动更新图片
-
你真的应该弄清楚 URI 和 URL 的区别 在互联网上,我们经常需要引用资源的位置来访问对应的资源。为了实现这一点,有两个术语经常被提及:URI 和 URL。这两个术语很容易也经常被弄混,很多人虽然大概能知道意思,但是并不能区分两者的差别,一直处于稀里糊涂之中。本文将详细介绍 URI 和 URL 的定义、作用以及它们之间的差异,并通过具体的例子帮助大家更好地理解。 什么是 URI? URI(Uniform Resource Identifier),统一资源标识符,是一个字符串,用于唯一标识互联网上的资源。URI 主要用于标识资源,而不管资源位于何处或如何访问。一个 URI 可能包含多种类型的标识信息,包括但不限于名称、位置、对象类型等。 拿书来举个例子,假设一本书的标题是《计算机网络》,可以使用一个 URI 来唯一标识这本书,如 urn:isbn:978-0132671453,这里的 “urn:isbn:” 表示这是一个国际标准书号 (ISBN) 格式的 URI。再拿本地文件来举个例子,对于本地文件系统中的一个文件,我们可以使用类似这样的 URI:file:///C:/Documents/MyFile.txt,这里的 “file://” 表示这是文件系统的路径。 URI 的主要目的是标识资源,而无需指定如何访问这些资源。URI 可以用于各种各样的资源,包括文件、书籍、服务等。 什么是 URL? URL(Uniform Resource Locator),统一资源定位符,是 URI 的一个子集,专门用于描述资源的位置以及访问资源的方法。URL 不仅标识资源,还提供了访问资源的具体路径。 举个网站的例子,假设我们要访问一个网站,其 URL 是 https://blog.csdn.net/luduoyuan,这里的 “http://” 表示使用 HTTP 协议访问该资源,“blog.csdn.net” 是域名,“/luduoyuan” 是资源的路径。再举个邮件的例子,发送电子邮件时使用的 URL 形式可能是 mailto:example@example.com,这里的 “mailto:” 表示使用邮件客户端发送电子邮件。 URL 明确指出了资源的位置和访问方式。URL 包含了足够的信息,可以直接访问资源。 URI 和 URL 的区别 URI 和 URL 的区别主要体现在以下几个方面: 范围不同:URI 是一个更广泛的概念,包括了 URL 和 URN(Uniform Resource Name)等。 作用不同:URI 的主要作用是标识资源;URL 则是用于描述资源的位置和访问方法。 格式不同:URL 通常以协议开头(如 “http://” 或 “https://”),后面跟着资源的位置。URI 可能不包含访问协议,而是仅仅作为标识符。 当在浏览器地址栏中输入一个网址时,实际上是在输入一个 URL。例如,输入 https://www.google.com 就是在告诉浏览器访问 Google 的主页。如果需要引用一个资源而不关心它的具体位置或访问方式,那么可能会使用一个 URI。例如,在学术论文中引用一个特定的研究成果时,可能会使用一个 DOI(数字对象唯一标识符)作为 URI。 小结 URI 和 URL 都是用于互联网资源标识的重要概念,但在实际使用中经常被混淆,所以一定要弄明白它们的区别。URI 和 URL 各自有着不同的重点和应用场景,URI 是一个更广泛的概念,包含了 URL,而 URL 是 URI 的一个子集,专门用于资源的定位。理解了它们之间的区别,有助于我们在处理网络资源时更加准确高效。
-
Web 开发 2025:PHP 依然有一席之地 PHP图片 在 2025 年即将到来之际,许多新晋 Web 开发人员都在思考一个问题:学习 PHP 还有必要吗? PHP 作为 Web 开发领域的元老,几十年来一直占据着主导地位,其影响力不容小觑。超过 75% 的网站都运行在 WordPress、Drupal 和 Joomla 等平台之上,而这些平台正是由 PHP 驱动的。然而,随着新兴编程语言和框架的涌现,PHP 的未来似乎蒙上了一层阴影,学习它的价值也因此受到质疑。 为了帮助您做出明智的决定,我们将深入探讨在 2025 年学习 PHP 的利弊,并分析其未来发展趋势。 1、PHP 的持续相关性 尽管 Python、JavaScript 和 Ruby 等新兴语言来势汹汹,但 PHP 在 Web 开发领域的地位依然不可撼动。尤其是 WordPress 等巨头平台,凭借 PHP 构建,牢牢占据着内容管理系统(CMS)市场的半壁江山。因此,对于专注于网站、博客或电子商务解决方案开发的开发者来说,掌握 PHP 依然是至关重要的技能。 2、框架和工具 现代 PHP 开发早已摆脱了过去的繁琐,这主要归功于 Laravel 等框架的兴起。Laravel 以其优雅的语法和强大的功能著称,为开发者提供了前所未有的便捷体验。Artisan 命令行工具、Eloquent ORM 和 Blade 模板引擎等更是如虎添翼,极大提升了开发效率。类似的,其他流行框架如 Django 和 Ruby on Rails 也采用了类似的设计理念, 致力于为开发者提供高效愉悦的开发体验。 3、PHP 8.x 和性能提升 PHP 并未故步自封,而是不断发展进化。PHP 8.0 及其后续版本的发布,带来了显著的性能提升和安全增强。其中,全新的 JIT 编译器极大提升了代码执行速度, 使 PHP 在与其他语言的竞争中更具优势。此外,PHP 还积极拥抱其他语言,支持与 Node.js 和 Python 等语言的集成,进一步拓展了其应用领域。 4、繁荣的社区和就业机会 PHP 并未故步自封,而是不断发展进化。PHP 8.0 及其后续版本的发布,带来了显著的性能提升和安全增强。其中,全新的 JIT 编译器极大提升了代码执行速度, 使 PHP 在与其他语言的竞争中更具优势。此外,PHP 还积极拥抱其他语言,支持与 Node.js 和 Python 等语言的集成,进一步拓展了其应用领域。 5、PHP 与新语言 虽然 PHP 宝刀未老,但我们也必须承认,一些新兴语言和框架在某些方面已经走在了前面,尤其是在现代 Web 应用开发领域。 JavaScript (Node.js): Node.js 已然成为全栈开发的热门选择,其最大的优势在于允许开发者使用 JavaScript 同时进行前端和后端开发。随着 React、Vue 等 JavaScript 框架的流行,越来越多的开发者投入 Node.js 的怀抱,享受其带来的流畅开发体验。 Python (Django/Flask): Python 以其简洁易读的语法著称,并且在数据科学和人工智能领域得到了广泛应用。这使得 Python 也成为了 Web 开发领域的热门选择。与 PHP 相比,Django 和 Flask 等 Python 框架提供了更强大的功能和更简洁的语法,对新一代开发者更具吸引力。 Go: Go 语言以其超快的速度和简洁的语法而闻名,在高性能应用和微服务领域越来越受欢迎。 尽管 PHP 依然占据一席之地,但学习 JavaScript 或 Python 等语言可以为你打开更多大门,让你在数据科学、机器学习或移动应用开发等领域大展拳脚。 6、您应该在 2025 年学习 PHP 吗? 如果你专注于开发基于 CMS 的项目,或者需要维护现有的 PHP 系统,那么学习 PHP 依然是明智之举。 而如果你立志成为全栈开发者,JavaScript 或 Python 或许是更佳选择。 当然,鱼和熊掌也可兼得。精通 PHP 的同时掌握前端开发技能,无疑会让你在求职市场上脱颖而出。更重要的是,借助 Laravel 等现代框架,PHP 开发体验也丝毫不逊色于其他语言。 PHP 将成为 2025 年最受好评的编程语言 PHP 将成为 2025 年最受好评的编程语言图片 这张图表预测了到 2025 年,PHP 与其他主流编程语言(JavaScript、Python、Java 和 Go)在受欢迎程度、就业机会和 Web 开发领域的主导地位。 1、受欢迎程度(%):该指标反映了开发者对每种语言的使用率和满意度。 JavaScript 以 95% 的高比例遥遥领先,Python 紧随其后,占比 92%。 PHP 依然保持着 80% 的强劲势头,表明其与 Web 开发的密切联系。 Java 和 Go 分别以 75% 和 60% 的比例位居其后。 2、就业机会(%):该指标预测了市场对掌握每种语言的开发者的需求程度。 PHP 的就业市场份额高达 82%,凸显了其强劲的就业前景,尤其是在 Web 开发和 CMS 平台领域。 JavaScript 和 Python 分别以 90% 和 88% 的比例领先,而 Java 和 Go 也保持稳定,分别占比 80% 和 65%。 3、Web 开发主导地位(%):该指标衡量每种语言在 Web 开发领域的影响力。 JavaScript 在前端开发领域占据绝对优势,占比高达 95%。 PHP 作为服务器端开发的传统优势依然存在,占比 85%,这意味着它将继续为大量 Web 应用提供支持,尤其是 WordPress 和 Laravel 等平台。 Python (70%) 和 Java (50%) 在 Web 应用开发中也占有一席之地,而 Go (40%) 正在某些细分领域逐渐崭露头角。 总而言之,这份图表强调了 PHP 在 Web 开发领域的重要地位,它依然是需求旺盛的主流语言之一,对于从事 CMS 平台和遗留系统开发的开发者来说更是不可或缺的技能。 结论 展望 2025 年,PHP 在 Web 开发领域依然占据着不可忽视的地位,尤其是在 CMS 开发和遗留系统维护方面。 当然,为了拓宽职业发展道路,或者进军人工智能、数据科学等前沿领域,学习 JavaScript 或 Python 等语言也是非常有益的。 总而言之,PHP 本身在不断发展进步,加之 Laravel 等现代框架的助力,对于有志于成为 Web 开发者的新人来说,PHP 依然是一项值得学习的宝贵技能,尤其是在 Web 开发领域。
-
纯CSS实现任意元素扫光效果的三种方式 介绍一个比较常见的动画效果。 在日常开发中,为了强调凸显某些文本或者元素,会加一些扫光动效,起到吸引眼球的效果,比如文本的 图片 或者是一个卡片容器,里面可能是图片或者文本或者任意元素 图片 除此之外,还有那种不规则的图片,比如奖品图案 图片 这些是如何实现的呢?一起看看吧 一、CSS 扫光的原理 CSS 扫光动画的原理很简单,就是一个普通的、从左到右的、无限循环的位移动画 图片 位移动画可以选择 transform 或者改变 background-position 都行。 至于扫光,我们只需要绘制一条斜向上45deg的线性渐变就可以了,示意如下 图片 用 CSS 实现就是 background: linear-gradient(45deg, rgba(255,255,255,0) 40%, rgba(255, 255, 255, 0.7), rgba(255,255,255,0) 60%);准备工作做好了,下面看 3 种不同场景的实现 二、文本扫光 首先来看文本扫光。 由于扫光在文本内部,所以需要将这个渐变作为文本的颜色。文本渐变色,可以用 backgrond-clip:text 来实现,假设 HTML 是这样的 <h1 class="shark-txt">前端侦探</h1>为了让效果看起来更加明显,我们用一个比较粗的字体 h1{ font-size: 60px; font-family: "RZGFDHDHJ"; font-weight: normal; color: #9747FF; }效果如下 图片 现在我们通过 background-clip 来添加扫光,由于是裁剪背景,所以需要将当前文本颜色设置透明,建议通过 -webkit-text-fill-color: transparent 来设置,这样可以保留文本原有颜色,好处是其他地方,比如 background-color 可以直接使用原有文本颜色 currentColor ,具体实现如下 .shark-txt{ -webkit-text-fill-color: transparent; background: linear-gradient(45deg, rgba(255,255,255,0) 40%, rgba(255, 255, 255, 0.7), rgba(255,255,255,0) 60%) -100%/50% no-repeat currentColor; -webkit-background-clip: text; }效果如下 图片 最后就是让这个扫光动起来了。 由于是在文本内部,所以这里可以通过改变background-position来实现扫光动画了,动画很简单,如下 @keyframes shark-txt { form{ background-position: -100%; } to { background-position: 200%; } }但是这样做没有动画效果,完全不会动。 这是因为背景默认尺寸是 100% ,根据背景偏移百分比的计算规则,当背景尺寸等于容器尺寸时,百分比完全失效,具体规则如下 给定背景图像位置的百分比偏移量是相对于容器的。值 0% 表示背景图像的左(或上)边界与容器的相应左(或上)边界对齐,或者说图像的 0% 标记将位于容器的 0% 标记上。值为 100% 表示背景图像的 右(或 下)边界与容器的 右(或 下)边界对齐,或者说图像的 100% 标记将位于容器的 100% 标记上。因此 50% 的值表示水平或垂直居中背景图像,因为图像的 50% 将位于容器的 50% 标记处。类似的,background-position: 25% 75% 表示图像上的左侧 25% 和顶部 75% 的位置将放置在距容器左侧 25% 和距容器顶部 75% 的容器位置。 https://developer.mozilla.org/zh-CN/docs/Web/CSS/background-position(container width - image width) * (position x%) = (x offset value) (container height - image height) * (position y%) = (y offset value)所以这种情况下,我们可以手动改小一点背景尺寸,比如 50% .shark-txt { -webkit-text-fill-color: transparent; background: linear-gradient(45deg, rgba(255, 255, 255, 0) 40%, rgba(255, 255, 255, 0.7), rgba(255, 255, 255, 0) 60%) -100% / 50% no-repeat currentColor; -webkit-background-clip: text; animation: shark-txt 2s infinite; }这样就能完美实现文本扫光效果了 图片 三、卡片容器扫光 还有一种比较常见的是容器内的扫光动效,通常是在一个圆角矩形的容器里。 像这种情况下就不能直接用背景渐变了,因为会被容器内的其他元素覆盖。所以我们需要创建一个伪元素,然后通过改变伪元素的位移来实现扫光动画了。 假设有一个容器,容器内有一张图片,HTML 如下 <div class="shark-wrap card"> <img src="https://imgservices-1252317822.image.myqcloud.com/coco/b11272023/ececa9a5.7y0amw.jpg"> </div>简单修饰一下 .card{ width: 300px; border-radius: 8px; background-color: #FFE8A3; } .card img{ display: block; width: 100%; }效果如下 图片 下面通过伪元素来创建一个扫光层,设置位移动画 .shark-wrap::after{ content: ''; position: absolute; inset: -20%; background: linear-gradient(45deg, rgba(255,255,255,0) 40%, rgba(255, 255, 255, 0.7), rgba(255,255,255,0) 60%); animation: shark-wrap 2s infinite; transform: translateX(-100%); } @keyframes shark-wrap { to { transform: translateX(100%); } }效果如下 图片 最后直接超出隐藏就行了 .shark-wrap{ overflow: hidden; }最终效果如下 图片 也适合那种圆形头像 图片 四、不规则图片扫光 其实前面两种情况已经适合大部分场景了,其实还有一种情况,就是那种不规则的图片扫光。这种图片无法直接通过 overflow:hidden 去隐藏多余部分,比如这样 图片 很明显在图片之外的地方也出现了扫光,无法做到扫光在图形的"内部"。 那么,有没有办法根据图片的外形去裁剪呢?当然也是有办法的,这里需要用到 CSS mask 遮罩。 简单来说,就是直接将该图片作为遮罩图片,这样只有形状内的部分可见,形状外的直接被裁剪了 图片 在上一种场景的情况下,只需要在此基础之上,添加一个完全相同的 mask 遮罩就行了 <div class="shark-wrap" style="-webkit-mask: url(https://imgservices-1252317822.image.myqcloud.com/coco/s09252023/3af9e8de.00uqxe.png) 0 0/100%"> <img class="logo" src="https://imgservices-1252317822.image.myqcloud.com/coco/s09252023/3af9e8de.00uqxe.png"> </div>这样就可以把扫光多余的部分裁剪掉了 图片 换张图也能很好适配 图片 五、总结一下 以上就本文的全部内容了,共介绍了3种不同的扫光场景,你学到了吗?下面总结一下重点 扫光样式本身可以直接用线性渐变绘制而成 扫光动画原理很简单,就是一个水平的位移动画 文本扫光动画需要通过改变 background-postion 实现 当背景尺寸等于容器尺寸时,设置 background-postion 百分比无效 普通容器的扫光效果需要借助伪元素实现,因为如果使用背景会被容器内的元素覆盖 普通容器的扫光动画可以直接用 transfrom 实现 使用 overflow:hidden 裁剪容器外的部分 不规则图片的扫光效果无法直接根据形状裁剪 借助 CSS mask 可以根据图片本身裁剪掉扫光多余部分 对了,这个属于常规需求,只是普通的动画效果,没有兼容性限制,放心使用,除了本文的样式,还可以根据需求改变扫光的大小,角度,颜色等,这个就看具体需求了。 六、完整案例 CSS shark animation (codepen.io):https://codepen.io/xboxyan/pen/KKLLZOE CSS shark animation (juejin.cn):https://code.juejin.cn/pen/7385810378132815882
-
PHP异步协程开发:优化邮件发送的速度与稳定性 在现代的互联网应用中,邮件发送是一个非常重要的功能,无论是用户注册验证、订单确认还是密码重置等等,都离不开邮件的发送。然而,传统的同步邮件发送方式在处理大量邮件发送时往往效率低下且不稳定。为了解决这个问题,我们可以使用PHP的异步协程开发,通过并发发送邮件,提高发送速度和稳定性。 本文将详细介绍使用PHP异步协程来优化邮件发送的方法,并通过具体的代码示例来说明。 一、PHP异步协程简介 PHP异步协程是指通过利用事件循环机制,将多个任务并发执行,以提高应用程序的执行效率。在传统的PHP开发中,我们通过多线程或多进程来实现并发处理,但这种方式会增加系统资源的开销。而PHP异步协程则通过单线程来同时处理多个任务,不会引起资源开销过大的问题。 二、优化邮件发送的原理 传统的邮件发送方式是同步的,即每发送一封邮件,都要等待邮件发送完成后再发送下一封。这样一来,当需要发送大量邮件时,会花费很长的时间,而且容易造成服务器的负载过大。 而通过PHP异步协程开发,我们可以将邮件发送任务封装成一个异步协程,然后一次性并发发送多个任务,提高发送效率。同时,由于使用了异步协程,可以避免等待发送完成的时间,从而提高整体的稳定性。 三、使用PHP异步协程发送邮件的代码示例 下面是一个使用PHP异步协程发送邮件的代码示例: use SwooleCoroutine; use SwooleCoroutineChannel; use PHPMailerPHPMailerPHPMailer; function sendMail($to, $subject, $body) { go(function () use ($to, $subject, $body) { $mail = new PHPMailer; $mail->isSMTP(); $mail->Host = 'smtp.example.com'; $mail->SMTPAuth = true; $mail->Username = 'username'; $mail->Password = 'password'; $mail->SMTPSecure = 'tls'; $mail->Port = 587; $mail->setFrom('from@example.com'); $mail->addAddress($to); $mail->Subject = $subject; $mail->Body = $body; if ($mail->send()) { echo "发送成功 "; } else { echo "发送失败:" . $mail->ErrorInfo . " "; } }); } $channel = new Channel(); go(function () use ($channel) { for ($i = 1; $i <= 100; $i++) { $channel->push(["to@example.com", "测试邮件{$i}", "这是一封测试邮件"]); } $channel->close(); }); go(function () use ($channel) { while ($data = $channel->pop()) { sendMail($data[0], $data[1], $data[2]); } }); Coroutine::create(function () { Coroutine::sleep(1); // 等待所有邮件发送完成 swoole_event_exit(); // 退出事件循环 });上述代码首先定义了一个 sendMail 函数,用于发送邮件。在 sendMail 函数内部,我们使用了 PHPMailer 库来实现邮件的发送。在异步协程中发送邮件时,需要等待邮件发送完成的时间,因此我们使用了协程的方式来进行处理,保证发送的效率。 然后,我们创建了一个 Channel 通道,将待发送的邮件信息推入该通道,并在另外一个协程中进行发送。 最后,我们使用协程的方式来等待所有邮件发送完成,并退出事件循环。 四、总结 通过使用PHP异步协程开发,我们可以优化邮件发送的速度和稳定性,提高应用程序的性能和响应能力。同时,异步协程的使用也能减少服务器资源的开销,更好地满足用户的需求。 当我们在开发邮件发送功能时,可以参考上述的代码示例,并根据实际需求进行相应的调整和优化。希望本文对广大开发者在优化邮件发送方面有所帮助。
-
使用JavaScript动态生成网站文章目录及内容滚动跟随效果 由于之前使用的文章导读插件性能过于臃肿,导致资源消耗高且难以维护,因此我决定自行开发一个轻量级的文章导读功能。参考了郄郄私语的 案例文章,我实现了以下四个主要功能: 根据文章内容自动生成目录 点击目录跳转至相应章节 滚动阅读时,目录随当前章节自动切换 目录跟随文章内容滚动 目标 本文旨在实现以下功能: 自动生成文章目录 点击目录跳转至对应章节 目录根据当前阅读章节自动高亮 目录随文章内容滚动 根据文章内容自动生成目录 实现自动生成目录的前提是文章内容须有清晰的层次结构,这需要使用 h1 至 h6 标签来定义标题。通过 JavaScript,我们可以提取这些标题来生成目录: var articleTitleList = $('.joe_detail__article').find('h1, h2, h3, h4, h5, h6'); articleTitleList.each(function() { const headingLevel = $(this).prop("tagName").toLowerCase(); const headingName = $(this).text().trim(); console.log(headingLevel, headingName); $('#catalogs').append(`<div class="catalog catalog-${headingLevel}">${headingName}</div>`); });在样式表中为目录项定义缩进样式: .catalog-h2 { margin-left: 1em; } .catalog-h3 { margin-left: 2em; } .catalog-h4 { margin-left: 3em; } .catalog-h5 { margin-left: 4em; } .catalog-h6 { margin-left: 5em; }点击目录跳转至对应章节 点击目录跳转至相应章节可以通过为每个标题添加锚点。我们将在 h1 至 h6 标签上添加 id: articleTitleList.each(function() { const headingName = $(this).text().trim(); const enHeadingName = encodeURIComponent(headingName); $(this).attr('id', `${enHeadingName}`); $('.posts-nav-lists>ul').append(`<li><a href="#${enHeadingName}">${headingName}</a></li>`); });目录自动切换至当前章节 为了让目录随着阅读位置自动切换,我们将监控用户的滚动位置并依据此更新目录的高亮条目: const catalogTrack = () => { let $currentHeading = $('h1'); articleTitleList.each(function() { const $heading = $(this); if ($heading.offset().top - $(document).scrollTop() > 20) return false; // 退出条件 $currentHeading = $heading; }); // 更新目录状态 const anchorName = $currentHeading.attr('id'); $('.posts-nav-lists>ul>li').removeClass('active'); $(`#title-${anchorName}`).parent().addClass('active'); };目录随文章内容滚动 为确保当前章节始终可见,我们控制目录区域的滚动: if ($catalog.length > 0) { $('.posts-nav-box').scrollTop($catalog[0].offsetTop - 50); // 确保可见 }性能优化 为了避免在滚动时频繁调用 catalogTrack 导致性能降低,我们可以使用函数节流技术: function throttle(fn, wait) { let lastTime = 0; return function() { const now = Date.now(); if (now - lastTime >= wait) { fn.apply(this, arguments); lastTime = now; } }; } window.addEventListener('scroll', throttle(catalogTrack, 500)); // 每500毫秒调用一次自定义跳转行为 考虑到固定导航条可能遮挡目标章节,我们可以自定义跳转行为,确保目标元素不会被遮挡: document.querySelectorAll('.posts-nav-lists>ul>li>a').forEach(link => { link.addEventListener('click', (event) => { event.preventDefault(); // 阻止默认跳转 const targetId = link.getAttribute('href').substring(1); const targetElement = document.getElementById(targetId); const headerHeight = document.querySelector('.joe_header').offsetHeight; const scrollTop = $(targetElement).offset().top - headerHeight - 10; window.scrollTo({ top: scrollTop, behavior: 'smooth' }); }); });总结 本文记录了生成和控制博客文章目录的思路与方法,针对不同需求可能会有其他解决方案。欢迎大家在评论区讨论和分享建议,感谢阅读! 完整代码示例 HTML 部分 <section class="joe_aside__item posts-nav-box"> <div class="joe_aside__item-title"><i class="fa fa-list-ul"></i><span class="text">文章目录</span><span class="line"></span></div> <div class="joe_aside__item-contain"> <div class="posts-nav-lists"><ul class="bl nav"></ul></div> </div> </section>JavaScript 部分 var articleTitleList = $('.joe_detail__article').find('h1, h2, h3, h4, h5, h6'); if (articleTitleList.length > 0) { // 目录生成及事件绑定 (function () { for (let heading of articleTitleList) { const headingLevel = heading.tagName.toUpperCase(); const $heading = $(heading); // console.log($heading); const headingName = $heading.text().trim(); const enHeadingName = encodeURIComponent(headingName); $heading.attr('id', `${enHeadingName}`); $('.posts-nav-lists>ul').append(`<li class="n-${headingLevel}"><a id="title-${enHeadingName}" href="#${enHeadingName}">${headingName}</a></li>`); // const anchorName = $heading.attr('id'); // console.log(headingLevel, headingName); } if (Joe.IS_MOBILE) { $('.joe_action').append(`<div class="joe_action_item posts-nav-switcher"><i class="fa fa-list-ul"></i></div>`) let joe_aside = $('.joe_aside .joe_aside__item.posts-nav-box .joe_aside__item-contain').html(); $('.joe_aside .joe_aside__item.posts-nav-box').remove(); let html = document.createElement('div'); html.className = 'posts-nav-box'; html.innerHTML = joe_aside; // console.log(html); $('.posts-nav-switcher').append(html); $('.joe_action_item .posts-nav-box').css({ 'position': 'absolute', 'display': 'none', 'right': '50px', 'bottom': '0px', 'padding': '15px', 'border-radius': 'var(--radius-wrap)', 'box-shadow': '0 0 10px 8px var(--main-shadow)', 'overflow': 'auto', 'max-height': '50vh', 'max-width': '80vw' }) $('.joe_action_item.posts-nav-switcher').click(() => { $('.joe_action_item.posts-nav-switcher .posts-nav-box').fadeToggle(200); }); } const catalogTrack = () => { // console.log('页面滚动标题监听'); let $currentHeading = $('h1'); for (let heading of articleTitleList) { const $heading = $(heading); if ($heading.offset().top - $(document).scrollTop() > $('.joe_header').height()) { break; } $currentHeading = $heading; const anchorName = $currentHeading.attr('id'); const $catalog = $(document.getElementById(`title-${anchorName}`)).parent(); if (!$catalog.hasClass('active')) { $('.posts-nav-lists>ul>li').removeClass('active'); $catalog.addClass('active'); } if ($catalog.length > 0) { if ($('.posts-nav-box .joe_aside__item-contain').length > 0) { $('.posts-nav-box .joe_aside__item-contain').scrollTop($catalog[0].offsetTop - 50); } else { $('.posts-nav-box').scrollTop($catalog[0].offsetTop - 50); } } else { $('.posts-nav-lists').scrollTop(0); } } }; /** * 函数节流,时间戳方案 * @param {*} fn * @param {*} wait * @returns */ function throttle(fn, wait) { var pre = Date.now(); return function () { var context = this; var args = arguments; var now = Date.now(); if (now - pre >= wait) { fn.apply(context, args); pre = Date.now(); } } } window.addEventListener('scroll', throttle(() => { catalogTrack(); }, 500)); // 监听文章目录a标签点击 document.querySelectorAll('.posts-nav-lists>ul>li>a').forEach(link => { link.addEventListener('click', (event) => { event.preventDefault(); // 阻止默认跳转行为 // 获取目标元素 ID const targetId = link.getAttribute('href').substring(1); const targetElement = document.getElementById(targetId); if (targetElement) { // 获取目标元素距离页面顶部的距离 const targetTop = $(targetElement).offset().top; // console.log(targetTop); // 获取顶栏高度,考虑动态高度变化和内部元素 const headerHeight = document.querySelector('.joe_header').offsetHeight; // 计算滚动位置 const scrollTop = (targetTop - headerHeight) - 10; // 预留10px的美观距离 window.scrollTo({ top: scrollTop, behavior: 'smooth' }); } else { console.error('目标元素未找到:', targetId); } }); }); }()) } else { $('.joe_aside__item.posts-nav-box').remove(); }通过以上修改,文章的可读性、结构性和实用性得以提升,使读者能够更好地理解和使用所提供的功能。
-
三十六计完整详解 三十六计,一计一集,计计相扣,在展现中国古代兵法和东方智慧的同时,浓彩重墨描绘出一幅二千年前中国战国时期政治、军事与各阶层不同的人物情感相交融的历史画卷。 三十六计图片 胜战计 第一计:瞒天过海 备周而意怠,常见则不疑,阴在阳之内,不在阳之对。太阳,太阴。 译:认为准备万分周到,就容易松劲;平时看惯了的,就往往不在怀疑了,秘计隐藏在暴露的事物中,而不是和公开的形式相排斥。非常公开的往往蕴藏着非常机密的。 第二计:围魏救赵 共敌不如分敌,敌阳不如敌阴。 译:树敌不可过多,对敌要各个击破,对现在还不忙于消灭的,要隐藏我们的意图。 第三计:借刀杀人 敌已明,友未定,引友杀敌,不出自力,以损推演。 译:作战的对象已经确定,而朋友的态度还不稳定,要诱导朋友去消灭敌人,避免消耗自己的力量。 第四计:以逸待劳 困敌之势,不以战,损刚益柔。 译:控制敌方力量发展的命脉来扼杀他,而不采取进攻的形势,这就是“损刚益柔”原理的演用。 第五计:趁火打劫 敌之害大,就势取利,刚决柔也。 译:敌方的危机很大,就乘机取利,用优势力量攻击软弱的。 第六计:声东击西 乱志乱萃,不虞“坤下兑上”之象;利其不自主而取之。 译:敌人乱撞瞎碰,摸不清情况,这是《易经》“萃”封上所说的“坤下兑上”的混乱征状。必须利用敌方失去控制力的时机加以消灭。 敌战计 第七计:无中生有 诳也,非诳也,实其所诳也。少阴,太阴,太阳。 译:无中生有是运用假象,但不是弄假到底。而是使假象变真象,大小假象,掩护真象。 第八计:暗渡陈仓 示之以动,利其静而有主,“益动而巽”。 译:故意暴露行动,利用敌方固守的时机,便主动偷袭。 第九计:隔岸观火 阳乖序乱,阴以待逆,暴戾恣睢,其势自毙。顺以动豫,豫顺以动。 译:敌人内部分裂,秩序混乱,我便等待他发生内讧,那时敌人穷凶极恶,翻目仇杀,势必自行灭亡。我要根据敌人变动作好准备;作好准备之后,还要根据敌人的变动而行动。 第十计:笑里藏刀 信而安之,阴以图之,备而后动,勿使有变:刚中柔外也。 译:使敌人相信我方,并使其麻痹松懈,我则暗中策划,充分准备,一有机会,立即动手,使他来不及应变,这是暗中厉害,表面柔和的策略。 第十一计:李代桃僵 势必有损,损阴以益阳。 译:当局势发展有所损失的时候,要舍得局部的损失,以换取全局的优势。 第十二计:顺手牵羊 微隙在所必乘,微利在所必得。少阴,少阳。 译:微小的漏洞必须利用,微小的利益,也必须获得。变敌人小的疏忽,为我方小的胜利。 攻战计 第十三计:打草惊蛇 疑为叩实,察而后动,复者,阴之媒也。 译:有怀疑的就要侦察实情,完全掌握了实情再行动。反复侦察,是发现暗藏敌人的因素。 第十四计:借尸还魂 有用者不可借,不能用者,求借,借不能用者而用之。匪我求童蒙,童蒙求我。 译:有用的不可以利用,怕的是我不能控制它,不能利用的却要去利用,因为我完全可以控制它,利用不能用的而控制它,这不是我受别人的支配,而是我支配别人。 第十五计:调虎离山 待天以困之,用人以诱之,“往蹇来返”。 译:等待天时对敌方不利时再去围困他,用人假象去诱骗他“往前有危险,就返身离开”。 第十六计:欲擒故纵 逼则反兵,走则减势,紧随勿迫。累其气力,消其斗志,散而后擒。兵不血刃,需,有孚光。 译:逼得敌人无路可走,就会遭到坚决的反扑;让他逃走,就会消灭敌人的气势,所以要紧紧地跟踪敌人,但不要逼迫他,借以消耗他的体力,瓦解他的士气,等他的兵力分散了,再行再以捕捉。这样用兵可以避免流血,不逼迫敌人,并让他相信,这对战争是有利的。 第十七计:抛砖引玉 类以诱之,击蒙也。 译:用类似的东西去迷惑敌人,使敌人遭懵上当。 第十八计:擒贼擒王 摧其坚,夺其魁,以解其体;龙战于野,其道穷也。 译:彻底地摧毁敌人的主力,抓住他的首领,借以粉碎他的战争机构,这是一场激烈的总决战。 混战计 第十九计:釜底抽薪 不敌其力,而消其势,兑下乾上之象。 译:力量上不能战胜敌人,可以瓦解他的气势,这就是《易经》兑下乾上的《履卦》上所说的“柔履刚”的办法。 第二十计:混水摸鱼 乘其阴乱,利其弱而无主,随,以向晦入宴息。 译:乘着敌人内部混乱,利用他还是弱小而没有主见,他随从我,像人随着天时吃饭、休息一样。 第二十一计:金蝉脱壳 存其形,完其势;友不疑,敌不动;巽而上蛊。 译:保存阵地的原形,造成强大的声势,使友军不怀疑,敌人也不敢贸然进犯,而我却可以隐蔽地击破另一支敌军。 第二十二计:关门捉贼 小敌困之,剥,不利有攸往。 译:对弱小的敌人,要加以包围歼灭;对垂死挣扎的敌人,如果从后面急追远赶,那是很不利的。 第二十三计:远交近攻 形禁势格,利以近取。害以远隔,上火下泽。 译:处于(扭转)不利的形势(局面),要考虑(阻止)它发展的方向(趋势),(利于)攻取附近的地方,就有利,(不利于)攻击远隔的地方,就有害。《易经聧》卦说:“火苗向上冒,池水向下流,志向不同,也可以结交。” 第二十四计:假途代虢 两大之间,敌胁以从,我假以势,困,有言不信。 译:对处的两个强大敌人中间的国家,敌人胁迫它时,我方却作援求它,立即出兵。《易经困》卦说:“对处在困迫状况下的国家,光空谈而没有行动,是不会被他信任的。” 并战计 第二十五计:偷梁换柱 频更其阵,抽其劲旅,待其自败,而后乘之,曳其轮也。 译:多次变动敌人的阵容,把他的兵力调开,等待他自己败阵,然后用谋进攻他,《易经既济》卦说:“先拖住敌人,然后再替换他。” 第二十六计:指桑骂槐 大凌小者,警以诱之。刚中而应,行险而顺。 译:强大的慑服弱小的,要用警戒的方法来诱导它。《易经师》卦说:适当的强硬,可以得到拥护;施用险诈,可以得到顺从。 第二十七计:假痴不癫 宁伪作不知不为,不伪作假知妄为,静不露机,云雷屯也。 译:宁可假装不知道的,不行动,不可假装知道而轻举妄动。要沉着,不要泄露一点机密,就像迅猛激烈的云雷,在冬季藏入地下般的平静。 第二十八计:上屋抽梯 假之以便,唆之使前,断其援应,陷之死地,遇毒,位不当也。 译:故意露出破绽,引诱敌人深入我方,然后选择有利时机,断绝敌人的前应和后援,使它完全处于死地。敌人这样的下场《易经嗑》上说的好:抢吃腊肉的嗑掉了牙,怪自己的动作不当。 第二十九计:树上开花 借局布势,力小势大;鸿渐于陆,其羽可用为仪也。 译:借别人的局面布成阵势,兵力弱小的看来阵容也显得强大。《易经渐》卦说:鸿雁飞向大陆,全凭它的羽毛丰满助长气势。 第三十计:反客为主 乘隙插足,扼其主机,渐之进也。 译:有空子就要插脚进去,扼住他的主脑机关。《易经渐》卦说:“循序而进”就是这个意思。 败战计 第三十一计:美人计 兵强者,攻其将。将智者,伐其情。将弱兵颓,其势自萎。利用御寇,顺相保也。 译:兵力强大的,就要攻打他的将帅;将帅明智的,就打击他的情绪,用美色诱惑,使其陷入困境或失去战斗力。将帅斗志衰弱、部队士气消沉,他的气势必定自行萎缩。《易经渐》卦说:利用敌人内部的严重弱点来控制敌人,可以有把握地保存自己的实力。 第三十二计:空城计 虚者虚之,疑中生疑;刚柔之际,奇而复奇。 译:空虚的就让它空虚,使人更加难以揣测;在进攻和防御中运用空虚的战术来隐蔽自己的空虚,越发显得用兵出奇。 第三十三计:反间计 疑中之疑,比之向内,不自失也。 译:在疑阵中再布置一层疑阵。《易经比》卦说:来自敌方内部的援助,自己不会受到损失。 第三十四计:苦肉计 人不自害,受害必真。假真真假,间以得行。童蒙之吉,顺以巽也。 译:人不自己迫害自己,受迫害必然是真的;真的变假,间谍便乘机活动。《易经蒙》卦说:把他骗得乖乖的,顺着他活动。 第三十五计:连环计 将多兵众,不可以敌,使其自累,以杀其势。在师中吉,承天宠也。 译:敌方兵力强大,不能硬打,应当运用谋略,使仓储自相牵制,借以削弱他的力量。《易经师》卦说:将帅靠指军不偏不倚,惯打胜仗的就是用兵如神。 第三十六计:走为上计 走为上计全师避敌,在次无咎,未失常也。 译:全军退却,甩开敌人,以退为进,待机破败,这是不违背正常的法则的。 自创计 第三十七计 潜龙勿用 译:自行体悟