株式会社ぺいじず

2021.04.08

Movable Type:エディタ用CSS サンプル

以前「Movable Type:エディタ用CSSの更新をラクにする方法」で概要をかいたのですが、コーダーさんに伝わらなかったので(涙)、サンプルを掲載します。

出力HTMLの想定

出力HTMLは下記を想定します。
.article__headline 内に「記事のタイトル」を、
.article__body 内に「記事の本文」を出力します。

つまりエディタ用CSSに記述するものは、.article__body 内で使用するCSSになります。

<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>記事タイトル | ニュース</title>
<link rel="stylesheet" href="/css/editor.css"> ←エディタ用CSS
<link rel="stylesheet" href="/css/template.css"> ←テンプレートCSS
</head>

<body class="news">
<header>header入ります</header>
<article class="article">
  <h1 class="article__headline">記事タイトル</h1>
  <div class="article__body">  ▼これ以下が記事の本文(エディタ内に入力する内容)
    <h2 class="title title--primary">大見出し</h2>
    <p>テキスト入ります。テキスト入ります。</p>
    <div class="float--left">
      <p><img src="#" alt=""></p>
    </div>
    <p>テキスト入ります。テキスト入ります。</p>
    <p class="clear">テキスト入ります。テキスト入ります。</p>
    <h3 class="title title--secondary">中見出し</h3>
    <p class="mb--none">テキスト入ります。テキスト入ります。</p>
    <ul class="list list--arrow">
      <li><a href="#">三角リスト</a>
        <ul class="list list--disc">
          <li>丸リスト</li>
        </ul>
      </li>
    </ul>
    <ol>
      <li>番号リスト</li>
    </ol>
    <table class="table table--basic">
      <tbody>
        <tr>
          <th>表見出し</th>
          <td>表データ</td>
        </tr>
      </tbody>
    </table>
    <div class="box box--gray">
      <p class="box__title">ボックス見出し</p>
      <p>テキスト入ります。テキスト入ります。</p>
    </div>
    <div class="row">
      <div class="col col--one-third">
        <p><img src="#" alt=""></p>
      </div>
      <div class="col">
        <p>テキスト入ります。テキスト入ります。</p>
      </div>
    </div>
  </div><!-- /article__body -->
</article>
<footer>footer入ります</footer>
</body>
</html>

エディタ用CSSの概要

以前書いた通り、エディタ用CSSに記載することは以下になります。

・ノーマライズCSS ★Point1
・デフォルトのエディタCSS用のリセットCSS
・見出し・リストなど、エディタ内で使用するCSS ★Point2
・clearfix・余白調整など、汎用的なCSS

Point1:リセットではなくノーマライズを使う

リセットCSSの場合、リストマークや各要素の余白がすべて消えてしまいます。
例えばリストボタンを押したときリストアイコンが出ないと、ユーザーはエディタが動作しているか分かりません。
また、ユーザーは予期せぬ入力することがあるため、すべてのブロック要素に余白がないと要素同士がくっついてしまいます。
もちろん完璧なリセットCSSであれば問題ないのですが、今までそんなものは見たことがないので、ノーマライズを推奨します。

Point2:エディタ編集領域外の要素でネストしない・要素セレクタは極力使用しない

上記HTMLでいうと、.news や .article__body はエディタ外なので、
.news .title–primary {} というように記述すると、エディタ内でCSSが反映されません。
また、h2 {} というように記述してしまうと、メンテナンス性が悪くなります。

× NG:エディタ領域外の要素でネストしない →エディタ内にCSSが反映されない
.news .title--primary {}
.article__body p {}

△ 非推奨:要素セレクタは極力使用しない →メンテナンス性が下がる
h2 {}
table {}

補足

TinyMCE はエディタの入力欄が <body> になっています。
ですので以下のように、エディタ用CSSと <body>直下にエディタ内の内容を入力したHTMLで、正しく表示されていればOKです。

<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>記事タイトル | ニュース</title>
<link rel="stylesheet" href="/css/editor.css">
</head>

<body>
<h2 class="title title--primary">大見出し</h2>
<p>テキスト入ります。テキスト入ります。</p>
・・・
</body>
</html>

エディタ用CSSのサンプル

この記事用に修正したので、間違いがあったらすみません。。。
サイトに合わせて適宜修正してください。

@charset "utf-8";
/* normalize
---------------------------------------- */
/* all */
*, *::before, *::after { box-sizing: border-box;}

/* html */
html { font-size: 62.5%;}

/* body */ ※主に本文<p>の文字設定。marginなどはテンプレート用CSSに記載
body {
  -webkit-text-size-adjust: 100%;
  overflow-wrap: break-word;
  line-height: 1.75;
  font-size: 1.6rem;
  font-family: sans-serif;
  color: #696969;
}

/* link */
a:link {}
a:visited {}
a:hover {}
a:active {}
a:focus {}

/* img */
img {
  max-width: 100%;
  height: auto;
}

/* list */ ※デフォルトのリストは右にインデントが入るので調整
ul {
  margin-left: 0;
  padding-left: 1.5em;
}
ol {
  margin-left: 0;
  padding-left: 2em;
}

