CSS-Verlaufsgrenzen

Guten Tag, liebe Chabrowiten. Ich präsentiere Ihnen die Übersetzung eines Artikels von Chris Koehr.

Nehmen wir an, Sie benötigen einen Verlaufsrand um ein bestimmtes Element. Und Sie denken so:

  • Hierfür gibt es keine einfache und offensichtliche CSS-API.
  • Ich mache einfach ein Wrapper-Element mit einem linearen Verlaufshintergrund, und dann blockiert das innere Element den größten Teil dieses Hintergrunds, mit Ausnahme einer dünnen Fülllinie um ihn herum.

Es wird ungefähr so ​​aussehen:

HTML

<div class="module-border-wrap"><div class="module"> Lorem ipsum dolor sit amet consectetur adipisicing elit. Vero pariatur corporis quaerat voluptatum eos tempora temporibus nisi voluptates sed, exercitationem sequi dolore culpa incidunt accusamus, quasi unde reprehenderit ea molestias. </div></div> 

SCSS

 body { height: 100vh; margin: 0; display: grid; place-items: center; background: #222; } .module-border-wrap { max-width: 250px; padding: 1rem; position: relative; background: linear-gradient(to right, red, purple); padding: 3px; } .module { background: #222; color: white; padding: 2rem; } 

Ergebnis


Wenn Ihnen die Idee eines Wrapper-Elements nicht gefällt, können Sie ein Pseudoelement verwenden, bis der negative Z-Index-Wert in Ordnung ist (dies würde nicht passieren, wenn viele übergeordnete Elementanhänge mit eigenem Hintergrund vorhanden wären).

Hier ist ein Beispiel für die Festlegung des Randradius durch Stephen Shaw:

HTML

 <div class="gradient-box"> <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent bibendum, lorem vel tincidunt imperdiet, nibh elit laoreet felis, a bibendum nisl tortor non orci. Donec pretium fermentum felis, quis aliquet est rutrum ut. Integer quis massa ut lacus viverra pharetra in eu lacus. Aliquam tempus odio adipiscing diam pellentesque rhoncus. Curabitur a bibendum est. </p> </div> 

SCSS

 .gradient-box { display: flex; align-items: center; //width: 50vw; width: 90%; margin: auto; max-width: 22em; position: relative; padding: 30% 2em; box-sizing: border-box; $border: 5px; color: #FFF; background: #000; background-clip: padding-box; /* !importanté */ border: solid $border transparent; /* !importanté */ border-radius: 1em; &:before { content: ''; position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: -1; margin: -$border; /* !importanté */ border-radius: inherit; /* !importanté */ background: linear-gradient(to right, red, orange); } } html { height: 100%; background: #000; display: flex; } body { margin: auto; } 

Ergebnis

Aber vergessen Sie nicht das border-image , möglicherweise die dümmste CSS-Eigenschaft aller Zeiten. Sie können es verwenden, um Verlaufsränder auch auf verschiedenen Seiten zu erhalten:

HTML

 <div class="module"> Lorem ipsum dolor sit amet consectetur adipisicing elit. Vero pariatur corporis quaerat voluptatum eos tempora temporibus nisi voluptates sed, exercitationem sequi dolore culpa incidunt accusamus, quasi unde reprehenderit ea molestias. </div> 

CSS

 body { height: 100vh; margin: 0; display: grid; place-items: center; background: #222; } .module { max-width: 250px; padding: 1rem; color: white; border-width: 3px; border-style: solid; border-image: linear-gradient( to bottom, red, rgba(0, 0, 0, 0) ) 1 100%; } 

Ergebnis

Die Verwendung von border-image und border-image-slice ist wahrscheinlich die einfachste Syntax zum Erstellen eines Verlaufsrahmens, aber leider nicht mit dem Rahmenradius kompatibel.

HTML

 <div> <div class="on-light"> <button class="border-gradient border-gradient-purple"> I have a gradient </button> </div> <div class="on-dark"> <button class="border-gradient border-gradient-purple"> I have a gradient </button> </div> <div class="on-light"> <button class="border-gradient border-gradient-green"> I have a gradient </button> </div> <div class="on-dark"> <button class="border-gradient border-gradient-green"> I have a gradient </button> </div> </div> 

SCSS

 button { background: none; text-decoration: inherit; font-family: system-ui; font-size: 1rem; padding: 1rem 2rem; } .border-gradient { border-image-slice: 1; border-width: 2px; } .border-gradient-purple { border-image: linear-gradient(to left, #743ad5, #d53a9d); } .border-gradient-green { border-image: linear-gradient(to left, #00C853, #B2FF59); } body { height: 100vh; margin: 0; display: flex; justify-content: center; align-items: center; > div { width: 100%; text-align: center; } > div > div { width: 100%; padding: 1rem; } } .on-dark { background: #222; button { color: white; } } 

Ergebnis

Source: https://habr.com/ru/post/de437310/


All Articles