Создавайте ведущие точки в CSS - PullRequest
34 голосов
/ 24 марта 2010

Как можно сделать начальные точки в оглавлении с помощью CSS?

Пример:

Link.............Chapter 1
Link.............Chapter 2
Link.............Chapter 3

Ответы [ 14 ]

44 голосов
/ 15 ноября 2011

Это лучшее решение только для CSS, которое я нашел для этого вопроса о точечных лидерах:

http://www.w3.org/Style/Examples/007/leaders.en.html

HTML

<ul class="leaders">
 <li><span>Salmon Ravioli</span> <span>7.95</span></li>
 <li><span>Fried Calamari</span> <span>8.95</span></li>
 <li><span>Almond Prawn Cocktail</span> <span>7.95</span></li>
 <li><span>Bruschetta</span> <span>5.25</span></li>
 <li><span>Margherita Pizza</span> <span>10.95</span></li>
</ul>

CSS2 / CSS3

ul.leaders {
max-width: 40em;
padding: 0;
overflow-x: hidden;
list-style: none
}

ul.leaders li:before {
float: left;
width: 0;
white-space: nowrap;
content:
". . . . . . . . . . . . . . . . . . . . "
". . . . . . . . . . . . . . . . . . . . "
". . . . . . . . . . . . . . . . . . . . "
". . . . . . . . . . . . . . . . . . . . "
}

ul.leaders span:first-child {
padding-right: 0.33em;
background: white
}

ul.leaders span + span {
float: right;
padding-left: 0.33em;
background: white
}

Мы создаем точечные лидеры с псевдоэлементом «: before», прикрепленным к элементы LI. Псевдоэлемент заполняет всю ширину списка пункт с точками и SPAN ставятся сверху. Белый фон на SPAN скрывает точки за ними и «переполнение: скрыто» на UL гарантирует, что точки не выходят за пределы списка.

Я использовал произвольные 80 точек, которых достаточно, чтобы заполнить около 38em, следовательно максимальная ширина в списке.

22 голосов
/ 24 марта 2010

взято из catchmyfame :

"Как это сделать? В основном, метка поля заключена в элемент div, который имеет небольшое изображение точки, неоднократно примененной в направлении x в качестве фона. Это само по себе приведет к тому, что точки будут течь под текстом, что сводит на нет это эффект, сам текст затем обернут в промежуток, где цвет фона установлен так, чтобы соответствовать цвету фона содержащего элемента. Вот CSS:

.dots { 
  background: url('dot.gif') repeat-x bottom; 
}
.field {
  background-color: #FFFFFF;
} 

Чтобы применить это к форме примера, вы просто должны использовать ее как:

<td>
    <div class="dots">
        <span class="field">LastName</span>
    </div>
</td>

изображение для точки

10 голосов
/ 03 декабря 2014

Можно объединить классическую технику "лидеров", описанную в w3c Благодаря @ nootrope с радостью flexbox.

Вот альтернативный подход, для современных браузеров и IE 10 + .

Демо: http://jsfiddle.net/tbm62z6L/2/

.article {
   display: flex;
 }
 .article .item,
 .article .price {
   flex: 1 0 auto;
 }
 .article .dots {
   flex: 0 1 auto;
   /*Allows too long content to be hidden.*/
   overflow: hidden;
 }
 .dots::before {
   display: block;
   white-space: nowrap;
   overflow: hidden;
   text-overflow: clip;
   content: 
     ". . . . . . . . . . . . . . . . . . . . "
     ". . . . . . . . . . . . . . . . . . . . "
     ". . . . . . . . . . . . . . . . . . . . "
     ". . . . . . . . . . . . . . . . . . . . "
 }
<div class="article">
  <span class="item">sandwichtoaster</span>
  <span class="dots"></span>
  <span class="price">$35</span>
</div>

Это очень гибкий способ отображения начальных точек с использованием текущего шрифта и без необходимости использования изображений.

9 голосов
/ 22 января 2015

Построение на @ Nico O ‘s ответ , нет необходимости в несемантическом элементе .dots.

