コニファ・ロゴ

 

liタグを横並びにしたときにできる余計な隙間を解消

liタグを横並びにしたときに、liとliの間に余計な隙間ができてしまいます。ぴったり隙間無しのデザインにしたい場合の対処法です。

次のサンプルは、幅600pxのdiv要素(赤いボーダー)の中に、幅25%のli要素を4つ入れていますが、余計な隙間(inlineの改行は、半角の空白として認識されることによる)ができてしまうため、4番目のliが下に落ちています。

CSSソース

.navi ul {
	margin:0;
	padding:0;
	}

htmlソース

<ul>
  <li>home</li>
  <li>products</li>
  <li>services</li>
  <li>contact</li>
</ul>
これを修正 :
ul要素のCSSに「font-size: 0;」を追加指定します。これで隙間は無くなり、親要素内に収まります。

CSSソース

.navi2 ul {
	margin:0;
	padding:0;
	font-size:0; /*-- これを追加するだけ --*/
	}

htmlソース

/*--- 前と同じです。 ---*/

 

ショートハンドによるfont指定がトラブルの元に?

font指定をショートハンドでおこなった場合、後々の修正などの際に思わぬトラブルを引き起こす可能性があります。

CSSの通常のfont指定例

セレクタ {
    font-style: italic;
    font-variant: small-caps;
    font-weight: bold;
    font-size: 22px;
    line-height: 1.6;
    font-family: century, serif;
    }

左の例をショートハンドにしたもの

セレクタ {
  font: italic small-caps bold 22px/1.6 century, serif;
  }

あるセレクタのfont指定を外部cssにショートハンドで記述し、後にその指定のfont-sizeとline-heightに変更が生じた際、元の外部cssには手をつけず、インラインなどのページ側に追記する形で変更したとします。

次の左のように記述すれば問題ないのですが、右のように必要箇所以外を省略して記述した場合問題が生じます。

正しいショートハンドによる指定

セレクタ {
  font: italic small-caps bold 21px/1.5 century, serif;
  }

問題が生じるショートハンドによる指定

セレクタ {
  font: bold 21px/1.5 century, serif;
  }
ショートハンドで指定した場合、省略した "font-style"、"font-variant"、"font-weight" の値は、すべてデフォルトの "normal" に置き換わります。その結果、デザインが大きく変わってしまいます。

問題が生じるショートハンドによる指定例の図解

 

切れ目がなく長い英文テキスト(単語)を <wbr> で改行させる

日本語テキストは、表示領域の幅に収まりきらないときに自動で改行しますが、英文のテキストで、切れ目がなく長いものは、表示領域の幅を超えても改行されません。これは長いテキストが、途中改行を禁止されている英文単語とみなされるためにおこります。その結果、[ダミーテキスト(1)]のように表示領域からあふれてしまいます。

[ダミーテキスト(1)]英文テキスト abcdefghijklmnopqrsituvwxyzabcdefghijklmnopqrsituvwxyzabcdefghijklmnopqrsituvwxyz

[ダミーテキスト(1)]のhtmlソース

<div class="test"> 
    <p>[ダミーテキスト(1)]英文テキスト 
    abcdefghijklmnopqrsituvwxyzabcdefghijklmnopqrsituvwxyzabcdefghijklmnopqrsituvwxyz
    </p>
</div>

 

また、表示領域を確保している親要素のCSSに「overflow:auto」が指定されていると、[ダミーテキスト(2)]のように横方向のスクロールバーが出てしまいます。

[ダミーテキスト(2)]英文テキスト abcdefghijklmnopqrsituvwxyzabcdefghijklmnopqrsituvwxyzabcdefghijklmnopqrsituvwxyz

 

領域の外にあふれたり、スクロールバーを出さないようにする対策として、仮に、長い英文テキストにハイフンを入れてみます。ハイフンは英文テキストの折り返し可能な箇所と認識されます。次の[ダミーテキスト(3)]は、「z」と「a」の間にハイフンを入れています(2カ所)。表示領域に収まりきらなくなる前のハイフンの次の箇所で自動改行されます。

[ダミーテキスト(3)]英文テキスト(ハイフン有り)abcdefghijklmnopqrsituvwxyz-abcdefghijklmnopqrsituvwxyz-abcdefghijklmnopqrsituvwxyz

 

実際は、決められたテキストに勝手にハイフンを入れることはできませんので、上のハイフンと同じような動きをする <wbr> を使用します。 <wbr> は、元々Netscape Navigator の独自機能でしたが、HTML5から追加されました。表示領域の幅やテキストの分量、文字サイズなどから判断して改行が可能なとき改行し、不要な箇所では改行しません。[ダミーテキスト(4)]

