Javascript-форум (https://javascript.ru/forum/)
-   (X)HTML/CSS (https://javascript.ru/forum/xhtml-html-css/)
-   -   Задачка на смекалку: (https://javascript.ru/forum/xhtml-html-css/56848-zadachka-na-smekalku.html)

Deff 06.07.2015 19:02

Задачка на смекалку:
 
Есть тег p такого вида
<p>
<br/>
Тут текст <br/>
Ещё текст ...
</p>

и такого:
<p>
Тут текст <br/>
Ещё текст ...
</p>


Задача - по возможности убить c помощью css тег <br/> (oтступ) в начале первой строки визуально; (не убивая <br/>, которые могут быть далее по тексту) Теги <p> как первого так и второго типа на странице расположены произвольно (как кол-во так и последовательность)

EmperioAf 06.07.2015 19:11

p:first-line{
  line-height:0;
}

EmperioAf 06.07.2015 19:24

а можно проще:
p br:first-child {
    display: none;
}

Deff 06.07.2015 19:28

EmperioAf,
1. Есть и теги <p> без <br> в первой строке
2. В псевдо элементе :first-line допустимы только изменения правил для правил font и line-height

Проверка:
<!DOCTYPE html>
  <html>
   <head>
<style>
body{
 margin:0;
 padding:0;
}
p {
  border:blue solid 1px;
}
p:first-line{
  line-height:0;
}
</style>
    </head>
<body>
<!-- Вариант-1 тега <p> -->
<p>
    <br/>
Тут текст - 1 <br>
Еще текст
</p>

<!-- Вариант-2 тега <p> -->
<p>
Тут текст - 2 <br>
Еще текст
</p>


</body>
  </html>

EmperioAf 06.07.2015 19:36

не понял, почему нельзя написать так:
p *:first-child {
  display: none;
}

?

Deff 06.07.2015 19:37

EmperioAf,
Для второго тега <p> - убъётся перевод строки

рони 06.07.2015 19:40

Deff,
:-?
<!DOCTYPE html>
  <html>
   <head><meta charset="utf-8">
<style>
body{
 margin:0;
 padding:0;
}
p {
  border:blue solid 1px;
}
p > br{
   display: none;
}
</style>
    </head>
<body>

<p>
    <br/>
Тут текст - 1
</p>


<p>
Тут текст - 2 <br>
Еще текст
</p>
</body>
  </html>

рони 06.07.2015 19:42

Deff,
или надо так?
<!DOCTYPE html>
  <html>
   <head><meta charset="utf-8">
<style>
body{
 margin:0;
 padding:0;
}
p {
  border:blue solid 1px;
}
p:first-of-type > br{
   display: none;
}
</style>
    </head>
<body>

<p>
    <br/>
Тут текст - 1
</p>


<p>
Тут текст - 2 <br>
Еще текст
</p>
</body>
  </html>

Deff 06.07.2015 19:44

рони, поставил бы + (2-й твой) Если б мог
Но теги <p> (как Вариантов 1, так и 2) рандомно разбросаны по странице, хитрость не проходит

EmperioAf 06.07.2015 19:53

Цитата:

Сообщение от Deff
Но теги <p> (как Вариантов 1, так и 2) рандомно разбросаны по странице, хитрость не проходит

почему нельзя тегам <p> задать класс ?

Deff 06.07.2015 19:55

EmperioAf,
Ну скриптом задача решается. Вопрос: решается ли через css ?

EmperioAf 06.07.2015 20:12

Цитата:

Сообщение от Deff
EmperioAf,
Ну скриптом задача решается. Вопрос: решается ли через css ?

ну то есть задача заключается в том, что нужно отличить с помощью селектора отличить пробел+<br> от пробел+текст
Разве в CSS есть инструменты определения, что элемент является TextNode?

Deff 06.07.2015 20:21

EmperioAf,

Я бы сформулировал так: - Скрыть первую строку в <p> при наличии в ней тега <br>

--------------------------------
Тег <br> идёт сразу за тегом родителя <p>

Т.е. вид HTML: <p><br>... </p>
.

Deff 06.07.2015 20:53

рони, - отлично, ток в старой опере так: http://savepic.su/5767635.jpg
Наверно нун хаккать для старой оперы(12.15) margin-top ? (компенсировать отступ наездом на предэлемент ?)
Да и в Mozilla Firefox так же
======================
В яндексе и Гугол-хроме все без отступа, в Опере и Мозилле с отступом

Deff 06.07.2015 21:29

Вариант:
<!DOCTYPE html>
  <html>
   <head><meta charset="utf-8">
<style>
body{
 margin:0;
 padding:0;
}
p {
  border:blue solid 1px;
}
 p > br {
  display:block;
  height:0;
  line-height:0;
  font-size:0;
}

</style>
    </head>
<body>
<p>
Тут текст - 2 <br>
Еще текст
</p>
<p>
    <br/>
Тут текст - 1
</p>
<p>
    <br/>
Тут текст - 1
</p>

<p>
Тут текст - 2 <br>
Еще текст
</p>
<p>
    <br/>
Тут текст - 1
</p>
</body>
  </html>


:( не работает В Хроме и Яндексе

Deff 06.07.2015 22:01

рони,
Да, в Опере работает, осталась Мозилла...
Скомпоновать бы мой и твой из поста 14

рони 06.07.2015 23:00

Deff,
нерабочие у меня варианты -- удалил.

filler 07.07.2015 13:07

Так решения так и не нашли?)

Deff 11.07.2015 16:15

Есть уточнение, что если тег <br> первый, он идёт вплотную после родителя:
<p><br>...

mikhail.golovkin 18.08.2015 08:55

Любопытно. :)

Попробуйте так:
<!DOCTYPE html>
<html>

  <head>
    <style>
      p {
        outline: dashed 1px black;
      }

      p::first-line {
        line-height: 0;
      }

      p::first-letter {
        line-height: 1;
      }
    </style>
  </head>

  <body>
    <p>
      <br>
      Hello
      <br>
      Plunker
      <br>!
    </p>
    
    <p>
      Hello
      <br>
      Plunker
      <br>!
    </p>
  </body>

</html>


P.S. Не работает в FF, как минимум.

рони 18.08.2015 09:05

mikhail.golovkin,
а добавить run для запуска кода? и в опере сами смотрели?

mikhail.golovkin 18.08.2015 09:48

Цитата:

Сообщение от рони (Сообщение 384652)
а добавить run для запуска кода?

Добавил.

Цитата:

Сообщение от рони (Сообщение 384652)
и в опере сами смотрели?

Работает в последних chrome (ubuntu, windows, android), yandex (windows, android), opera (windows) и в ie11.

В FF не работает (ubuntu, windows, android), но решение для FF написано выше самим автором.


Часовой пояс GMT +3, время: 09:59.