Нарисуйте динамические линии с помощью HTML и CSS

Можно ли с помощью html и css нарисовать следующее?

Нарисуйте динамические линии с помощью HTML и CSSНарисуйте динамические линии с помощью HTML и CSS

Меня интересует только часть строк. Здесь - это то, что я пробовал до сих пор.

html:

<div class = "outer">
  <div class = "inner">
    <div class = "topPart">
      TOP
    </div>
    <div class = "middlePart">
      <div class = "program selectedProgram">
        <div class = "programName">
          foo program
        </div>

        <div class = "modulesDiv">
          <div class = "module">
           <div class = "moduleName">
             foo module foo module foo module foo module foo module
           </div>
          </div>
          <div class = "module">
           <div class = "moduleName">
             foo short name
           </div>
          </div>
          <div class = "module">
           <div class = "moduleName">
             foo module foo module foo module foo module foo module
           </div>
          </div>
        </div>
      </div>
    </div>
    <div class = "bottomPart">
      BOTTOM
    </div>
  </div>
</div>

css:

.outer {
  background-color: red;
  position: relative;
  margin: 0 auto;
  top: 40px;
  width: 200px;
  height: 2000px;
  background-image: url('https://mdn.mozillademos.org/files/7693/catfront.png');
  background-repeat: no-repeat;
  background-size: cover;
}

.inner {
  position: -webkit-sticky;
  position: sticky;
  top: 0;
  background-color: cyan;
  width: 200px;
  height: 400px/* 100vh */
  ;
}

.topPart {
  position: absolute;
  height: 10%;
  width: 100%;
  top: 0;
  background-color: pink;
  text-align: center;
}

.middlePart {
  position: absolute;
  height: 80%;
  width: 100%;
  top: 10%;
  background-color: yellow;
  text-align: center;
}

.bottomPart {
  position: absolute;
  height: 10%;
  width: 100%;
  top: 90%;
  background-color: #66aa11;
  text-align: center;
}

.program {
  height: auto;
  text-align: left;
  width: 100%;
  cursor: pointer;
  padding-top: 5%;
  padding-bottom: 5%;
  padding-left: 5%;
  padding-right: 5%;
  word-wrap: break-word;
  border-bottom: 1px solid #afadad;
  position: relative;
}

.program.selectedProgram {
  border-left: 4px solid #289efd;
}

.program .programName {
  display: inline;
  font-size: 110%;
  color: #484646;
  padding-left: 5%;
  vertical-align: middle;
}

.selectedProgram.program .programName {
  font-weight: bold;
  color: #289efd;
}

.program:hover .programName {
  color: #289efd;
}

.program .programName {
  white-space: pre-wrap;
  white-space: -moz-pre-wrap !important;
  white-space: -webkit-pre-wrap;
  white-space: -pre-wrap;
  white-space: -o-pre-wrap;
  white-space: pre-wrap;
  word-wrap: break-word;
  word-break: break-all;
  white-space: normal;
}

.modulesDiv {
  height: auto;
  width: 100%;
  position: relative;
  padding-left: 5%;
  padding-top: 5%;
  display: none;
}

.selectedProgram .modulesDiv {
  display: block;
}

.module {
  height: auto;
  text-align: left;
  width: 100%;
  cursor: pointer;
  padding-top: 5%;
  padding-bottom: 5%;
  padding-left: 5%;
  padding-right: 5%;
  word-wrap: break-word;
  position: relative;
}

.program .moduleName {
  display: inline;
  font-size: 110%;
  color: #484646;
  padding-left: 5%;
  vertical-align: middle;
}

.selectedModule.module .moduleName {
  font-weight: bold;
  color: #289efd;
}

.module:hover .moduleName {
  color: #289efd;
}

Здесь я столкнулся с двумя проблемами.

  1. Я не знаю, как нарисовать произвольно расположенную линию, используя только html и css.
  2. Я не могу заранее угадать, какую высоту займет каждый модуль, и, следовательно, не могу сделать вывод в коде, когда мне придется рисовать горизонтальный выступ к имени модуля.

Я называю основное имя, выделенное жирным шрифтом на снимке экрана, именем программы, а имена с отступом слева - именами модулей.

Надеюсь, здесь кто-то сможет хоть чем-то помочь.

Улучшение производительности загрузки с помощью 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 страниц, которые помогут...
1
0
965
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не собираюсь вдаваться в подробности, но вы можете использовать хорошо организованную структуру в сочетании с размером background, чтобы создать желаемый эффект. Я использую однопиксельное фоновое изображение SVG, которое можно растянуть с помощью background-size для создания желаемого вида. Это также не приносит в жертву фактической семантике:

