惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
罗磊的独立博客
云风的 BLOG
云风的 BLOG
Last Week in AI
Last Week in AI
Y
Y Combinator Blog
小众软件
小众软件
Blog — PlanetScale
Blog — PlanetScale
T
The Blog of Author Tim Ferriss
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
博客园 - Franky
F
Fortinet All Blogs
D
Docker
博客园 - 司徒正美
腾讯CDC
Recent Announcements
Recent Announcements
The Cloudflare Blog
B
Blog RSS Feed
GbyAI
GbyAI
T
Tailwind CSS Blog
雷峰网
雷峰网
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 三生石上(FineUI控件)
阮一峰的网络日志
阮一峰的网络日志

吐槽大王部落格

群宠 Bot 塑料碗开发记 (Phase 1) 在 X (Twitter) 上找 IT 工作靠谱吗? 如何在上游分支被反复重写时优雅地 Rebase 我的 2025 我在经营自己的社交帐号,但可能「玩脱了」 我依然没有学会怎么在网上提出技术问题 我是怎么差点被恶意 npm 包攻击的 我对 Vue Router「动态路由」的一点暴论 不用 eas-cli 编译 React Native (Expo) 应用的 Android 版本 【更正版】简单实现类型安全的、能触发 CustomEvent 的 EventTarget 在 IE11 使用 CSS Grid 实现多列卡片列表布局 自建云游戏服务的尝试(2024 更新) 在 Termux 编译和使用 bwm-ng(需要 root) 如何在已有的 Vue CLI 项目使用 esbuild 我的 2021 npm、镜像源与 package-lock.json 新的桌面工作站:HP Z2 G5 Tower 我的 2020 在 Intel 版 MacBook Pro 以 EFI 的形式安装 Windows 10 为什么大家都在安利这一样东西? 新的家庭服务器:MicroServer Gen10 我的 2019 在树莓派(Raspbian)上安装最新稳定版 nginx 驾照 宿舍用小型 UPS 电源与新台灯 拆解我爸 2010 年装的廉价 PC 我的 2018 2018 厦门面基记 我(曾经)设想过的外置智能大脑 没用的无懈可击
我写的一言轮播脚本(2018 更新)
tcdw · 2018-04-13 · via 吐槽大王部落格

看到很多 ACG 博客都用上了一言,但我觉得在同一个页面只显示一条内容未免有些单调,所以想让它定时轮播,而且采用较好的切换效果。

我后来在 WNJXYK 上看到了我想要的轮播效果,但那是基于 jQuery 制作的。

因为对于我这种讨厌为一个小功能放上大型前端库的人来说不能忍,所以我用原生 JS 写了一个。

2018 年,为了获得更佳的性能和稳定性,我把这个脚本进行了重写,从 JavaScript 动画更改为 CSS 渐变,并改掉了一些不科学的地方。

下面是实际效果:

如果你在使用 RSS 阅读器,请访问原文查看效果。

HTML 部分

<span id="hitokoto"></span>

JavaScript 部分

(function () {
  var server = "https://api.lwl12.com/hitokoto/v1";
  var target = document.getElementById("hitokoto");
  var fadeDur = 1;
  var waitDur = 10;
  var errorMsg = "加载出现了问题!";
  /* -=-=-=-=-=-=-=-=-=-=-=- 你的配置部分结束 -=-=-=-=-=-=-=-=-=-=-=- */
  var first = true;
  var present = "";
  target.style.opacity = 0;
  target.style.transition = "opacity " + fadeDur + "s";
  function loadData() {
    var connect = new XMLHttpRequest();
    connect.open("GET", server, true);
    connect.onload = function () {
      if (connect.status >= 200 && connect.status < 400) {
        present = connect.responseText;
        if (first) {
          first = false;
          target.textContent = present;
          fadeIn();
        } else {
          fadeOut();
        }
      } else {
        target.style.opacity = 1;
        target.textContent = errorMsg;
        setTimeout(loadData, (fadeDur + waitDur) * 1000);
      }
    };
    connect.onerror = function () {
      target.textContent = errorMsg;
      setTimeout(loadData, (fadeDur + waitDur) * 1000);
    };
    connect.send();
  }
  function fadeOut() {
    target.style.opacity = 0;
    setTimeout(function () {
      target.textContent = present;
      fadeIn();
    }, fadeDur * 1000);
  }
  function fadeIn() {
    target.style.opacity = 1;
    setTimeout(loadData, (fadeDur + waitDur) * 1000);
  }
  loadData();
})();