🔰はじめての方へ

Cocoonの「SILK」スキンでブログカードを横向きにするCSS(左サムネイル・右テキスト)

Wordpress
記事内に広告が含まれています。
スポンサーリンク

Cocoonのスキンを「SILK」にしたら、ブログカードがどうしても縦向きにしかならなくなりました。

パソコンで見ると、サムネイルの下にテキストが並んだ縦長のカードが、記事の真ん中にポツンと出る形になります。

私はこれが気になっていました。カードが縦に伸びるぶん、読者の視線がそこで下に落ちて、本文の流れから外れてしまう感じがしたからです。

ーーーーーーーーーーーーーーーー👇外部リンクではありません👇ーーーーーーーーーーーーーーーー

ーーーーーーーーーーーーーーーー👆外部リンクではありません👆ーーーーーーーーーーーーーーー

横向き(左にサムネイル・右にテキスト)にすれば視線が横に流れて、本文からそんなに外れないと思いました。

ただ、SILKスキンで横向きにする方法を、私が探した範囲では見つけられませんでした。

なので自分でCSSを組み直すことにしました!

実際に横向きにできたので、そのコードをそのまま置いておきます。

同じところで止まっている方の役に立てばと思います。

そもそもCocoonのブログカードが縦向きになる理由

先にコードだけ欲しい方は、次の見出しまで飛ばして大丈夫です。

Cocoonの親テーマのブログカードは、float: left と margin-left: 170px で組まれています。

サムネイルを左にfloatさせて、テキスト側に170pxの余白を空けて右に逃がす、という昔ながらの組み方です。

この構造のまま少しCSSをいじっても、横並びにはなってくれませんでした。

私は最初、フレックスボックス(display: flex)で横に並べようとしました。

ですが、親テーマのfloatやmarginが残っているせいで、レイアウトが全部ずれてしまいました。

そこで、floatで組まれた部分を一度打ち消して、CSS Grid で組み直す方針にしました。ここはClaudeに手伝ってもらいながら整えました。

実際に使った横向きブログカードのCSS(全文)

CSSを貼る場所について

私は開発環境(Docker + VSCode)でテーマのCSSファイルを直接さわって、GitHubで管理しています。

ただ、同じCSSを 外観 → カスタマイズ → 追加CSS に貼っても、同じように反映されると思います。

手軽なのは追加CSSの方だと思います。

完成図

下のコードをそのままコピーして使えます。カード幅などは、コメントを付けた箇所で調整できます。

/********** ブログカード横向き **********/
/* ブログカードを横向き(左サムネイル・右テキスト)にする */
/* 幅と中央寄せは <a> 側(.blogcard-wrap)に持たせる。
   ホバー背景は .a-wrap:hover に付くので、ここを枠と同じ幅にしないとはみ出す。 */

.entry-content .blogcard-wrap {
  display: block;
  width: 80%;         /* カード幅。お好みで調整 */
  max-width: 100%;
  margin-left: auto;
  margin-right: auto;
  padding: 0;         /* .a-wrap の padding:1.5% を解除(ホバー範囲=枠内) */
}
/* .blogcard の直下は label / thumbnail / content / footer。
   label は Cocoon側で position:absolute なのでグリッドの外。
   親テーマは float + margin-left:170px で組んでいるので、それを全部打ち消す。 */
.entry-content .blogcard {
  display: grid;
  grid-template-columns: 249px 1fr;   /* 左のサムネイル幅。min-height の 16:9 に合わせる */
  grid-template-areas:
    "thumb   content"
    "thumb   footer";
  align-items: stretch;   /* サムネイルをカードの高さいっぱいに伸ばす */
  width: 100%;
  max-width: 100%;
  min-height: 140px;      /* カードの高さ。249px の 16:9 = 140px */
  padding: 0;             /* 画像を枠に密着させるため、カード自体には余白を持たせない */
  overflow: hidden;       /* 画像を枠の角丸で切り抜く */
}
/* サムネイルが取得できなかった場合(Cocoonのスクショ機能OFF時など)は
   左の空カラムが残ってしまうので、1カラムに畳む */
.entry-content .blogcard:has(.blogcard-thumbnail:empty) {
  grid-template-columns: 1fr;
  grid-template-areas:
    "content"
    "footer";
  min-height: 0;
}
.entry-content .blogcard-thumbnail {
  grid-area: thumb;
  float: none;        /* 親テーマの float:left を解除 */
  width: 100%;
  height: 100%;
  margin: 0;          /* 親テーマの margin-right:1.6% / margin-top:3px を解除 */
}
/* 内部カードの img は接頭辞付きクラスしか持たないので要素セレクタで指定。
   object-fit: cover で、元画像の大きさに関係なく枠いっぱいに敷き詰める。 */
.entry-content .blogcard-thumbnail img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  border-radius: 0;   /* 角丸は .blogcard の overflow:hidden 側で処理する */
}
/* 余白はテキスト側だけに持たせる(画像の上・左・下は枠に密着) */
.entry-content .blogcard-content {
  grid-area: content;
  margin-left: 0;     /* ← タイトル左の余白の正体(親テーマの 170px) */
  margin-right: 0;
  width: auto;
  padding: 10px 14px 0 20px;
  min-width: 0;       /* テキストが正しく折り返されるために必要 */
  min-height: 0;      /* 親テーマの min-height:100px を解除(下の余白の一因) */
  max-height: none;   /* 同 max-height:140px を解除 */
}
.entry-content .blogcard-footer {
  grid-area: footer;
  clear: none;        /* 親テーマの clear:both を解除 */
  align-self: end;
  padding: 8px 14px 12px 20px;
}
.entry-content .blogcard-title {
  font-size: 1.1em;
  line-height: 1.5;
  margin-bottom: 8px;
}
.entry-content .blogcard-snippet {
  font-size: 13px;
  line-height: 1.6;
}