.toc li {
  display: flex;
}

.toc li .title {
  order: 1;
}

.toc li .chapter {
  order: 3;
}

.toc li::after {
  content: "";
  border-bottom: 1px dotted;
  flex-grow: 1;
  order: 2;
}
<ul class="toc">
  <li>
    <span class="title">Foo</span>
    <span class="chapter">Chapter 1</span>
  </li>
  <li>
    <span class="title">Bar</span>
    <span class="chapter">Chapter 2</span>
  </li>
</ul>

Мы пользуемся тем фактом, что мы можем упорядочить дочерние элементы нашего гибкого контейнера так, как хотим, и тем фактом, что псевдоэлемент ведет себя как дочерний элемент того, где он был определен. Ключ - правило flex-grow. flex-grow из 1, в то время как для всех остальных братьев и сестер по умолчанию 0 увеличится до оставшегося пространства, даже если у него нет содержимого.

Это будет работать до тех пор, пока элементы .title и .chapter вместе не заполнят все пространство. Тогда псевдоэлемент ::after будет иметь width, равный 0, и пунктирная граница не будет отображаться, даже если .title и .chapter будут переносить их содержимое. Поэтому, если вы уверены, что этого не произойдет, и ваши зрители используют современных браузеров , это может быть оптимальным решением.

Если вы хотите более разреженные точки, вы можете использовать радиальный градиент в качестве фона для псевдоэлемента вместо border-bottom:

.toc li::after {
  background-image: radial-gradient(circle, currentcolor 1px, transparent 1px);
  background-position-y: bottom;
  background-size: 1ex 3px;
  background-repeat: repeat-x;
  height: 1em;
}
7 голосов
/ 09 августа 2014

Я собрал несколько примеров, чтобы создать, как мне кажется, довольно хорошее решение. Не полагается на цвет фона, чтобы скрыть точки лидера. Работает и на IE8.

http://jsfiddle.net/westy808/g0d8x8c5/1/

<ul class="leaders">
    <li><span>Item</span><span>12.234</span></li>
    <li><span>Another Item</span><span>1,000.25</span></li>
</ul>

ul.leaders li { clear: both; }

ul.leaders li span:first-child {
    float: left;
    padding: 0 .4em 0 0;
    margin: 0;
}
ul.leaders li span + span {
    float: right;
    padding: 0 0 0 .4em;
    margin: 0;
}

ul.leaders li:after {
    content: "";
    display: block;
    overflow: hidden;
    height: 1em;
    border-bottom: 1px dotted;
}
5 голосов
/ 09 марта 2017

Многие из этих CSS-хаков не работают с фоном или с трудом. Вы можете использовать современную гибкость и фоновый градиент для пунктирной линии (она выглядит более отточенной, чем таблица точечной). Как это:

.contacts-row {
    display: flex;
    width: 500px;
}

.dots {
    display: block;
    background: radial-gradient(circle, rgba(0,0,0,.62) 1px, transparent 1px) repeat-x;
    background-size: 20px 28px;
    flex-grow: 10;
}
<div class="contacts-row">
    <b>E-mail: </b>
    <span class="dots"></span>
    <span class="text">test@email</span>
</div>

<div class="contacts-row">
     <b>Phone: </b>
     <span class="dots"></span>
     <span class="text">test-phone</span>
</div>
3 голосов
/ 15 июля 2016

Вот мой подход, использующий элемент с пунктирным бордюром вместо изображения или содержимого, согните его и поместите между «Ссылкой» и «Главой».

.toc {
  width: 500px;
}

.row {
  flex-direction: row;
  display: flex;
}

.flex-dots {
  border-top-style: dotted;
  border-top-width: 1px;
  max-height: 1px;
  margin-top: 0.5em;
}

.flex-dots-vcenter {
  flex-direction: row;
  display: flex;
}

