纯CSS实现常见的UI效果

 前言

高明网站建设公司创新互联建站,高明网站设计制作,有大型网站制作公司丰富经验。已为高明上1000家提供企业网站建设服务。企业网站搭建\成都外贸网站制作要多少钱,请找那个售后服务好的高明做网站的公司定做!

切图仔,是大多数前端用来自嘲的称呼。相信很多人平时写页面的时候,大部分时间是在切图和排图,如此往复。这里并不是要否定切图本身,而是在质疑:一直切图到底对自己的功力增长有何好处?想想UI丢给你一套好看的界面,你却只需一个img标签,或者一个background-image属性即可搞定了它,但日后某个地方需要调整某些外观(颜色、文字等),你还不是会让UI再修改之前的素材,然后替换上去完事?这样就完全受制于UI,而无法发挥自己的能动性。

那么,如何打破这个僵局?很简单,如果你CSS玩的够溜,你就无需再进行那枯燥无比的切图工作,那些界面、元素都是通过你双手亲自缔造而成的,尽管创作它们可能会花一些功夫,但带来的回报也是巨大的,你不仅能够自由掌控你所创造出来的元素,而且能大幅提高自己的CSS功力。

在此之前

在用纯CSS实现这些效果之前,笔者先介绍几个常用的SCSS Mixin和一个得力武器,用它们来进行创作将会事半功倍

