Bisakah Anda mengatur opacity perbatasan di CSS?

409

Apakah ada cara CSS lurus ke depan untuk membuat perbatasan elemen semi-transparan dengan sesuatu seperti ini?

border-opacity: 0.7;

Jika tidak, apakah ada yang tahu bagaimana saya bisa melakukannya tanpa menggunakan gambar?

mcbeav
sumber

Jawaban:

626

Sayangnya opacityelemen tersebut membuat keseluruhan elemen (termasuk teks apa saja) semi-transparan. Cara terbaik untuk membuat perbatasan semi-transparan adalah dengan format warna rgba. Misalnya, ini akan memberikan batas merah dengan opacity 50%:

div {
    border: 1px solid rgba(255, 0, 0, .5);
    -webkit-background-clip: padding-box; /* for Safari */
    background-clip: padding-box; /* for IE9+, Firefox 4+, Opera, Chrome */
}

Masalah dengan pendekatan ini adalah bahwa beberapa browser tidak memahami rgbaformat dan tidak akan menampilkan perbatasan sama sekali jika ini adalah keseluruhan deklarasi. Solusinya adalah dengan memberikan dua deklarasi perbatasan. Yang pertama dengan opacity palsu, dan yang kedua dengan yang sebenarnya. Jika browser mampu, itu akan menggunakan yang kedua, jika tidak, itu akan menggunakan yang pertama.

div {
    border: 1px solid rgb(127, 0, 0);
    border: 1px solid rgba(255, 0, 0, .5);
    -webkit-background-clip: padding-box; /* for Safari */
    background-clip: padding-box; /* for IE9+, Firefox 4+, Opera, Chrome */
}

Deklarasi perbatasan pertama akan menjadi warna yang setara dengan 50% perbatasan merah buram di atas latar belakang putih (meskipun setiap grafik di bawah perbatasan tidak akan berdarah).

UPDATE: Saya telah menambahkan "background-clip: padding-box;" untuk jawaban ini (sesuai saran SooDesuNe dalam komentar) untuk memastikan perbatasan tetap transparan bahkan jika warna latar belakang yang kuat diterapkan.

kingjeffrey
sumber
ya dan kemudian kita kembali ke masalah yang pertama kali dia alami ^^ "Saya berpikir tentang menggunakan rgba untuk warna perbatasan, tapi itu bekerja sangat buruk di browser modern." sementara solusi saya bekerja di hampir semua browser
Breezer
23
Sebenarnya, rgba bekerja sangat baik di browser modern (kecuali jika Anda berpikir IE6-8 adalah "modern").
kingjeffrey
4
Yah mereka seharusnya: P dan ketika Anda mendapat 50% + menggunakan mereka Anda harus memastikan bahwa itu bekerja untuk yaitu juga setidaknya untuk ie7 +
Breezer
42
Dan itulah mengapa ada "opacity palsu" jatuh kembali. Hidup saya sebagai desainer web menjadi jauh lebih mudah ketika saya menerima bahwa tidak setiap browser perlu di-render secara identik. Jika mereka mendukung border-radius, maka mereka mendapatkan sudut membulat. Jika tidak, mereka tidak melakukannya. Konten masih dapat diakses, masih terlihat baik, hanya saja terlihat lebih baik jika mereka menggunakan browser yang mampu. Saya tidak pernah punya satu klien mengeluh tentang ini dalam 1,5 tahun terakhir beroperasi dengan cara ini di setiap proyek.
kingjeffrey
23
Jika Anda mencoba untuk membuat konten di balik konten berbatasan Anda untuk bersinar (dan BUKAN warna latar belakang elemen berbatasan itu sendiri), Anda perlu mengatur background-clip:padding-box;juga.
SooDesuNe
134

Sangat mudah, gunakan bayangan padat dengan 0 offset:

#foo {
  border-radius: 1px;
  box-shadow: 0px 0px 0px 8px rgba(0,0,0,0.3);       
}

Juga, jika Anda menetapkan radius batas ke elemen, itu memberi Anda batas yang cukup bulat

Demo jsFiddle

masukkan deskripsi gambar di sini

Pedro L.
sumber
Ini akan selalu berhasil. Terima kasih untuk cuplikan :) Untuk semua orang, yang hanya ingin memiliki perbatasan ke satu atau lebih situs Anda harus mengubah dua parameter pertama seperti bayangan kotak: -1px -1px 0px 0px rgba (0,0,0,0.1 ) untuk mencapai eg border-top
Thomas Richter
Yang ini harus digunakan dengan hati-hati! box-shadowtidak memiliki ukuran dan dapat merusak tata letak Anda, membuat Anda margin tidak merata! jsfiddle.net/bj81hew7/2
William
14

Seperti yang disebutkan orang lain: CSS-3 mengatakan bahwa Anda dapat menggunakan rgba(...)sintaks untuk menentukan warna batas dengan nilai opacity (alpha).

