Как создать css-макет «линии метро» без названия станции или линии

У меня есть множество линий метро и станций. Что я хочу сделать, так это отобразить line names on the up center of line и station names right below the station, а линии и станции связаны. Важно то, что line names shouldn't exceed line, and shouldn't cover other line names и station names should also not cover other station names, независимо от того, насколько длинными являются названия станций или названий линий. Теперь проблема если название станции слишком длинное, оно закроет другие названия станций.

.main{
  margin-top: 32px;
  margin-left: 32px;
  display: flex;
  flex-direction: row;
  justify-content: left;
  align-items: center;
}
.line{
  height: 2px;
  min-width: 32px;
  border-bottom: 2px solid;
  box-sizing: border-box;
  display: flex;
  justify-content: center;
  align-items: center;
}
 .line-name{
   margin: -20px 16px 0;
 }
.station{
  height: 8px;
  width: 8px;
  border-radius: 50%;
  border: 1px solid #000;
  display: flex;
  justify-content: center;
  align-items: center;
}
.station-name {
  margin: 0 16px -20px;
  white-space: nowrap;
}
<div class = "main">
 <div class = "station">
  <span class = "station-name">first station</span>
 </div>
 <div class = "line">
  <span class = "line-name">short line</span>
 </div>
 <div class = "station">
  <span class = "station-name">loooooong station name</span>
 </div>
 <div class = "line">
  <span class = "line-name">very very very very loooooooong line name</span>
 </div>
 <div class = "station">
  <span class = "station-name">this on name</span>
 </div>
</div>

Целевой эффект здесь текущий код здесь: https://jsfiddle.net/ueq21afw/, и название станции перекрывают друг друга. Может ли кто-нибудь помочь мне в этом? Благодарю.

Пожалуйста, поделитесь любым скриншотом для требуемого стиля и структуры. Спасибо

Hassan Siddiqui 10.04.2019 08:36

Добавлено фото @HassanSiddiqui

toffrey 10.04.2019 08:45

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

toffrey 10.05.2019 04:35
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
3
282
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я пробовал структурировать html-код по-другому. https://jsbin.com/gapecapopo/edit?html, css, вывод

.main {
  display: flex;
}

.column {
  /* flex: 1; */
  background-color: #EEE;
  flex-grow: 1;
}

.line {
  border-bottom: 2px solid #000;
}
.line::before {
  content: 'o';
  position:relative;
  bottom: -8px;
}

.station-name {
  text-align: center;
}
<div class = "main">
  	  <div class = "column">
  	    <div class = "station-name">This station aaaa have very long name</div>
        <div class = "line"></div>
        <div class = "line-name">line a</div>
  	  </div>
      <div class = "column">
  	    <div class = "station-name">station b short</div>
        <div class = "line"></div>
        <div class = "line-name">line b</div>
  	  </div>
      <div class = "column">
  	    <div class = "station-name">this station cccc have very long nameee</div>
        <div class = "line"></div>
        <div class = "line-name">line c</div>
  	  </div>
  	</div>

спасибо, но когда название станции очень длинное, очередь тоже должна расти

toffrey 10.04.2019 09:49

@user2306775 user2306775, кажется, тоже хорошо растет.

cjmling 10.04.2019 10:39

Я попробовал довольно длинное название станции, оно не сработало. И я добавил свой код, который также имеет проблему, когда имя станции становится очень длинным: jsfiddle.net/ueq21afw

toffrey 10.04.2019 10:57

Кажется, я не совсем ясно выразился, название линии должно располагаться вверху посередине строки, а название станции должно располагаться прямо под станцией, и при увеличении названия линии оно не должно превышать ширину строки, а когда название станции увеличивается, оно не должно перекрывать другие названия станций. В вашем примере, когда имена под точками становятся слишком длинными, кажется, что это работает не совсем хорошо.

toffrey 10.04.2019 11:58

Я просто обновляю ваш код несколькими изменениями CSS и структура. Попробуйте это, я надеюсь, что это поможет вам. Спасибо

ul {
  display: table;
  margin: 50px 0 0;
  padding: 0;
  list-style: none;
  height: 40px;
}

li {
  display: table-cell;
  vertical-align: top;
  padding: 0 5px;
  margin: 5px 0;
  position:relative;
  white-space: nowrap;
}

li:after {
  background-color: #000;
  content: '';
  height: 1px;
  position: absolute;
  left: 0;
  top: 50%;
  width: 100%;
}

li.station {
  vertical-align: bottom;
}

li.station:before {
  background-color: #fff;
  border-radius: 50%;
  border: 1px solid black;
  content: '';
  height: 5px;
  width: 5px;
  position: absolute;
  top: calc(50% - 3px);  
  left: calc(50% - 3px);
  z-index: 1;
}

li.station:last-child:after {
  width: 50%;
}
<ul>
  <li>Line Text 1</li>
  <li class = "station">Station Name 1</li>
  <li>Line Text 2</li>
  <li class = "station">Station Name 2</li>
  <li>Line Text 3</li>
  <li class = "station">Station Name 3Station Name 3Station Name 3Station Name 3Station Name 3Station Name 3</li>
</ul>

спасибо за ваш ответ, но в вашем коде, когда имя станции становится довольно длинным, оно превращается в несколько строк, что нарушает всю структуру, есть ли какое-либо предлагаемое решение?

toffrey 11.04.2019 06:49

@yuant Я только что обновил приведенный выше фрагмент кода. Теперь, если текст станции/линии становится слишком длинным, он останется на одной строке. Спасибо

Hassan Siddiqui 11.04.2019 09:28

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

toffrey 10.05.2019 04:34
Ответ принят как подходящий

Наконец, я решил это с помощью холста.

  1. Сначала я создал холст.
  2. Затем я вставляю все тексты (например: 今日の天気 Station) в холст и сохраняю их в массиве.
  3. Тем временем я получил длины всех вновь вставленных текстов. Делая все вышеперечисленное, я могу рассчитать, в какую позицию я должен поместить текст, круги и линии. И я нарисовал все элементы.

Другие вопросы по теме