CSS3画箭头&calc动态调整高度

简介: 准备用bootstrap的treeview画一个权限管理的页面。右边用一个panel。中间加一个箭头。 两边都好弄,关键就是中间的这个箭头不好弄,听说css3可以画箭头,忍不住想试一下。

准备用bootstrap的treeview画一个权限管理的页面。右边用一个panel。中间加一个箭头。
两边都好弄,关键就是中间的这个箭头不好弄,听说css3可以画箭头,忍不住想试一下。

画箭头参考的这里: CSS3 4个带方向箭头的标注框

一开始代码是这样的:


<!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">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>老是对不齐</title>

    <!-- Bootstrap Core CSS -->
    <link href="bootstrap.min.css" rel="stylesheet">


    <!-- Custom Fonts -->
    <link href="font-awesome.min.css" rel="stylesheet" type="text/css">

    <style>
    .text--center {
        text-align: center;
    }
    .wrap {
        padding-left: 7%;
    }
    .title-style {
        font-weight: 100;
        font-size: 3em;
        color: #346BB3;
    }
    .box {
         width: 100%;
        float: left;
         margin-left: 0.46296%;
         margin-right: 0.46296%;
        position: relative;

        white-space: nowrap;
        border-radius: 5px;
    }
    .box:after {
        content: " ";
        position: absolute;
    /*     position: relative; */
        height: 0;
        width: 0;
        border: solid transparent;
        pointer-events: none;
        border-width: 20px;
        border-color: #fff;
    }
    .pointer--right {
        animation: animate-pointer--right 500ms ease-in-out;
        transform-origin: right center;
    }
    .pointer--right:after {
        border-left-color: #346BB3;
        top: 45%;
        /*每次展开或折叠时,div高度也会变化,因为li标签的border也有宽度,所以总是有几个像素对不齐*/
        right: -42px;
    }
    @keyframes animate-pointer--right {
        0% {
            transform: rotate(0deg) rotateX(30deg);
            opacity: 0;
        }
        50% {
            transform: rotate(10deg);
            opacity: 1;
        }
        70% {
            transform: rotate(-10deg) rotateX(-30deg);
        }
        100% {
            transform: rotate(0deg);
        }
    }
    /* work in progress */
    </style>
</head>

<body>
    <div id="wrapper">

        <div id="page-wrapper">
            <div class="row">
                <div class="col-lg-4">
                    <div id="tree" class="box pointer--right"></div>
                </div>

                <div class="col-lg-4">

                    <div class="panel-body">
                        <div class="alert alert-success alert-dismissable">
                            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                            <a href="#" class="alert-link">child2</a>.
                        </div>
                        <div class="alert alert-info alert-dismissable">
                            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                             <a href="#" class="alert-link">child3</a>.
                        </div>
                        <div class="alert alert-warning alert-dismissable">
                            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                             <a href="#" class="alert-link">child4</a>.
                        </div>
                        <div class="alert alert-danger alert-dismissable">
                            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                             <a href="#" class="alert-link">child5</a>.
                        </div>
                    </div>
                </div>
                <!-- /.col-lg-4 -->
            </div>
        </div>
    </div>



    <!-- jQuery -->
    <script src="jquery.min.js"></script>

    <!-- Bootstrap Core JavaScript -->
    <script src="bootstrap.min.js"></script>

    <script src="bootstrap-treeview.js"></script>
    <script type="text/javascript">
    var data = [
                {
                  text: "Parent 1",
                  nodes: [
                    {
                      text: "Child 2",
                      nodes: [
                        {
                          text: "Grandchild 3"
                        },
                        {
                          text: "Grandchild 4"
                        }
                      ]
                    },
                    {
                      text: "Child 5"
                    }
                  ]
                },
                {
                  text: "Parent 6"
                },
                {
                  text: "Parent 7"
                },
                {
                  text: "Parent 8"
                },
                {
                  text: "Parent 9"
                },
                {
                    text: "Parent 10"
                },
                {
                    text: "Parent 11"
                },
                {
                    text: "Parent 12"
                },
                {
                    text: "Parent 13"
                },
                {
                    text: "Parent 14"
                },
                {
                    text: "Parent 15"
                }
              ];

        function getTree() {
          // Some logic to retrieve, or generate tree structure
          return data;
        }

        $('#tree').treeview({
              data: data,         // data is not optional
              levels: 5 //Sets the number of hierarchical levels deep the tree will be expanded to by default.
//               backColor: 'green'
            });
        $('#tree').on('nodeSelected', function(event, data) {
            console.log(data.parentId+","+data.nodeId+","+data.text);
        });
        $('#tree').on('nodeCollapsed', function(event, data) {
            console.log($(".box.pointer--right").height());
            console.log($(".box.pointer--right").outerHeight(true));
        });
        $('#tree').on('nodeExpanded', function(event, data) {
            console.log($("#tree").height());
        });
        $('#tree').on('nodeChecked', function(event, data) {
            console.log("checked.."+$("#tree").height());
        });
    </script>

</body>

</html>

效果是这样的: 虽然没有完全对齐,起码还过得去。
这里写图片描述

