前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Css 小技巧

Css 小技巧

作者头像
grain先森
发布2019-04-18 14:41:13
1K0
发布2019-04-18 14:41:13
举报
文章被收录于专栏:grain先森

在页面构建中,能明显提升页面显示质量的一些CSS小技巧。很多简洁美观的页面表现,可以使用CSS3代码即可实现,减少图片的使用

页面构建

一、边框内圆角

我们在设计例如按钮等控件的时候,会遇到这样的设计:只有内侧有圆角,而边框或者描边的四个角还是保持直角的形状,用以下代码可以轻松的实现。

边框内圆角

代码语言:javascript
复制
#wrapper {
    width: 200px;
    height: 80px;
    padding: 10px;
    background: rgb(255, 187, 51);
    #content {
        display: flex;
        justify-content: center;
        align-items: center;
        height: 100%;
        background: rgb(85, 136, 187);
        color: #fff;
        font-size: 14px;
        border-radius: 20px;
    }
}

这种解决方案需要使用到两个 dom 元素,那么如果只使用一个 dom 元素,应该怎么实现?这里需要用到 CSS 的两个属性: box-shadowoutline 属性,具体属性参见MDN

box-shadow属性有以下5个特性

  • <inset>
  • <offset-x> <offset-y>
  • <blur-radius>
  • <spread-radius>
  • <color>

这里我们将使用第四个属性 spread-radius 来填充效果当中的空白。同时利用 outline 的特性:描边不跟随边框绘制的特点来实现(因为不清楚这是不是一个bug,所以在将来的版本中可能会改变),具体代码如下。

代码语言:javascript
复制
box-shadow: 0 0 0 10px rgb(255, 187, 51);
outline: 10px solid rgb(255, 187, 51);

spread-radius

这种实现方式,对于边框的宽度和圆角的大小有一定的限制效果。仅当边框宽度 w 与圆角半径 r 存在 w ≥ (2-1)r 关系时才可实现.

二、条纹背景

如何使用CSS来实现条纹?

CSS实现条纹

使用 linear-gradient 属性实现

代码语言:javascript
复制
#stripe {
  width: 400px;
  height: 200px;
  background: linear-gradient(rgb(255, 187, 51), rgb(85, 136, 187));
}

linear-gradient属性实现

尝试修改 linear-gradient 属性,当linear-gradient属性

代码语言:javascript
复制
background: linear-gradient(rgb(255, 187, 51) 50%, rgb(85, 136, 187) 50%);

修改 linear-gradient 属性

因为条纹是由 background-image 属性生成的,因此当然也可以使用 background-size 属性来改变它的大小

代码语言:javascript
复制
background-size: 100% 40px;

使用 background-size 属性

如果某个色标的位置值比整个列表中在它之前的色标的位置值都要小,则该色标的位置值会被设置为它前面所有色标位置值的最大值。

代码语言:javascript
复制
background: linear-gradient(rgb(255, 187, 51) 60%, rgb(85, 136, 187) 0);

然后我们尝试创建一个三色条纹以及垂直条纹

三色条纹

代码语言:javascript
复制
background: linear-gradient(
    rgb(255, 187, 51) 33.3%, 
    rgb(85, 136, 187) 0, 
    rgb(85, 136, 187) 66.6%, 
    rgb(170, 255, 0) 0
);

垂直条纹

垂直条纹

代码语言:javascript
复制
background: linear-gradient(to right, rgb(255, 187, 51) 60%, rgb(85, 136, 187) 0);

默认值为 to bottom ,可以设置 to right; to left

斜条纹

斜条纹

代码语言:javascript
复制
background: linear-gradient(45deg, 
    rgb(255, 187, 51) 25%, 
    rgb(85, 136, 187) 0, 
    rgb(85, 136, 187) 50%, 
    rgb(255, 187, 51) 0%, 
    rgb(255, 187, 51) 75%, 
    rgb(85, 136, 187) 0
);
background-size: 30px 30px;

为了达到斜条纹等宽的视觉效果,需要运用到勾股定理来计算宽度。

代码语言:javascript
复制
background-size: 42px 42px;

介绍 linear-gradient 的升级版 : repeating-linear-gradient,可以试着使用 linear-gradientrepeating-linear-gradient 实现同样的60°斜条纹进行对比

代码语言:javascript
复制
background: linear-gradient(60deg,
    rgb(255, 187, 51), 
    rgb(255, 187, 51) 25%,
    rgb(85, 136, 187) 0, 
    rgb(85, 136, 187) 50%,
    rgb(255, 187, 51) 0, 
    rgb(255, 187, 51) 75%,
    rgb(85, 136, 187) 0, 
    rgb(85, 136, 187) 100%
);
background-size: 18px 31px;

background: repeating-linear-gradient(60deg,
    rgb(255, 187, 51), 
    rgb(255, 187, 51) 15px, 
    rgb(85, 136, 187) 0, 
    rgb(85, 136, 187) 30px
);

三、平行四边形和梯形

使用 transform 属性可以很轻松的创建一个平行四边形

平行四边形

