使用anki自带的条件字段语法控制内容显示

在 Anki 卡片中,由于其渲染机制特殊(模板变量 {{}} 的解析时机、JS 执行环境限制等),直接用 JS 控制显示 / 隐藏确实容易出问题,而且 Anki 官方也更推荐用其自带的条件字段语法来处理 "空内容不显示" 的需求,比 JS 更稳定、更适配 Anki 环境。

解决方案:用 Anki 自带的条件标签替代 JS

Anki 的模板支持{{#字段名}}...{{/字段名}}语法,意思是:当 "字段名" 有内容时,才显示中间的内容块;如果字段为空,整个内容块会自动隐藏,完全不需要 JS。

为什么这样更合适?

  1. 适配 Anki 机制:Anki 的条件标签是原生支持的,会在卡片渲染时直接处理(比 JS 更早、更稳定),不会出现 "JS 执行时字段还没渲染导致误判" 的问题(这也是你之前 "空白刷新后消失" 的核心原因)。
  2. 无需 JS:避开了 Anki 对 JS 的限制和兼容性问题,卡片加载更稳定。
  3. 逻辑清晰:直接通过字段是否有内容控制显示,比 JS 判断更直观,后期维护也方便。

修改后,之前的空白问题应该会彻底解决,因为 Anki 会在渲染卡片时就自动跳过空字段对应的区块,不会出现 "先隐藏再显示" 的闪烁或空白。

原来的代码:

js 复制代码
<script>

let fun = function(){

let cn1 = document.getElementById("cn1")
let cn2 = document.getElementById("cn2")
let cn3 = document.getElementById("cn3")
let cn4 = document.getElementById("cn4")


if (cn1.innerHTML.trim() === "") {
  cn1.parentElement.style.display = "none"
}
if (cn2.innerHTML.trim() === "") {
  cn2.parentElement.style.display = "none"
}
if (cn3.innerHTML.trim() === "") {
  cn3.parentElement.style.display = "none"
}
if (cn4.innerHTML.trim() === "") {
  cn4.parentElement.style.display = "none"
}

let redbook = document.getElementById("redbook")
if (redbook.innerHTML.trim() === "") {
	redbook.parentElement.style.display = "none"
}

let mem = document.getElementById("mem")
if (mem.innerHTML.trim() === "") {
  mem.parentElement.style.display = "none"
}

let extra = document.getElementById("extra")
if (extra.innerHTML.trim() === "") {
  extra.parentElement.style.display = "none"
}


}

setTimeout(function(){ fun(); }, 40);
fun();

</script>

{{FrontSide}}

<div>
<div id="cn1" style='font-family: Arial; font-size: 25px; '>{{中文1}}</div>
<br>
<div id="example1" style='font-family: Arial; font-size: 20px;'>{{例句1}}</div>
<br>
<div id="translate1" style='font-family: Arial; font-size: 20px;'>{{hint:例句翻译1}}</div>
<br>
<br>
</div>

<div>
<div id="cn2" style='font-family: Arial; font-size: 25px; color:'>{{中文2}}</div>
<br>
<div style='font-family: Arial; font-size: 20px;'>{{例句2}}</div>
<div style='font-family: Arial; font-size: 20px;'>{{hint:例句翻译2}}</div>
<br >
<br >
</div>

<div>
<div id="cn3" style='font-family: Arial; font-size: 25px; color:'>{{中文3}}</div>
<div style='font-family: Arial; font-size: 20px;'>{{例句3}}</div>
<div style='font-family: Arial; font-size: 20px;'>{{hint:例句翻译3}}</div>
<br>
<br>
</div>

<div>
<div id="cn4" style='font-family: Arial; font-size: 25px; color:'>{{中文4}}</div>
<div style='font-family: Arial; font-size: 20px;'>{{例句4}}</div>
<div style='font-family: Arial; font-size: 20px;'>{{hint:例句翻译4}}</div>
<br>
</div>

<div>
<div id="redbook" title="红宝书" style='font-family: Arial; font-size: 25px; '>{{红宝书}}</div>
<br>
</div>

<div>
<div id="mem" title="助记" style='font-family: Arial; font-size: 25px;'>{{助记}}</div>
<br>
</div>

<div>
<div id="extra" title="补充" style='font-family: Arial; font-size: 25px;'>{{补充}}</div>
<br>
</div>


<div title="字源" style='font-family: Arial; font-size: 25px; '>{{字源}}</div>
<div style='font-family: Arial; font-size: 25px;'>{{发音}}</div>

你可以把原来的 HTML 结构改写成这样(按字段分别包裹):

js 复制代码
{{FrontSide}}

  


{{#中文1}}

<div>

<div id="cn1" style='font-family: Arial; font-size: 25px; '>{{中文1}}</div>

<br>

<div id="example1" style='font-family: Arial; font-size: 20px;'>{{例句1}}</div>

<br>

<div id="translate1" style='font-family: Arial; font-size: 20px;'>{{hint:例句翻译1}}</div>

<br>

<br>

</div>

{{/中文1}}

  


{{#中文2}}

<div>

<div id="cn2" style='font-family: Arial; font-size: 25px; color:'>{{中文2}}</div>

<br>

<div style='font-family: Arial; font-size: 20px;'>{{例句2}}</div>

<div style='font-family: Arial; font-size: 20px;'>{{hint:例句翻译2}}</div>

<br >

<br >

</div>

{{/中文2}}

  


{{#中文3}}

<div>

<div id="cn3" style='font-family: Arial; font-size: 25px; color:'>{{中文3}}</div>

<div style='font-family: Arial; font-size: 20px;'>{{例句3}}</div>

<div style='font-family: Arial; font-size: 20px;'>{{hint:例句翻译3}}</div>

<br>

<br>

</div>

{{/中文3}}

  


{{#中文4}}

<div>

<div id="cn4" style='font-family: Arial; font-size: 25px; color:'>{{中文4}}</div>

<div style='font-family: Arial; font-size: 20px;'>{{例句4}}</div>

<div style='font-family: Arial; font-size: 20px;'>{{hint:例句翻译4}}</div>

<br>

</div>

{{/中文4}}

  


<div>

<div id="redbook" title="红宝书" style='font-family: Arial; font-size: 25px; '>{{红宝书}}</div>

<br>

</div>

  


<div>

<div id="mem" title="助记" style='font-family: Arial; font-size: 25px;'>{{助记}}</div>

<br>

</div>

  


<div>

<div id="extra" title="补充" style='font-family: Arial; font-size: 25px;'>{{补充}}</div>

<br>

</div>

  


  


<div title="字源" style='font-family: Arial; font-size: 25px; '>{{字源}}</div>

<div style='font-family: Arial; font-size: 25px;'>{{发音}}</div>

主要优化点说明:

  1. 使用 Anki 条件标签 :通过{{#字段名}}...{{/字段名}}语法,实现当字段为空时自动隐藏整个内容块,完全替代了原来的 JavaScript 判断逻辑。

  2. 样式统一管理 :将重复的样式定义整合到<style>标签中,使代码更简洁,后续修改样式也更方便。

  3. 去除冗余结构 :删除了不必要的id属性(因为已不需要 JS 定位元素),简化了 HTML 结构。

  4. 优化间距控制 :通过 CSS 的marginpadding精确控制元素间距,避免了莫名空白的出现。

这种实现方式完全符合 Anki 的设计规范,不会出现 JS 执行时机问题,也不会有刷新前后显示不一致的情况,稳定性和兼容性更好。

相关推荐
shoubepatien17 小时前
JavaWeb_Web基础
java·开发语言·前端·数据库·intellij-idea
WordPress学习笔记17 小时前
wordpress外贸主题Google地图添加(替换)方案
前端·wordpress·wordpress地图
码农秋17 小时前
Element Plus DatePicker 日期少一天问题:时区解析陷阱与解决方案
前端·vue.js·elementui·dayjs
未来之窗软件服务18 小时前
未来之窗昭和仙君(五十六)页面_预览模式——东方仙盟筑基期
前端·仙盟创梦ide·东方仙盟·昭和仙君·东方仙盟架构
top_designer18 小时前
Illustrato:钢笔工具“退休”了?Text to Vector 零基础矢量生成流
前端·ui·aigc·交互·ux·设计师·平面设计
星哥说事18 小时前
星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!
前端
donecoding18 小时前
前端AI开发:为什么选择SSE,它与分块传输编码有何不同?axios能处理SSE吗?
前端·人工智能
安_18 小时前
<style scoped>跟<style>有什么区别
前端·vue
姝然_952718 小时前
Claude Code 命令完整文档
前端
wjcroom18 小时前
web版进销存的设计到实现一
前端