[ダミーテキスト(4)]英文テキスト(<wbr>使用)abcdefghijklmnopqrsituvwxyzabcdefghijklmnopqrsituvwxyzabcdefghijklmnopqrsituvwxyz

[ダミーテキスト(4)]のhtmlソース

<div class="test"> 
    <p>[ダミーテキスト(1)]英文テキスト 
    abcdefghijklmnopqrsituvwxyz<wbr>abcdefghijklmnopqrsituvwxyz<wbr>abcdefghijklmnopqrsituvwxyz
    </p>
</div>

 

比較のために、上の <wbr> を <br> に置き換えたものが、[ダミーテキスト(5)]です。単純にその箇所で改行しますので、ひとつの単語であることが分かりにくくなります。

[ダミーテキスト(5)]英文テキスト(<br>使用)abcdefghijklmnopqrsituvwxyz
abcdefghijklmnopqrsituvwxyz
abcdefghijklmnopqrsituvwxyz

 

 

1つのボックス要素に複数の背景画像を使う

1つのボックス要素に複数の背景画像を使うことができます。どちらかの背景画像の幅がボックス要素の幅の50%以上になると、背景画像は重なります。サンプルは、2つの背景画像を幅の違う2つボックスに使用したものです。

width:75%のサンプルボックス

ダミーテキストだみーてきすと、ダミーテキストだみーてきすと、ダミーテキストだみーてきすと、ダミーテキストだみーてきすと、ダミーテキストだみーてきすと、ダミーテキストだみーてきすと、ダミーテキスト

width:85%のサンプルボックス

ダミーテキストだみーてきすと、ダミーテキストだみーてきすと、ダミーテキストだみーてきすと、ダミーテキストだみーてきすと、ダミーテキストだみーてきすと、ダミーテキストだみーてきすと、ダミーテキスト

CSSの指定は、背景画像のパス、背景画像のpositionをカンマで区切って記述します。

CSSソース・75%のほう(上側)のみ

.box1 {
	width: 75%;
	min-width: 420px;
	height: 200px;
	margin: 20px auto;
	border: 1px solid #bbb;
	background-image: url(img3/gin-11.png), url(img3/gin-22.png); /* パス */
	background-position: left bottom, right bottom; /* position */
	background-repeat: no-repeat;
	}

 

 

CSSを使って、廃止されたblink要素の代替サンプル

blink要素は、テキストを点滅させるためのものでしたが、HTML5で廃止されました。まだ、動くブラウザがあるかもしれませんが、アップデートにより突然動かなくなってもおかしくないので、使わない方が無難です。

CSSを使って、blink要素の代替サンプル

赤いテキスト部分が点滅します

サンプルのCSSソース

span.winker {
    color:#c33333;
    -webkit-animation:wink 1.3s ease-in-out infinite alternate;  
    -moz-animation:wink 1.3s ease-in-out infinite alternate;  
    animation:wink 1.3s ease-in-out infinite alternate;   
    }
@-webkit-keyframes wink{
    0% {opacity:0;}
    100% {opacity:1;}
    }
@-moz-keyframes wink{
    0% {opacity:0;}
    100% {opacity:1;}
    }
@keyframes wink{
    0% {opacity:0;}
    100% {opacity:1;}
    }

 

閲覧者によるコンテンツ編集を可能にする

要素に、contenteditable属性を追加することで、閲覧者によるコンテンツ編集を可能にします。 元々、古いInternet Explorerが持っていた機能ですが、HTML5から属性として追加されました。

使い方:要素内に contenteditable="" を追加し、値を "true" 、または ""(空)にすると、コンテンツ編集が可能になります。コンテンツ編集を禁止する場合は、"false" にします。また、継承する場合は、"inherit" にします。次のサンプルは、div要素のstyleに contenteditable="true" を使っていて、編集可能です。編集すると、すぐにその内容が反映します。

サンプル

サンプルのhtmlソース

<div class="inner">
  <style class="style" contenteditable="true">.style {
    display: block; 
    white-space: pre; 
    padding: 15px;
    background: #678;
    font-size: 16px;
    color: #eee;
    }
  </style>
</div>

 

aタグのtarget="_blank"にrel="noopener"を指定する

html4の末期に非推奨となっていた「target="_blank"」ですが、HTML5で復活しています。記憶が定かではありませんが、「target="_blank"」によって新しく開かれたページから、元のページのlocationなどをコントロールできてしまう辺りが非推奨だった所以の一つとなっていたと思います。

このコントロールできる機能は、HTML5になった現在も活きていて、 window.opener.location.href = url で、新しく開かれたページから、元のページのlocationをコントロールできてしまいます。これを防ぐには、target="_blank"と同じタグ内に rel="noopener" を指定します。

