首页 > 其他分享 >CSS 绘制扇面

CSS 绘制扇面

时间:2024-08-12 13:49:41浏览次数:10  
标签:Math background 100% 50% param 扇面 angles 绘制 CSS

参考资料:https://juejin.cn/post/7266641059282927650

 

效果:

源码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>使用css3绘制任意角度扇形</title>
  <style>
    .sector {
        position: relative;
        display: inline-block;
        width: 80px;
        height: 80px;
        background-color: transparent;
        border-radius: 50%;
        overflow: hidden;
        transform: rotate(45deg);
    }

    .sector::before {
        display: inline-block;
        content: '';
        width: 100%;
        height: 100%;
        background: linear-gradient(90deg,
                                    #4D84FF 25%,#eee 0,
                                    #eee 50%,#4D84FF 0,
                                    #4D84FF 75%,#eee 0);
        background-size: 30px;
        clip-path: polygon(50% 50%, 0 0, 100% 0);
        opacity: .7;
    }
    
    .sector::after {
        position: absolute;
        display: inline-block;
        content: '';
        width: 80px;
        height: 80px;
        top: calc(50% - 40px);
        left: calc(50% - 40px);
        border-radius: 50%;
        background-color: #fff;
        z-index: 1;
    }

  </style>
</head>
<body>
  <div class="sector"></div>
</body>

<script>
    /**
     * @param {Number} radius: 半径
     * @param {Number} minRadius: 内半径
     * @param {Number} angles: 角度
     * @param {Number} direct: 方向
     **/
    function drawPie({radius, minRadius, angles, direct, selector}) {
        let points = ['50% 50%', '0 0'],
            residue = angles%45? angles%45:45,
            percent = 0
            direct = direct || 45;
        
        angles > 90 && points.push('100% 0');
        angles > 180 && points.push('100% 100%');
        angles > 270 && points.push('0 100%');
        
        //let percent = (100/2) * (Math.tan(2*Math.PI/360 * residue).toFixed(4)); // tan算出来的是相对半径的占比
        
        percent = (100/2) * (Math.tan(2*Math.PI/360 * residue).toFixed(4)); 
        
        if(angles<=45) {
            points.push(percent + '%' + ' 0');
        }else if(angles<=90) {
            points.push(percent + 50 + '%' + ' 0');
        }else if(angles<=135) {
            points.push('100% ' + percent + '%');
        }else if(angles<=180) {
            points.push('100% ' + (percent + 50) + '%');
        }else if(angles<=225) {
            points.push(100 - percent + '%' + ' 100%');
        }else if(angles<=270) {
            points.push(50 - percent + '%' + ' 100%');
        }else if(angles<=315) {
            points.push('0 ' + (100 - percent) + '%');
        }else if(angles<=360) {
            points.push('0 ' + (50 - percent) + '%');
        }
        
        let path = 'polygon(' + points.join(', ') + ')';
        // 外扇面
        addCSSRule(selector + '::before', {
            'clip-path': path
        });
        // 内扇面
        addCSSRule(selector + '::after', {
            'clip-path': path,
            width: minRadius + 'px',
            height: minRadius + 'px',
            top: 'calc(50% - ' + minRadius/2 + 'px)',
            left: 'calc(50% - ' + minRadius/2 + 'px)'
        });
        // 容器大小和方向
        addCSSRule(selector, {
            width: radius + 'px',
            height: radius + 'px',
            transform: 'rotate(' + direct + 'deg)'
        });
    }
    // 绘制扇面
    drawPie({
        selector: '.sector',
        radius: 400,
        minRadius: 180,
        angles: 120, 
        direct: 100
    });
    
    function addCSSRule(selector, rules, index) {
        // 创建一个style元素
        var style = document.createElement('style');
        
        // 设置type属性为text/css
        style.type = 'text/css';
        
        // 插入到head中
        document.head.appendChild(style);
        
        // 获取sheet
        var sheet = style.sheet;
        
        // 如果index未提供,则添加到末尾
        index = index || null;
        
        // 如果是CSS规则字符串
        if (typeof rules === 'string') {
            // 直接添加
            sheet.insertRule(selector + ' {' + rules + '}', index);
        } else { // 如果是一个对象
            // 遍历对象中的所有属性
            for (var prop in rules) {
                if (rules.hasOwnProperty(prop)) {
                    // 将属性和值转换为字符串
                    var rule = prop + ': ' + rules[prop];
                    // 添加到样式表中
                    sheet.insertRule(selector + ' {' + rule + '}', index);
                }
            }
        }
    }
    
    /*
    addCSSRule('.my-other-class', 'color: red; background-color: yellow;', 0); // 添加到顶部
    */
</script>

</html>

 

标签:Math,background,100%,50%,param,扇面,angles,绘制,CSS
From: https://www.cnblogs.com/xtreme/p/18354810

相关文章

  • 前端必知必会-CSS边框属性border
    文章目录CSS边框CSS边框样式border-styleCSS边框宽度border-widthCSS边框颜色border-colorCSS指定每条边的属性CSS简写边框属性CSS圆角边框border-radius总结CSS边框CSS边框属性允许您指定元素边框的样式、宽度和颜色。CSS边框样式border-styleborder-......
  • 前端必知必会-CSS边距Margin
    文章目录CSS边距Margin边距-各个侧面边距-简写属性CSS边距折叠总结CSS边距Margin边距Margin用于在元素周围、任何定义的边框之外创建空间。有一些属性可用于设置元素每侧的边距(顶部、右侧、底部和左侧)。边距-各个侧面CSS具有用于指定元素每侧边距的属......
  • 结构开发笔记(三):solidworks软件(二):小试牛刀,绘制一个立方体
    前言  solidworks草图大师,基本的使用过程。  所有的零件基础都是从平面绘制开始,然后凸出来厚度。  本篇绘制一个简单的立方体,熟悉基本操作。 立方体绘制过程  选取一个平面绘制一个立方形,然后拉伸即可。  绘制矩形的方式:    功能所见即所得。  其......
  • pyqt5+win32+python联合在CAD绘图无法绘制
    1初始报错想法是:写好pyqt5的简单界面代码后,用一个信号槽连接到CAD绘制图形。出现了报错:显示“已成功连接到CAD”,说明连接没有问题,但是“在CAD中绘制线条时出错:(-2147352567,'发生意外。',(0,None,None,None,0,-2147024809),None)”。搜索后给出可能原因是:1-参......
  • 横向滚动条 css js html
    目的:1.练习手写滚动条2.市面上多是竖向滚动条,横向滚动条较少3.横向滚动条,需要滑动到容器底部才能使用,不方便,因此想自己写一个横向滚动条放置在容器内部的视口高度的最低处3.问题复现:如果容器的内容超过了容器的宽度,就会出现横向滚动条(暂不考虑换行),但是如果该容器的高......
  • 大学生HTML期末大作业——HTML+CSS+JavaScript学校网站(学生信息管理系统)
    HTML+CSS+JS【学校网站】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......
  • Mermaid 赋能 VuePress:轻松绘制流程图、时序图,让博客内容更生动
    聊聊如何让博客框架VuePress显示图表‍什么是mermaid如果你还不了解,可以先看看我的Markdown教程——使用Markdown画图。‍‍‍‍安装依赖相关插件有很多,我这里选择的是vuepress-plugin-mermaidjs:‍npmivuepress-plugin-mermaidjs‍‍‍配置在config.t......
  • python由tif影像绘制png图片并制作动图
    笔者最近需要下载一个区域的长时间序列影像,然后将其制作成动图展示其动态变化过程。这其中涉及到两个问题,一是将tif数据绘制成PNG或jpg等格式图片,二是由图片绘制动图GIF。一、由TIF绘制PNG 这里需要用到matplotlib和GDAL两个库来将tif格式图像绘制为PNG图片,如果没有相关包......
  • 前端:CSS选择器(级联/层叠样式单)--用作装饰
    1.选择器:给谁加样式三种样式如果对于不同的方面,效果叠加,如果是相同的方面,行内样式的优先级最高,外部样式和内部样式的优先级相等,谁在上面先用谁2.css的语法规则:selector{property:value;property:value;}/*基本选择器*//*1.元素选择器根据元素名称做......
  • CSS3 边框(包含border-radius、border-image与box-shadow)
    CSS3边框样式border-radius作用:设置圆角值的个数及其效果简记:左上开始顺时针,值不够的对角来凑。值的个数效果1四个角一致2左上角和右下角一致,右上角和左下角一致3左上角、右上角和左下角一致、右下角4左上角、右上角、右下角、左下角圆角与椭圆角语法:border-radi......