CUDA 10.1+Cudnn8.0.5 1.7.1版
pip install torch==1.7.1+cu101 torchvision==0.8.2+cu101 torchaudio==0.7.2 -f https://download.pytorch.org/whl/torch_stable.html 1.7.0版
pip install torch==1.7.0+cu101 torchvision==0.8.0+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html 1.6.0版
pip install torch==1.6.0+cu101 torchvision==0.7.0+cu101 -f https://download.pytorch.org/whl/torch_stable.html CUDA 11.1 1.8.0版
pip install torch==1.8.0+cu111 torchvision==0.9.0+cu111 torchaudio==0.8.0 -f https://download.pytorch.org/whl/torch_stable.html 可以采用阿里云的源文件加速,在上述代码后附上以下代码:
-i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com 测试torch能否用GPU
import torch
torch.version
torch.cuda.is_available()
输出True即可。
tensorflow-gpu安装
pip install -U tensorflow-gpu -i https://pypi.tuna.tsinghua.edu.cn/simple 测试
import tensorflow as tf tf.config.list_physical_devices('GPU') 输出为True
记录一下小错误
实例化类的时候,给类传参时报错takes no arguments,一种错误,网上基本都指出了
__init__ #正确 _init_ #错误 即问题出在初始化时候,__init__左右为两个下划线,有些地方因为排版问题只显示一个下划线,造成了误导。
第二种错误,我在练习的时候意外发现。我在写完代码后reformate code让其自动优化代码排版,不知道是哪里出了bug将我类下面的语句缩进全部减少了一个单位,导致类下面的语句都没有归入类中,看了半天才发现这个问题。
总而言之,这个报错基本是格式方面的错误,检查一下拼写格式基本可以排查。
给和我一样的菜鸟提供一点排错思路。
很多用户在购买电脑或者重装系统之后都会给电脑安装360安全卫士,其实360是一款知名的流氓软件,感觉进行了彻底的删除工作,其实还残留了很多。那Win10如何彻底删除360呢?下面小编就来给大家展示一下具体的办法。
2022新版Win10 64位系统下载_Windows10光盘映像(ISO文件)下载 - 系统之家
微软官方Win10专业版下载_Windows10光盘映像(iso文件)免费版下载 - 系统之家
Win10如何彻底删除360?
1、首先打开浏览器,点击右上角设置,打开“internet选项”。
2、接着在主页中输入一个新的主页,只要与360无关即可。
3、修改完成后,我们再打开左下角“设置”。
4、然后打开“应用”设置。
5、然后在其中找到“360软件”。
6、随后选中该软件,点击“卸载”。
7、最后点击“继续卸载”就可以彻底删除360了。
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入:digits = [1,2,3] 输出:[1,2,4] 解释:输入数组表示数字 123。 class Solution { public int[] plusOne(int[] digits) { int n = digits.length; int plus = 1; for(int i=n-1;i>=0;i--){ if((digits[i]+plus)==10){ digits[i] = 0; plus = 1; }else{ digits[i] = digits[i] + plus; plus = 0; } } if(digits[0]==0){ //考虑999的情况 digits = new int[n+1]; digits[0] = 1; } return digits; } }
centos7 离线安装 gcc
gcc 文件 链接:https://pan.baidu.com/s/1rUFw9xv5_0l3-oT3vI48Hw
提取码:jjyl
把下载好的gcc 文件放在 /usr/local 文件夹下
执行命令
#解压gcc tar -zxf gcc.tar.gz cd gcc #rpm安装gcc rpm -Uvh *.rpm --nodeps --force #检测gcc是否安装成功 gcc -v [root@vm-1649781257 gcc]# gcc -v 使用内建 specs。 COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper 目标:x86_64-redhat-linux 配置为:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux 线程模型:posix
如何理解NodeJs 它是一个JavaScript的运行环境,而不是JavaScript框架。JavaScript框架诸如Jquery。
Node提供了一个后台的运行编译Javascript的环境,由于浏览器的运行环境一般。
所以,让一段Js代码运行的不仅仅有浏览器,还有Node环境。
Node可以运行一个Js的后台环境,可以做Web 服务器。
Node环境中执行console语句:
如何在浏览器中的console一样。
什么是REPL环境?
REPL环境就是在编辑器中运行node命令进入的环境。类似于浏览器中的console
目标:更改可执行文件的文件信息和图标,如下图所示:
参考链接:
https://github.com/electron/rcedit
C++外部程序修改exe文件属性信息_PEINTRE_的博客-CSDN博客_修改exe文件说明
示例:
参考上面第一个链接,编译生成rcedit.exe,然后调用rcedit.exe更改其他文件信息。
下面用bat文本记录cmd命令,其实可以多个参数一起执行的,为了方便理解,拆成了多行。
源码中有几个属性没有找到,添加了注释。有的exe设置图片的话,可能会无效,可能是存在限
制,重启电脑就可以了。
set WORK_DIR="D:\WORK" set RCEDIT_DIR="D:\rcedit-master\Default" set PATH=%RCEDIT_DIR%;%PATH% cd /d %WORK_DIR% REM 设置详细信息-文件版本 rcedit.exe %WORK_DIR%\MyExe.exe --set-file-version "10.7.99" REM 未找到 rcedit.exe %WORK_DIR%\MyExe.exe --set-version-string "Comments" Comments1 REM 设置详细信息-文件说明 rcedit.exe %WORK_DIR%\MyExe.exe --set-version-string "FileDescription" FileDescription1 REM 未找到 rcedit.exe %WORK_DIR%\MyExe.exe --set-version-string "CompanyName" CompanyName1 REM 未找到 rcedit.exe %WORK_DIR%\MyExe.exe --set-version-string "FileVersion" FileVersion1 REM 设置详细信息-版权 rcedit.exe %WORK_DIR%\MyExe.exe --set-version-string "LegalCopyright" LegalCopyright1 REM 未找到 rcedit.exe %WORK_DIR%\MyExe.exe --set-version-string "InternalName" InternalName1 REM 设置详细信息-合法商标 rcedit.exe %WORK_DIR%\MyExe.
命令概览:
1、查看某个端口被哪个程序占用
2、卸载windows服务
3、查看IP地址
4、显示当前正在运行的服务列表
5、路径追踪
6、打开以管理员身份运行CMD命令的窗口
7、删除目录
8、清屏
9、打开控制面板
10、打开远程桌面
11、查看当前目录下有哪些文件
12、查看自己电脑机器名
命令详情:
1、查看某个端口被哪个程序占用,以8080端口为例:
第一步:netstat -aon|findstr "8080" ###8080为想查看的端口号(出现的列表最后一列为该端口对应的PID)
第二步:tasklist|findstr "38928" ###38928为占用该端口所对应的应用程序的PID
netstat -ano可以列出所有端口的情况,IP地址后面的即为端口号,最后一列为对应的PID;
还可以通过Wdinows任务管理器的PID(查看-->选择列-->PID进程标识符)查看占用端口的程序。
2、卸载windows服务:sc delete 服务名
3、查看IP地址:ipconfig ###显示的Ipv4 地址 即是内网IP
4、显示当前正在运行的服务列表:net start
net start 该命令的语法是:net start [service]
例如开启本地的workstation服务,可按如下方法操作:
开始→运行→输入cmd→回车,打开命令提示符窗口,键入以下命令后回车:
net start workstation
注:如果不带参数,直接使用net start则显示当前正在运行的服务列表。
返回值:
0 开启成功
2 开启成功,但又关闭原因是:没有什么可做 。 或者 服务已经开启
5、路径追踪:tracert 域名或IP ###可以用于确定IP数据包访问目标时所选择的路径 根据域名追踪: 根据IP追踪:
6、打开以管理员身份运行CMD命令的窗口: runas /user:ljp2009 "cmd /k"
其中ljp2009是本地管理员账号。
7、删除目录:rmdir
好比说我要删除 222 这个目录下的所有目录和文件,语法就是:
Makefile学习笔记06|编译动态链接库 希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长,谢谢。
这里是目录 静态链接与动态链接 链接分为两种:静态链接、动态链接。
静态链接
静态链接:由链接器在链接时讲库的内容加入到可执行文件中。
优点: 对环境的依赖性小,具有较好的兼容性。
缺点:生成的程序比较大,需要更多的系统资源,在装入内存时会消耗更多的时间。库函数有了更新,必须重新编译应用程序。 动态链接
动态链接:链接器在链接时仅仅建立与所需库函数之间的链接关系,在程序运行时才将所需资源调入可执行程序。
优点: 在需要的时候才会调入对应的资源函数。简化程序的升级;有着较小的程序体积。实现进程之间的资源共享(避免重复拷贝)。
缺点:应用程序在运行时依赖动态库,不能独立运行。动态库依赖版本问题严重。 动态、静态编译对比
系统默认采用动态链接的方式进行程序编译,若想采用静态编译,需加入参数-static。 编译选项 -fPIC-shared g++ -shared -fPIC mylib.cpp -o libmylib.so g++ test.cpp -lmylib -L/root/cpp #!/bin/sh LD_LIBRARY_PATH=./; export LD_LIBRARY_PATH ./test 静态库编译选项 编译静态库时有两个常用的可选参数和一个必选参数。
选项描述[c]不显示创建[v]显示过程r创建静态库s建立索引 项目结构 总项目下分三个子项目,分别为xserver、xthread、xcom。
项目名称路径文件输出xserver~/make/src/xserverxserver.cpp、makefilexserverxthread~/make/src/xthreadxthread.h、xthread.cpp、makefilelibxthread.soxcom~/make/src/xcomxcom.h、xcom.cpp、makefilelibxcom.a XThread // xthread.h #ifndef XTHREAD_H #define XTHREAD_H #include <thread> class XThread { public: virtual void Start(); virtual void Wait(); private: virtual void Main()=0; std::thread th_; }; #endif // xthread.cpp #include "
原文地址 手机看面试题 【web面试助手】 1,阐述清楚浮动的几种方式(常见问题) (1)父级div定义 height
原理:父级div手动定义height,就解决了父级div无法自动获取到高度的问题。 优点:简单、代码少、容易掌握 缺点:只适合高度固定的布局,要给出精确的高度,如果高度和父级div不一样时,会产生问题 (2)父级div定义 overflow:hidden
原理:必须定义width或zoom:1,同时不能定义height,使用overflow:hidden时,浏览器会自动检查浮动区域的高度 优点:简单、代码少、浏览器支持好 (3) 结尾处加空div标签 clear:both
原理:添加一个空div,利用css提高的clear:both清除浮动,让父级div能自动获取到高度 优点:简单、代码少、浏览器支持好、不容易出现怪问题 缺点:不少初学者不理解原理;如果页面浮动布局多,就要增加很多空div,让人感觉很不好 2,解释css sprites ,如何使用? CSS Sprites其实就是把网页中一些背景图片整合到一张图片文件中, 再利用CSS的“background-image”,“background- repeat”,“background-position”的组合进行背景定位, background-position可以用数字能精确的定位出背景图片的位置。 CSS Sprites为一些大型的网站节约了带宽,让提高了用户的加载速度和 用户体验,不需要加载更多的图片 3,如何用原生js给一个按钮绑定两个onclick事件? //事件监听 绑定多个事件 var btn = document.getElementById("btn"); btn.addEventListener("click",hello1); btn.addEventListener("click",hello2); function hello1(){ alert("hello 1"); } function hello2(){ alert("hello 2"); } 4,拖拽会用到哪些事件 · dragstart:拖拽开始时在被拖拽元素上触发此事件,监听器需要设置拖拽所需数据,从操作系统拖拽文件到浏览器时不触发此事件. · dragenter:拖拽鼠标进入元素时在该元素上触发,用于给拖放元素设置视觉反馈,如高亮 · dragover:拖拽时鼠标在目标元素上移动时触发.监听器通过阻止浏览器默认行为设置元素为可拖放元素. · dragleave:拖拽时鼠标移出目标元素时在目标元素上触发.此时监听器可以取消掉前面设置的视觉效果. · drag:拖拽期间在被拖拽元素上连续触发 · drop:鼠标在拖放目标上释放时,在拖放目标上触发.此时监听器需要收集数据并且执行所需操作.如果是从操作系统拖放文件到浏览器,需要取消浏览器默认行为. · dragend:鼠标在拖放目标上释放时,在拖拽元素上触发.将元素从浏览器拖放到操作系统时不会触发此事件. 5,请列举jquery中的选择器: #id,.class,element,:first,:even,:eq(index),:contains(text) 链接:jQuery选择器 6,Javascript中的定时器有哪些?他们的区别及用法是什么? setTimeout 只执行一次 setInterval 会一直重复执行 7,请描述一下 cookies sessionStorage和localstorage区别 (1)相同点:都存储在客户端
最近在做深度学习方面的课题,由于电脑太过垃圾,就一直想法设法找免费的GPU来跑模型,好不容易找到这个(个人感觉比colab好多了,那个好麻烦,上传数据也老慢)不允许还有人不知道!!!新用户注册即得10元无门槛代金券(可以直接用来跑模型!!不需要充钱!!)现在注册还送一个月的会员!!
废话不多说,直接上注册链接:https://www.autodl.com/register?code=489fdfa4-7292-43a5-83ad-632b878a6fed
注册完成后,点击右上角【控制台】→【我的实例】→【租用新实例】,根据自己的需求选择型号(我一般都是早上租最便宜的那个,0.52元/时,便宜的比较抢手,下手晚可能就没了)
实例开机后,可以选择使用FileZilla将数据上传到实例
修改好代码,在终端输入 python + 文件路径(如python autodl-tmp/yolov/train.py)就可以开始训练了
还可以对CPU和内存使用情况进行检测,简直不要太爽
如果大家有什么问题,欢迎找我讨论吖
背景 不同尺寸的矩阵,求逆使用不同的方法,会有不同的效率的.
16x16矩阵的直接求逆与PartialPivLU的效率对比(本人亲测) 1 实现代码 GetSystemTimeInMacroSecond的实现
boost::posix_time::ptime now = boost::posix_time::microsec_clock::universal_time() + boost::posix_time::hours(8); long long cur_time = now.time_of_day().total_microseconds(); return cur_time; 求逆用时评估代码
Eigen::MatrixXf x; Eigen::MatrixXf A = Eigen::MatrixXf::Zero(22, 22); Eigen::VectorXf b = Eigen::MatrixXf::Zero(22, 1); A << 1.34600000000000, 1.13841228110978e-18, -3.54804631550289e-17, -2.05829006182795e-19, -0.160432023690557, 0.00411124458769287, -0.000223899921724580, -0.0593112659337829, -0.0241839767166998, -0.00834748033971202, -5.37814422485606e-06, 5.23214930710842e-06, -0.0580682816915559, -0.0247053374485193, -0.00834723095360454, 1.97819241321089e-07, 0.999999990195040, 9.97072788916781e-05, 9.83279179330304e-05, 0, 0, 0, 1.13841228110978e-18, 1.34600000000000, -3.32036915323686e-18, 0.160484535740467, 5.65533818549124e-05, 0.0112007248696078, 0.0837289215044391, -9.20550154007569e-05, 4.95864766071101e-05, -2.26259635075635e-05, 0.00198399199113416, 0.0818535878168905, 0.000219747293578020, -9.
1、创建项目
vue create test (项目名称) vue2完整创建流程 2.进行H5适配 2.1 选择ui框架(以vantui 为例)
具体参考 安装依赖(vue2版本)
npm i vant@latest-v2 -S 通过babel-plugin-import自动引入组件(推荐)
npm i babel-plugin-import -D 在项目中配置 // 对于使用 babel7 的用户,可以在 babel.config.js 中配置 module.exports = { plugins: [ ['import', { libraryName: 'vant', libraryDirectory: 'es', style: true }, 'vant'] ] }; 在main.js中引入所需要的组件 例如: 按钮组件 import { Button } from 'vant'; 安装H5适配所需插件 1.安装amfe-flexible
amfe-flexible用于设置 rem 基准值
npm i -S amfe-flexible //在index.html中修改 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"
测试流程就是:图片->压缩图片->base64->解压图片->图片
(注意压缩会失真的,可以不压缩,但是base64会比较大)
main.cpp #include "stdafx.h" #include <Windows.h> #include "base64.h" #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/opencv.hpp> #include <vector> #include <cstdio> using namespace std; using namespace cv; #define MAX_SIZE_BASE64 100000 int main() { long t1 = GetTickCount(); string source_data, source_data_encode; Mat srcImage, grayImage,dstImage; //读取图片1 srcImage = imread("image.jpg"); dstImage = srcImage.clone(); imshow("【原图】", srcImage); //MAT转base64 int quality = 50; //压缩比率0~100 vector<int> compress_params; compress_params.push_back(IMWRITE_JPEG_QUALITY); compress_params.push_back(quality); std::vector<unsigned char> buf(MAX_SIZE_BASE64, 0); //vector要分配内存,否则imencode会崩 cv::imencode(".jpg", dstImage, buf, compress_params); source_data.
maven安装笔记 maven 简介与安装maven 项目管理构建多模块应用maven 安装额外依赖 maven 简介与安装 Maven 是一个项目管理和构建工具。Maven 提供了开发人员构建一个完整的生命周期框架。开发团队可以自动完成项目的基础工具建设,Maven 使用标准的目录结构和默认构建生命周期。
在多个开发团队环境时,Maven 可以设置按标准在非常短的时间里完成配置工作。由于大部分项目的设置都很简单,并且可重复使用,Maven 让开发人员的工作更轻松,同时创建报表,检查,构建和测试自动化设置。
maven 依赖查询:官网
注意:maven 中说说的依赖,即是我们平时使用的 Jar 包。
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> 中央仓库
下载 maven 工具 apache-maven-3.8.2 只需要简单配置 /conf/settings.xml 文件中的中央仓库和本地仓库位置即可,当本地仓库没有依赖包时,通过中央仓库下载。如下配置优先选择中国阿里云仓库,这样会加快依赖下载速度。
<mirrors> <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>https://maven.aliyun.com/nexus/content/repositories/central/</url> </mirror> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>https://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> <mirror> <id>central</id> <name>Maven Repository Switchboard</name> <url>https://repo1.maven.org/maven2/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors> 如果想要 maven 下载的依赖不存放在用户目录的 .m2 文件夹下,可以修改本地仓库的位置。
<localRepository>D:/maven-dependcies</localRepository> 注意:配置本地依赖存放位置 D:/maven-dependcies 必须存在,每个依赖下载到本地后会形成如下的目录和文件结构。
作者 | 剑客阿良_ALiang
来源 | CSDN博客
前言
今天我继续魔改一下,让该模型可以支持将gif动图或者视频,也做成卡通化效果。毕竟一张图可以那就带边视频也可以,没毛病。所以继给次元壁来了一拳,我在加两脚。
项目github地址:https://github.com/Hy-1990/hy-cartoon
环境依赖
除了上一篇文章中的依赖,还需要加一些其他依赖,requirements.txt如下:
核心代码
不废话了,先上gif代码。
gif动图卡通化
实现代码如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/12/5 18:10 # @Author : 剑客阿良_ALiang # @Site : # @File : gif_cartoon_tool.py # !/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/12/5 0:26 # @Author : 剑客阿良_ALiang # @Site : # @File : video_cartoon_tool.py # !/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/12/4 22:34 # @Author : 剑客阿良_ALiang # @Site : # @File : image_cartoon_tool.
回溯法迷宫问题 思路:利用回溯法和递归思想解决。 findWay 方法就是专门来找出迷宫的路径如果找到,就返回 true ,否则返回 falsemap 就是二维数组,即表示迷宫i,j 就是老鼠的位置,初始化的位置为(1,1)因为我们是递归的找路,所以我先规定 map 数组的各个值的含义0 表示可以走 1 表示障碍物 2 表示可以走 3 表示走过,但是走不通是死路递归出口当 map[6][5] =2 就说明找到通路,就可以结束,否则就继续找先确定老鼠找路策略 下->右->上->左 public class migong{ public static void main(String args[]){ int [][]map = new int[8][7]; //迷宫为一个八行七列的二维数组,墙为1,路为0 for(int i=0;i<7;i++){ map[0][i] = 1; map[7][i] = 1; } for(int i = 0;i<8;i++){ map[i][0] = 1; map[i][6] = 1; } //设计迷宫四周的墙 map[3][1] = 1; map[3][2] = 1; map[3][3] = 1; map[2][3] = 1; map[2][1] = 1; //设置迷宫图形 System.
1.安装和配置OpenSSH 参考教程
win32位下载 || win64位下载||官网下载
1.1下载解压到C:\Program Files\OpenSSH
1.2设置系统环境变量path的值追加C:\Program Files\OpenSSH
1.3检查是否安装cmd运行ssh 或者打开 C:\Windows\System32\OpenSSH 查看是否有ssh.exe
2.vscode安装下载链接
user版会安装在当前计算机帐户目录,这意味着如果使用另一个帐号登陆计算机将无法使用别人安装的
system版本可以安装在非用户目录,例如C盘根目录,任何帐户都可以使用.
2.1安装插件Remote-SSH
2.2打开vs界面按下F1输入Remote-SSH:settings
2.3找到Remote-SSH:Path 设置为C:\Program Files\OpenSSH\ssh.exe
3免密登录
3.1 windows 生成密钥文件 cmd 打开 输入ssh-keygen一路回车将在C:\Users\86176.ssh\下生成2个文件
3.2复制或者拷贝C:\Users\86176.ssh\id_rsa\id_rsa.pub 到远端服务器的/root/.ssh/authorized_keys中
3.3修改vs_code的连接信息
Host 阿里云 (连接名称随便写) HostName 10.0.0.32(远端IP) User root (登录身份) IdentityFile C:\Users\86176\.ssh\id_rsa (密钥文件) 4.常见问题
4.1
VSCode插件Remote-SSH连接远程服务器错误 “could not establish connection *****“
参考链接
4.2
vscode 远程开发 提示 could not establish connection to “”.Connecting was canceled.
参考链接
4.3
https://blog.csdn.net/weixin_42096901/article/details/105193366
https://blog.csdn.net/chaoenhu/article/details/103698804?
参考:https://www.jianshu.com/p/66a72d7ba3da
最近项目中看到这样的一个切角效果,如下所示
就是一个正常的矩形,然后被“切”了一块,而且是沿着右上角切的。那么,这种布局如何实现呢?
一、自适应方式 这种布局一般有两种自适应方式,当然具体需要哪种可以根据实际设计师需求
1. 固定距离 无论宽高怎么变化,切角距离顶部的距离是固定的,如下
2. 固定角度 无论宽高怎么变化,切角与顶部的夹角是固定的,如下
下面具体来看这两种布局的实现
二、固定距离的切角 固定距离的比较好实现,只需要借助 clip-path就可以了。假设距离顶部的距离是20px,那么四个点的坐标是
代码实现就是
div{ clip-path: polygon(0 20px, 100% 0, 100% 100%, 0 100%); } 这样就得到了一个固定距离的切角
三、固定角度的切角 这个稍微复杂一点。起初,我以为简单的线性渐变就能实现,比如
div{ background: linear-gradient(-30deg, #B89DFF 80%, transparent 0); } 实时效果如下
可以看到,角度虽然是固定的,但是切角不会紧贴右上角,原因是线性渐变的起始点是沿着角度与之垂直的最远距离,如下所示(截图取自 MDN 官网)
所以并不能保证切角的固定相交位置,比较适合那种小切角场景。
那还有其他方式吗?当然也是有的
提到角度,除了线性渐变,还能想到锥形渐变conic-gradient,可以以某一点绘制锥形图案。假设固定角度是20度,示意如下
那么,锥形渐变的角度就是 250°(270 - 20),代码实现如下
div{ background: conic-gradient(#B89DFF 250deg, transparent 0); } 效果如下
因为锥形渐变默认中心点是容器的中点,我们需要移到右上角,可以通过at来指定位置,如下
div{ background: conic-gradient(at 100% 0, #B89DFF 250deg, transparent 0); } 这样就得到了一个固定角度的切角
四、总结一下 以上就是这类布局的两种实现方案,主要用到了clip-path和conic-gradient,下面总结一下