サンプルのページ(index.html)
は、target="_blank"で開く同じページ(blank.html)のリンクが2つあり、一方に rel="noopener" を指定しています。リンク先のblank.htmlでは、次のようなスクリプトで、元のindex.htmlのlocationをdestination.htmlに変更することができてしまいますが、 rel="noopener" を追加することでこれをブロックできます。

blank.htmlのソース(一部)

<p><a href="javaScript:ctrlp()">リンク元のlocationを変更する</a></p>
<script>
  function ctrlp() {
    window.opener.location.href = "destination.html";
  }
</script>

元のindex.htmlの2つのリンク部分のソース

 <a href="blank.html" target="_blank">target blankで開くリンク</a>
 <a href="blank.html" target="_blank" rel="noopener">target blankで開くリンク・「 rel="noopener"」付き</a>

(注) 古めブラウザやEdgeなどで、機能しない場合があるようです。

 

スタイルの継承(inherit)と初期化(all:initial)

通常では継承しない親要素のプロパティのスタイルを継承させる場合は、「inherit」を使用します。 次のサンプル1は、親要素のdivにwidth、padding、border、font-size、colorを指定しています。 font-size、colorは子要素に自動で継承しますが、padding、borderは継承しません。2つの子要素のうち子要素1は、 「border: inherit」を指定しているので、親要素と同じborderがつきます。

サンプル1

親要素sample1のスタイル
border:inheritを指定した子要素1
border:inheritを指定していない子要素2

親要素sample1のCSS

.sample1 {
	width:500px;
	padding:10px;
	border:1px solid #37d;
	font-size:20px;
	color:green;
	}

サンプル1のhtmlソース

<div class="sample1">親要素sample1のスタイル
	<div style="border: inherit;"> border: inheritを指定した子要素1</div>
	<div> border: inheritを指定していない子要素2</div>
</div>

 

同じサンプルを使い、今度は子要素に「all:initial」を指定して、自動で継承するプロパティのスタイルを 初期化して継承を止めます。 次のサンプル1-2は、サンプル1の親要素と同じCSSを指定していますが、2つの子要素に「all:initial」を 指定してすべての自動の継承を止めます。さらに子要素2には、「color:unset」を追加して、止めた自動継承のうちcolorの値の継承を許可します。

サンプル1-2

親要素sample1のスタイル
all:initialを指定した子要素1

all:initialとcolor:unsetを指定した子要素2

サンプル1-2のhtmlソース(親要素sample1のCSSは同じです)

<div class="sample1">親要素sample1のスタイル<br>
	<div style="all:initial;">  all:initialを指定した子要素1</div><br>
	<div style="all:initial;color:unset;"> all:initialとcolor:unsetを指定した子要素2</div>
</div>
 div要素のdisplayプロパティのデフォルトの値は「block」ですが、「all:initial」の指定のため「inline」になってしまい、一並びになってしまうため、<br>を追加しています。

 

CSSの属性セレクターの大文字と小文字の区別の有無を設定

CSSの属性セレクターを使って次のような状態を選択できます。
  • [○属性="△□"] ○属性の値が、「△□」と同じ場合(完全一致)
  • [○属性~="△□"] ○属性の値が、空白区切りの語のリストで、その中の1つが「△□」と同じ場合
  • [○属性|="△□"] ○属性の値が、「△□」と完全一致するか、「△□」の直後に-(ハイフン)が続く場合
  • [○属性^="△□"] ○属性の値が、「△□」で始まる場合(前方一致)
  • [○属性$="△□"] ○属性の値が、「△□」で終わる場合(後方一致)
  • [○属性*="△□"] ○属性の値が、「△□」を含む場合
これらに加えて「[○属性="△□" i] 」と「i」または「I」を加えることで、大文字と小文字の区別を無しにできます。 また、「[○属性="△□" s] 」と「s」または「S」を加えることで、大文字と小文字の区別を有りにできます。

次のサンプルは、href属性が同じ「#JavaScript」のa要素を2つ使っています。これを大文字と小文字の区別の有無でスタイルを振り分けます。2つとも「java」という小文字の値を条件にしています。上側は「i」付きなので、大文字と小文字の区別が無く、条件が一致し背景が青くなります。下側は「s」付きなので、大文字と小文字の区別が有るため、条件が一致せず背景が青くなりません。

サンプル

サンプルa要素・区別無し

サンプルa要素・区別有り

サンプルのhtmlソース

  <p class="samp1"><a href="#JavaScript">サンプルa要素・区別無し</a></p>
  <p class="samp2"><a href="#JavaScript">サンプルa要素・区別有り</a></p>

サンプルのCSSソース

.samp1 a[href*="java" i] {
	background: #7bf;
	}
.samp2 a[href*="java" s] {
	background: #7bf;
	}

 

図表のキャプション figcaption に振り仮名を付ける ruby

