Установка границы для первого элемента в строке

(Я новичок в веб-дизайне). У меня есть список ссылок (разделов на текущей странице), которые могут расширяться до нескольких строк в зависимости от размера области просмотра. Ссылки разделяются вертикальной линией (граница слева):

Установка границы для первого элемента в строке

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

Установка границы для первого элемента в строке

Обратите внимание, что этот список, вероятно, различается для каждой страницы.

Вопрос: Как добиться такого эффекта? CSS? JavaScript?

.links a {
  display: inline-block;
}
.links a:not(:first-child) {
  border-left: 1px solid black;
  padding-left: 15px;
}
.links a:not(:last-child) {
  padding-right: 15px;
}
<div class = "links">
  <a href = "#">Link number 1</a>
  <a href = "#">Link number 2</a>
  <a href = "#">Link number 3</a>
  <a href = "#">Link number 4</a>
  <a href = "#">Link number 567</a>
  <a href = "#">Link number 6</a>
  <a href = "#">Link number 7</a>
  <a href = "#">Link number 8</a>
  <a href = "#">Link number 9</a>
</div>

PS: display: inline-block предназначен только для того, чтобы избежать переноса между строками. Я бы хотел избежать изменения структуры HTML, так как это затрагивает многие страницы. Такие ссылки всегда вложены в <div class = "links"></div>, как показано в примере.

Вам понадобятся медиа-запросы. Невозможно сделать это динамически с помощью CSS. Он не знает, когда предметы оборачиваются.

Paulie_D 01.10.2018 18:28

О ... а что, если на страницах разный набор ссылок? один конкретный CSS для каждого? Я обновлю вопрос, чтобы прояснить это ... может быть какой-нибудь JS?

cbuchart 01.10.2018 18:30

Вероятно, это был бы единственный выход.

Paulie_D 01.10.2018 18:30

Ваш динамический список представляет собой список слов, поэтому единственный способ, которым я представляю самый лучший с точки зрения производительности, - это получить среднюю ширину символа (число, букву) и вычислить @media queries в CSS для этих размеров.

Julius 01.10.2018 18:47

@Paulie_D «Невозможно сделать это динамически с помощью CSS». в то время как «динамическая» часть остается верной, конкретный запрос OP возможен только с помощью CSS. Хотя, полагаю, мой ответ можно было бы считать обходным решением.

Tyler Roper 01.10.2018 18:56
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
5
474
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Установите overflow: hidden; на контейнер и дайте своим ссылкам отрицательный left-margin. Вы можете нейтрализовать отрицательную маржу на других ссылках, просто удвоив padding-right.

.links {
  overflow: hidden;
}
.links a {
  display: inline-block;
  border-left: 1px solid black;
  padding-left: 15px;
  margin-left: -15px;
}
.links a:not(:last-child) {
  padding-right: 30px;
}
<div class = "links">
  <a href = "#">Link number 1</a>
  <a href = "#">Link number 2</a>
  <a href = "#">Link number 3</a>
  <a href = "#">Link number 4</a>
  <a href = "#">Link number 567</a>
  <a href = "#">Link number 6</a>
  <a href = "#">Link number 7</a>
  <a href = "#">Link number 8</a>
  <a href = "#">Link number 9</a>
</div>

Как это работает

Левое поле и левая граница находятся присутствуют, однако отрицательное поле вытесняет их из контейнера. Затем мы скрываем все, что находится за пределами контейнера, с помощью overflow: hidden.

В приведенном ниже примере показано, что на самом деле происходит при удалении overflow: hidden; и присвоении контейнеру границы:

.links {
  border: 1px solid red;
  overflow: visible;
  margin-left: 30px;
}
.links a {
  display: inline-block;
  border-left: 1px solid black;
  padding-left: 15px;
  margin-left: -15px;
}
.links a:not(:last-child) {
  padding-right: 30px;
}
<div class = "links">
  <a href = "#">Link number 1</a>
  <a href = "#">Link number 2</a>
  <a href = "#">Link number 3</a>
  <a href = "#">Link number 4</a>
  <a href = "#">Link number 567</a>
  <a href = "#">Link number 6</a>
  <a href = "#">Link number 7</a>
  <a href = "#">Link number 8</a>
  <a href = "#">Link number 9</a>
</div>

Спасибо! работает безупречно! Можно ли изменить его, чтобы он работал, если у .links есть text-align: center? Это изменение дизайна для подмножества страниц ... следует ли мне опубликовать его как отдельный вопрос или расширить этот?

cbuchart 02.10.2018 09:15

Мне удалось решить эту конкретную проблему с помощью JS, спасибо за вашу помощь!

cbuchart 02.10.2018 12:08

Вот простой способ скрыть первые границы с помощью псевдоэлемента.

.links {
  overflow: hidden;
  position:relative;
  width:600px;
  animation:change 4s linear infinite alternate;
}
.links:before {
  content:"";
  position:absolute;
  top:0;
  bottom:0;
  left:0;
  width:1px;
  background:#fff;
}
.links a {
  display: inline-block;
  border-left: 1px solid black;
  padding-left: 15px;
}

@keyframes change {
  to{width:160px}
}
<div class = "links">
  <a href = "#">Link number 1</a>
  <a href = "#">Link number 2 5q4d </a>
  <a href = "#">Link number 3</a>
  <a href = "#">Link number 4</a>
  <a href = "#">Link number 567</a>
  <a href = "#">Link number 6</a>
  <a href = "#">Link number 7 dqsd dqs</a>
  <a href = "#">Link number 8</a>
  <a href = "#">Link number 9</a>
</div>

Хотя я предпочитаю решения, предложенные Тайлер Ропер и Темани Афиф, потому что они показывают правильный результат с самого первого рендеринга (особенно это заметно на страницах с множеством дополнительных ресурсов), я хочу поделиться другим решением (с использованием JavaScript), вдохновленным этот другой ответ.

$(document).ready(function() {
  fn = function() {
    var prevTop = -1;
    $("a", $(".links")).each(function() {
      var link = $(this);
      var top = link.offset().top;
      if (top == prevTop) {
        link.attr("class", "border");
      } else { // new line
        prevTop = top;
        link.removeClass("border"); // in case 'border' was previously added
      }
    });
  };
  $(window).resize(fn);
  fn();
});
.links {
  text-align: center;
}

.links a {
  display: inline-block;
  padding-left: 15px;
  padding-right: 15px;
}

.links a.border {
  border-left: 1px solid black;
}
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class = "links">
  <a href = "#">Link number 1</a>
  <a href = "#">Link number 2</a>
  <a href = "#">Link number 3</a>
  <a href = "#">Link number 4</a>
  <a href = "#">Link number 567</a>
  <a href = "#">Link number 6</a>
  <a href = "#">Link number 7</a>
  <a href = "#">Link number 8</a>
  <a href = "#">Link number 90</a>
</div>

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

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

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