Дві кольорові межі


95

Клієнт бажає двох кольорових меж для рельєфного вигляду. Чи можу я це зробити на одному елементі? Я сподівався уникнути складання двох елементів DOM з окремими межами.


Чи бажаєте ви використовувати Javascript для досягнення ефекту? jquery.malsup.com/corner
nopuck4you

Відповіді:


140

Так: використовувати outlineвластивість; він діє як друга межа за межами вашого кордону. Остерігайтеся, адже він може хитро взаємодіяти з полями, прокладками та тінями. У деяких браузерах вам, можливо, доведеться використовувати префікс для певного браузера; для того, щоб переконатися, що він його підхоплює: -webkit-outlineі тому подібне (хоча, зокрема, WebKit цього не вимагає).

Це також може бути корисно у випадку, коли ви хочете викинути контур для певних браузерів (наприклад, якщо ви хочете поєднати контур із тінню; у WebKit контур знаходиться всередині тіні; у FireFox це зовні, тому -moz-outline: 0корисно переконатися, що ви не отримаєте вузької лінії навколо вашої красивої тіні CSS).

.someclass {
  border: 1px solid blue;
  outline: 1px solid darkblue;
}

Редагувати: Деякі люди зауважували, що outlineне вдається з IE <8. Хоча це правда; підтримка IE <8 насправді не те, що ви повинні робити.


27
-1 за "підтримка IE <8 насправді не те, що ви повинні робити". Не підтримуючи IE6 може бути добре. Але не підтримувати IE7 смішно, жоден сайт з нетехнічною аудиторією не може собі цього дозволити
Pekka,

6
outlineіснує з CSS2.
BoltClock

156
+1 за непідтримку IE 7, хоча ваш сайт завжди повинен працювати та виглядати досить добре в IE 7, повна підтримка не потрібна. особливо якщо це просто двоколірна межа. я особисто використовую box-shadow та інші "розширені" функції. IE7 не бачить тіні, ... велика справа. немає жодної причини використовувати менш підходяще, надто складне або навіть застаріле рішення, просто для того, щоб обійти примхи IE7.
Marian Theisen

2
Також перегляньте це посилання з причин доброї доступності, щоб НЕ зламати властивість структури для цілей дизайну: outlinenone.com
Джоель Гловір,

11
Слово обережності outlineє менш універсальним, ніж border. Зокрема, W3C говорить : "Примітка. Контур з усіх боків однаковий. На відміну від меж, тут немає властивості" outline-top "або" outline-left " . (Наголос на моєму.)
Боб Штейн

68

Це дуже можливо. Потрібна лише невелика хитрість CSS!

div.border {
  border: 1px solid #000;
  position: relative;
}

div.border:before {
  position: absolute;
  display: block;
  content: '';
  border: 1px solid red;
  height: 100%;
  width: 100%;
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
}
<div class="border">Hi I have two border colors<br />I am also Fluid</div>

Це те, що ви шукаєте?


Насправді це складно, але він витончено погіршується і навіть працює в моєму браузері акцій мого HTC (Android)! Якщо ви використовуєте border-radius, спробуйте зменшити радіус внутрішньої межі на один піксель, що зробить розрив між двома округлими межами майже непомітним.
грип

Це добре. Використання, bottom:1pxа не height:100%працювало для мене краще лише для нижньої межі :)
Нік

якщо у вас є заповнення для div.border, я виявив, що додавання від’ємного поля з однаковими розмірами для div.border:before, допомогло зберегти все на рівні. Можливо, є кращий спосіб це зробити? jsFiddle
NW Tech

+1 за використання псевдоелементів. Я думаю, що ця відповідь краща за відповідь Вілліхама Тотланда
Матіас Канепа

Це чудово! :)
BennKingy

33

Інший спосіб - використовувати box-shadow:

#mybox {
box-shadow:
  0 0 0 1px #CCC,
  0 0 0 2px #888,
  0 0 0 3px #444,
  0 0 0 4px #000;
-moz-box-shadow:
  0 0 0 1px #CCC,
  0 0 0 2px #888,
  0 0 0 3px #444,
  0 0 0 4px #000;
-webkit-shadow:
  0 0 0 1px #CCC,
  0 0 0 2px #888,
  0 0 0 3px #444,
  0 0 0 4px #000;
}