代码语言:javascript
复制
#content {
    display: flex;
    justify-content: center;
    align-items: center;
    width: 200px;
    height: 80px;
    background: rgb(85, 136, 187);
    color: #fff;
    font-size: 14px;
    transform: skewX(-30deg);
    span {
        transform: skewX(30deg);
    }
}

缺点:需要两个元素、修改的话需要修改两个地方。

如何使用一个元素就实现这样的效果。

解决办法:将平行四边形的背景设置在伪元素上,对伪元素进行变形。

代码语言:javascript
复制
#content {
    position: relative;
    display: flex;
    justify-content: center;
    align-items: center;
    width: 120px;
    height: 60px;
    font-size: 18px;
    font-weight: 600;
    color: #fff;

    &::after {
        content: '';
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        transform: skewX(-30deg);
        background: rgb(85, 136, 187);
        z-index: -1;
    }
}

梯形的概念比平行四边形更加宽泛,只需要两条边平行即可。梯形常用于标签页,之前常用伪元素方法来实现一个梯形。

梯形

代码语言:javascript
复制
.trapezoid {
    position: relative;
    left: 200px;
    width: 400px;
    height: 180px;
    background: rgb(85, 136, 170);
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 48px;
    color: rgb(255, 255, 255);

    &::before,
    &::after {
        content: '';
        position: absolute;
    }

    &::before {
        position: absolute;
        top: 0;
        left: -100px;
        width: 0;
        height: 0;
        border-top: 180px solid transparent;
        border-bottom: 0 solid transparent;
        border-right: 100px solid rgb(255, 187, 51);
    }

    &::after {
        position: absolute;
        top: 0;
        right: -240px;
        width: 0;
        height: 0;
        border-top: 180px solid transparent;
        border-bottom: 0 solid transparent;
        border-left: 240px solid rgb(255, 187, 51);
    }
}

缺点:

  1. 把两个伪元素都使用了;
  2. 需要修改形状时,需要修改的方过多;
  3. 不能给梯形加边框、阴影;
  4. 不能设置成圆角梯形;

通过构造平行四边形的思想,对矩形进行变形。但是这次不采用 2d 平面的变形,而是 3d 平面变形,通过视觉差来构造一个梯形。

这里需要用到 transform 属性3d变换特性:

  1. perspective
  2. rotate3d (rotateX rotateY rotateZ)
  3. transform-origin
  4. scale3d (scaleX scaleY scaleZ)

实现一个最简单的梯形所需要的代码只有以下一行:

代码语言:javascript
复制
transform: perspective(200px) rotateX(30deg);

2d 变换不同,3d 内部变形是不可逆的,因此与构造平行四边形相似,我们也可以将图形的变形放在伪元素上。

最简单的梯形

代码语言:javascript
复制
.trapezoid {
    position: relative;
    left: 200px;
    width: 400px;
    height: 180px;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 48px;
    color: rgb(255, 255, 255);
    &::before {
        content: '';
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        background: rgb(85, 136, 170);
        transform: perspective(200px) rotateX(30deg);
        z-index: -1;
    }
}

优化

  1. 修改 transform-origin 属性,控制转动轴
代码语言:javascript
复制
transform-origin: bottom;
  1. 通过 scale3d 属性而非 padding 属性来修正视觉大小,同时兼顾了优雅降级
代码语言:javascript
复制
transform: perspective(200px) rotateX(30deg) scaleY(2.25);

修正视觉大小

  1. 添加圆角、阴影、背景渐变
代码语言:javascript
复制
background: linear-gradient(to right, rgb(85, 136, 170), rgb(255, 187, 51));
border-top-right-radius: 60px;
border-top-left-radius: 60px;
box-shadow: 10px 10px 10px 1px rgba(85, 136, 170, .2);
  1. 改变 transform-origin 得到不同斜边的梯形
代码语言:javascript
复制
transform: perspective(200px) rotateX(10deg);
transform-origin: left;

缺点 斜边的角度依赖于元素的宽度。因此,当元素的内容长度不等时,想要得到斜度一致的梯形就不容易了。3d 变换具体实现原理参见 matrix3d

四、阴影

投影首先会想到 box-shadow 这个属性,根据以上的介绍,我们可以轻松的做出一个元素的阴影

代码语言:javascript
复制
#shadow {
    width: 200px;
    height: 100px;
    background: rgb(255, 187, 51);
    box-shadow: 240px 120px 0 0 red;
}

那么如何针对一张图片实现其对应的阴影?在页面的例如头像显示会遇到这种效果

阴影

这里将会使用到CSS3里面的 filter 属性

代码语言:javascript
复制
#logo {
    position: relative;
    width: 200px;
    height: 200px;
    background: url('../img/logo.svg') no-repeat;
    &::after {
        content: '';
        position: absolute;
        top: 40px;
        left: 0;
        width: 100%;
        height: 100%;
        background: url('../img/logo.svg') no-repeat;
        background-size: 100% 100%;
        filter: blur(10px)
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.04.07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、边框内圆角
  • 二、条纹背景
  • 三、平行四边形和梯形
  • 四、阴影
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档