/* スマホでは縦積みに戻す */
@media (max-width: 480px) {
  .entry-content .blogcard {
    grid-template-columns: 1fr;
    grid-template-areas:
      "thumb"
      "content"
      "footer";
    min-height: 0;
  }
  /* 縦積みのときは高さを比率で決める(height:100% は伸びる先が無いため) */
  .entry-content .blogcard-thumbnail img {
    height: auto;
    aspect-ratio: 16 / 9;
  }
}

このCSSが何をしているのか

丸ごとコピーで動きますが、あとから自分で調整したくなったとき用に、要点だけ書いておきます。

①親テーマのfloatを打ち消してGridにする

.blogcard を display: grid にして、左サムネイル(249px)+右テキスト(1fr)の2カラムに組み替えています。

あわせて、親テーマの float: left / margin-left: 170px / min-height: 100px / clear: both を解除しています。タイトルの左に空いていた余白の正体は、この margin-left: 170px でした。

②サムネイルをカードの高さいっぱいに表示する

サムネイルは object-fit: cover で、元画像の大きさに関係なくカードの枠いっぱいに敷き詰めています。

これで画像のサイズがバラバラでも、カードの高さが一定に保たれます。min-height: 140px は、左サムネイル 249px の 16:9 の高さです。

画像は枠に密着させて、余白はテキスト側だけに付けています。

③ホバーの範囲がカードからはみ出す問題

Cocoonのブログカードは、リンク全体(.a-wrap)に padding: 1.5% が付いていて、マウスを乗せたときの背景色がカードの枠からはみ出してしまいました。

これは、カードの幅と中央寄せを .blogcard-wrap(=リンクの <a> 側)に持たせて、.a-wrap の padding を解除することで、ホバーの範囲を枠の中に収めています。

④サムネイルが無いときとスマホ表示

Cocoonのスクショ機能がオフなどでサムネイルが取得できないと、左のカラムだけ空いてしまいます。

:has() を使って、その場合は自動で1カラムに畳むようにしています。

スマホ(480px以下)では、横並びをやめて縦積みに戻しています。縦積みのときは height: 100% が効かないので、aspect-ratio: 16 / 9 で画像の高さを確保しています。

私がハマったところ

横向きにする作業でいちばん時間がかかったのは、CSSそのものより「なぜか余白が消えない」「なぜか画像の下にすき間ができる」といった原因探しでした。同じ症状で止まったときのために、正体を残しておきます。

フレックスボックスだと全部ずれた

最初に書いたとおり、私は display: flex で横並びにしようとして、レイアウトが全部ずれました。

親テーマの float と margin が残っている状態だと、flexとケンカしてしまうようです。最終的に、floatを打ち消してGridで組み直したら、きれいに並びました。

サムネイル画像のクラス名が、内部リンクと外部リンクで違う

これがいちばん分かりにくかったところです。

内部リンクのカードのサムネイル画像には internal-blogcard-thumb-image というクラスしか付いておらず、blogcard-thumb-image が付いていませんでした。

クラス名でCSSを当てると、内部カードだけ効かない、ということが起きます。なので .blogcard-thumbnail img という要素セレクタで指定して、内部・外部どちらのカードにも効くようにしました。

画像の下にできる余白の正体

横並びにしたあと、画像の下に説明のつかないすき間ができていました。

調べたところ、親テーマに aspect-ratio: var(–card-ratio) という指定があり、その –card-ratio が未定義のまま無効になっていたのが原因でした。ここを打ち消したら、余白が消えました。

ラベルはGridの外にいる

.blogcard-label(カードに付くラベル)は、親テーマで position: absolute になっています。

absoluteの要素はGridの並びの対象外になるので、grid-template-areas には入れていません。ここを無理に並べようとすると崩れます。

まとめ

CocoonのSILKスキンでブログカードが縦向きにしかならないのは、親テーマがfloatで組まれているからでした。

私は、それを一度打ち消してCSS Gridで組み直すことで、左サムネイル・右テキストの横向きカードにできました。

ハマったのは、フレックスボックスだと崩れること、内部カードだけクラス名が違うこと、未定義のaspect-ratioが余白を作っていたこと、そしてラベルがabsoluteでGridの外にいることでした。この正体さえ分かれば、上のCSSをそのまま貼るだけで横向きになると思います。

私の開発ブログでは、実際にこの横向きカードを使っています。

例として貼っているのは、自作の画像トリミングツールのカードです。

簡単にトリミングができるものにしました。

ぜひ使ってみてください!

Image Crop Studio — 画像を、最短で目的のサイズへ。
SNS・ブログ投稿用の画像を数秒でトリミングできる無料Webアプリ。note / WordPress / YouTube / X / Instagram などのサイズプリセット対応。画像はブラウザ内のみで処理されます。

同じところで止まっていた方の遠回りが、少しでも減ればうれしいです。