/* table */ ※ブラウザ毎に文字揃えが異なるので調整
th { text-align: left;}

/* hr */
.hr {
  margin: 1em 0;
  border: none;
  border-top: solid 1px #cccccc;
  height: 0;
}


/* TinyMCE ※TinyMCE のバージョンによって異なるので、必要に応じて相殺
---------------------------------------- */
.mce-content-body { line-height: inherit;}

/* guide */ ※div のガイド追加
.mce-content-body .row, .mce-content-body .col {
  border: dashed 1px #cccccc;
  padding: 1px;
}


/* icon
---------------------------------------- */
a:not(.no-icon)[target="_blank"]::after,
a:not(.no-icon)[href$=".pdf"]::after, a:not(.no-icon)[href*=".pdf#page="]::after {
  display: inline-block;
  margin-left: 0.5em;
}

/* blank */
a[target="_blank"]::after { content: url("/files/ico_blank_01.svg");}

/* pdf */
a[href$=".pdf"]::after, a[href*=".pdf#page="]::after { content: url("/files/ico_pdf_01.svg");}


/* column
---------------------------------------- */
/* row */
.row {
  display: flex;
  margin: -10px;
}

/* col */
.col {
  margin: 10px;
  width: 100%;
}
  .col > *:first-child { margin-top: 0;}
  .col > *:last-child { margin-bottom: 0;}

.col--one-half, .col--one-third, .col--one-quarter { flex-shrink: 0;}
.col--one-half { width: calc(50% - 20px);}
.col--one-third { width: calc(33.3% - 20px);}
.col--one-quarter { width: calc(25% - 20px);}


/* box
---------------------------------------- */
.box {
  margin: 1em 0;
  border: solid 1px;
  padding: 9px;
}
  .box > *:first-child { margin-top: 0;}
  .box > *:last-child { margin-bottom: 0;}

/* box--gray */
.box--gray {
  border-color: #f5f5f5;
  background: #f5f5f5;
}


/* float
---------------------------------------- */
.float--left {
  float: left;
  margin: 0 1em 1em 0;
}
.float--right {
  float: right;
  margin: 0 0 1em 1em;
}
.clear { clear: both;}


/* title
---------------------------------------- */
.title + * { margin-top: 0;}

/* title--primary */
.title--primary {
  margin: 3em 0 1em 0;
  font-size: 2.0rem;
}

/* title--secondary */
.title--secondary {
  margin: 2em 0 1em 0;
  font-size: 1.8rem;
}


/* list ※入れ子の場合もあるので、<li>は直下セレクタを利用する
---------------------------------------- */
.list {
  margin-left: 0;
  padding-left: 0;
  list-style: none;
}
  .list > li {
    padding-left: 1.5em;
    background: no-repeat left calc(0.75em - 8px);
  }

/* list--arrow */
.list--arrow {}
  .list--disc > li { background-image: url("/files/ico_arrow_right_01.svg");}

/* list--disc */
.list--disc {}
  .list--disc > li { background-image: url("/files/ico_disc_01.svg");}


/* table ※入れ子の場合もあるので、子要素は直下セレクタを利用する
---------------------------------------- */
.table {
  border-collapse: collapse;
  border-spacing: 0;
}
  .table--basic > * {}
    .table--basic > * > tr {}
      .table--basic > * > tr > * { padding: 5px;}

/* table--basic */
.table--basic { border: solid 1px #cccccc;}
  .table--basic > * {}
    .table--basic > * > tr {}
      .table--basic > thead > tr > th,
      .table--basic > tfoot > tr > th {
        color: #ffffff;
        background: #808080;
      }
      .table--basic > tbody > tr > th { background: #f5f5f5;}
      .table--basic > * > tr > td {}


/* general-purpose
---------------------------------------- */
/* mb */
.mb--none { margin-bottom: 0;}
.mb--none + * { margin-top: 0;}

.mb--small { margin-bottom: 1em;}
.mb--medium { margin-bottom: 2em;}
.mb--large { margin-bottom: 3em;}

テンプレート用CSSのサンプル

以前書いた通り、テンプレート用CSSに記載することは以下になります。

・ヘッダ・フッタなど、レイアウトに使用するCSS
・一覧ページに使用するCSS
・パンくず・ページ送りなど、エディタ内では使用しないCSS

@charset "utf-8";
/* normalize ※<html>のスクロールや、<body>のmarginなど
---------------------------------------- */
/* html */
html {
  overflow-y: scroll;
  overflow-x: hidden;
}

/* body */
body { margin: 0;}

※フォームなどエディタには使用しない要素セレクタのノーマライズは、
 エディタ用CSSでもテンプレート用CSSでも、どちらでもOKです。
 (ノーマライズはエディタ用CSSにまとめたい人は、エディタ用CSSに書けばよいと思います。)

※ヘッダとかフッタとか、ループのリストとか後はお好きにどうぞ!

次回は管理画面にエディタ用CSSを適用させる方法をご紹介いたします。

関連記事

株式会社ぺいじず

私たちは、東京都千代田区で創業30年のWeb制作会社です。
長年のマニュアル制作で培われたライティングスキルを活かし、効果的なWebサイトをご提案しています。