Создать строку после текста с помощью css

Я пытаюсь сделать строку после каждого из моих тегов h2. Я не могу понять, как мне сказать ширину, потому что длина заголовков h2 отличается от h2 до h2.

Я использую метод after: для создания строк

       h2:after {
       position: absolute;
       content: "";
       height: 2px;
       background-color: #242424;
       width: 50%;
       margin-left: 15px;
       top: 50%;
       } 

Проверить код здесь: http://jsfiddle.net/s9gHf/ Как видите, линия становится слишком широкой и делает сайт слишком широким.

Ответ 1

Вы можете достичь этого с помощью дополнительного <span>:

HTML

<h2><span>Featured products</span></h2>
<h2><span>Here is a very long h2, and as you can see the line get too wide</span></h2>

CSS

h2 {
    position: relative;
}

h2 span {
    background-color: white;
    padding-right: 10px;
}

h2:after {
    content:"";
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
    height: 0.5em;
    border-top: 1px solid black;
    z-index: -1;
}

http://jsfiddle.net/myajouri/pkm5r/

Другое решение без дополнительного <span>, но для <h2> требуется overflow: hidden:

h2 {
    overflow: hidden;
}

h2:after {
    content:"";
    display: inline-block;
    height: 0.5em;
    vertical-align: bottom;
    width: 100%;
    margin-right: -100%;
    margin-left: 10px;
    border-top: 1px solid black;
}

http://jsfiddle.net/myajouri/h2JRj/

Ответ 2

с помощью flexbox:

h2 {
    display: flex;
    align-items: center;

}

h2 span {
    content:"";
    flex: 1 1 auto;
    border-top: 1px solid #000;
}

HTML:

<h2>Title <span></span></h2>

Ответ 3

Вот еще одно, на мой взгляд, еще более простое решение с использованием flex-оболочки:

HTML:

<div class="wrapper">
  <p>Text</p>
  <div class="line"></div>
</div>

CSS

.wrapper {
  display: flex;
  align-items: center;
}

.line {
  border-top: 1px solid grey;
  flex-grow: 1;
  margin: 0 10px;
}

JSFiddle

Ответ 4

Вот как я это делаю: http://jsfiddle.net/Zz7Wq/2/

Вместо фона используйте фон и использую H1 или H2 для покрытия фона. Не совсем ваш метод выше, но хорошо работает для меня.

CSS

.title-box { background: #fff url('images/bar-orange.jpg') repeat-x left; text-align: left; margin-bottom: 20px;}
.title-box h1 { color: #000; background-color: #fff; display: inline; padding: 0 50px 0 50px; }

HTML

<div class="title-box"><h1>Title can go here</h1></div>
<div class="title-box"><h1>Title can go here this one is really really long</h1></div>

Ответ 5

Это самый простой способ, который я нашел для достижения результата: просто используйте тег hr перед текстом и установите верхнюю границу для текста. Очень коротко и легко понять! jsfiddle

h2 {
  background-color: #ffffff;
  margin-top: -22px;
  width: 25%;
}

hr {
  border: 1px solid #e9a216;
}
<br>

<hr>
<h2>ABOUT US</h2>

Ответ 6

Больше нет необходимости в дополнительных обертках или элементах span. Flexbox и Grid могут легко справиться с этим.

h2 {
  display: flex;
  align-items: center;
}

h2::after {
  content: '';
  flex: 1;
  margin-left: 1rem;
  height: 1px;
  background-color: #000;
}
<h2>Heading</h2>