中央に単語がある水平線のCSSテクニック


286

途中にテキストを入れて横罫を作ろうとしています。例えば:

-----------------------------------私のタイトルはこちら------------ -----------------

CSSでそれを行う方法はありますか?すべての「-」ダッシュがないことは明らかです。


これはformタグの内側用ですか?
thirtydot 2011年

その場合、私の回答への返答で30ドットが指摘したように、fieldsetおよびlegend要素を検索することをお勧めします
ステファンミュラー


透明な背景での解決策については、透明な背景中央揃えされたテキストの前後の線を
web-tiki

回答:


404

これは大体私がやる方法です:線はborder-bottom包含にa を設定h2h2、より小さいを与えることで作成されますline-height。次に、テキストは、span背景が透明でない入れ子にされます。

h2 {
   width: 100%; 
   text-align: center; 
   border-bottom: 1px solid #000; 
   line-height: 0.1em;
   margin: 10px 0 20px; 
} 

h2 span { 
    background:#fff; 
    padding:0 10px; 
}
<h2><span>THIS IS A TEST</span></h2>
<p>this is some content other</p>

私はChromeでのみテストしましたが、他のブラウザで動作しないはずはありません。

JSFiddle:http ://jsfiddle.net/7jGHS/


3
これが私のお気に入りのソリューションです。OSXでも動作しますが、他の一部では動作しません。このソリューションを使用する場合、スパンの背景をページの背景と同じ色に設定することを忘れないでください。背景が白ではない場合、私が何を意味するかは特に明白です。;)
DrLazer

1
これを全体の約4分の1にする方法はありますか?
Troy Cosentino 2013年

1
「text-align:left; text-indent:40px;」を使用して、左からインデントされたテキストを取得します h2スタイルで。
Matt__C 2013年

14
テキストの背景色を白に固定するため、これは柔軟ではありません。
Chao

2
@NateBarbettiniあなたがこれをやり直そうとしている行とテキストがその背後にある他のもののための透明な背景を持つ必要がない限り。
コバーン

265

さまざまな解決策を試した後、異なるテキスト幅、可能な背景、および追加のマークアップを追加せずに有効なものを用意しました。

h1 {
  overflow: hidden;
  text-align: center;
}

h1:before,
h1:after {
  background-color: #000;
  content: "";
  display: inline-block;
  height: 1px;
  position: relative;
  vertical-align: middle;
  width: 50%;
}

h1:before {
  right: 0.5em;
  margin-left: -50%;
}

h1:after {
  left: 0.5em;
  margin-right: -50%;
}
<h1>Heading</h1>
<h1>This is a longer heading</h1>

IE8、IE9、Firefox、Chromeでテストしました。ここで確認できますhttp://jsfiddle.net/Puigcerber/vLwDf/1/


