Jump to content
  • 0

Когда не хватает псевдоэлементов или как спозиционировать тень


Launder
 Share

Question

Вот иллюстрация. Тень должна исходить из выделенного блока(визуально, там видно откуда, и видно, что сейчас сделано криво). По-идее, это должен быть span, но в оригинальной задаче, span должен быть сам по себе, а тень должна исходить либо из самого пункта (класс every), либо из какого-либо нейтрального потомка, а какой потомок "нейтрален"? псевдоэлемент, его мы может подогнать под нужные размеры, поставить нужный z-index и сделать для него тень.

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

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

Были мысли также про какие-то изыски с границей, но опять-таки, двухцветную границу можно сделать только через border-image, а как плавно менять его прозрачность? (понятно, что если нам форма не важна, мы можем тупо сделать левую и правую границу и через opacity менять прозрачность элемента. Но нам же нужно чтоб этот элемент ещё показывал тень, поэтому нам важна как форма, так и прозрачность элемента и менять в угоду полосочкам ни то, ни другое, мы не можем. полосочки как-нибудь сами должны).

В общем, нужно как-то поменять форму тени не трогая span, чтоб, при этом, её форма совпала со span и, для последнего элемента, оставить две пары, по две полосы, которые,  независимо друг от друга, должны плавно уходить в прозрачность и выплывать из неё обратно.

Благодраю за внимание, буду рад Вашим свежим идеям! :rolleyes:

ЗЫ: можно, ещё сделать две тени, но поскольку тень также нельзя увеличить только в одну какую-то сторону, то процесс подгонки тени (которая в разных браузерах, и рисуется всё-таки немного по разному), большая, отдельная, нудная тема, которую не хотелось бы открывать, лучше чтоб тень исходила из элемента совпадающего по форме с тем, из которого она исходит визуально.

ЗЫЗЫ: чисто теоретически, для градиента можно сделать плавный переход, вот что сказано в спецификации:

Цитата

The following describes how each property type undergoes transition or animation.

gradient: interpolated via the positions and colors of each stop. They must have the same type (radial or linear) and same number of stops in order to be animated. Note: [CSS3-IMAGES] may extend this definition.

Но на практике у меня это не заработало. Может у кого-то заработает? ;) 

Edited by Launder
Link to comment
Share on other sites

5 answers to this question

Recommended Posts

  • 0

Ну вот, в общем, получилось.

С тенями, сложности, в основном, такие:

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

В принципе, в моём примере, я мог все тени убрать с помощью прозрачности, кроме предпоследних полос, поскольку вместе с ними уберутся и последние полосы.

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

  • Like 1
Link to comment
Share on other sites

  • 0

Для меню.

http://htmlbook.ru/practical/nispadayushchee-menyu

https://webref.ru/layout/html5-css3/list/use

Вдохновившись, в своё время этим, ваяю многоуровневое адаптивное меню :) Спан (в оригинале блочная ссылка) и тень участвуют в наложении по z-плоскости и должны находиться на разных уровнях. Надеюсь, я это когда-нибудь доваяю:angry:, наберусь смелости:lol:, и выложу на суд общественности...

