JavaScriptをまったく使用せずに、CSSのみのリンクを使用してテキストを表示および非表示にすることは可能ですか?
例:このページ
「詳細」リンクに注意してください。クリックすると、テキストが再表示されます。この特定の例はJavaScriptですが、純粋なCSSで実行できるかどうかはわかりません。
JavaScriptをまったく使用せずに、CSSのみのリンクを使用してテキストを表示および非表示にすることは可能ですか?
例:このページ
「詳細」リンクに注意してください。クリックすると、テキストが再表示されます。この特定の例はJavaScriptですが、純粋なCSSで実行できるかどうかはわかりません。
回答:
Edgeにまだ組み込まれていない<details>
要素があります。
<details>
<summary>more <!-- a bad summary --></summary>
<p>Some content</p>
</details>
ブラウザ間で一貫してスタイルを設定することがどれほど難しいかはわかりません。
一般的なチェックボックスハックがあります(チェックボックスを非表示にし、ラベルを任意のようにスタイル設定できます)。
#more:not(:checked) ~ #content {
display: none;
}
<input id="more" type="checkbox" /> <label for="more">more</label>
<p id="content">Some content</p>
しかし、それを使用することが常に(多分今までに?うーん)適切であるとは限りません。通常は、JavaScriptの読み込みに失敗したときにコンテンツの表示にフォールバックし、そのコンテンツへの「詳細」リンクリンクを設定できます。
もありますが:target
、閉じるメカニズムを組み込むのが難しいため、おそらくさらに適切ではありません。
#content {
display: none;
}
#content:target {
display: block;
}
#less {
display: none;
}
#content:target ~ #less {
display: block;
}
<a href="#content" id="more">More</a>
<p id="content">Lorem ipsum</p>
<a href="#" id="less">Less</a>
:checked
か:target
、決して適切ではないのか戸惑います。結局のところ、それらは存在します。
id
要件だけであり、動的ページでの使用をより困難にします。IMOではありませんが、この非表示のチェックボックスパターンはかなり古く、理解するのは難しくありません。動的な状況では、IDの一部としてハッシュを使用できます。
:target
–他の場所にリンクすると、コンテンツが消えます。:checked
つまり、拡張内でリンクすることはできません。チェックボックスを非表示にすると、ラベルをキーボードフォーカス可能にする必要があります。これらのいずれかが機能するには、コンテンツがすでに存在している必要があるため、デフォルトで表示し、ほとんどの場合、JavaScriptを使用して拡張機能を提供します。
はい、これは純粋なCSSで可能です。チェックボックスの:checked
属性を<label>
要素のfor
属性と組み合わせて使用することにより、要素をクリックすることができます。
チェックボックスをオフにできるため、これを使用visibility: hidden
して、元の要素に追加するだけで表示を切り替えることができます :checked
(チェックボックスをもう一度クリックすると、この疑似セレクターは無効になり、CSSセレクターはターゲットと一致しなくなります)。
これ<label>
は、for
属性を使用してに拡張できるため、チェックボックス自体を完全に非表示にして、独自のスタイルを<label>
直接適用できます。
以下では、隣接する兄弟コンビネータ(+
)を使用してtoggle
、<label>
要素がクリックされたときにクラスを切り替えます。
input[type="checkbox"] {
display: none; /* Hide the checkbox */
}
/* This is tied to the invisible checkbox */
label {
background-color: #4CAF50;
border: 2px solid black;
border-radius: 20px;
color: white;
padding: 15px 32px;
text-align: center;
font-size: 16px;
display: inline-block;
margin-bottom: 20px;
cursor: pointer;
user-select: none;
}
/* The target element to toggle */
input[type="checkbox"]:checked + label + .toggle {
visibility: hidden;
}
<input type="checkbox" id="checkbox" />
<label for="checkbox">Click me to toggle the content</label>
<div class="toggle">CONTENT</div>
はい、CSSのみを使用してこれを簡単に行うことができます。以下のコードを参照してください。
* {
box-sizing: border-box;
}
body {
background-color: #646464;
color: #fff;
}
header {
background-color: rgba(0, 0, 0, 0.5);
font-size: 1.5em;
text-align: center;
padding: 1em;
}
.panel-wrapper {
position: relative;
}
.btn {
color: #fff;
background: #000;
border-radius: 1.5em;
left: 30%;
padding: 1em;
text-decoration: none;
width: 40%;
}
.show,
.hide {
position: absolute;
bottom: -1em;
z-index: 100;
text-align: center;
}
.hide {
display: none;
}
.show:target {
display: none;
}
.show:target~.hide {
display: block;
}
.show:target~.panel {
max-height: 2000px;
}
.show:target~.fade {
margin-top: 0;
}
.panel {
position: relative;
margin: 2em auto;
width: 70%;
max-height: 100px;
overflow: hidden;
transition: max-height .5s ease;
}
.fade {
background: linear-gradient(to bottom, rgba(100, 100, 100, 0) 0%, #646464 75%);
height: 100px;
margin-top: -100px;
position: relative;
}
<!DOCTYPE html>
<html lang='en' class=''>
<head>
<link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.css'>
</head>
<body>
<header>CSS Only: Show More</header>
<div class="panel-wrapper">
<a href="#show" class="show btn" id="show">Show Full Article</a>
<a href="#hide" class="hide btn" id="hide">Hide Full Article</a>
<div class="panel">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In pharetra consectetur accumsan. Vestibulum vitae ipsum euismod, tempus ligula non, tempus lacus. Phasellus at pellentesque ex. Praesent at ipsum dui. Cras lectus neque, bibendum ac diam
a, elementum tristique felis. Sed iaculis, diam at vehicula lacinia, odio urna tincidunt felis, sit amet scelerisque urna erat non leo. Pellentesque vel leo vitae tellus bibendum viverra.</p>
<p>Donec id ultrices mi. Suspendisse potenti. Pellentesque cursus sagittis lacinia. Mauris elit sem, eleifend nec facilisis eget, fermentum sed odio. Nam aliquam massa nec leo tincidunt rhoncus. Integer tincidunt finibus tincidunt. Maecenas aliquam
fermentum nisi, vitae mattis neque vehicula vitae.</p>
<p>Nam orci purus, consequat sed lorem id, lacinia efficitur lorem. Vestibulum id quam ut elit congue varius. Donec justo augue, rhoncus non nisl ut, consectetur consequat velit. In hac habitasse platea dictumst. In hac habitasse platea dictumst. Aliquam
auctor sapien lorem, at vestibulum justo congue vel. Duis volutpat, lorem quis tincidunt ornare, felis tortor posuere tellus, nec pretium neque velit vulputate libero.</p>
<p>Morbi tortor tortor, auctor porttitor felis in, eleifend cursus ante. Nullam pellentesque lorem ipsum, in fringilla enim suscipit cursus. Pellentesque feugiat volutpat congue. Donec ac ante elit. Quisque ornare lacus dui, id commodo tortor lacinia
nec. Curabitur dignissim magna sagittis neque aliquam porttitor. Aenean sit amet tincidunt risus.</p>
<p>Cras feugiat, sapien luctus congue gravida, enim enim tristique nisl, vel porta lacus ante vitae dolor. Duis at nisl sed lectus imperdiet congue. Vestibulum pellentesque finibus ligula, sit amet elementum enim dignissim eget. Nullam bibendum justo
eros, in placerat est ullamcorper nec. Donec blandit accumsan venenatis. Vivamus nec elit arcu. Morbi ultrices blandit sapien eget aliquam. Pellentesque placerat et libero a sodales. Donec eget erat ac velit maximus ullamcorper. Nulla laoreet
dolor in purus sollicitudin varius. Duis eu erat ut magna lobortis rhoncus ac at lacus. Nullam in mi sed sem porttitor molestie. Aenean auctor dui in neque vulputate, in mattis purus tristique. Aliquam egestas venenatis ultricies. Nam elementum
ante libero, nec dictum erat mollis dapibus. Phasellus pharetra euismod nibh, sit amet lobortis odio.</p>
<p>Sed bibendum dapibus leo eu facilisis. Cras interdum malesuada diam id lobortis. Phasellus tristique odio eget placerat ornare. Phasellus nisl nulla, auctor convallis turpis tempus, molestie blandit urna. Nullam accumsan tellus massa, at tincidunt
metus imperdiet sed. Donec sed imperdiet quam, id dignissim dolor. Curabitur mollis ultricies tempor. Morbi porttitor, turpis et dignissim aliquam, nunc lacus dignissim massa, a consequat nibh est vel turpis. Pellentesque blandit, ante vehicula
sollicitudin imperdiet, tellus urna fringilla diam, id tempor neque augue eu nisl. Quisque eu sem posuere, vehicula risus ut, ullamcorper massa. Fusce vulputate bibendum erat, vel dapibus dui consectetur nec. Donec mauris mauris, egestas non malesuada
non, finibus nec lacus. Duis at mauris tincidunt, accumsan augue non, vestibulum libero.</p>
<p>Vestibulum fermentum vulputate lectus, at sollicitudin diam laoreet vitae. Aliquam erat volutpat. Nulla condimentum, arcu nec suscipit ultrices, urna tortor rutrum purus, sed mollis lacus ligula vitae justo. Duis vitae malesuada sem, eget finibus
nibh. Etiam facilisis, urna ac blandit molestie, quam velit congue nibh, ac.</p>
</div>
<!-- end panel -->
<div class="fade"></div>
</div>
<!-- end panel-wrapper -->
</body>
</html>
チェックボックスを非表示にすることはできますが、関連する<label>
要素を介してチェックボックスをオン/オフにすることができます。
チェックボックスがオンになっているかどうかに基づいて、追加のテキストを表示/非表示にしたり、ラベルのテキストを「詳細」から「少ない」に変更したりすることもできます。
各定義の意図をもう少し明確にするために、CSSにいくつかの追加の詳細を含めました。
1. 1つのトグル「もっと」/「少ない」ボタンで:
.more-text, #more-checkbox { /* Hide the second paragraph and checkbox */
display: none;
}
input:checked ~ .more-text { /* Show the second paragraph when checked */
display: block;
}
.more-label::after { /* Label underline, hand cursor, color */
cursor: pointer;
text-decoration: underline;
color: #666;
}
input ~ .more-label::after { /* Set label text to "More" by default */
content: 'More';
}
input:checked ~ .more-label::after { /* Set label text to "Less" when checked */
content: 'Less';
}
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ullamcorper, arcu ut facilisis interdum, lacus felis fringilla nulla, vel scelerisque massa quam vel leo.
</p>
<input type="checkbox" id="more-checkbox" />
<label class="more-label" for="more-checkbox"></label>
<p class="more-text">
Sed a ullamcorper ex. In elementum purus ullamcorper justo gravida aliquet. Aliquam erat volutpat. Maecenas in ante quam.
</p>
2.上部に「詳細」ボタン、下部に「少ない」ボタンがある場合:
.more-text, #more-checkbox, .less-label {
display: none;
}
.more-label, .less-label {
cursor: pointer;
text-decoration: underline;
color: #666;
}
input:checked ~ .more-text, input:checked ~ .less-label {
display: block;
}
input:checked ~ .more-label {
display: none;
}
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ullamcorper, arcu ut facilisis interdum, lacus felis fringilla nulla, vel scelerisque massa quam vel leo.</p>
<input type="checkbox" id="more-checkbox" />
<label class="more-label" for="more-checkbox">More</label>
<p class="more-text">
Sed a ullamcorper ex. In elementum purus ullamcorper justo gravida aliquet. Aliquam erat volutpat. Maecenas in ante quam.
</p>
<label class="less-label" for="more-checkbox">Less</label>
技術的には、以下に示すように、ボタンまたはリンクをクリックしたタイミングに基づいてテキストの表示を切り替えることができます。
.hidden-text {
display: none;
}
.toggle-text:focus + .hidden-text {
display: block;
}
<p>
This is an example with no hidden content until you... <a href="#" class="toggle-text">read more</a>!
<span class="hidden-text">Now I'm visible!!!</span>
</p>
そうは言っても、このようなものにJavaScriptを使用するソリューションははるかに単純であり、柔軟性を高めることができるため、JavaScriptに精通することを強くお勧めします。
はい、HTMLとCSSのみを使用してそれを行うことができます。
body { padding: 20px; }
div { margin-top: 10px; border: 1px solid black; width: 200px; height: 100px;
padding: 5px;
}
input:checked + label + div { display: none; }
input + label:after { content: " To Hide"; }
input:checked + label:after { content: " To Show"; }
label {
background-color: yellow;
box-shadow: inset 0 2px 3px rgba(255,255,255,0.2), inset 0 -2px 3px rgba(0,0,0,0.2);
border-radius: 4px;
font-size: 16px;
display: inline-block;
padding: 2px 5px;
cursor: pointer;
}
<input type='checkbox' style='display: none' id=cb>
<label for=cb>Click Here</label>
<div>
Hello. This is some stuff.
</div>
CSSのみを使用してテキストを表示/非表示にできるようになりました!テキスト入力を使用していて、入力ボックスの状態に基づいてテキストを表示/非表示にする場合は、またはの新しいCSS疑似クラス:placeholder-shown
を使用できます。上記の疑似クラスの例/デモは次のとおりです!:<input>
<textarea>
/* Some base style */
.app {
margin: 10px auto;
padding: 10px;
}
code {
background-color: lightgray;
padding: 4px;
}
input {
padding: 5px 10px;
}
input:focus {
outline: none;
}
/* When there is something in input box give
it a solid blue border */
input:not(:placeholder-shown) {
border: solid 2px #42A5F5
}
/* Hide the p initially */
p {
background-color: #F0F4C3;
padding: 5px;
opacity: 0;
transition: all 300ms ease-in-out;
}
/* Show the p when the placeholder is not shown.
i.e. Something is in the input box and placeholder is gone */
input:not(:placeholder-shown)+p {
opacity: 1
}
<div class="app">
<h1>Hide/Show Text using input's <code>:placehoder-shown</code> psuedo class!</h1>
<label for="name">Enter your name</label>
<input type="text" id="name" placeholder="Your Name">
<p class="msg">Well done!</p>
</div>
ここにあるリンクMDNドキュメントには。
これは実験的な技術です。これを本番環境で使用する前に、ブラウザの互換性テーブルを注意深く確認してください。
たぶん、誰かがこのソリューションをより直感的で実装しやすいと思うでしょう。これの仕組みは、リンクがそれ自体をターゲットにしていることです。その場合、DOMで次に来るものを簡単に選択できます。
.toggle-hide,
.toggle-content {
display: none;
}
.toggle-show:target + .toggle-hide,
.toggle-show:target + .toggle-hide + .toggle-content {
display: block;
}
.toggle-show:target {
display: none;
}
<a id="target" class="toggle-show" href="#target">Show</a>
<a class="toggle-hide" href="#" >Hide</a>
<p class="toggle-content">Lorem ipsum</p>
使用する "display: none;" attribute.