css3画热咖啡
<!DOCTYPE html>
<html lang=“en”>
<head>
<meta charset="UTF-8”>
<title></title>
<style lang=“”>
.tea-cup-container {
margin: 0 auto;
padding: 0;
height: 80vh;
aspect-ratio: 1/2;
resize: both;
overflow: auto;
background-color: #607d8b;
display: flex;
flex-direction: column;
justify-content: flex-end;
align-items: center;
}
.tea-cup-container * {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.tea-cup-container .frame {
position: relative;
padding: 1rem;
width: 90%;
aspect-ratio: 1/1;
display: flex;
justify-content: flex-start;
align-items: center;
flex-direction: column-reverse;
}
.tea-cup-container .cup {
position: relative;
width: 56%;
aspect-ratio: 1;
border-bottom-left-radius: 45%;
border-bottom-right-radius: 45%;
background: linear-gradient(to right, #f9f9f9, #d9d9d9);
}
.tea-cup-container .top {
width: 100%;
border-radius: 50%;
aspect-ratio: 14/3;
margin-top: -10.7%;
background: linear-gradient(to right, #f9f9f9, #d9d9d9);
display: flex;
align-items: center;
justify-content: center;
}
.tea-cup-container .circle {
width: 92.9%;
height: 83.3%;
border-radius: 50%;
background: linear-gradient(to left, #f9f9f9, #d9d9d9);
overflow: hidden;
}
.tea-cup-container .tea {
background: linear-gradient(#c57e65, #e28462);
width: 100%;
height: 100%;
border-radius: 50%;
margin-top: 7.1%;
}
.tea-cup-container .handle {
width: 35%;
aspect-ratio: 5 / 9;
margin-left: auto;
margin-right: -30%;
margin-top: -2%;
}
.tea-cup-container .handle path {
fill: #dcdcdc;
}
.tea-cup-container .handle>svg {
width: 100%;
height: 100%;
}
.tea-cup-container .plate {
position: relative;
background: green;
margin-top: -32%;
width: 100%;
aspect-ratio: 5 / 2;
background: linear-gradient(to right, #f9f9f9, #e7e7e7);
border-radius: 50%;
box-shadow: 0 35px 35px rgba(0, 0, 0, 0.2);
}
.tea-cup-container .plate::before {
content: ‘’;
position: absolute;
top: 3%;
left: 2%;
right: 2%;
bottom: 3%;
border-radius: 50%;
background: linear-gradient(to left, #f9f9f9, #e7e7e7);
}
.tea-cup-container .plate::after {
content: ‘’;
position: absolute;
top: 6%;
left: 6%;
right: 6%;
bottom: 6%;
border-radius: 50%;
background: radial-gradient(rgba(0, 0, 0, 0.2) 25%, transparent, transparent);
}
.tea-cup-container .vapour {
position: absolute;
width: 100%;
display: flex;
justify-content: space-between;
z-index: 1;
padding: 0 7%;
/* background-color: rgba(0, 255, 0, 0.5); */
}
.tea-cup-container .vapour span {
position: relative;
bottom: 0px;
display: block;
margin-top: 0px;
margin-bottom: 16.7%;
width: 6%;
aspect-ratio: 1 / 9;
background: white;
border-radius: 50%;
opacity: 0;
filter: blur(10px);
animation: vapour-animate 5s linear infinite;
animation-delay: calc(var(--i) * -0.5s);
}
@keyframes vapour-animate {
0% {
transform: translateY(0) scaleX(1) rotate(0deg);
}
15% {
opacity: 1;
}
50% {
transform: translateY(-125%) scaleX(5) rotate(calc((var(--i) - 10) * -2deg));
}
95% {
opacity: 0;
}
100% {
transform: translateY(-250%) scaleX(10) rotate(calc((var(--i) - 10) * 2deg));
opacity: 0;
}
}
</style>
</head>
<body>
<div class="tea-cup-container”>
<div class=“frame”>
<div class=“plate”>
</div>
<div class=“cup”>
<div class=“top”>
<div class=“vapour”>
<span style="--i: 6;"></span>
<span style="--i: 13;"></span>
<span style="--i: 7;"></span>
<span style="--i: 18;"></span>
<span style="--i: 3;"></span>
<span style="--i: 20;"></span>
<span style="--i: 14;"></span>
<span style="--i: 17;"></span>
<span style="--i: 12;"></span>
<span style="--i: 4;"></span>
<span style="--i: 9;"></span>
<span style="--i: 19;"></span>
<span style="--i: 8;"></span>
<span style="--i: 2;"></span>
<span style="--i: 11;"></span>
<span style="--i: 15;"></span>
<span style="--i: 1;"></span>
<span style="--i: 10;"></span>
<span style="--i: 16;"></span>
<span style="--i: 5;"></span>
</div>
<div class=“circle”>
<div class="tea"></div>
</div>
</div>
<div class=“handle”>
<svg viewBox="0 0 5 9”>
<path d="M 0 9 C 4 9 7 0 0 0 M 0 1 C 5 1 3 8 0 8 Z"></path>
</svg>
</div>
</div>
</div>
</div>
<script>
</script>
</body>
</html>
css自适应布局方案
一、百分比布局宽度百分比,高度px布局
二、rem布局①自定义rem尺寸
//方式一
const deviceWidth = document.documentElement.clientWidth || document.body.clientWidth;
document.querySelector('html').style.fontSize = deviceWidth / 7.5 + ‘px’;
//方式二
document.documentElement.style.fontSize = document.documentElement.clientWidth / 7.5 + “px”;
window.addEventListener(
“resize”,
function() {
document.documentElement.style.fontSize =
document.documentElement.clientWidth / 7.5 + “px”;
},
false
);
//方式一和方式二 效果一样
②采用插件
常用插件:
amfe/lib-flexible(已停用) https://github.com/amfe/lib-flexible
gitHub官网也推荐使用viewport布局,毫无疑问,viewport布局是目前最好的。
amfe-flexible教程如下:
安装:
npm install amfe-flexible —save
npm install postcss-pxtorem --save-dev
在main.js中引入:
import'amfe-flexible’
3.配置postcss-pxtorem
vue-cli3配置方式:在根路径下新增postcss.config.js文件
module.exports = {
"plugins": {
"postcss-pxtorem": {
rootValue: 192, // 根据设计图尺寸写,设计图是1920,就写192
propList: ['*'], // 需要被转换的属性
selectorBlackList: [] // 不进行px转换的选择器
}
}
}
三、viewport方案
该方案就是使用vw、vh为单位来布局。
在vue中可以使用插件,将px自动装维vw。
1、插件安装 :
npm i postcss-px-to-viewport -D
2.在项目根目录下添加.postcssrc.js文件
//添加如下配置:
module.exports = {
plugins: {
autoprefixer: {}, // 用来给不同的浏览器自动添加相应前缀,如-webkit-,-moz-等等
"postcss-px-to-viewport": {
unitToConvert: "px", // 要转化的单位
viewportWidth: 750, // UI设计稿的宽度
viewportHeight: 1334, // 视窗的高度 根据750设备的宽度来指定,一般指定1334,也可以不配置
unitPrecision: 3, // 转换后的精度,即小数点位数
propList: ["*"], // 指定转换的css属性的单位,*代表全部css属性的单位都进行转换
viewportUnit: "vw", // 指定需要转换成的视窗单位,默认vw
fontViewportUnit: "vw", // 指定字体需要转换成的视窗单位,默认vw
selectorBlackList: ["wrap", ".ignore-class"], // 指定不转换为视窗单位的类名,这里设置了两个不需要转换的class类名
minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换
mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false
replace: true, // 是否转换后直接更换属性值
exclude: [/node_modules/], // 设置忽略文件,用正则做目录名匹配
landscape: false // 是否处理横屏情况
},
'postcss-viewport-units': {}, // 给vw、vh、vmin和vmax做适配的操作,这是实现vw布局必不可少的一个插件
}
};
propList用法展示:
propList: ["!font-size"],这表示:所有css属性的属性的单位都进行转化,除了font-size的其他所有属性。
3、兼容vant
vant的ui稿是375px,再使用的时候我们可以以动态设置vant中的desiginWidth为375。
//配置如下:
module.exports = ({ file }) => {
const designWidth = file.dirname.includes('node_modules/vant') ? 375 : 750;
return {
plugins: {
autoprefixer: {}, // 用来给不同的浏览器自动添加相应前缀,如-webkit-,-moz-等等
"postcss-px-to-viewport": {
unitToConvert: "px", // 要转化的单位
viewportWidth: designWidth, // UI设计稿的宽度
// 视窗的高度 根据750设备的宽度来指定,一般指定1334,也可以不配置
viewportHeight: 1334,
unitPrecision: 3, // 转换后的精度,即小数点位数
propList: ["*"], // 指定转换的css属性的单位,*代表全部css属性的单位都进行转换
viewportUnit: "vw", // 指定需要转换成的视窗单位,默认vw
fontViewportUnit: "vw", // 指定字体需要转换成的视窗单位,默认vw
// 指定不转换为视窗单位的类名,这里设置了两个不需要转换的class类名
selectorBlackList: ["wrap", ".ignore-class”],
minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换
mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false
replace: true, // 是否转换后直接更换属性值
exclude: [/node_modules/], // 设置忽略文件,用正则做目录名匹配
landscape: false // 是否处理横屏情况
},
// 给vw、vh、vmin和vmax做适配的操作,这是实现vw布局必不可少的一个插件
'postcss-viewport-units': {},
}
}
}
四、移动端调试插件vConsole
npm install vconsole --save-dev
// 在main.js中使用
import Vconsole from ‘vconsole’
let vConsole = new Vconsole()
Vue.use(vConsole)
插件效果如下,会在右下角出现console按钮,方便查看控制台:
1111css实现按钮冷光效果
效果一
111<!DOCTYPE html>
<html lang=“en”>
<head>
<meta charset="UTF-8”>
<meta http-equiv="X-UA-Compatible" content="IE=edge”>
<meta name="viewport" content="width=device-width, initial-scale=1.0”>
<title>Document</title>
<style lang=“”>
*{ /*清除样式*/
margin: 0;
padding: 0;
}
body{
/* 设置整体背景颜色 */
background-color: #000;
}
a{ /*去掉下划线*/
text-decoration: none;
/* 绝对定位,东西放在那就不动了 */
position: absolute;
/* 下面三个实现彻底居中,left和top是以左上角为原点,所以不是中心,用translate实现自身移动50% */
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
/* 设置字体大小 */
font-size: 24px;
/* 实现渐变色,90deg表示一个角度开始 */
background: linear-gradient(90deg,#03a9f4,#f441a5,#ffeb3b,#03a9f4);
/* 背景色放大 */
background-size: 400%;
/* 图形大小 */
width: 400px;
height: 100px;
/* 行高 */
line-height: 100px;
/* 文本居中 */
text-align: center;
/* 字体颜色 */
color: #fff;
/* 字母变大写 */
text-transform: uppercase;
/* 设置成胶囊状 */
border-radius: 50px;
/* 值为正数在上面显示,反之 */
z-index: 1;
}
/* 设置发光 */
a::before{
content: “”;
position: absolute;
/* 设置发光范围 */
left: -5px;
right: -5px;
top: -5px;
bottom: -5px;
/* 设置发光颜色 */
background: linear-gradient(90deg,#03a9f4,#f441a5,#ffeb3b,#03a9f4);
background-size: 400%;
border-radius: 50px;
/* filter实现高斯模糊 */
filter: blur(20px);
z-index: -1;
}
a:hover::before{
animation: sun 8s infinite;
}
/* 鼠标经过产生的效果 */
a:hover{
/* 产生8秒的效果,sun是名称*/
animation: sun 8s infinite;
}
/* 设置流光 */
@keyframes sun{
100%{
/* 以x轴为基准向左移动4个自身大小 */
background-position: -400% 0;
}
}
</style>
</head>
<body>
<a href="#">sunbutton</a>
</body>
</html>
CSS3实现雷达特效
<!DOCTYPE html>
<html lang=“en”>
<head>
<meta charset="UTF-8”>
<meta http-equiv="X-UA-Compatible" content="IE=edge”>
<meta name="viewport" content="width=device-width, initial-scale=1.0”>
<title>雷达</title>
<style>
.radar {
overflow: hidden;
position: relative;
margin: 200px;
width: 200px;
height: 200px;
border-radius: 50%;
background: #fff;
border: 1px solid #5ef2ff;
box-sizing: border-box;
}
.radar::before {
width: 100px;
height: 200px;
content: ‘’;
display: block;
position: absolute;
right: 0;
top: 0;
box-sizing: border-box;
border-left: 1px solid #5ef2ff;
}
.radar::after {
width: 200px;
height: 100px;
content: ‘’;
display: block;
box-sizing: border-box;
border-bottom: 1px solid #5ef2ff;
}
.fan {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border-radius: 50%;
box-sizing: border-box;
border: 1px solid #5ef2ff;
width: 100px;
height: 100px;
}
.fan::after {
content: “”;
width: 100px;
height: 100px;
display: block;
box-sizing: border-box;
position: relative;
top: -50%;
right: -50%;
transform-origin: 0% 100%;
border-bottom: 3px solid transparent;
/* border-image: linear-gradient(to right, transparent, #5ef2ff); */
border-image-slice: 3;
background: transparent;
background-image: linear-gradient(to right, transparent, #9bfdfd);
animation: rotateAnimate 2s linear infinite;
}
@keyframes rotateAnimate {
from {
transform: rotate(0deg) skew(-10deg)
}
to {
transform: rotate(360deg) skew(-10deg)
}
}
</style>
</head>
<body>
<div class=“radar”>
<div class="fan"></div>
</div>
</body>
</html>
grid布局
网格布局有很多用处,主要用来快速搭建页面目录结构。
先设置一个html布局。
<div class=“wrapper”>
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
</div>
一、容器元素
容器元素有如下几个属性:
大致可以划分为
// 设置容器为网格模式
display: grid;
// 设置网格
grid-template(grid-template-columns与grid-template-rows的缩写)
grid-template-columns
grid-template-rows
repeat
auto-fill
fr
grid-template-areas
// 设置网格线
grid-gap
grid-column-gap
grid-row-gap
首先设置父级元素为grid布局:
.wrapper {
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px;
grid-column-gap: 10px;
grid-row-gap: 20px;
}
1、grid-template
grid-template是grid-template-columns与grid-template-rows的缩写形式。
grid-template-columns 分别设置列数和对应列宽度(grid-template-rows同理)。比如上面意味着设置三列,每一列都是100px;
可以简写为:grid-template: 100px 100px 100px / 100px 100px 100px;
设置好容器元素后,项目元素会按照容器设置的行、列和宽高依次排列下去。一旦项目数量大于设置的网格数量(例如上面的容器元素设置了3×3的网格,而项目数量大于9或者位置超出网格区域的话,项目不会再遵从网格中的设置)。
grid-template-columns和 grid-template-rows还存在几个关键字,用来快速设置grid属性,如下:
repeat
auto-fill
fr
minmax
auto
下面我们来一一看一下:
1)repeat()
repeat有两种用法:
一种用法为:
grid-template-columns: repeat(m, n);
repeat可以接受两个参数:m是重复的次数,n 是重复的值。
比如grid-template-columns:repeat(4, 25%); 表示为设置为4列,每列宽度是25%;
另外一种用法是:
grid-template-columns: repeat(2, 10px 20px 30px);表示为按照 后边的这种宽度模式重复两次(即6 列,宽度依次 10、20、30、10、20、30)
2)auto-fill
当容器元素宽度不确定,而项目元素宽度知晓的情况下,设置auto-fill属性。
用法为:
grid-template-columns: repeat(auto-fill, 50px);
上面意思为网格每一列宽度都为50,项目自动填充。
3)fr
fr关键字是用来行、列的比例结构的。
例如:
// html
<div class=“wrapper”>
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
// css
.wrapper {
display: grid;
width: 500px;
height: 500px;
border: 1px solid #000;
grid-template-columns: 1fr 1fr 2fr;
}
可以得到三个项目宽度比例为1:1:2,盛满容器元素。
大概样子如下:
2、grid-gap
grid-gap用来设置网格线的宽度。
grid-column-gap表示列之前的网格线宽度(也可以简单理解为列内容之前的间距)。
grid-row-gap为行之前网格线的宽度。
3、grid-template-areas
4、网格线名称
网格线可以设置自己的名称,用来单独操作,用法如下:
.container {
display: grid;
grid-template-columns: [c1] 100px [c2] 100px [c3] 100px [c4];
grid-template-rows: [r1] 100px [r2] 100px [r3] 100px [r4];
}
上面代码,我们为一个3×3的网格的横竖各4条网格线设置了名称。如图
111下面我们通过引用网格线名称来改变项目的位置:
.item:first-child {
grid-area: r1/c1/r3/c3;
}
得到如下结构:
111也可以这样设置,但是不够简便:
.item:first-child {
/* grid-area: r1/c1/r3/c3; */
grid-row-start: r1;
grid-row-end: r3;
grid-column-start: c1;
grid-column-end: c3;
}
二、项目元素
设置九宫格中项目元素样式(填充一下颜色,便于观看)的样式如下:
.item {
padding: 20px;
background: #ddd;
text-align: center;
}
得到如下九宫格:
1111、grid-area
可以单独为项目设置位置,我习惯用grid-area来设置。
grid-area 是grid-row
与 grid-column
的简写。
我们可以设置项目元素的位置,例如第一个元素设置为:
.item:first-child {
background: green;
grid-area: 1/2/2/3;
}
得到如下结构:
grid-area的四个数字分别代表:
模块左上角起始行号
模块左上角起始列号
模块右下角结束行号
模块右下角结束列号
从这也看到项目9脱离了网格。
三、用处实践
简单列举grid布局几个常用的地方:
1、网格布局
例如element-ui的栅格布局等,传统的有24栅格布局、16栅格布局
采用grid的写法非常简单:
grid-template-columns: repeat(16, 1fr);
将页面分为了16列。
2、后台项目布局
运营后台一类的项目,设置header、aside、content
3、异形结构
例如视频网站页面等
ps:常用后台项目布局如下:
<!DOCTYPE html>
<html lang=“en”>
<head>
<meta charset="UTF-8”>
<meta name="viewport" content="width=device-width, initial-scale=1.0”>
<title>Document</title>
<style>
.item {
background: #ddd;
text-align: center;
box-sizing: border-box;
}
html{
height: 100%;
}
body{
height: 100%;
margin: 0;
padding: 0;
}
.wrapper {
width: 100%;
height: 100%;
display: grid;
grid-template: 5% 90% 5%/ 15% 85%;
}
.item:first-child {
background: #ccc;
grid-area: 1/2/2/3;
}
.item:nth-child(2) {
grid-area: 1/1/4/2;
background: #666;
}
.item:nth-child(3) {
grid-area: 2/2/4/3;
}
</style>
</head>
<body>
<div class=“wrapper”>
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
</body>
</html>
我们可以得到如下的布局结构: header\aside\content;这是项目控制台布局的常用结构。
111
网友评论