Edited by Launder
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Similar Content

    • By Drew96
      Здравствуйте. Необходимо реализовать svg-иконки соцсетей. На картинке снизу соответственно обычное состояние, hover и active.
      . В состоянии active у иконки должна появляться тень. Код иконок я вставляю в HTML, и стилизую с помощью CSS. Сначала я пытался реализовать тень с помощью box-shadow inset, применяя её к самому svg. Но в таком случае тень появляется как-бы за элементом
      http://codepen.io/Drew96/pen/WxPdvb
      Потом я пытался сделать тень с помощью svg-фильтров. Но так как иконка представляет собой круг с «дыркой» по форме значка социальной сети, то тень появлялась не только сверху круга, но еще и под значком.
      Тогда я сделал тень, добавив блочный псевдоэлемент к ссылкам. Уже к этому элементу я добавлял тень и абсолютно позиционировал его относительно родительского элемента иконки.
      http://codepen.io/Drew96/pen/xOrpkp
      Получилось нормально, но в firefox этот вариант работает плохо. Ссылка работает только при нажатии где-то внизу иконки или на самой границе.
      Поэтому и появился вопрос, как правильно реализовать такую тень, или как заставить firefox обрабатывать ссылки нормально? Заранее спасибо.
    • By Launder
      https://jsfiddle.net/Launder/Ly9mLfv4/1/
       
      В 21 строчке CSS кода
      box-shadow: inset 0 1px 5px rgba(0,0,0,0.2);как только убираешь свойство inset (тень внутрь) тень (наружу) появляется. Как сделать тень внутрь?
    • By Launder
      http://jsfiddle.net/tr0zurq1/
       
      Предполагается, что тень будет именно для каждого элемента: либо для <li>, либо для <a>, а не для <ul>.
      По-идее, между элементами тень не должна быть видна, поскольку, z-index псевдоэлемента, для которого сделана тень, меньше z-index'a элемента, для которого сделан псевдоэлемент.
      Но тень всё равно есть. Почему? Как расположить тень "дальше" пунктов меню?
      <ul> <li><a href="#">Борщ украинский с пампушками</a></li> <li><a href="#">Вареники с печенью в луке с салом</a></li> <li><a href="#">Курица, тушенная с галушками</a></li></ul>ul { position: absolute; list-style: none; margin: 0; padding: 0; word-wrap: break-word; /*перенос слов*/ z-index: 0; }ul a { display: block; position: relative; z-index: 1; background: #ffe5e5; color: #ca575b; padding: 5px 10px; text-decoration: none; }ul a:hover { background: #8bc6ee; color: #fffcfc; }ul a::after { content: ''; display: block; position: absolute; top: 0; bottom: 0; left:0; right:0; box-shadow: 0 0 4px #dd9a9a; z-index: -1; }
    • By Launder
      http://jsfiddle.net/Launder/d70c2kg1/4/
      <ul class="menu"> <li><a href="#">Разные вкусности</a> <ul> <li><a href="#">Суп с клёцками</a></li> <li><a href="#">Пироги с капустой и яйцом</a></li> <li><a href="#">Торт Медовый</a></li> </ul> </li> <li><a href="#">Узбекская кухня</a> <ul> <li><a href="#">Плов по-бухарски с изюмом</a></li> <li><a href="#">Плов с бараниной и нутом</a></li> <li><a href="#">Халва из ядрышек урюка</a></li> <li><a href="#">Лагман по-хорезмски</a></li> </ul> </li> <li><a href="#">Итальянская кухня</a> <ul> <li><a href="#">Феттучини с ветчиной и грибами в сливочном соусе</a></li> <li><a href="#">Пицца по-тоскански с индейкой и грейпфрутом</a></li> <li><a href="#">Кролик по-лигурийски с красным вином</a></li> <li><a href="#">Миндальные бискотти с медом</a></li> </ul> </li></ul>.menu { background: -moz-linear-gradient(to top, #ecc, #fff8f8); background: -webkit-linear-gradient(to top, #ecc, #fff8f8); background: -o-linear-gradient(to top, #ecc, #fff8f8); background: -ms-linear-gradient(to top, #ecc, #fff8f8); background: linear-gradient(to top, #ecc, #fff8f8); border: 1px solid #888; border-top: 0; padding: 0; margin: 0; font-family: Arial, Helvetica, sans-serif; font-size: 0; }.menu > li { display: inline-block; width: 200px; height: 75px; border: 1px solid #fff; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; font-size: 14px; position: relative; }.menu a { text-decoration: none; display: block; }.menu ul { list-style: none; }.menu > li:hover::after { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; -webkit-box-shadow: inset 0 0 10px #777; -moz-box-shadow: inset 0 0 10px #777; box-shadow: inset 0 0 10px #777; }Почему элемент ul, который является составной частью inline-block элемента li, выходит за его границы, а не растягивает его?
      Я это говорю, потому что вижу, что выделяет тень (при наведении на блок).
      С другой стороны, inline-block-и, как и должны, выстроились по базовой линии самой нижней строчки текста в них. Значит, всё же, они "чувствуют" вложенный список.
      Как объяснить такое двойное поведение?
    • By user89
      Хочу получить такую таблицу. Здесь на сером фоне внутренние белые линии (слева и сверху)

       
      Cделать через тень, короткое изящное решение http://jsfiddle.net/aykkwbss/
      Работает везде, но как обычно IE в своем репертуаре (думал в 10-й версии глюков с тенью не будет). Здесь белые линии смещены на 1px вправо или вниз

       
      Вложил DIV в ячейку. У Мозиллы едет верстка, а IE не растягивает DIV http://jsfiddle.net/aykkwbss/5/
      Можно решить без JavaScript?
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy