Границы вставки CSS
У меня есть быстрый вопрос о границах CSS.
Мне нужно создать сплошной цвет вставки границы. Это бит CSS, который я использую:
border: 10px inset rgba(51,153,0,0.65);
к сожалению, это создает 3D ребристую границу (игнорируйте квадраты и темное поле описания):
http://dl.dropbox.com/u/12147973/border-current.jpg
Это гол:
http://dl.dropbox.com/u/12147973/border-boal.jpg
какие идеи?
11 ответов:
вы могли бы использовать
box-shadow
возможно:#something { background: transparent url(https://i.stack.imgur.com/RL5UH.png) 50% 50% no-repeat; min-width: 300px; min-height: 300px; box-shadow: inset 0 0 10px #0f0; }
#something { background: transparent url(https://i.stack.imgur.com/RL5UH.png) 50% 50% no-repeat; min-width: 300px; min-height: 300px; box-shadow: inset 0 0 10px #0f0; }
<div id="something"></div>
это имеет то преимущество, что он будет накладываться на фоновое изображение
div
, но это, конечно, размыто (как и следовало ожидать отbox-shadow
свойства). Чтобы создатьdensity
из тени вы можете добавить дополнительные тени, конечно:#something { background: transparent url(https://i.stack.imgur.com/RL5UH.png) 50% 50% no-repeat; min-width: 300px; min-height: 300px; box-shadow: inset 0 0 20px #0f0, inset 0 0 20px #0f0, inset 0 0 20px #0f0; }
#something { background: transparent url(https://i.stack.imgur.com/RL5UH.png) 50% 50% no-repeat; min-width: 300px; min-height: 300px; box-shadow: inset 0 0 20px #0f0, inset 0 0 20px #0f0, inset 0 0 20px #0f0; }
<div id="something"></div>
редактировать потому что я понял что я идиот, и забыл предложить самое простое решение первый, который использует в противном случае-пустой дочерний элемент, чтобы применить границы над фоном:
#something { background: transparent url(https://i.stack.imgur.com/RL5UH.png) 50% 50% no-repeat; min-width: 300px; min-height: 300px; padding: 0; position: relative; } #something div { position: absolute; top: 0; left: 0; right: 0; bottom: 0; border: 10px solid rgba(0, 255, 0, 0.6); }
<div id="something"> <div></div> </div>
редактировать после комментарий@CoryDanielson, ниже:
jsfiddle.net/dPcDu/2 вы можете добавить 4-й параметр px для
box-shadow
что делает распространение и будет легче отражать его изображения.#something { background: transparent url(https://i.stack.imgur.com/RL5UH.png) 50% 50% no-repeat; min-width: 300px; min-height: 300px; box-shadow: inset 0 0 0 10px rgba(0, 255, 0, 0.5); }
<div id="something"></div>
Я бы рекомендовал использовать
box-sizing
.*{ -webkit-box-sizing:border-box; -moz-box-sizing:border-box; -ms-box-sizing:border-box; box-sizing:border-box; } #bar{ border: 10px solid green; }
для создания вставки границы внутри элемента единственное решение, которое я нашел (и я пробовал все предложения в этом потоке безрезультатно), - это использовать псевдо-элемент, такой как: before
например.
.has-inset-border:before { content: "foo"; /* you need something or it will be invisible at least on Chrome */ color: transparent; position: absolute; left: 10px; right: 10px; top: 10px; width: 10px; border: 4px dashed red; }
свойство box-sizing не будет работать, так как граница всегда заканчивается за пределами всего.
параметры box-shadow имеют двойные недостатки: они не работают и не поддерживаются так широко (и стоят больше циклов процессора для рендеринга, если вы тщательность.)
Это старый трюк, но я все еще нахожу самый простой способ сделать это-использовать контур-смещение с отрицательным значением (пример ниже использует-6px). Вот это скрипка из него-я сделал внешнюю границу красной и контур белый, чтобы различать два:
.outline-offset { width:300px; height:200px; background:#333c4b; border:2px solid red; outline:2px #fff solid; outline-offset:-6px; } <div class="outline-offset"></div>
Я не знаю, с чем вы сравниваете.
но супер простой способ иметь вставку с рамкой по сравнению с другими не граничными элементами-это добавить
border: ?px solid transparent;
чтобы все элементы не иметь границы.это заставит граничный элемент выглядеть вставкой.
если вы хотите убедиться, что граница находится внутри вашего элемента, вы можете использовать
box-sizing:border-box;
это поместит следующую границу внутри элемента:
border: 10px solid black;
(аналогичный результат вы получите, используя дополнительный параметр
inset
на box-shadow, но вместо этого это для реальной границы, и вы все еще можете использовать свою тень для чего-то еще.)примечание к другому ответу выше: как только вы используете любой
inset
onbox-shadow
определенного элемента, вы ограничены максимум 2 box-тени на этом элементе и потребуется оболочка div для дальнейшего затенения.оба решения должны также избавить вас от нежелательных 3D-эффекты. Также обратите внимание, что оба решения являются стекируемыми (см. пример, который я добавил в 2018 году)
.example-border { width:100px; height:100px; border:40px solid blue; box-sizing:border-box; float:left; } .example-shadow { width:100px; height:100px; float:left; margin-left:20px; box-shadow:0 0 0 40px green inset; } .example-combined { width:100px; height:100px; float:left; margin-left:20px; border:20px solid orange; box-sizing:border-box; box-shadow:0 0 0 20px red inset; }
<div class="example-border"></div> <div class="example-shadow"></div> <div class="example-combined"></div>
Если
box-sizing
это не вариант, Другой способ сделать это, просто сделать это ребенок от размеров элемента.демо
CSS
.box { width: 100px; height: 100px; display: inline-block; margin-right: 5px; } .border { border: 1px solid; display: block; } .medium { border-width: 10px; } .large { border-width: 25px; }
HTML<div class="box"> <div class="border small">A</div> </div> <div class="box"> <div class="border medium">B</div> </div> <div class="box"> <div class="border large">C</div> </div>
вы можете использовать background-clip: border-box;
пример:
.example { padding: 2em; border: 10px solid rgba(51,153,0,0.65); background-clip: border-box; background-color: yellow; } <div class="example">Example with background-clip: border-box;</div>
Так что я пытался иметь границу появляются при наведении, но он переместил всю нижнюю панель главного меню, которое не выглядело все, что хорошо я исправил его следующим образом:
#top-menu .menu-item a:hover { border-bottom:4px solid #ec1c24; padding-bottom:14px !important; } #top-menu .menu-item a { padding-bottom:18px !important; }
Я надеюсь, что это поможет кому-то там.
простое решение SCSS с псевдо-элементами
демо:https://codepen.io/vlasterx/pen/xaMgag
// Change border size here $border-width: 5px; .element-with-border { display: flex; height: 100px; width: 100%; position: relative; background-color: #f2f2f2; box-sizing: border-box; // Use pseudo-element to create inset border &:before { position: absolute; content: ' '; display: flex; border: $border-width solid black; left: 0; right: 0; top: 0; bottom: 0; border: $border-width solid black; // Important: We must deduct border size from width and height width: calc(100% - $border-width); height: calc(100% - $border-width); } }
<div class="element-with-border"> Lorem ipsum dolor sit amet </div>
Я знаю, что это три года, но подумал, что это может быть полезным кому-то.
концепция заключается в использовании селектора :after (или: before) для размещения границы внутри родительского элемента.
.container{ position:relative; /*Position must be set to something*/ } .container:after{ position:relative; top: 0; content:""; left:0; height: 100%; /*Set pixel height and width if not defined in parent element*/ width: 100%; -webkit-box-sizing:border-box; -moz-box-sizing:border-box; -ms-box-sizing:border-box; box-sizing:border-box; border:1px solid #000; /*set your border style*/ }