Размер тени блока CSS3 — процентные единицы?

Я работаю над проектом, в котором необходимо использовать свойство box-shadow CSS3. Это нормально, но я обнаружил, что размер тени не может быть установлен в процентах от родительского объекта.

Я полностью понимаю, что box-shadow не является аддитивным, поэтому он не использует размер родителя в качестве ссылки.

Но учитывая тот факт, что мне нужен полностью адаптивный сайт с плавным масштабированием объектов (не только в точках останова), это также создает проблему — я могу установить свойство тени для распространения только в абсолютных единицах (em или px).

Есть ли какое-нибудь решение для этого? Я думал об использовании внутреннего контейнера (для контента) внутри контейнера (для «тени» — это без размытия), но это создает другую проблему — вертикальное центрирование внутреннего контейнера.

Любое решение? Пожалуйста, не используйте jQuery, только чистый CSS.


person Jozko Remen    schedule 27.12.2012    source источник
comment
Как насчет границы вместо тени?   -  person Ana    schedule 28.12.2012
comment
Я бы попробовал поработать с pseudo-elements   -  person MMachinegun    schedule 13.04.2014
comment
em относится к размеру шрифта. Один из трюков — масштабировать шрифт.   -  person Eric    schedule 25.10.2017


Ответы (5)


Я обнаружил, что размер разброса тени не может быть установлен в процентах от родительского объекта.

Истинный. Но вы можете установить font-size для родительского объекта, затем определить размер объекта в ems и использовать те же ems для определения размера box-shadow.

Или, если вашим родительским объектом является окно, вы можете использовать единицы области просмотра: vw и vh.

person mik01aj    schedule 23.11.2015
comment
Отличное решение (на самом деле взлом). Я использую его так: (встроенный) font-size = (ball-radius / 10) и class-css box-shadow: inset -2em -5em 5em rgba(0,0,0,.6 ) - person T4NK3R; 17.09.2017
comment
Это должен быть принятый ответ ИМО. Остальные просьбы не выполняют. - person RSinohara; 26.11.2018

Если вам нужна вставка box-shadow, вы можете использовать фон с радиальным градиентом, чтобы имитировать поведение. Так что вместо -

box-shadow: inset 0 0 100% #000;

Вы бы использовали -

background: radial-gradient(ellipse at center, rgba(0,0,0,0) 0,rgba(0,0,0,1) 100%);

Поддержка: FF16+, IE10+, Safari 5.1+

Я не могу найти однозначного ответа, когда Chrome начал поддерживать это свойство, но моя текущая версия (39.0.2171.65) определенно его поддерживает.

ColorZilla — довольно полезный инструмент для создания радиальных (среди прочего) градиентов вместе с необходимыми префиксами, если вы решаете пойти по этому пути.

person shakyjake    schedule 26.11.2014
comment
Просто упомянем: Переходы нельзя применять к градиентному фону. - person vsync; 13.10.2019

Пробовали ли вы использовать модуль rem (корневой модуль em)? Я считаю, что вы можете использовать это, чтобы сделать его плавным.

Единица rem всегда относится к корневому html-элементу, поэтому она будет соответствующим образом масштабироваться, и вам не придется беспокоиться о внутренних контейнерах или чем-то подобном. На данный момент он также имеет довольно широкую поддержку браузеров.

Я использую его в своих проектах, чтобы сделать их более отзывчивыми, но всегда следую параметру, уже определенному px или em, так что на всякий случай он изящно терпит неудачу. Например:

font-size: 14px; font-size: 1.4rem;

Вот отличная статья, объясняющая все, что вам нужно знать об этом устройстве: http://snook.ca/archives/html_and_css/font-size-with-rem

person alex    schedule 02.01.2013

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

Например, приведенный ниже код CSS делает «радиус распространения» тени блока равным 20% ширины div:

div {
    --width: 100px;
    width: var(--width);
    box-shadow: 0 0 0 calc(var(--width) * 0.2) #aaa;
}
person Ian Y.    schedule 21.03.2020

Вы хотите, чтобы box-shadow масштабировался по ширине контейнера или по высоте контейнера? Вы не можете указать высоту и ширину своей тени, только разброс. Итак, если ваш контейнер сжимается на 10% по ширине, но не уменьшается по высоте, ваша тень уменьшится на 10% (если бы это было возможно), т.е. высота вашей тени будет масштабироваться, хотя, вероятно, этого не должно быть.

Если вы хотите, чтобы box-shadow правильно масштабировалась по высоте и ширине, вам нужно будет создать несколько теней — одну для высоты, одну для ширины.

Однако вы никогда не сможете масштабировать реальную тень, а только контейнер тени. Таким образом, вы должны создать контейнер внутри вашего основного контейнера, а затем задать ему отрицательные поля и прикрепить box-shadow. Однако вскоре вы заметите, что ваша тень на самом деле растет, а не сжимается, когда вы уменьшаете размер контейнера.

Кажется немного излишним пытаться масштабировать что-то, что не масштабируется без использования медиа-запросов или jQuery.

Однако, если вы ищете масштабируемые границы, то есть box-shadow без размытия :P, тогда не смотрите дальше:

http://jsfiddle.net/925r2/3/

<style>
    * {
        margin: 0;
        padding: 0;
        border: 0;
        box-sizing: border-box;
    }

    .wrapper {
        position: relative;
        margin: 100px auto 0;
        width: 80%;         /* .content width */
        height: 400px;      /* .content height */
    }

    .content {
        position: absolute;
        top: 0;
        right: 0;
        bottom: 0;
        left: 0;
        background: #fff;   /* .content background */
    }

    .shadow {
        position: absolute;
        top: -10%;          /* .content shadow top height */
        right: -5%;         /* .content shadow right width */
        bottom: -10%;       /* .content shadow bottom height */
        left: -5%;          /* .content shadow left width */
        background: #000;   /* .content shadow, unfortuntely no blur effect */
    }
</style>

<div class="wrapper">
    <div class="shadow"></div>
    <div class="content">This is your content</div>
</div>
person Cornelius    schedule 11.07.2014
comment
Это не отвечает на вопрос об использовании box-shadow с процентными единицами. - person Zach Saucier; 12.07.2014
comment
Просто вы не можете использовать проценты на box-shadow. Практически любой ответ будет хаком, который использует некоторые другие контейнеры для достижения эффекта. Таким образом, либо вопрос следует отправить поставщикам W3C и браузеров, либо, если автор ищет решение, это решение, представляющее собой тень, процентное соотношение без эффекта размытия. - person Cornelius; 12.07.2014