inilah contoh cepat jika Anda ingin memeriksanya.

  • Ini bekerja di Safari dan Chrome (mungkin bekerja di semua browser webkit).

  • Ini berfungsi di Firefox

  • Saya ragu itu bekerja sama sekali di IE, tapi saya curiga ada beberapa filter atau perilaku yang akan membuatnya bekerja.

Ada juga posting stackoverflow ini , yang menunjukkan beberapa masalah lain - yaitu, bahwa perbatasan membuat di atas semua warna latar belakang (atau gambar latar belakang) yang telah Anda tentukan; dengan demikian membatasi kegunaan alpha perbatasan dalam banyak kasus.

Lee
sumber
4
Masalah perbatasan dapat disembuhkan dengan background-clip: padding-box;(dan sampai didukung, Anda dapat menggunakan ekstensi vendor -webkit dan -moz).
kingjeffrey
Saya telah menambahkan jawaban ini ke pertanyaan yang Anda tautkan.
kingjeffrey
6

Jika Anda memeriksa kode CSS dengan validator W3C, Anda akan melihat apakah kode CSS Anda dapat diterima, bahkan jika itu berfungsi di browser utama.

Membuat batas transparan melalui CSS, seperti yang tertulis di atas,

border: 1px solid rgba(255, 0, 0, .5);

tidak diterima oleh standar W3C, bahkan untuk CSS3. Saya menggunakan validator input langsung dengan kode CSS berikut,

.test { border: 1px solid rgba(255, 0, 0, .5); }

Hasilnya adalah,

Kesalahan Nilai: batas Terlalu banyak nilai atau nilai yang tidak dikenali: 1px solid rgba (255,0,0,0,5)

Sayangnya nilai alpha (huruf "a" di akhir "rgb") belum diterima oleh W3C sebagai bagian dari nilai warna perbatasan. Saya bertanya-tanya mengapa tidak dibakukan, karena ini bekerja di semua browser. Satu-satunya halangan adalah apakah Anda ingin tetap berpegang pada standar W3C atau menyingkir darinya untuk membuat sesuatu dalam CSS.

Untuk menggunakan validator CSS W3C online / Input Langsung .

Selalu merupakan ide bagus untuk menggunakan validator untuk memeriksa pekerjaan Anda, itu benar-benar membantu menemukan kesalahan kecil atau bahkan besar dalam pengkodean ketika Anda akan juling setelah berjam-jam pekerjaan pengkodean.

Mark2090
sumber
11
Salah, ini bisa diterima oleh standar W3C, dan merupakan bug di validator. Lihat jawaban ini . Ide bagus untuk menggunakan validator, ya, tapi jangan percaya untuk semuanya.
BoltClock
5

* Tidak sejauh yang saya tahu tidak ada yang biasanya saya lakukan dalam keadaan seperti ini adalah membuat blok di bawahnya dengan ukuran yang lebih besar ((berbatasan * 2) + ukuran asli) dan membuatnya transparan menggunakan

filter:alpha(opacity=50);
-moz-opacity:0.5;
-khtml-opacity: 0.5;
opacity: 0.5;

di sini adalah sebuah contoh

#main{
    width:400px;
    overflow:hidden;
    position:relative;
}
.border{
    width:100%;
    position:absolute;
    height:100%;
    background-color:#F00;
    filter:alpha(opacity=50);
    -moz-opacity:0.5;
    -khtml-opacity: 0.5;
    opacity: 0.5;
}
.content{
    margin:15px;/*size of border*/
    background-color:black;
}
<div id="main">
    <div class="border">
    </div>
    <div class="content">
        testing
    </div>
</div>

Memperbarui:

Jawaban ini sudah usang, karena setelah semua pertanyaan ini lebih dari 8 tahun. Hari ini semua browser terbaru mendukung rgba, bayangan kotak, dan sebagainya. Tapi ini adalah contoh yang layak bagaimana itu 8+ tahun yang lalu.

Breezer
sumber
Ya itulah yang akhirnya saya lakukan sebenarnya, itu hanya menyebalkan dengan posisi elemen.
mcbeav
menambahkan contoh sehingga Anda bisa melihat lebih jelas bagaimana saya berpikir :)
Breezer
itu bisa dilakukan - tetapi tidak dengan dukungan lintas-browser yang luas. Namun, kemungkinan bagus bahwa browser apa pun yang mendukung opacity css pada warna latar belakang juga akan mendukung rgba(...)dalam warna perbatasan. Anda dapat mencobanya di sini .
Lee
@ Lee, IE mendukung opacity "filter", tetapi tidak dalam bentuk rgba (sampai IE9).
kingjeffrey
2

Sebagai solusi alternatif yang mungkin berfungsi dalam beberapa kasus: ubah border-styleke dotted.