但是菜单一折叠后,就明显对不齐了。
这里写图片描述

然后各种尝试。一开始以为top设置为50%就没问题的。后来调成了45%。然后越调越不对。
后来尝试使用js动态给after伪元素设置高度,没有成功。

接着单独写了一个div,然后给它加上box pointer–right class,top设置为50%。效果好的很。

<div style="height:440px; width:20px; border:1px solid lime" class="box pointer--right"></div>

这里写图片描述

可以看到50%正好是正中间,是三角形的定点正好在正中间的位置。
直觉告诉我一定是高度出了问题。仔细排查后发现parent1~parent15在15个li标签里,被一个ul标签包围着。这个ul的高度才是真实的高度,#tree的高度比ul高了不少,所以一直对不齐。
然后修改代码如下:

①把样式加在ul上而不是外围的div上。

<div id="tree"></div>

可是ul是动态生成的,所以只能用js加了,在treeview初始化完之后,给ul加样式:

$('#tree').treeview({
            data: data,         // data is not optional
            levels: 5         //Sets the number of hierarchical levels deep the tree will be expanded to by default.
        });
$("ul.list-group").addClass("box").addClass("pointer--right");

②top改为50%。

.pointer--right:after {
    top: 50%;
}

这回终于到正中间了,可惜是三角形的定点在正中间。
这里写图片描述

li标签的高度是40。三角形的高度也是40,应该让top减去20,这样就能跟Parent 8对齐了。

搜了一些css3有calc函数,可以动态调整高度。
top设置为:

-moz-calc(expression);
-webkit-calc(expression);
top: calc(50% - 20px); /*注意减号两边必须有空格!!!*/

终于好了。中间出了小插曲就是,calc函数里减号必须有空格,否则不起作用。
这里写图片描述

折叠之后也能对齐,多亏了css3炸天的calc函数。
这里写图片描述

目录
相关文章
|
7月前
|
前端开发 JavaScript
vue 动态改变css样式
vue 动态改变css样式
138 0
|
2月前
|
安全 前端开发 开发者
CSS3 中 calc()、constant() 和 env() 函数的使用指南
在现代网页设计中,CSS3 的 calc()、constant() 和 env() 函数为开发者提供了强大的工具,帮助实现灵活和响应式的布局。本文将深入探讨这三个函数的定义、用法以及最佳实践,特别是如何利用 calc() 进行动态计算、constant() 的历史背景,以及 env() 在处理设备安全区域中的应用。通过本文,读者将能够更好地理解并运用这些函数,提升网页设计的灵活性与用户体验。
78 0
|
5月前
|
前端开发 容器
css 动态文本对齐自适应 — 文本宽度小于容器宽度时居中对齐,文本宽度大于容器宽度时居左对齐
css 动态文本对齐自适应 — 文本宽度小于容器宽度时居中对齐,文本宽度大于容器宽度时居左对齐
45 2
|
5月前
|
JavaScript 前端开发
vue 模拟随机变速的动态打字特效【支持多行文本】(含css实现闪烁光标,js动态改变setInterval定时器的时间间隔)
vue 模拟随机变速的动态打字特效【支持多行文本】(含css实现闪烁光标,js动态改变setInterval定时器的时间间隔)
99 1
|
6月前
|
前端开发 JavaScript
使用JavaScript动态更改元素的CSS属性
【6月更文挑战第29天】使用JavaScript动态更改元素的CSS属性
89 3
|
6月前
|
前端开发 UED
纯css写一个动态圣诞老人
使用CSS创建的圣诞老人动画,通过`@keyframes`实现身体摇摆。关键代码包括定义动画`rock`,以及设置帽子、脸部、眼睛和胡须的样式。完整代码可下载,此效果为网页增添节日气氛,提升用户体验。[点此获取代码](https://download.csdn.net/download/No_Name_Cao_Ni_Mei/89489001)
35 0
纯css写一个动态圣诞老人
|
5月前
|
前端开发 JavaScript
vue实战范例——箭头步骤条/导航(含css 斜切skew的妙用)
vue实战范例——箭头步骤条/导航(含css 斜切skew的妙用)
309 0
|
6月前
|
前端开发
CSS动画(动态导航栏)
CSS动画(动态导航栏)
|
7月前
|
前端开发 JavaScript
HTML DOM如何通过JavaScript动态改变元素的CSS样式?
【5月更文挑战第23天】HTML DOM如何通过JavaScript动态改变元素的CSS样式?
117 1
|
7月前
|
移动开发 前端开发 JavaScript
【专栏:HTML与CSS实战项目篇】使用HTML5与CSS3制作一个动态表单验证页面
【4月更文挑战第30天】本文介绍了使用HTML5和CSS3创建动态表单验证页面的方法。首先,简述HTML5用于构建网页内容,CSS3用于描述样式。接着,分四步展示实现过程:1) 设计包含输入框和提示信息的表单结构;2) 使用CSS3创建样式,增强视觉效果;3) 使用JavaScript监听输入事件,动态验证表单并显示错误信息;4) 测试和调试确保跨平台兼容性。通过学习,开发者能掌握创建带验证功能的表单,提升用户体验。
90 7