[flex] {
  flex: 1;
}
    <div class="toc">
      <div class="row">
        <span class="field1">Link 1</span>
        <div class="flex-dots-vcenter" flex><span class="flex-dots" flex></span></div>
        <span class="field2">Chapter 1</span>
      </div>
      <div class="row">
        <span class="field1">Link 20</span>
        <div class="flex-dots-vcenter" flex><span class="flex-dots" flex></span></div>
        <span class="field2">Chapter 20</span>
      </div>
      <div class="row">
        <span class="field1">Link 300</span>
        <div class="flex-dots-vcenter" flex><span class="flex-dots" flex></span></div>
        <span class="field2">Chapter 300</span>
      </div>
    </div>
3 голосов
/ 03 октября 2012

На самом деле W3C имеет рабочий проект, описывающий функциональность, которую вы ищете

http://www.w3.org/TR/css3-gcpm/#leaders

Еще в 2005 году A List Apart опубликовал статью для него. (http://www.alistapart.com/articles/boom) К сожалению, это не работает для меня, и я не нашел намного больше. Но, возможно, стоит помнить, что однажды в ближайшем будущем будет возможно только с CSS:)

1 голос
/ 13 мая 2019

Мне нужно было, чтобы мой клиент мог легко редактировать прайс-лист на своем сайте, поэтому я создал необработанный контент в виде простой HTML-таблицы с двумя столбцами. Это супер легко редактировать в любой CMS

Затем, основываясь на предыдущих ответах и ​​с целью иметь возможность обрабатывать данные, отформатированные в виде таблицы , я использовал следующее. Я попробовал подход пунктирной нижней границы, но это довольно уродливо. Поэтому я выбрал подход «точки как контент».

.toc table {
    width: unset;
	margin: 0 auto;
	margin-top: 1ex;
	display: block;
}
.toc  table tbody {
	display: block;
}
.toc  table tr {
	display: flex;
}
.toc  table tr td {
	width: auto !important;
}
.toc  table tr td:first-child {
	order: 1;
	white-space: nowrap;
}
.toc  table tr td:last-child {
	order: 3;
	white-space: nowrap;
}  
.toc  table tr:after {
	flex-grow: 1;
	order: 2;
	content: ". . . . . . . . . . . . . . . . . . . . " 
	". . . . . . . . . . . . . . . . . . . . " 
	". . . . . . . . . . . . . . . . . . . . " 
	". . . . . . . . . . . . . . . . . . . . ";
	white-space: nowrap;
	overflow: hidden;
	text-overflow: clip;
}
<div class="toc">
    <table>
        <tbody>
            <tr>
                <td>
                    Product 1
                </td>
                <td>$123,456</td>
            </tr>
            <tr>
                <td>Product 2</td>
                <td>$12,345</td>
            </tr>
        </tbody>
    </table>
</div>
1 голос
/ 12 марта 2019

Отличный вопрос и отличные ответы.

Я обнаружил, что многие из этих рабочих ответов не работают, когда для элементов li требуются чередующиеся цвета фона. Вот мой вклад, который улучшает это.

Sample list with alternating background items

Это основано на отличном решении nootrope на этой странице. Их класс "лидеров" может быть добавлен заново при необходимости.

ul{
    padding: 0;
    overflow-x: hidden;
    margin:0 0 24pt;
    list-style: none;
    list-style-type:none;
}
ul li{
    background:white;
}
ul li:nth-child(odd){
    background:lightgrey;
}
ul li:before {
    float:left;
    width:0;
    white-space:nowrap;
    content:
 ". . . . . . . . . . . . . . . . . . . . "
 ". . . . . . . . . . . . . . . . . . . . "
 ". . . . . . . . . . . . . . . . . . . . "
 ". . . . . . . . . . . . . . . . . . . . "
 ". . . . . . . . . . . . . . . . . . . . ";
}
ul span:first-child {
    padding: 0 0.33em 0 0.8em;
    background:inherit;
}
ul span + span{
    float: right;
    padding: 0 0.8em 0 0.33em;
    background:inherit;
}

Основная часть, которая делает эту работу - это осторожные padding и background:inherit; в разделах ul span.

Также обратите внимание, что добавление большего количества точек-заполнителей в ul li:before позволяет растягиваться до более широких эластичных макетов.

Надеюсь, что это вам поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...