Memiliki kelompok piksel bergantian antara warna latar depan dan warna latar belakang tidak sama dengan garis kontinu piksel transparan sebagian. Di sisi lain, ini membutuhkan jauh lebih sedikit CSS dan jauh lebih kompatibel di setiap browser tanpa arahan khusus browser.

Stephan Samuel
sumber
0

Jawaban lain berhubungan dengan aspek teknis dari masalah opacity-perbatasan, sementara saya ingin menyajikan peretasan (hanya CSS murni dan HTML). Pada dasarnya buat div kontainer, memiliki div perbatasan dan kemudian div konten.

<div class="container">
  <div class="border-box"></div>
  <div class="content-box"></div>
</div>

Dan kemudian CSS: (atur batas konten ke tidak ada, urus pemosisian sedemikian rupa sehingga ketebalan perbatasan diperhitungkan)

.container {
  width: 20vw;
  height: 20vw;
  position: relative;
}
.border-box {
  width: 100%;
  height: 100%;
  border: 5px solid black;
  position: absolute;
  opacity: 0.5;
}
.content-box {
  width: 100%;
  height: 100%;
  border: none;
  background: green;
  top: 5px;
  left: 5px;
  position: absolute;
}
RBk
sumber
0

Tidak, tidak ada cara hanya mengatur opacity perbatasan dengan css.

Misalnya, jika Anda tidak tahu warnanya , tidak ada cara untuk hanya mengubah opacity perbatasan hanya dengan menggunakan rgba().

Travis J
sumber
-1

coba ini:

<h2>Snippet for making borders transparent</h2>
<div>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta.
    Mauris massa. Vestibulum lacinia arcu eget nulla. <b>Lorem ipsum dolor sit amet, consectetur adipiscing elit</b>. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales ligula in libero. Sed dignissim
    lacinia nunc. <i>Lorem ipsum dolor sit amet, consectetur adipiscing elit</i>. Curabitur tortor. Pellentesque nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed convallis tristique sem. Proin ut ligula vel nunc egestas porttitor.
    <i>Lorem ipsum dolor sit amet, consectetur adipiscing elit</i>. Morbi lectus risus, iaculis vel, suscipit quis, luctus non, massa. Fusce ac turpis quis ligula lacinia aliquet. Mauris ipsum. Nulla metus metus, ullamcorper vel, tincidunt sed, euismod
    in, nibh. Quisque volutpat condimentum velit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nam nec ante. Sed lacinia, urna non tincidunt mattis, tortor neque adipiscing diam, a cursus ipsum ante quis
    turpis. Nulla facilisi. Ut fringilla. Suspendisse potenti. Nunc feugiat mi a tellus consequat imperdiet. Vestibulum sapien. Proin quam. Etiam ultrices. <b>Nam nec ante</b>. Suspendisse in justo eu magna luctus suscipit. Sed lectus. <i>Sed convallis tristique sem</i>.
    Integer euismod lacus luctus magna. <b>Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos</b>. Quisque cursus, metus vitae pharetra auctor, sem massa mattis sem, at interdum magna augue eget diam. Vestibulum
    ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Morbi lacinia molestie dui. Praesent blandit dolor. Sed non quam. In vel mi sit amet augue congue elementum. Morbi in ipsum sit amet pede facilisis laoreet. Donec lacus nunc,
    viverra nec, blandit vel, egestas et, augue. Vestibulum tincidunt malesuada tellus. Ut ultrices ultrices enim. <b>Suspendisse in justo eu magna luctus suscipit</b>. Curabitur sit amet mauris. Morbi in dui quis est pulvinar ullamcorper. </p>
</div>
<div id="transparentBorder">
  This &lt;div&gt; has transparent borders.
</div>

Dan inilah CSS magis kami ..

* {
  padding: 10pt;
  font: 13px/1.5 Helvetica Neue, Arial, Helvetica, 'Liberation Sans', FreeSans, sans-serif;
}

b {
  font-weight: bold;
}

i {
  font-style: oblique;
}

H2 {
  font-size: 2em;
}

div[id='transparentBorder'] {
  height: 100px;
  width: 200px;
  padding: 10px;
  position: absolute;
  top: 40%;
  left: 30%;
  text-align: center;
  background: Black;
  border-radius: 4px;
  border: 10pt solid rgba(0, 0, 0, 0.5);
  -moz-background-clip: border;
  /* Firefox 3.6 */
  -webkit-background-clip: border;
  /* Safari 4? Chrome 6? */
  background-clip: border-box;
  /* Firefox 4, Safari 5, Opera 10, IE 9 */
  -moz-background-clip: padding;
  /* Firefox 3.6 */
  -webkit-background-clip: padding;
  /* Safari 4? Chrome 6? */
  background-clip: padding-box;
  /* Firefox 4, Safari 5, Opera 10, IE 9 */
  text-align: center;
  margin: 0;
  color: #fff;
  cursor: pointer;
}

Lihat Demo di sini.

A Malik
sumber