You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Anki自定义闪卡模板表格打乱文本格式问题求助

Anki闪卡模板排版异常排查与解决

我在设计Anki闪卡模板时遇到无法定位原因的排版异常问题,以下是相关代码和修复方案:

闪卡正面代码

<div class="front">
    {{#Title}}<div class="title">{{Title}}</div>{{/Title}}
    <div class="subtitle">Details</div>
    <table id="clozed">
      <tr>
        <td class="heading">Origin</td>
        <td>{{cloze:Text1}}</td>
      </tr>
      <tr>
        <td class="heading">Insertion</td>
        <td>{{cloze:Text2}}</td>
      </tr>
      <tr>
        <td class="heading">Innervation</td>
        <td>{{cloze:Text3}}</td>
      </tr>
      <tr>
        <td class="heading">Action</td>
        <td>{{cloze:Text4}}</td>
      </tr>
    </table>
</div>

<script>
// Scroll to cloze
function scrollToCloze () {
    const cloze1 = document.getElementsByClassName("cloze")[0];
    const rect = cloze1.getBoundingClientRect();
    const absTop = rect.top + window.pageYOffset;
    const absBot = rect.bottom + window.pageYOffset;
    if (absBot >= window.innerHeight) {
        const height = rect.top - rect.bottom
        const middle = absTop - (window.innerHeight/2) - (height/2);
        window.scrollTo(0, middle);
    };
}
if ( document.readyState === 'complete' ) {
    setTimeout(scrollToCloze, 1);
} else {
    document.addEventListener('DOMContentLoaded', function() {
        setTimeout(scrollToCloze, 1);
    }, false);
}
</script>

闪卡背面代码

<div class="back">
    {{#Title}}<div class="title">{{Title}}</div>{{/Title}}
    <div class="subtitle">Details</div>
    <table id="clozed">
      <tr>
        <td class="heading">Origin</td>
        <td>{{cloze:Text1}}</td>
      </tr>
      <tr>
        <td class="heading">Insertion</td>
        <td>{{cloze:Text2}}</td>
      </tr>
      <tr>
        <td class="heading">Innervation</td>
        <td>{{cloze:Text3}}</td>
      </tr>
      <tr>
        <td class="heading">Action</td>
        <td>{{cloze:Text4}}</td>
      </tr>
    </table>
</div>

<script>
// Remove cloze syntax from revealed hint
var hint = document.getElementById("original");
if (hint) {
    var html = hint.innerHTML.replace(/\[\[oc(\d+)::(.*?)(::(.*?))?\]\]/mg,
                                      "<span class='cloze'>$2</span>");
    hint.innerHTML = html
};

// Scroll to cloze
function scrollToCloze () {
    const cloze1 = document.getElementsByClassName("cloze")[0];
    const rect = cloze1.getBoundingClientRect();
    const absTop = rect.top + window.pageYOffset;
    const absBot = rect.bottom + window.pageYOffset;
    if (absBot >= window.innerHeight) {
        const height = rect.top - rect.bottom
        const middle = absTop - (window.innerHeight/2) - (height/2);
        window.scrollTo(0, middle);
    };
}
if ( document.readyState === 'complete' ) {
    setTimeout(scrollToCloze, 1);
} else {
    document.addEventListener('DOMContentLoaded', function() {
        setTimeout(scrollToCloze, 1);
    }, false);
}


// Reveal full list
var olToggle = function() {
    var orig = document.getElementById('original');
    var clozed = document.getElementById('clozed');
    var origHtml = orig.innerHTML
    orig.innerHTML = clozed.innerHTML
    clozed.innerHTML = origHtml
}
</script>

CSS样式代码

html {
  /* scrollbar always visible in order to prevent shift when revealing answer*/
  overflow-y: scroll;
}

.card {
  border: 1px solid #404040;
  padding: 8px;
  font-weight: normal;
  font-size: 16px;
  text-align: left;
  color: black;
  background-color: white;
}

/* general layout */

.text {
  /* center left-aligned text on card */
  column-count: 2;
  display: inline-block;
  align: center;
  text-align: left;
  margin: auto;
  max-width: 40em;
}

.hidden {
  /* guarantees a consistent width across front and back */
  font-weight: bold;
  display: block;
  line-height:0;
  height: 0;
  overflow: hidden;
  visibility: hidden;
}

.title {
  background-color: #edcac5;
  color: #000000;
  font-weight: bold;
  font-size: 20px;
  margin-bottom: 10px;
  text-align: center;
}

.subtitle {
  background-color: #3b3b3d;
  color: #FFFFFF;
  font-weight: bold;
  font-size: 16px;
  padding: 3px;
  margin-bottom: 5px;
  text-align: center;
}

.heading {
  color: #6395ff;
  font-weight: bold;
  text-align: left;
  width: 30%;
}

table {
  table-layout: fixed;
  width: 100%;
}

td {
  word-wrap: break-word;
}

/* clozes */

.cloze {
  /* regular cloze deletion */
  font-weight: bold;
  color: #FFFFFF;
}

.card21 #btn-reveal{
  /* no need to display reveal btn on last card */
  display:none;
}

/* additional fields */

.extra{
  margin-top: 0.5em;
  margin: auto;
  max-width: 40em;
}

.extra-entry{
  margin-top: 0.8em;
  font-size: 0.9em;
  text-align:left;
}

.extra-descr{
  margin-bottom: 0.2em;
  font-weight: bold;
  font-size: 1em;
}

#btn-reveal {
  font-size: 0.5em;
  display:none;
}

.mobile #btn-reveal {
  font-size: 0.8em;
  display:none;
}

问题根因

你为table设置了width:100%,但table的父元素(front/back容器)没有设置宽度规则,无法继承卡片的可用宽度,导致table的100%宽度只能自适应内容宽度,无法撑满卡片空间。

修复方案

在CSS中添加以下规则即可解决排版异常:

.front, .back {
  width: 100%;
  box-sizing: border-box;
}
/* 可选优化:优化表格显示效果,避免内容贴边 */
table#clozed {
  border-collapse: collapse;
  margin: 8px 0;
}
td {
  padding: 4px 6px;
  vertical-align: top;
}

如果修改后仍存在列宽挤压问题,可以把table规则中的table-layout: fixed改为table-layout: auto,让浏览器自动分配列宽适配内容。

内容的提问来源于stack exchange,提问作者Nil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 13:45:04