X(Twitter) でイラストレーターや写真家の投稿を見る時、テキストツイートが邪魔で画像だけをサクッと見たいことがある。ブックマークレットまたは Chrome 拡張機能でテキストツイートを自動で非表示にできる。

何ができるか

以下が実現できる:

  • 画像・動画が含まれないツイートを自動で非表示
  • タイムラインが画像・動画付きツイートだけになる
  • イラストや写真の閲覧に集中できる
  • ワンクリックで ON/OFF 切り替え可能(拡張機能版)

方法1: ブックマークレット版(一番簡単)

インストール不要で、ブックマークレットを作成するだけ。

手順

  1. Chrome で新しいブックマークを作成(ブックマークバーを右クリック → 「ページを追加」)
  2. 名前を「Twitter 画像のみ」などに設定
  3. URL に以下のコードを貼り付け:
javascript:(function(){const id='twitter-img-filter';let s=document.getElementById(id);if(s){s.remove();}else{s=document.createElement('style');s.id=id;s.textContent='div[data-testid="cellInnerDiv"]:has(article):not(:has(div[data-testid="tweetPhoto"])):not(:has(video)){display:none!important;}';document.head.appendChild(s);}})();

使い方

  1. X(Twitter) のタイムラインを開く
  2. 作成したブックマークレットをクリック
  3. 画像・動画がないツイートが非表示になる
  4. もう一度クリックすると解除される(トグル動作)

方法2: Chrome 拡張機能版(自動適用)

ページを開くたびに自動で適用される拡張機能を作成する。

1. フォルダ構成

以下の構成でフォルダを作成する:

twitter-image-only-filter/
├── manifest.json
├── content.js
├── popup.html
└── popup.js

2. manifest.json

{
  "manifest_version": 3,
  "name": "Twitter Image Only Filter",
  "version": "1.0",
  "description": "X(Twitter)で画像・動画付きツイートだけを表示",
  "permissions": ["storage", "activeTab"],
  "content_scripts": [
    {
      "matches": ["https://x.com/*", "https://twitter.com/*"],
      "js": ["content.js"],
      "run_at": "document_end"
    }
  ],
  "action": {
    "default_popup": "popup.html"
  }
}

3. content.js

// 設定を読み込んでフィルターを適用
chrome.storage.sync.get(['enabled'], function(result) {
  if (result.enabled) {
    applyFilter();
  }
});

// 設定変更を監視
chrome.storage.onChanged.addListener(function(changes) {
  if (changes.enabled) {
    if (changes.enabled.newValue) {
      applyFilter();
    } else {
      removeFilter();
    }
  }
});

function applyFilter() {
  // 既存のstyleを削除
  const existingStyle = document.getElementById('twitter-image-only-filter');
  if (existingStyle) {
    existingStyle.remove();
  }

  // 新しいstyleを追加
  const style = document.createElement('style');
  style.id = 'twitter-image-only-filter';
  style.textContent = \`
    /* 画像・動画がないツイートを非表示 */
    div[data-testid="cellInnerDiv"]:has(article):not(:has(div[data-testid="tweetPhoto"])):not(:has(video)) {
      display: none !important;
    }
  \`;
  document.head.appendChild(style);
}

function removeFilter() {
  const style = document.getElementById('twitter-image-only-filter');
  if (style) {
    style.remove();
  }
}

4. popup.html

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <style>
    body {
      width: 200px;
      padding: 15px;
      font-family: sans-serif;
    }
    label {
      display: flex;
      align-items: center;
      cursor: pointer;
    }
    input[type="checkbox"] {
      margin-right: 8px;
    }
  </style>
</head>
<body>
  <label>
    <input type="checkbox" id="toggle">
    画像のみ表示
  </label>

  <script src="popup.js"></script>
</body>
</html>

5. popup.js

CSP (Content Security Policy) 対策のため、スクリプトを別ファイルに分離:

const toggle = document.getElementById('toggle');

// 現在の設定を読み込む
chrome.storage.sync.get(['enabled'], function(result) {
  toggle.checked = result.enabled || false;
});

// トグル変更時に保存
toggle.addEventListener('change', function() {
  chrome.storage.sync.set({ enabled: toggle.checked });
});

6. 拡張機能のインストール

  1. Chrome で chrome://extensions/ を開く
  2. 右上の「デベロッパーモード」をオン
  3. 「パッケージ化されていない拡張機能を読み込む」をクリック
  4. 作成したフォルダを選択
  5. 拡張機能がインストールされる

7. 使い方

  1. X(Twitter) を開く
  2. 拡張機能アイコンをクリック
  3. 「画像のみ表示」チェックボックスをオン
  4. ページをリロードするとフィルターが適用される

仕組みの解説

このフィルターは CSS の :has() 擬似クラスを使ってる。

セレクタの詳細

div[data-testid="cellInnerDiv"]:has(article):not(:has(div[data-testid="tweetPhoto"])):not(:has(video))

このセレクタの意味:

  • div[data-testid="cellInnerDiv"] - タイムラインの各セル(ツイート全体を囲む div)
  • :has(article) - article 要素を含むセル(実際のツイート)
  • :not(:has(div[data-testid="tweetPhoto"])) - 画像コンテナがない
  • :not(:has(video)) - 動画がない

X(Twitter) の DOM 構造では、各ツイートは cellInnerDiv という div で囲まれており、画像がある場合は tweetPhoto という testid を持つ div が含まれる。article タグではなく、その親の div を隠すことで確実にツイート全体が非表示になる。

カスタマイズ

リツイートも非表示にしたい場合

content.js の applyFilter() 関数内、style.textContent に以下の CSS を追加:

/* リツイートを非表示 */
div[data-testid="cellInnerDiv"]:has([data-testid="socialContext"]) {
  display: none !important;
}

特定のユーザーのツイートは画像なしでも表示したい場合

content.js の applyFilter() 関数を以下のように書き換える:

// 特定ユーザーのツイート以外を非表示(画像なしのみ)
const allowedUsers = ['username1', 'username2'];
const userSelector = allowedUsers.map(u => \`:has([href*="/${u}"])\`).join(',');
const styleText = \`
  div[data-testid="cellInnerDiv"]:has(article):not(:has(div[data-testid="tweetPhoto"])):not(:has(video)):not(${userSelector}) {
    display: none !important;
  }
\`;

username1, username2 のところに、表示したいユーザーの ID を入れる。これらのユーザーのツイートは画像がなくても表示される。

注意

  • X(Twitter) の仕様変更で将来的に動作しなくなる可能性がある。
  • ブックマークレット版はページをリロードすると解除される。
  • 拡張機能版は設定が保存され、次回以降も自動適用される。
  • スクロールして新しいツイートが読み込まれた時も自動でフィルターされる。

こんな時に便利

  • イラストレーターの作品だけを見たい
  • 写真家のタイムラインをギャラリーのように見たい
  • 画像付きツイートだけを流し見したい
  • テキストツイートが多すぎて画像が埋もれる
  • 純粋にビジュアルコンテンツだけを楽しみたい