Можно ли с помощью 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;
}
Здесь я столкнулся с двумя проблемами.
html и css.Я называю основное имя, выделенное жирным шрифтом на снимке экрана, именем программы, а имена с отступом слева - именами модулей.
Надеюсь, здесь кто-то сможет хоть чем-то помочь.






Я не собираюсь вдаваться в подробности, но вы можете использовать хорошо организованную структуру в сочетании с размером 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>@iloveseven Да, но все становится немного сложнее. В этом случае все ваши отступы должны перейти к <li>, и вам понадобятся два фоновых изображения. Позвольте мне показать вам небольшой пример.
@iloveseven Я добавил небольшой фрагмент с немного другим подходом - я думаю, что этот даже лучше, но для него требуется поддержка множественного фона (что есть в большинстве браузеров на данный момент!). Затем вы можете сосредоточиться на последнем дочернем элементе (или типе) и закончить список на этом. Таким образом вы можете решить многие из этих крайних случаев.
Линии, которые вы рисуете, рисуются с помощью SVG rect. Я попытался настроить атрибуты viewBox, width и height, добавив атрибуты stroke-width и stroke = "black", но это не изменило ширину линий. Можно ли как-нибудь изменить ширину линий?
@iloveseven Да, используя свойства background-size :) <svg> нужны просто для того, чтобы предоставить квадратный пиксель определенного цвета. Это просто прямоугольник 1x1, заполненный цветом (svg обычно меньше кода, чем использование закодированного изображения base64)
Ой. Этот трюк с background-size просто потрясающий. Спасибо большое. смешной
Мне правда очень жаль, что я был таким дерзким. Но не могли бы вы помочь настроить рисование линий таким образом, чтобы он не рисовал линии ниже выбранного li? Прикреплю изображение в вопросе.
Как бы можно было решить проблему, если последний
liзанимает более одной строки? Например, здесь.