HTML5から追加されたタグの中に、<figure> と <figcaption> があります。前者は図表であることを示し、後者はその図表のキャプションを示します。この <figcaption> にルビ(振り仮名、<ruby>)を付けるテストです。

次のサンプルは、<figure> で向日葵の画像を表示し、<figcaption> で「向日葵」と画像のキャプションを追加し、そのキャプションに <ruby> で振り仮名を付けています。

サンプル

ひまわり
向日葵ひまわり

サンプルのHTMLソース

<figure id="himawari" style="width:150px;">
    <img src="csstest/images/sample22.png" width="150" alt="ひまわり">
    <figcaption style="text-align:center;">
        <ruby>向日葵<rt>ひまわり</rt></ruby>
    </figcaption>
</figure>

 

scale() を使って、二次元要素のx、y方向ごとのサイズ変形

scale() を使って、二次元要素のx方向、y方向のサイズをそれぞれ別な値で変形できます。サンプルは横150px、縦50pxのボックスを基本にして、x方向、y方向をそれぞれのサイズで変形します。「見本ボックス1」は、変形を加えず、「見本ボックス2」は、横100%、縦140%に、「見本ボックス3」は、横140%、縦100%に変形しています。

内包するテキストもそれぞれ長体、平体になります。この例ではテキストの親要素に対しての変形ですが、直接テキストを変形し、長体文字、平体文字として利用することも可能です。なお、数世代前の古いブラウザは非対応です。
見本ボックス1
見本ボックス2
見本ボックス3

htmlソース

    <div class="box">見本ボックス1</div>
    <div class="box scale100-140">見本ボックス2</div>
    <div class="box scale140-100">見本ボックス3</div>

CSSソース

.scale100-140 {
	transform: scale(1, 1.4);
	}
.scale140-100 {
	transform: scale(1.4, 1);
	} 

 

aタグのアンダーラインを一部分のみ非表示にする

aタグのテキストが小さく、アンダーラインが付くと見づらい部分があるなどの理由で、一部分のみアンダーラインを非表示にしたいことが稀にあります。そんなときの簡単な方法です。

アンダーラインをすべて消すのは、text-decoration:none でできますが、一部分のみ消すときは、その部分をinline-block にします。

サンプルの上側は、一行のaタグテキストで、下側は同じものの「sample」部分のみをinline-block にしています。この部分のみアンダーラインが非表示になります。hoverすると一行のaタグテキストであることが分かります。

サンプル

  1. サンプルリンクテキストsample link text
  2. サンプルリンクテキストsample link text

htmlソース

  <ol class="sample3">
      <li><a href="#">サンプルリンクテキストsample link text</a></li>
      <li><a href="#">サンプルリンクテキスト<span>sample</span> link text</a></li>
  </ol>

CSSソース

ol.sample3 li a {
	text-decoration: underline;
	color: #26c;
	}
ol.sample3 li a:hover {
	color: #c33333;
	}
ol.sample3 span {
	display: inline-block;
	}

 

新しいCSSプロパティdisplay:flow-rootでfloatのクリア

floatクリアには、clearfixoverflow:hiddenが使われてきましたが、もっとも簡単にクリアできる
display:flow-rootプロパティが追加されています(一部ブラウザには対応していません)。次のサンプルは、黄緑色背景の親要素の中にfloat:leftを指定した青いboxの子要素が5ずつ入っています。サンプル(1)は、floatのクリア無しで、子要素が親要素の外に飛び出しています。
サンプル(2)は、overflow:hiddenを、サンプル(3)は、display:flow-rootをそれぞれ親要素に指定しています。2019年3月現在、InternetExplorer11やEdgeは非対応です。
サンプル(1)floatのクリア無し
 
 
 
 
 

サンプル(2) "overflow:hidden"
 
 
 
 
 
サンプル(3) "display:flow-root"
 
 
 
 
 

htmlソース

<div class="parent2">
	<span> サンプル(1)floatのクリア無し</span><br>
	<div class="child"> </div>
	<div class="child"> </div>
	<div class="child"> </div>
	<div class="child"> </div>
	<div class="child"> </div>
</div>
<br style="clear:both;">
<div class="parent2" style="overflow: hidden;">
	<span>サンプル(2)<code> "overflow:hidden"</code></span><br>
	<div class="child"> </div>
	<div class="child"> </div>
	<div class="child"> </div>
	<div class="child"> </div>
	<div class="child"> </div>
</div>
<div class="parent2" style="display: flow-root;">
	<span>サンプル(3)<code> "display:flow-root"</code></span><br>
	<div class="child"> </div>
	<div class="child"> </div>
	<div class="child"> </div>
	<div class="child"> </div>
	<div class="child"> </div>
</div>

 

 

▲このページのトップへ

 


戻るボタン