CSS 小技巧

一、边框内圆角

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

#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-shadow 和 outline 属性,具体属性参见MDN。

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

1.<inset>

2.<offset-x> <offset-y>

3.<blur-radius>

4.<spread-radius>

5.<color>

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

box-shadow: 0 0 0 10px rgb(255, 187, 51);
outline: 10px solid rgb(255, 187, 51);

  

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

二、条纹背景

如何使用CSS来实现条纹?

使用  linear-gradient 属性实现

#stripe {
width: 400px;
height: 200px;
background: linear-gradient(rgb(255, 187, 51), rgb(85, 136, 187));
}

  

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

background: linear-gradient(rgb(255, 187, 51) 50%, rgb(85, 136, 187) 50%);

  

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

background-size: 100% 40px;

  

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

background: linear-gradient(rgb(255, 187, 51) 60%, rgb(85, 136, 187) 0);

  

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

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
);

  

垂直条纹

background: linear-gradient(to right, rgb(255, 187, 51) 60%, rgb(85, 136, 187) 0);

  

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

斜条纹

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;

  

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

background-size: 42px 42px;

  

介绍 linear-gradient 的升级版 :  repeating-linear-gradient

可以试着使用 linear-gradient 和 repeating-linear-gradient 实现同样的60°斜条纹进行对比

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 属性可以很轻松的创建一个平行四边形

#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);
}
}

  

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

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

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

#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;
}
}

  

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

.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)

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

transform: perspective(200px) rotateX(30deg);

  

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

.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 属性,控制转动轴

transform-origin: bottom;

  

2、通过 scale3d 属性而非 padding 属性来修正视觉大小,同时兼顾了优雅降级

transform: perspective(200px) rotateX(30deg) scaleY(2.25);

  

3、添加圆角、阴影、背景渐变

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);

  

4、改变 transform-origin 得到不同斜边的梯形

transform: perspective(200px) rotateX(10deg);
transform-origin: left;

  

缺点

斜边的角度依赖于元素的宽度。因此,当元素的内容长度不等时,想要得到斜度一致的梯形就不容易了。

3d 变换具体实现原理参见 matrix3d

四、阴影

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

#shadow {
width: 200px;
height: 100px;
background: rgb(255, 187, 51);
box-shadow: 240px 120px 0 0 red;
}

  

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

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

#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)
}
}

  

CSS 小技巧的更多相关文章

  1. css小技巧(1)

    1.-webkit-overflow-scrolling: touch; 解决ios滑动时无缓冲问题 2.::-webkit-scrollbar 设置ios滑动时是否显示滚动条 3.::selecti ...

  2. 常用的CSS小技巧

    实际开发过程中会遇到一些需要用CSS小技巧处理的布局问题,现在分享几个个人工作中遇到的小问题和解决方案. 1.inline元素间的空白间隙 这里要介绍一个神器font-size:0. 如果你写了个列表 ...

  3. 前端开发者应该知道的 CSS 小技巧

    一些小技巧让你的CSS技术更专业 使用:not()去除导航上不需要的边框 为body添加行高 垂直居中任何元素 逗号分离的列表 使用负nth-child选择元素 使用SVG图标 文本显示优化 在纯CS ...

  4. CSS 小技巧 | 一行代码实现头像与国旗的融合

    到国庆了,大家都急着给祖国母亲庆生. 每年每到此时,微信朋友圈就会流行起给头像装饰上国旗,而今年又流行这款: emm,很不错. 那么,将一张国旗图片与我们的头像,快速得到想要的头像,使用 CSS 如何 ...

  5. 模仿也是提高,纯css小技巧实现头部进度条

    刚开始的时候我也觉得不可能,但是就是这么神奇,总有大神给你意想不到的惊喜. 快来感受一下把.(仔细看看头部黄色条的变化) 思考一下啊,怎么出现的那,其实作者使用了一点小技巧,那就是背景色渐变和遮挡产生 ...

  6. Css 小技巧总结

    相对偏移 指定left top等属性就能够够完美控制一个元素的位置 如: position:relative; left:2px; 今天遇到一个很好玩的问题,当两个并排浮动框,当一个框的长度太大时就会 ...

  7. Web前端开发基础 第四课(CSS小技巧1)

    垂直居中-父元素高度确定的单行文本 父元素高度确定的单行文本的竖直居中的方法是通过设置父元素的 height 和 line-height 高度一致来实现的.如下代码: <div class=&q ...

  8. CSS小技巧使用

    1.清除浮动 浮动给我们的代码带来的麻烦,想必不需要多说,我们会用很多方式来避免这种麻烦,其中我觉得最方便也是兼容性最好的一种是....// 清除浮动 .clearfix{ zoom: 1; } .c ...

  9. css小技巧

    每逢大的灾难的时候,很多网站变成了灰色,如何让网站快速变灰?css代码是很简单的,用的是css的filter功能. html { filter: grayscale(100%);//IE浏览器 -we ...

随机推荐

  1. mysql 编译安装 window篇

    传送门 # mysql下载地址 https://www.mysql.com/downloads/ # 找到MySQL Community Edition (GPL) https://dev.mysql ...

  2. windows系统安装完后要做的事情

    完成之后 1.netplwiz关闭开机输入密码 2.这台电脑右击->属性->高级系统设置->高级->性能设置->高级->虚拟内存: 把C盘设为无分页文件,选择一个大 ...

  3. iptabes一条指令开放多个端口

    开放某个范围段内的端口: -A INPUT -p tcp -m state --state NEW -m tcp --dport 9001:9009 -j ACCEPT 开放多个不连续的端口: -A ...

  4. 浏览器对HTML5特性检測工具Modernizr

    近期在做公司移动端运营的项目,需求中多处地方都会涉及动画. 相信非常多前端开发都会有这样的感触,对CSS3中的动画属性非常熟悉,可是因为对动画运动过程的理解不深入,经常仅仅能望而止步.CSS3中动画这 ...

  5. 教程:Spagobi开源BI系统 Console报表设计教程

    Console Designer 1 Console Designer Console Designer 1.1 Introduction 1.2 Dataset Tab 1.3 Summary Pa ...

  6. HAVANA 团队简介

    在Ensembl 下载的gtf 文件中,会有一部分来源自 HAVANA havana 的全称叫做 human  and vertebrate analysis and annotation, 是sag ...

  7. windows 同时启动多个Tomcat 控制台日志(startup.bat)输出到指定文件中

    1 .修改startup.bat第42行 call "%EXECUTABLE%" start %CMD_LINE_ARGS% 为 call "%EXECUTABLE%&q ...

  8. [TF] Architecture - Computational Graphs

    阅读笔记: 仅希望对底层有一定必要的感性认识,包括一些基本核心概念. Here只关注Graph相关,因为对编程有益. TF – Kernels模块部分参见:https://mp.weixin.qq.c ...

  9. 5 -- Hibernate的基本用法 --6 深入Hibernate映射

    Hibernate提供三种方式将POJO变成PO类: 1. 使用持久化注解(以JPA标准注解为主,如果有一些特殊要求,则依然需要使用Hibernate本身提供的注解). 2. 使用JPA2 提供的XM ...

  10. HighCharts-highcharts resetZoom点击事件

    场景:zoom缩放功能: 选中x轴的一段区域后,需要解除x轴已设定的max值对zoom缩放功能的影响: 点击'reset zoom'后,又需要将max值重新赋值给x轴. 查遍highcharts ap ...