覆盖 - cover 

 
 
 
 
  1. @mixin cover($top: 0, $left: 0, $width: 100%, $height: 100%) {  
  2.   position: absolute;  
  3.   top: $top;  
  4.   left: $left;  
  5.   width: $width;  
  6.   height: $height;  

当你想在原先元素的基础上再“复制”一个元素,并将其覆盖在它身上时,你将会用到它

demo地址:https://codepen.io/alphardex/pen/GRjEoBZ

嵌入 - inset 

 
 
 
 
  1. @mixin inset($inset: 0) {  
  2.   position: absolute;  
  3.   top: $inset;  
  4.   left: $inset;  
  5.   right: $inset;  
  6.   bottom: $inset;  

同样地,这也是在原先元素基础上复制出一个元素,只不过这个元素位置和原先的元素相同,大小会基于原先的元素而增减。

举个例子,倘若你想创建多个半径不同的同心圆,这个Mixin将会很有帮助

aqua.css

aqua.css是笔者开源的一个优雅的、轻量级的CSS框架。里面有很多常用的组件以及常用的样式类,用它来写CSS体验将会非常爽

在codepen上,笔者准备了一个aqua.css模版,大家可以用它来进行CSS的创作

常见UI效果

条纹效果

2

首先,我们要抓住“边框”这个词,如何创作出一个特殊的边框呢?如果一般的CSS属性实现不了的话,可以考虑用伪元素来实现,思路如下:在原先的元素下方创建一个有条纹背景的伪元素,并保证原先元素覆盖住它就行,这样就模拟了边框的效果。

那么如何创建条纹背景呢?这里我们将使用repeating-linear-gradient来实现它 

 
 
 
 
  1.   
  2.     
  3.     Lorem ipsum...  
  4.   
  
  •   
     
     
     
     
    1. .border-stripe {  
    2.   --stripe-width: 0.5rem;  
    3.   --stripe-deg: -45deg;  
    4.   --stripe-color-1: var(--grey-color-1);  
    5.   --stripe-offset-1: 2px;  
    6.   --stripe-color-2: var(--skin-color-2);  
    7.   --stripe-offset-2: 1rem;  
    8.   --stripe-radius: 15px;  
    9.   --stripe-inset: calc(var(--stripe-width) * -1);  
    10.   &::before {  
    11.     @include inset(var(--stripe-inset));  
    12.     content: "";  
    13.     z-index: -1;  
    14.     background: repeating-linear-gradient(  
    15.       var(--stripe-deg),  
    16.       var(--stripe-color-1) 0 var(--stripe-offset-1),  
    17.       var(--stripe-color-2) 0 var(--stripe-offset-2)  
    18.     );  
    19.     border-radius: var(--stripe-radius);  
    20.   }  

    为了保证复用性,这里将其抽象成了border-stripe类,里面的值都可以通过CSS变量来动态调节

    demo地址:https://codepen.io/alphardex/pen/VwKWvdG

    光泽效果

    一看到光泽,相信你可能会想到一个关键角色——径向渐变,通过它,我们可以创作出放射状的图案,而光泽也恰好是放射状的,再根据背景可以叠加的特性,光泽效果就能轻松实现了 

     
     
     
     
    1.   
    2.     
    3.     Shine Button 1  
    4.     
    5.     
    6.     Shine Button 2  
    7.     
      
     
     
     
     
    1. :root {  
    2.   --blue-color-1: #08123d;  
    3.   --gold-color-1: #dcb687;  
    4.   --brown-color-1: #50301f;  
    5.   --brown-color-2: #936237;  
    6.   --gold-grad-1: radial-gradient(  
    7.       circle at 50% 5%,  
    8.       #{transparentize(white, 0.5)},  
    9.       #eba262  
    10.     ),  
    11.     #eba262;  
    12.   --gold-grad-2: linear-gradient(88deg, #e7924e 0%, #f8ffee 50%, #e7924e 100%);  
    13.   --blue-grad-1: radial-gradient(  
    14.       circle at 50% 5%,  
    15.       #{transparentize(white, 0.8)},  
    16.       #091344  
    17.     ),  
    18.     #091344;  
    19.   --primary-color: var(--blue-grad-1);  
    20.   --info-color: var(--gold-grad-1);  
    21. }  
    22. .btn {  
    23.   &-primary {  
    24.     border: 4px solid var(--gold-color-1);  
    25.     span {  
    26.       background-image: var(--gold-grad-2);  
    27.     }  
    28.   }  
    29.   &-info {  
    30.     color: var(--brown-color-1);  
    31.     border: none;  
    32.   }  
    33.   &-depth {  
    34.     box-shadow: 0 -5px 0 var(--brown-color-2);  
    35.   }  

    demo地址:https://codepen.io/alphardex/details/vYXZNez

    不规则形状

    首先,让我们先观察一下上图的缎带形状是由哪些基本形状组成的:中间是一个矩形,矩形下方有2个三角形,左右2侧各有一个被裁切过的矩形。一提裁切,就能想到clip-path这个属性,于是问题也就很好解决了 

     
     
     
     
    1.   
    2.   Pure CSS Ribbon  
    3.     
    4.     
    5.     
    6.     
    7.   
     
     
     
     
    1. .ribbon {  
    2.   --ribbon-color-1: var(--yellow-color-1);  
    3.   --ribbon-color-2: var(--yellow-color-2);  
    4.   --ribbon-color-3: var(--yellow-color-3);  
    5.   position: relative;  
    6.   padding: 0.5rem 1rem;  
    7.   color: white;  
    8.   background: var(--ribbon-color-1);  
    9.   .block {  
    10.     &:nth-child(1),  
    11.     &:nth-child(2) {  
    12.       position: absolute;  
    13.       bottom: -20%;  
    14.       width: 20%;  
    15.       height: 20%;  
    16.       background: var(--ribbon-color-2);  
    17.       clip-path: polygon(0 0, 100% 100%, 100% 0);  
    18.     } 
    19.     &:nth-child(1) {  
    20.       left: 0;  
    21.     }  
    22.     &:nth-child(2) {  
    23.       right: 0;  
    24.       transform: scaleX(-1); 
    25.     }  
    26.     &:nth-child(3),  
    27.     &:nth-child(4) {  
    28.       position: absolute;  
    29.       z-index: -1;  
    30.       top: 20%;  
    31.       width: 40%;  
    32.       height: 100%;  
    33.       background: var(--ribbon-color-3);  
    34.       clip-path: polygon(0 0, 25% 50%, 0 100%, 100% 100%, 100% 0);  
    35.     }  
    36.     &:nth-child(3) {  
    37.       left: -20%;  
    38.     }  
    39.     &:nth-child(4) {  
    40.       right: -20%;  
    41.       transform: scaleX(-1);  
    42.     }  
    43.   } 

    注意到有一行代码transform: scaleX(-1);,这起到了水平翻转的作用,它可以防止再写一遍clip-path

    demo地址:https://codepen.io/alphardex/pen/OJRvaaR

    浮雕效果

    通过仔细观察,你会发现这是由2个同心的元素组成的,于是自然就想到了inset这个Mixin。

    创建了2个同心元素后,就要想办法来创建它们的浮雕光泽了。这里的光泽可以用box-shadow来实现,通过叠加多重阴影,我们就能模拟出浮雕的效果了 

     
     
     
     
    1.   
    2.   浮雕按钮  
    3.   
     
     
     
     
    1. :root {  
    2.   --red-color-1: #af2222;  
    3.   --red-color-2: #c1423e;  
    4.   --red-color-3: #c62a2a;  
    5.   --red-color-4: #951110;  
    6.   --green-color-1: #486433;  
    7.   --green-color-2: #2b361a;  
    8.   --red-grad-1: linear-gradient(  
    9.     to right,  
    10.     var(--red-color-1) 50%,  
    11.     var(--red-color-2) 0  
    12.   );  
    13. }  
    14. .embossed {  
    15.   --emboss-radius: 1rem;  
    16.   --emboss-out: 6px;  
    17.   --emboss-out-minus: calc(var(--emboss-out) * -1);  
    18.   --emboss-inset: 2px;  
    19.   --emboss-inset-minus: calc(var(--emboss-inset) * -1);  
    20.   --emboss-blur: 1px;  
    21.   --emboss-bg-1: var(--red-color-3);  
    22.   --emboss-bg-2: var(--green-color-1);  
    23.   --emboss-color-1: white;  
    24.   --emboss-color-2: var(--red-color-4);  
    25.   --emboss-color-3: var(--green-color-2);  
    26.   position: relative;  
    27.   box-sizing: border-box;  
    28.   white-space: nowrap;   
    29.   &::before {  
    30.     @include inset(var(--emboss-out-minus));  
    31.     content: "";  
    32.     background: var(--emboss-bg-1);  
    33.     box-shadow: inset var(--emboss-inset-minus) var(--emboss-inset-minus)  
    34.         var(--emboss-blur) var(--emboss-color-1),  
    35.       inset var(--emboss-inset) var(--emboss-inset) var(--emboss-blur) 
    36.         var(--emboss-color-2);  
    37.     border-radius: calc(var(--emboss-radius) + var(--emboss-out));  
    38.   }  
    39.   &::after {  
    40.     @include inset;  
    41.     @include flex-center;  
    42.     content: attr(data-text);  
    43.     color: white;  
    44.     font-weight: bold;  
    45.     background: var(--emboss-bg-2);  
    46.     box-shadow: inset var(--emboss-inset) var(--emboss-inset) var(--emboss-blur)  
    47.         var(--emboss-color-1),  
    48.       inset var(--emboss-inset-minus) var(--emboss-inset-minus)  
    49.         var(--emboss-blur) var(--emboss-color-3); 
    50.     border-radius: var(--emboss-radius);  
    51.   }  

    demo地址:https://codepen.io/alphardex/pen/poEEERM?editors=0110

    课后作业

    尝试用纯CSS来实现下图的效果,不准切图哦~

    我的方案:https://codepen.io/alphardex/pen/gOweBBE 

    分享名称:纯CSS实现常见的UI效果
    URL标题:http://www.gawzjz.com/qtweb/news5/199955.html

    网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

    猜你还喜欢下面的内容

    品牌网站建设知识

    同城分类信息