ul {
  padding: 0;
  margin: 0;
  list-style: none;
  padding-left: 5px;
  background: url( "data:image/svg+xml;charset=utf8,<svg width='100%' height='100%' viewBox='0 0 1 1' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xml:space='preserve' preserveAspectRatio='none'><rect x='0' y='0' width='1' height='1' fill='gray' stroke='none' /></svg>" );
  background-size: 1px calc(100% - .5em);
  background-position: top 0 left 5px;
  background-repeat: no-repeat;
}

li {
  padding: 0;
  padding-left: 10px;
  background: url( "data:image/svg+xml;charset=utf8,<svg width='100%' height='100%' viewBox='0 0 1 1' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xml:space='preserve' preserveAspectRatio='none'><rect x='0' y='0' width='1' height='1' fill='gray' stroke='none' /></svg>" );
  background-size: 8px 1px;
  background-position: top .5em left 0;
  background-repeat: no-repeat;
}
<h1>List</h1>
<ul>
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Lipsum Dolor</li>
  <li>
    Sit Amet:
    <ul>
      <li>Dolor</li>
      <li>Lorem</li>
      <li>Ipsum</li>
      <li>Datia</li>
    </ul>
  </li>
  <li>Other</li>
</ul>

Пойдя немного дальше, чтобы последний элемент не растягивался как сумасшедший, нам придется использовать несколько определений background, поэтому его нельзя сделать совместимым с некоторыми старыми браузерами, но он работает независимо:

ul, h1 {
  padding: 0;
  margin: 0;
  list-style: none;
}

h1 {
  font-size: 1rem;
  color: gray;
  border-bottom: 1px solid gray;
}


li {
  padding: 0;
  padding-left: 13px;
  background: url( "data:image/svg+xml;charset=utf8,<svg width='100%' height='100%' viewBox='0 0 1 1' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xml:space='preserve' preserveAspectRatio='none'><rect x='0' y='0' width='1' height='1' fill='gray' stroke='none' /></svg>" ), url( "data:image/svg+xml;charset=utf8,<svg width='100%' height='100%' viewBox='0 0 1 1' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xml:space='preserve' preserveAspectRatio='none'><rect x='0' y='0' width='1' height='1' fill='gray' stroke='none' /></svg>" );
  background-size: 8px 1px, 1px 100%;
  background-position: top .5em left 5px, top 0 left 5px;
  background-repeat: no-repeat, no-repeat;
}

li:last-of-type {
  background-size: 8px 1px, 1px .5em;
}
<h1>List</h1>
<ul>
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Lipsum Dolor</li>
  <li>
    Sit Amet:
    <ul>
      <li>Dolor</li>
      <li>Lorem</li>
      <li>Ipsum</li>
      <li>Datia</li>
    </ul>
  </li>
</ul>

<h1>'Nother List</h1>
<ul>
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Lipsum Dolor</li>
  <li>
    Sit Amet:
    <ul>
      <li>Dolor</li>
      <li>Lorem</li>
      <li>Ipsum</li>
      <li>Datia</li>
    </ul>
  </li>
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Lipsum Dolor<br />Sit Amet Nanaba</li>
</ul>

Как бы можно было решить проблему, если последний li занимает более одной строки? Например, здесь.

iloveseven 14.08.2018 11:57

@iloveseven Да, но все становится немного сложнее. В этом случае все ваши отступы должны перейти к <li>, и вам понадобятся два фоновых изображения. Позвольте мне показать вам небольшой пример.

somethinghere 14.08.2018 12:34

@iloveseven Я добавил небольшой фрагмент с немного другим подходом - я думаю, что этот даже лучше, но для него требуется поддержка множественного фона (что есть в большинстве браузеров на данный момент!). Затем вы можете сосредоточиться на последнем дочернем элементе (или типе) и закончить список на этом. Таким образом вы можете решить многие из этих крайних случаев.

somethinghere 14.08.2018 12:41

Линии, которые вы рисуете, рисуются с помощью SVG rect. Я попытался настроить атрибуты viewBox, width и height, добавив атрибуты stroke-width и stroke = "black", но это не изменило ширину линий. Можно ли как-нибудь изменить ширину линий?

iloveseven 14.08.2018 14:17

@iloveseven Да, используя свойства background-size :) <svg> нужны просто для того, чтобы предоставить квадратный пиксель определенного цвета. Это просто прямоугольник 1x1, заполненный цветом (svg обычно меньше кода, чем использование закодированного изображения base64)

somethinghere 14.08.2018 14:23

Ой. Этот трюк с background-size просто потрясающий. Спасибо большое. смешной

iloveseven 14.08.2018 14:39

Мне правда очень жаль, что я был таким дерзким. Но не могли бы вы помочь настроить рисование линий таким образом, чтобы он не рисовал линии ниже выбранного li? Прикреплю изображение в вопросе.

iloveseven 14.08.2018 18:34

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