Использование отрицательных полей % для наложения элементов друг на друга

Пытался заставить строки отображаться сложенными и занимающими всю ширину родителя, но что-то смещает последующие строки, только первая строка (выровненная по низу) отображается правильно:

.sp-line{
  display: inline-block;
  width: 100%;
  margin-right: -100%;
  position: relative;
  z-index: 10;
  border-top: 1px dotted #000;
}
.sp_baseline{
  border-color: blue;
  vertical-align: baseline;
}
.sp_text-bottom{
  border-color: green;
  vertical-align: text-bottom;
}
.sp_bottom{
  border-color: red;
  vertical-align: bottom;
}
.sp_text-top{
  border-color: green;
  vertical-align: text-top;
}
.line{
  border: 1px solid cyan;
}

span.text {
  background-color: papayawhip;
  line-height: 1.96; 
}
<div class = "line">
  <span class = "sp-line sp_bottom"></span>
  <span class = "sp-line sp_baseline"></span>
  <span class = "sp-line sp_text-bottom"></span>
  <span class = "sp-line sp_text-top"></span>
  <span class = "text1 text">SINGLE line</span>
</div>

Пытаюсь добраться до:

Использование отрицательных полей % для наложения элементов друг на друга

Я просто пытался воссоздать строки из https://christopheraue.net/design/vertical-align. Я не вижу, чего здесь не хватает.

Привет. у вас есть образ того, что вы пытаетесь сделать?

Dejan.S 18.03.2019 18:19

Я не уверен, что понимаю вопрос, но если у вас есть высота строки, это компенсирует уменьшение% от отрицательных полей.

Cody Swann 18.03.2019 18:35

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

inabramova 18.03.2019 18:44

Строки смещены с левой стороны, потому что каждый элемент span имеет небольшую ширину и расположен слева направо в том порядке, в котором они расположены внутри div. Я думаю, что вы должны позиционировать их с помощью position: absolute;, но это ломает vertical-align...

Romen 18.03.2019 19:00

если позволите, в чем тут проблема, мне кажется, все в порядке: codepen.io/anon/pen/YgjPKz

kukkuz 18.03.2019 19:37

Я хотел, чтобы пунктирные линии выровнялись, чтобы начать с начала div

inabramova 18.03.2019 19:56

Почему бы вам не использовать что-то подобное внутри div.line?jsfiddle.net/4sn06p13

gengns 18.03.2019 21:06
Улучшение производительности загрузки с помощью 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
7
112
2

Ответы 2

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

.line {
  overflow-x:hidden;
}

.sp-line{
  display: inline-block;
  width: 2px;
  position: relative;
  z-index: 10;
}
.sp-line:before {
  content:"";
  position:absolute;
  border-top: 1px dotted;
  bottom:0;
  left:-100vw; /*big value here*/
  right:-100vw;/*big value here*/
}
.sp_baseline{
  color: blue;
  vertical-align: baseline;
}
.sp_text-bottom{
  color: green;
  vertical-align: text-bottom;
}
.sp_bottom{
  color: purple;
  vertical-align: bottom;
}
.sp_top{
  color: red;
  vertical-align: top;
  transform:translateY(1px); /*we move the top one by 1px so we can see it*/
}
.sp_text-top{
  color: green;
  vertical-align: text-top;
}

span.text {
  background-color: papayawhip;
  line-height: 1.96; 
  font-size:40px;
}
<div class = "line">
  <span class = "text1 text">SINGLE line</span>
  <span class = "sp-line sp_bottom"></span>
  <span class = "sp-line sp_top"></span>
  <span class = "sp-line sp_baseline"></span>
  <span class = "sp-line sp_text-bottom"></span>
  <span class = "sp-line sp_text-top"></span>
</div>

Я считаю, что проблема, с которой вы столкнулись, как-то связана с шириной 100% в вашем sp-классе. Необходимо учитывать границу класса .line (голубой контур) и некоторый интервал в шрифте. Я установил ширину, чтобы вычислить ее на 100% меньше 4 пикселей, чтобы удовлетворить это:

.sp-line {
  display: inline-block;
  width: calc(100% - 4px);
  margin-right: -100%;
  position: relative;
  z-index: 10;
  border-top: 1px dotted #000;
}

.sp_baseline {
  border-color: blue;
  vertical-align: baseline;
}

.sp_text-bottom {
  border-color: green;
  vertical-align: text-bottom;
}

.sp_bottom {
  border-color: red;
  vertical-align: bottom;
}

.sp_text-top {
  border-color: green;
  vertical-align: text-top;
}

.line {
  border: 1px solid cyan;
}

span.text {
  background-color: papayawhip;
  line-height: 1.96;
}
<div class = "line">
  <span class = "sp-line sp_bottom"></span>
  <span class = "sp-line sp_baseline"></span>
  <span class = "sp-line sp_text-bottom"></span>
  <span class = "sp-line sp_text-top"></span>
  <span class = "text1 text">SINGLE line</span>
</div>

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