Apex

VisualforceをLightning仕様に近づける設定と注意点

Classicで作成したVisualforceページは、Lightning Experienceでもそのまま動きます。見た目をLightning仕様に近づける属性の付け方と、動かなくなる書き方への対応を説明します。

2021.06.04

Lightning Experienceでも動くが見た目は変わらない

Visualforceページは、Lightning Experienceのタブやカスタムアプリの中でもそのまま動きます。ただし、表示は自動的にLightning仕様になりません。標準コンポーネントはClassicの見た目のまま表示されます。これがLightning Experience移行で最初につまずく点です。公式ガイドは、Lightning Experienceのスタイルシートを既存ページへ手動で適用する方法を案内しています。

lightningStylesheetsで見た目を合わせる

apex:pageタグにlightningStylesheets="true"を付けると、ページ全体にLightning Design Systemのスタイルが適用されます。公式ガイドによれば、対象はapex:pageBlockやapex:pageBlockSection、apex:dataTable、apex:commandButton、apex:inputFieldなど70以上の標準コンポーネントです。

Classic版はこのページからlightningStylesheets="true"が抜けているだけで、他のマークアップは同じです。

<apex:page standardController="Account" lightningStylesheets="true">
<apex:form>
<apex:pageBlock title="My Content" mode="edit">
<apex:pageBlockButtons>
<apex:commandButton action="{!save}" value="Save"/>
</apex:pageBlockButtons>
<apex:pageBlockSection title="My Content Section" columns="2">
<apex:inputField value="{!account.name}"/>
<apex:inputField value="{!account.site}"/>
<apex:inputField value="{!account.type}"/>
<apex:inputField value="{!account.accountNumber}"/>
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form>
</apex:page>

元のページに属性を1つ足しただけです。マークアップは変えていません。

属性を付けても、すべてのコンポーネントが同じ見た目になるわけではありません。apex:inputFileや一部のapex:inputFieldはブラウザ標準のスタイルのままです。ボタンをブランドカラーにするにはslds-vf-button_brandクラスを別途加えます。Experience CloudサイトのページとrenderAs="pdf"のページには効果がありません。
Classic表示のpageBlock。取引先名など4項目とSaveボタンが並ぶ
属性を付けない状態の表示です。枠線と灰色の見出しというClassicの見た目のままである点を見てください。
Lightning Design Systemが適用されたpageBlock。余白の広い白い枠
lightningStylesheetsを付けた後の表示です。余白と書体がLightning仕様に変わる点を見比べてください。

コントローラを持つページも属性だけで対応する

selectList・selectRadio・dataTableのようにApexコントローラを持つページも、直す場所はapex:pageタグだけです。コントローラのApexコードは変更しません。

Classic表示の複数選択リスト。US・Canada・Mexicoが小さな枠に並ぶ
selectListのClassic表示です。選択リストとTestボタンが小さくまとまっている点を見てください。
Lightning表示の複数選択リスト。行間が広くボタンが青くなっている
同じページに属性を付けた表示です。行間とボタンの配色が変わる点を見比べてください。
<apex:page controller="selectRadioController" lightningStylesheets="true">
<apex:form>
<apex:selectRadio value="{!country}">
<apex:selectOptions value="{!items}"/>
</apex:selectRadio>
<apex:commandButton value="Test" action="{!test}" rerender="out" status="status"/>
</apex:form>
<apex:outputPanel id="out">
<apex:actionstatus id="status" startText="testing...">
<apex:facet name="stop">
<apex:outputPanel>
<p>You have selected:</p>
<apex:outputText value="{!country}"/>
</apex:outputPanel>
</apex:facet>
</apex:actionstatus>
</apex:outputPanel>
</apex:page>

selectRadioのページにlightningStylesheetsを追加します。コントローラ側は変更不要です。

⚠️ 実際の見た目は、組み合わせるコンポーネントや独自のCSSによって変わります。最終的な見た目はSandboxで確かめてください。

Classic表示のラジオボタン。US・Canada・Mexicoが横に並ぶ
selectRadioのClassic表示です。ラジオボタンとTestボタンの素朴な見た目を見てください。
Lightning表示のラジオボタン。丸が大きく文字が青くなっている
属性を付けた後のラジオボタンです。丸の大きさと配色が変わる点を見比べてください。
Classic表示のdataTable。caption・header・footerの各行が詰まって並ぶ
dataTableのClassic表示です。見出しと明細が同じ書体で詰まって並ぶ点を見てください。所有者の列は伏せています。
Lightning表示のdataTable。見出しが大文字になり行間が広い
属性を付けたdataTableです。見出しが大文字になり行間が広がる点を見比べてください。所有者の列は伏せています。

windowオブジェクトとURLの扱いを見直す

Classic向けに書かれたVisualforceには、Lightning Experienceで問題になりやすい書き方があります。

元の書き方Lightning Experienceでの扱い
window.locationでのページ遷移正しく遷移しません。sforce.oneのナビゲーションメソッドに置き換えます
静的なURLへの直接リンクLightning Experienceは静的URLを想定していません。URLFOR関数などで動的に組み立てます
iframeでの表示多くはそのまま動きますが、表示エラーが出た場合は個別に見直します

JavaScriptカスタムボタンはLightningで動かない

OnClick JavaScriptを使うカスタムボタン・リンクは、Lightning Experienceでは動きません。公式ヘルプは「Custom buttons that call JavaScript aren't supported in Lightning Experience.」と明記しています。REQUIRESCRIPT関数もOnClick JavaScript専用の機能なので、同じ制約を受けます。置き換え先は、クイックアクション、Flow、Lightning Web Componentsのいずれかです。既存のJavaScriptのロジックをそのまま移すのではなく、機能単位で作り直します。

ここで間違えやすい

間違い何が起きるか
lightningStylesheetsを付けずに見た目だけ心配する属性を付けない限りClassicの見た目のままです
window.locationでページ遷移させるLightning Experienceで正しく遷移しません
JavaScriptカスタムボタンをそのまま残すLightning Experienceでは呼び出せません
renderAs="pdf"のページにlightningStylesheetsを期待する対象外なので効果がありません

確認した環境

  • 2026年9月 / Salesforce Summer '26(APIバージョン67.0)時点の公式ドキュメントで、lightningStylesheetsの対応範囲とJavaScriptボタンの制限を確認しています

まとめ

  • Visualforceページ自体はLightning Experienceでも動きますが、見た目は自動的には変わりません
  • apex:pageにlightningStylesheets="true"を付けると、標準コンポーネントの多くがLightning Design Systemの見た目になります
  • 一部のコンポーネントやrenderAs="pdf"のページ、Experience Cloudサイトには効果がありません
  • window.locationはsforce.oneのナビゲーションメソッドに置き換えます
  • JavaScriptカスタムボタンはLightning Experienceで動きません。クイックアクションやFlow、LWCに作り直します

Salesforceの導入・運用についてご相談ください

導入前の検討から、お使いの環境の改修・運用、AIとの連携まで承ります。状況を伺ったうえで、進め方をご提案します。