<div id="mybox">ABC</div>

Дивіться приклад тут.


Я віддаю перевагу цьому, оскільки він працює з радіусом кордону, на відміну від методу контуру
Йохан

18

Ви пробували різні стилі меж, доступні в специфікації CSS? Уже є два стилі меж, які можуть задовольнити ваші потреби:

border-style: ridge;

Або

border-style: groove;

1
Це було саме те, що мені потрібно. (Виправлення <fieldset> в IE8)
DOOManiac

14

Контур хороший, але лише тоді, коли ви хочете, щоб кордон був навколо.

Скажімо, якщо ви хочете зробити це лише знизу або зверху, ви можете використовувати

<style>

  #border-top {
  border-top: 1px solid  #ccc;
  box-shadow: inset 0 1px 0 #fff;
}
</style>

<p id="border-top">This is my content</p>

А внизу:

<style>

      #border-bottom {
      border-top: 1px solid  #ccc;
      box-shadow: 0 1px 0 #fff;
    }
</style>

    <p id="border-bottom">This is my content</p>

Сподіваюся, що це допомагає.


6

Замість використання непідтримуваних та проблемних контурів просто використовуйте

  • background-color + відступ для внутрішньої межі
  • нормальна межа для зовнішньої.

Приклад:

HTML:

<img src="http://cdn3.thumbs.common.smcloud.net/common/8/6/s/863444wpPN.jpg/r-0,500-n-863444wpPN.jpg" alt="malkovich" />

CSS:

img {
    padding: 1px;
    background: yellow;
    border:1px solid black;
}

ТЕСТ (JSFiddle) :


Працює добре, але лише якщо у вас є вміст із фоном.
Кульме

4

Якщо під "тисненням" ви маєте на увазі дві межі навколо один одного двома різними кольорами, є outlineвластивість ( outline-left, outline-right....), але воно погано підтримується в сімействі IE (а саме, IE6 та 7 взагалі не підтримують його) ). Якщо вам потрібні дві межі, найкраще буде другий елемент обгортки.

Якщо ви маєте на увазі використання двох кольорів на одній межі. Використовуйте напр

border-right: 1px white solid;
border-left: 1px black solid;
border-top: 1px black solid;
border-bottom: 1px white solid;

border-stylesдля цього також є спеціальні ( ridge, outsetі inset), але, на мій досвід, вони, як правило, різняться в різних браузерах.


3
Я вважаю, що те, про що він просить, щось подібне, border : black white; що означає визначення двох різних кольорів для однієї межі, яка виглядає послідовно одночасно.
Тарік

1
@Braveyard ах, я розумію. Теоретично це було б можливим із використанням, outlineале це не буде добре працювати в IE <8
Pekka,

3
Зверніть увагу, що існує лише контур ... на жаль, немає такого поняття, як контур ліворуч, контур праворуч, контур зверху чи контур унизу.
Девід Шеррет,

-1

Неможливо, але слід перевірити, чи border-styleзначення, наприклад inset, outsetчи якісь інші, досягли бажаного ефекту .. ( я сумніваюся в цьому .. )

CSS3 має властивості border-image , але я ще не знаю про підтримку браузерів (докладніше на http://www.css3.info/preview/border-image/ ).


У світі програмування немає нічого неможливого: P ну мені подобається робити це твердження весь час :)
Тарік,


-1

Ви можете використовувати

<html>
<head>
<title>Two Colors</title>
<style type="text/css">

.two-colors {
background: none repeat scroll 0% 0% rgb(245, 245, 245); border-color: rgba(111,111,111,0.2) transparent;
 padding: 4px; outline: 1px solid green;
}

</style>

<style type="text/css">
      body {
        padding-top: 20px;
        padding-bottom: 40px;
        background-color:yellow;        
      }
    </style>

</head>
<body>
<a target="_blank" href="people.htm">
  <img class="two-colors" src="people.jpg" alt="Klematis" width="213" height="120" />
  </a>

</body>
</html>

-2

Це дає приємний ефект.

<div style="border: 1px solid gray; padding: 1px">
<div style="border: 1px solid gray">
   internal stuff
</div>
</div>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.