РЕЗЮМЕ:
В зависимости от того, что нужно, это может быть сложно, но основной подход довольно прост.
Я написал целую статью об этом здесь:
это может быть легче читать.
http://dream -world.us / 2012/01/07 / перекрывающихся прозрачный-дивы-с одной границы /
Этот подход немного отличается от моей первой мысли ... но результат тот же.
- Я сделал черный / прозрачный узор для круга и установил его
:before
.
- Круг затем преобразуется
rotate(180deg)
и перемещается, чтобы соответствовать
угол <div>
.
- Затем я установил
opacity
этого круга на 0.6
.
- Сам
<div>
не подвержен влиянию opacity
.
- Затем я добавил элемент
:after
и поместил изображение как background
(при необходимости вы можете управлять этим с помощью js)
- Я добавил некоторые эффекты к изображению (
border-radius
, box-shadow
,
border
), чтобы показать, насколько легко и независимо этот элемент может быть
под контролем.
- Я использовал более светлый фон и установил
opacity
на 0.3
, чтобы показать
результат
ЗДЕСЬ СКИДКА: http://jsfiddle.net/pixelass/nPjQh/4/
Посмотрите на эту версию для некоторых сумасшедших результатов: http://jsfiddle.net/pixelass/nPjQh/5/
каждый из этих примеров использует только один div
элемент
Основные правила. (эти правила «могли» использоваться для создания динамического поведения с помощью js)
позиция = абсолютная;
top = circleHeight / -2;
left = circleHeight / -2; // (left = top)
вращение = 180 градусов;
opacity = valueAofBackground;
bgColor = значениеRGBofBackground;
#inner {
width: 100%;
height: 100%;
position: absolute;
left: 0;
top: 0;
z-index: -1;
background-color: rgba(0, 0, 0, 0.3);
padding:20px;
border-radius: 20px;
border-top-left-radius: 0;
}
#inner:before {
content: "";
background-image: -webkit-linear-gradient(transparent 50%, rgb(0, 0, 0) 50%, rgb(0, 0, 0)),
-webkit-linear-gradient(0deg, transparent 50%, rgb(0, 0, 0) 50%, rgb(0, 0, 0));
height: 40px;
width: 40px;
border-radius: 40px;
position: absolute;
top: -20px;
left: -20px;
-webkit-transform: rotateZ(180deg);
opacity:0.3;
}
#inner:after {
content: "";
background: url('http://lorempixel.com/10/10/sports/1/') no-repeat;
background-position:0;
height: 10px;
width: 10px;
border-radius: 10px;
position: absolute;
top: -6px;
left: -6px;
-webkit-box-shadow: 0 0 10px rgb(255,255,255);
border: 1px rgb(255,255,255) solid;
}
Лучшее объяснение
Оригинальная прокомментированная версия
http://jsfiddle.net/pixelass/nPjQh/10/
см. Комментарии в коде ниже
#inner {
background: rgba(0,0,0,0.5) /*this is the full color-code of the div (with alpha)*/
}
#inner:before {
/*the solid color of the circle = rgbValue of the div*/
background-image: -webkit-linear-gradient(transparent 50%, rgb(0, 0, 0) 50%, rgb(0, 0, 0)),
-webkit-linear-gradient(0deg, transparent 50%, rgb(0, 0, 0) 50%, rgb(0, 0, 0));
/*opacity of the circle = alpha of the div*/
opacity: 0.5;
}
Этот пример имеет полностью прозрачный div
... круг "pacman" - форма: http://jsfiddle.net/pixelass/nPjQh/14/
Управление смещением круга
Посмотрите на эти примеры, которые обрабатывают смещение круга ( НЕ ИСПОЛЬЗУЯ PSEUDEO-ЭЛЕМЕНТОВ )
1: 1 копия кода ОП (смещение 15 пикселей): http://jsfiddle.net/pixelass/nPjQh/12/
С намного меньшим смещением (5 пикселей): http://jsfiddle.net/pixelass/nPjQh/13/
(содержимое имеет ту же непрозрачность, что и кружок)
Как работает смещение?
Управление background-size
против top
и left
Правила
сверху = слева;
background-size = elementHeight * 2 + top * 2;
Посмотрите на цветок (он также только один <div>
с псевдоэлементами)
background-size
больше круга. который создает зеленые листья на дне
http://jsfiddle.net/pixelass/nPjQh/15/
ТЕКУЩАЯ ПРОБЛЕМА
Смотрите эту скрипку: http://jsfiddle.net/pixelass/nPjQh/16/
Если не использовать другой слой, как показано в примерах вверху поста, контент будет прозрачным. Так что, если вам нужно только изображение внутри круга, приведенные выше примеры будут работать нормально.
КАК РЕШИТЬ ЭТОТ ВЫПУСК
Если вам нужен холст или другой элемент div внутри круга, вам нужно поместить круг на элемент div и наложить нужный элемент div на круг
Смотрите эту скрипку: http://jsfiddle.net/pixelass/nPjQh/17/
измените немного, и все будет работать нормально. ПОЛУЧИТЕ КОД ИЗ НЕЙТРА
Различные формы / продвинутый стиль
Если вы используете другую форму с плоскими сторонами, вы можете даже поставить границу вокруг суммы двух делений или даже добавить тень от поля
все еще использует простую разметку ....
<div id="foo">
<div id="bar">
</div>
</div>
См. Скрипку для тени коробки: http://jsfiddle.net/pixelass/nPjQh/21/
Применить границу к кругу
Используя -webkit-mask-image
, мы можем добавить границу к кругу.
http://jsfiddle.net/pixelass/nPjQh/24/
Дополнительные примеры:
Четыре круга вокруг div
http://jsfiddle.net/pixelass/nPjQh/25/
Разметка:
<div id="foo">
<div id="bar1"></div>
<div id="bar2"></div>
<div id="bar3"></div>
<div id="bar4"></div>
</div>
Использование этой техники для создания всплывающей подсказки
http://jsfiddle.net/pixelass/nPjQh/31/
Разметка:
<div id="foo">
<div id="bar"></div>
I am a pure css tooltip with a semi-transparent background and a black border. <br/>
My width is static an my height is dynamic...
</div>