2
私もこれが一番好きです。テキストが中央揃えではなく左からインデントされるスタイルを取得するには、次の変更を使用し h1 { ます。`text-align:left; `text-indent:40px; `}
Matt__C

9
これは本当に良い解決策です。特に、どの背景でも機能し、見出し要素に幅を設定する必要がないためです。
ルーク

2
これは素晴らしい。テキストを左揃えにし、:after要素をブロックの幅にするためにコードを少し調整しました。私は興味があります:正確には何の役割margin-right: -50%ですか?コードをいじくり回していたときに、そのプロパティがないと、装飾が別の行に壊れてしまいます。また:after、100%の幅が割り当てられている場合でも、幅を合わせるには50%の負のマージン右が必要です。どうして?
BeetleTheNeato 2013年

私が理解しているように、両側に負のマージンを追加すると、要素が両方向に引っ張られるため、中央に配置されます。
Puigcerber 2013

2
このソリューションで私が気に入っている点の1つは、背景の色がわからない状況でも機能することです。これまでのところ、この問題に対する最善の解決策は簡単です。
JoeMoe1984

54

これはもっと複雑ですが、IE <8以外のすべてで機能します

<div><span>text TEXT</span></div>

div {
    text-align: center;
    position: relative;
}
span {
    display: inline-block;    
}
span:before,
span:after {
    border-top: 1px solid black;
    display: block;
    height: 1px;
    content: " ";
    width: 40%;
    position: absolute;
    left: 0;
    top: 1.2em;
}
span:after {
   right: 0;  
   left: auto; 
}

:before要素と:after要素は絶対的に配置されているため、1つを左に、1つを右にプルできます。また、幅(この場合は40%)は内部のテキストの幅に大きく依存します。そのための解決策を考える必要があります。少なくともは、top: 1.2emフォントサイズが異なっていても、行がテキストの中央に多かれ少なかれ留まるようにします。

それでもうまくいくようです:http : //jsfiddle.net/tUGrf/3/


3
これらは賢いですが、OPがformタグ内でこれを望まないことを望みます。もしそうなら、あなたが知っていると思いますが、彼は単純にfieldsetandを使用することができますlegend
thirtydot 2011年

1
ええ、あなたはそれについて正しいです。これが機能しない場合でも、とにかくそれのために行くかもしれません..意味的に正しいわけではありませんが、このimoのようなもののためにJavaScriptに頼る必要があるよりはましです。
ステファンミュラー

8
画面が常駐し
Xavier John

ええ@ xavier-john、それが私の答えです;)
Puigcerber 2014年

43

最短かつ最良の方法:

span:after,
span:before{
    content:"\00a0\00a0\00a0\00a0\00a0";
    text-decoration:line-through;
}
<span> your text </span>


4
削除したくない場合を除いて、コードが何をするのかについての説明を追加する必要があります。
inf3rno 2014年

私の場合、ラインは少し太いように見えたので、別のフォントファミリを割り当てることでハッキングしましたfont-family: monospace;
Mikhail Vasin 2017

38

これがFlexベースのソリューションです。

中央に水平線が横向きの見出し

h1 {
  display: flex;
  flex-direction: row;
}
h1:before, h1:after{
  content: "";
  flex: 1 1;
  border-bottom: 1px solid #000;
  margin: auto;
}
h1:before {
  margin-right: 10px
}
h1:after {
  margin-left: 10px
}
<h1>Today</h1>

JSFiddle:https ://jsfiddle.net/yoshiokatsuneo/3h1fmj29/


パディングを取得する方法?
Sylar

すばやく汚い場合は、&nbsp;を追加できます。
chrismarx 2018年

1
私は別の要素を使用します:<h1><span>Today</span></h1>スパンにマージン/パディングがあります。
Jesse Buitenhuis、2018年

19

後で(nowdays)ブラウザのために、display:flexそしてd pseudo-elements が簡単に描画することができます。border-style、メイクアップにbox-shadowbackground役立ちます。 以下のデモ

h1 {margin-top:50px;
  display:flex;
  background:linear-gradient(to left,gray,lightgray,white,yellow,turquoise);;
}
h1:before, h1:after {
  color:white;
  content:'';
  flex:1;
  border-bottom:groove 2px;
  margin:auto 0.25em;
  box-shadow: 0 -1px ;/* ou 0 1px si border-style:ridge */
}
<h1>side lines via flex</h1>


これをありがとう、とても滑らかです!
Jimmy Obonyo Abor

背景が画像の場合に機能する、完璧で唯一のソリューション
cjohansson

12

.hr-sect {
	display: flex;
	flex-basis: 100%;
	align-items: center;
	color: rgba(0, 0, 0, 0.35);
	margin: 8px 0px;
}
.hr-sect::before,
.hr-sect::after {
	content: "";
	flex-grow: 1;
	background: rgba(0, 0, 0, 0.35);
	height: 1px;
	font-size: 0px;
	line-height: 0px;
	margin: 0px 8px;
}
<div class="hr-sect">Text</div>


9
<div><span>text TEXT</span></div>

div { 
  height: 1px; 
  border-top: 1px solid black; 
  text-align: center; 
  position: relative; 
}
span { 
  position: relative; 
  top: -.7em; 
  background: white; 
  display: inline-block; 
}

スパンにパディングを付けて、テキストと行の間のスペースを広げます。

例:http : //jsfiddle.net/tUGrf/


1
ただ、問題は、背景を白に設定する必要があり、透明に設定できないことです。
Marnix、2011年

その場合は、両側に1本ずつ、合計2本の線で作業する必要があります。それはきれいな方法で達成することは困難になるだろう...
シュテファン・ミュラー

これまでのところ私のお気に入りのアプローチですが、残念ながら、何らかの理由でメールクライアントでは機能しません(Gmailモバイル&ウェブ)
リードウルフ

9

私はこの単純な装飾のいくつかの解決策を探していましたが、かなりの数の解決策、奇妙なもの、JSを使用してフォントの高さを計算するもの、bla、bla、blaを見つけたもの、そして私はこの記事の1からのコメント読んthirtydotをについて話す fieldsetlegend、私はそれがだと思いました。

私はこれらの2つの要素のスタイルをオーバーライドしています。それらのW3C標準をコピーして、.middle-line-textクラス(または呼び出したいもの)に含めることができると思いますが、これは私がやったことです:

<fieldset class="featured-header">
    <legend>Your text goes here</legend>
</fieldset>

<style>
.featured-header{
    border-bottom: none;
    border-left: none;
    border-right: none;
    text-align: center;
 }

.featured-header legend{
    -webkit-padding-start: 8px; /* It sets the whitespace between the line and the text */
    -webkit-padding-end: 8px; 
    background: transparent; /** It's cool because you don't need to fill your bg-color as you would need to in some of the other examples that you can find (: */
    font-weight: normal; /* I preffer the text to be regular instead of bold  */
    color: YOU_CHOOSE;
}   

</style>

ここにフィドルがあります:http : //jsfiddle.net/legnaleama/3t7wjpa2/

私はボーダースタイルを試しましたが、Androidでも動作します;)(kitkat 4.XXでテスト済み)

編集:

良いオプションでもあるBekerov Arturのアイデアに従って、.pngのbase64画像を変更して.SVGでストロークを作成し、他のソフトウェアを使用せずに任意の解像度でレンダリングし、要素の色を変更できるようにしました:)

/* SVG solution based on Bekerov Artur */
/* Flexible solution, scalable, adaptable and also color customizable*/
.stroke {
background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' width='1px' height='1px' viewBox='0 0 1 1' enable-background='new 0 0 1 1' fill='%23ff6600' xml:space='preserve'><rect width='1' height='1'/></svg>");
background-repeat: repeat-x;
background-position: left;
text-align: center;
}
.stroke h3 {
background-color: #ffffff;
margin: 0 auto;
padding:0 10px;
display: inline-block;
font-size: 66px;
}

5

IE8以降のソリューション...

注目に値する問題:

を使用background-colorして境界線をマスクすることは、最善の解決策ではない場合があります。複雑な(または不明な)背景色(または画像)がある場合、最終的にマスキングは失敗します。また、テキストのサイズを変更すると、白い背景色(または設定したもの)によって、上の行(または下の行)のテキストが隠れてしまうことに気付くでしょう。

また、コンテンツの幅が変化するレスポンシブサイトにスタイルを実装することは非常に柔軟性がなく、ほとんど不可能になるため、セクションの幅も「推測」したくありません。

解決:

JSFiddleを表示

で境界を「マスク」する代わりにbackground-colordisplayプロパティを使用します。

HTML

<div class="group">
    <div class="item line"></div>
    <div class="item text">This is a test</div>
    <div class="item line"></div>
</div>

CSS

.group { display: table; width: 100%; }
.item { display: table-cell; }
.text { white-space: nowrap; width: 1%; padding: 0 10px; }
.line { border-bottom: 1px solid #000; position: relative; top: -.5em; }

要素にfont-sizeプロパティを配置して、テキストのサイズを変更します.group

制限:

  • 複数行のテキストはありません。単一行のみ。
  • HTMLマークアップはエレガントではありません
  • top.line要素のプロパティはの半分である必要がありline-heightます。あなたが持っているのであれば、line-heightのを1.5em、その後topでなければなりません-.75em。これは自動化されていないため、これは制限です。これらのスタイルを行の高さの異なる要素に適用する場合は、line-heightスタイルを再適用する必要がある場合があります。

私にとって、これらの制限は、ほとんどの実装について私の回答の冒頭で指摘した「問題」を上回っています。


クロムで動作します。セマンティックでかなりシンプルに見えます。ブートストラップで動作します。
ジェフアンセル2014年

border-collapse:を分離して.groupに追加する必要がありました。これは、設定を変えて実際に使用しているためです。よく働く。
Brian MacKay 2016

5

これにより、線の長さが固定されますが、うまく機能します。行の長さは、 '\ 00a0'(Unicodeスペース)を追加または取得することによって制御されます。

ここに画像の説明を入力してください

h1:before, h1:after {
  content:'\00a0\00a0\00a0\00a0';
  text-decoration: line-through;
  margin: auto 0.5em;
}
<h1>side lines</h1>


2

左側に固定された距離で(上記のように中央に配置されないように)表示されるように見出しを設定する方法を誰かが疑問に思っている場合は、@ Puigcerberのコードを変更してそのことを理解しました。

h1 {
  white-space: nowrap;
  overflow: hidden;
}

h1:before, 
h1:after {
  background-color: #000;
  content: "";
  display: inline-block;
  height: 1px;
  position: relative;
  vertical-align: middle;
}

h1:before {
  right: 0.3em;
  width: 50px;
}

h1:after {
  left: 0.3em;
  width: 100%;
}

ここにJSFiddleがあります。


2
h6 {
    font: 14px sans-serif;
    margin-top: 20px;
    text-align: center;
    text-transform: uppercase;
    font-weight: 900;
}

    h6.background {
        position: relative;
        z-index: 1;
        margin-top: 0%;
        width:85%;
        margin-left:6%;
    }

        h6.background span {
            background: #fff;
            padding: 0 15px;
        }

        h6.background:before {
            border-top: 2px solid #dfdfdf;
            content: "";
            margin: 0 auto; /* this centers the line to the full width specified */
            position: absolute; /* positioning must be absolute here, and relative positioning must be applied to the parent */
            top: 50%;
            left: 0;
            right: 0;
            bottom: 0;
            width: 95%;
            z-index: -1;
        }

これはあなたを助けます


行間

<h6 class = "background">​​ <span> <br>当社のサービス</ span> </ h6>これはHTMLコードです
Dominic Amal Joe F

ジョー、あなたはあなた自身の答えを編集してHTMLコードを追加することができます-それをコメントに入れるよりもはるかに良いです。また、回答に説明を追加する必要があります。
Mogsdad 2016年

申し訳ありませんが、MogsdadはHTMLコードを配置するのを忘れていたため、ここに配置しました。
ドミニクアマルジョーF

2

テーブルレイアウトを使用して、側面を動的に塗りつぶし、高さ0の絶対位置のdivを使用して動的に垂直に配置します。

ここに画像の説明を入力してください

  • ハードコードされた寸法はありません
  • 画像がありません
  • 疑似要素なし
  • 背景を尊重する
  • コントロールバーの外観

https://jsfiddle.net/eq5gz5xL/18/

真下の真ん中より少し下がテキストで最もよく見えることがわかりました。これはどこにあるかを調整できます55%(高さが高いほどバーが低くなります)。線の外観はどこにあるかを変更できますborder-bottom

HTML:

<div class="title">
  <div class="title-row">
    <div class="bar-container">
      <div class="bar"></div>
    </div>
    <div class="text">
      Title
    </div>
    <div class="bar-container">
      <div class="bar"></div>
    </div>
  </div>
</div>

CSS:

.title{
  display: table;
  width: 100%
  background: linear-gradient(to right, white, lightgray);
}
.title-row{
  display: table-row;
}
.bar-container {
  display: table-cell;
  position: relative;
  width: 50%;
}
.bar {
  position: absolute;
  width: 100%;
  top: 55%;
  border-bottom: 1px solid black;
}
.text {
  display: table-cell;
  padding-left: 5px;
  padding-right: 5px;
  font-size: 36px;
}

2

死んだ馬を倒さないために、私は解決策を探していて、ここで終わりました、そして、特に、何らかの理由で、ここで提供された解決策を私にうまく機能させることができなかったので、私自身は選択肢に満足しませんでした。(おそらく私の側のエラーが原因です...)しかし、私はflexboxで遊んでいます、そしてこれは私が自分のために働くために得たものです。

一部の設定はハードワイヤードですが、デモンストレーションのみを目的としています。このソリューションは、ほとんどすべての最新のブラウザーで機能するはずです。.flex-parentクラスの固定設定を削除/調整し、colors / text / stuffを調整するだけで、(私は)このアプローチで満足するでしょう。

HTML:

.flex-parent {
  display: flex;
  width: 300px;
  height: 20px;
  align-items: center;
}

.flex-child-edge {
  flex-grow: 2;
  height: 1px;
  background-color: #000;
  border: 1px #000 solid;
}
.flex-child-text {
  flex-basis: auto;
  flex-grow: 0;
  margin: 0px 5px 0px 5px;
  text-align: center;
}
<div class="flex-parent">
  <div class="flex-child-edge"></div>
  <div class="flex-child-text">I found this simpler!</div>
  <div class="flex-child-edge"></div>
</div>

ここにも私のソリューションを保存しました:https : //jsfiddle.net/Wellspring/wupj1y1a/1/


1

だれかが望む場合に備えて、CSSを使用したIMHOの最良のソリューションはフレックスボックスによるものです。

次に例を示します。

.kw-dvp-HorizonalButton {
    color: #0078d7;
    display:flex;
    flex-wrap:nowrap;
    align-items:center;
}
.kw-dvp-HorizonalButton:before, .kw-dvp-HorizonalButton:after {
    background-color: #0078d7;
    content: "";
    display: inline-block;
    float:left;
    height:1px;
}
.kw-dvp-HorizonalButton:before {
    order:1;
    flex-grow:1;
    margin-right:8px;
}
.kw-dvp-HorizonalButton:after {
    order: 3;
    flex-grow: 1;
    margin-left: 8px;
}
.kw-dvp-HorizonalButton * {
    order: 2;
}
    <div class="kw-dvp-HorizonalButton">
        <span>hello</span>
    </div>

これにより、行とコンテンツの間のマージンを簡単に制御できる、左右に線が引かれた完全に中央揃えのコンテンツが常に得られます。

トップコントロールの前後に線要素を作成し、コンテンツを順序2(中央に移動)として設定しながら、それらをフレックスコンテナーで順序1,3に設定します。before / aftergrowに1を指定すると、コンテンツを中央に保ちながら、最も空いているスペースを均等に消費します。

お役に立てれば!


0

よくわかりませんが、横罫線を使用して、テキストを上余白の上に移動することもできます。段落タグの固定幅と背景も必要です。これは少しハックで、すべてのブラウザで機能するかどうかはわかりません。フォントのサイズに基づいて負のマージンを設定する必要があります。クロームでも動作します。

<style>   
 p{ margin-top:-20px; background:#fff; width:20px;}
</style>

<hr><p>def</p>

0

私は提案された方法のほとんどを試しましたが、全幅、または動的コンテンツには適していませんなどのいくつかの問題で終わります。最後に、コードを変更し、完全に動作しました。このサンプルコードは、これらの線を前後に描画し、コンテンツの変更に柔軟に対応します。中央揃えも。

HTML

        <div style="text-align:center"> 
            <h1>
                <span >S</span>
            </h1> 
        </div> 

        <div style="text-align:center"> 
            <h1>
                <span >Long text</span>
            </h1> 
        </div> 

CSS

      h1 {
            display: inline-block;
            position: relative;
            text-align: center;
        }

        h1 span {
            background: #fff;
            padding: 0 10px;
            position: relative;
            z-index: 1;
        }

        h1:before {
            background: #ddd;
            content: "";
            height: 1px;
            position: absolute;
            top: 50%;
            width: calc(100% + 50px);//Support in modern browsers
            left: -25px;
        }

        h1:before {
            left: ;
        }

結果:https : //jsfiddle.net/fasilkk/vowqfnb9/


0

私にとってこの解決策は完全にうまくいきます...

HTML

<h2 class="strikethough"><span>Testing Text</span></h2>

CSS

.strikethough {
 width:100%; 
 text-align:left; 
 border-bottom: 1px solid #bcbcbc; 
 overflow: inherit;
 margin:0px 0 30px;
 font-size: 16px;
 color:#757575;
 }
.strikethough span {
 background:#fff; 
 padding:0 20px 0px 0px;
 position: relative;
 top: 10px;
}

0

Bootstrap 4を使用している人は、この方法で達成できます。HTMLコードで言及されているクラスはBootstrap 4のものです。

h1 {
    position: relative;
    flex-grow: 1;
    margin: 0;
}

h1:before {
   content: "";
   display: block;
   border-top: solid 2px blue;
   width: 100%;
   height: 1px;
   position: absolute;
   top: 50%;
   z-index: 1;
 }
 h1 span {
   background: #fff;
   left: 12%;
   padding: 0 15px;
   position: relative;
   z-index: 5;
 }

そして、このようにあなたのHTMLを書いてください

<div class="d-flex flex-row align-items-center">
  <h1><span> Title </span> </h1>
</div>

0

中央に単語がある水平線と垂直

.box{
    background-image: url("https://i.stack.imgur.com/N39wV.jpg");
    width: 350px;
    padding: 10px;
}

/*begin first box*/
.first{
    width: 300px;
    height: 100px;
    margin: 10px;
    border-width: 0 2px 0 2px;
    border-color: red;
    border-style: solid;
    position: relative;
}

.first span {
    position: absolute;
    display: flex;
    right: 0;
    left: 0;
    align-items: center;
}
.first .foo{
    top: -8px;
}
.first .bar{
    bottom: -8.5px;
}
.first span:before{
    margin-right: 15px;
}
.first span:after {
    margin-left: 15px;
}
.first span:before , .first span:after {
    content: ' ';
    height: 2px;
    background: red;
    display: block;
    width: 50%;
}


/*begin second box*/
.second{
    width: 300px;
    height: 100px;
    margin: 10px;
    border-width: 2px 0 2px 0;
    border-color: red;
    border-style: solid;
    position: relative;
}

.second span {
    position: absolute;
    top: 0;
    bottom: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
}
.second .foo{
    left: -15px;
}
.second .bar{
    right: -15.5px;
}
.second span:before{
    margin-bottom: 15px;
}
.second span:after {
    margin-top: 15px;
}
.second span:before , .second span:after {
    content: ' ';
    width: 2px;
    background: red;
    display: block;
    height: 50%;
}
<div class="box">
    <div class="first">
        <span class="foo">FOO</span>
        <span class="bar">BAR</span>
    </div>

   <br>

    <div class="second">
        <span class="foo">FOO</span>
        <span class="bar">BAR</span>
    </div>
</div>

これはhttps://stackoverflow.com/a/57279326/6569224でも回答されています


-1
  • 色のドットが1つある小さな画像1x18を作成#e0e0e0
  • 画像をbase64コードに変換しました

結果:

body
{
  background: #c0c0c0;
}

#block_with_line
{
  width: 100%;
  position: relative;
  height: 18px;
  background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAASAQMAAACgmSb/AAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAZQTFRFAAAA4ODg8vF4+wAAAAJ0Uk5TAP9bkSK1AAAAEElEQVR4nGNgQAMN6AIMDAAJpACBAQttyAAAAABJRU5ErkJggg==');
}

#block_with_line span
{
  background: #e4e4e4;
  width: 150px;
  display: block;
  margin: 0 auto;
  position: absolute;
  left: 50%;
  margin-left: -75px;
  text-align: center
}
<body>
  <div id="block_with_line">
    <span>text</span>
  </div>
</body>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.