diff --git a/components/style/themes/default.less b/components/style/themes/default.less
index f4e489572a..1bf14f6d36 100644
--- a/components/style/themes/default.less
+++ b/components/style/themes/default.less
@@ -265,6 +265,10 @@
@rate-star-color: #f5a623;
@rate-star-bg: #e9e9e9;
+// Tree
+// ---
+@tree-icon-color: #999;
+
// Card
// ---
@card-head-height: 48px;
diff --git a/components/tree-select/style/index.less b/components/tree-select/style/index.less
index 36aac04122..ae8c09ab74 100644
--- a/components/tree-select/style/index.less
+++ b/components/tree-select/style/index.less
@@ -77,17 +77,13 @@
&.@{select-tree-prefix-cls}-center_open,
&.@{select-tree-prefix-cls}-bottom_open,
&.@{select-tree-prefix-cls}-noline_open {
- .antTreeSwitcherIcon();
+ .antTreeSwitcherIcon("open");
}
&.@{select-tree-prefix-cls}-roots_close,
&.@{select-tree-prefix-cls}-center_close,
&.@{select-tree-prefix-cls}-bottom_close,
&.@{select-tree-prefix-cls}-noline_close {
- .antTreeSwitcherIcon();
- .ie-rotate(3);
- &:after {
- transform: rotate(270deg) scale(0.5);
- }
+ .antTreeSwitcherIcon("close");
}
}
}
diff --git a/components/tree/demo/customized-icon.md b/components/tree/demo/customized-icon.md
new file mode 100644
index 0000000000..5a89170949
--- /dev/null
+++ b/components/tree/demo/customized-icon.md
@@ -0,0 +1,90 @@
+---
+order: 6
+title:
+ zh-CN: 自定义图标
+ en-US: Customize Icon
+---
+
+## zh-CN
+
+可以针对不同节点采用样式覆盖的方式定制图标。
+
+## en-US
+
+You can customize icons for different nodes by styles override.
+
+````jsx
+import { Tree } from 'antd';
+const TreeNode = Tree.TreeNode;
+
+class Demo extends React.Component {
+ onSelect = (selectedKeys, info) => {
+ console.log('selected', selectedKeys, info);
+ }
+ render() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+ReactDOM.render(, mountNode);
+````
+
+```css
+#components-tree-demo-customized-icon .ant-tree-iconEle {
+ position: absolute;
+ left: 0;
+ background: #fff;
+}
+#components-tree-demo-customized-icon .ant-tree-iconEle::after {
+ font-size: 12px;
+ font-size: 8px \9;
+ transform: scale(0.66666667) rotate(0deg);
+ -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";
+ zoom: 1;
+ display: inline-block;
+ font-family: 'anticon';
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ font-weight: bold;
+ color: #999;
+ transition: transform .3s ease;
+ margin-top: 2px;
+}
+#components-tree-demo-customized-icon .ant-tree-iconEle.ant-tree-icon__docu::after {
+ content: "\E664";
+}
+#components-tree-demo-customized-icon .ant-tree-iconEle.ant-tree-icon__open::after {
+ content: "\E699";
+}
+#components-tree-demo-customized-icon .ant-tree-iconEle.ant-tree-icon__close::after {
+ content: "\E662";
+}
+#components-tree-demo-customized-icon .ant-tree-switcher {
+ position: relative;
+ z-index: 1;
+ background: transparent;
+}
+#components-tree-demo-customized-icon .ant-tree-switcher::after {
+ opacity: 0;
+}
+```
diff --git a/components/tree/demo/line.md b/components/tree/demo/line.md
new file mode 100644
index 0000000000..1281039e69
--- /dev/null
+++ b/components/tree/demo/line.md
@@ -0,0 +1,51 @@
+---
+order: 5
+title:
+ zh-CN: 连接线
+ en-US: Tree With Line
+---
+
+## zh-CN
+
+带连接线的树。
+
+## en-US
+
+Tree With Line
+
+````jsx
+import { Tree } from 'antd';
+const TreeNode = Tree.TreeNode;
+
+class Demo extends React.Component {
+ onSelect = (selectedKeys, info) => {
+ console.log('selected', selectedKeys, info);
+ }
+ render() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+ReactDOM.render(, mountNode);
+````
diff --git a/components/tree/index.en-US.md b/components/tree/index.en-US.md
index d099c7bcbb..f3e2c813b8 100644
--- a/components/tree/index.en-US.md
+++ b/components/tree/index.en-US.md
@@ -38,6 +38,8 @@ Directory, organization, biological classification, country, and etc. Almost thi
|onDragLeave | Defines a function will be called when the onDragLeave event occurs | function({event, node}) | - |
|onDragEnd | Defines a function will be called when the onDragEnd event occurs | function({event, node}) | - |
|onDrop | Defines a function will be called when the onDrop event occurs | function({event, node, dragNode, dragNodesKeys}) | - |
+|showLine | Whether show connecting line | boolean | false |
+|showIcon | Whether show the icon before TreeNode title, which has no default style, you must set custom style for it if set to true | boolean | false |
### TreeNode props
diff --git a/components/tree/index.tsx b/components/tree/index.tsx
index cb25766ea4..29de396184 100644
--- a/components/tree/index.tsx
+++ b/components/tree/index.tsx
@@ -1,6 +1,7 @@
import React from 'react';
import RcTree, { TreeNode } from 'rc-tree';
import animation from '../_util/openAnimation';
+import classNames from 'classnames';
export interface AntTreeNodeProps {
disabled?: boolean;
@@ -96,11 +97,16 @@ export default class Tree extends React.Component {
render() {
const props = this.props;
+ const { prefixCls, className, showLine } = props;
let checkable = props.checkable;
+ const classString = classNames({
+ [`${prefixCls}-show-line`]: !!showLine,
+ }, className);
return (
) : checkable }
+ className={classString}
+ checkable={checkable ? () : checkable }
>
{this.props.children}
diff --git a/components/tree/index.zh-CN.md b/components/tree/index.zh-CN.md
index d4c948f51e..c5d575e1ab 100644
--- a/components/tree/index.zh-CN.md
+++ b/components/tree/index.zh-CN.md
@@ -39,6 +39,8 @@ subtitle: 树形控件
|onDragLeave | dragleave 触发时调用 | function({event, node}) | - |
|onDragEnd | dragend 触发时调用 | function({event, node}) | - |
|onDrop | drop 触发时调用 | function({event, node, dragNode, dragNodesKeys}) | - |
+|showLine | 是否展示连接线 | boolean | false |
+|showIcon | 是否展示 TreeNode title 前的图标,没有默认样式,如设置为 true,需要自行定义图标相关样式 | boolean | false |
### TreeNode props
diff --git a/components/tree/style/index.less b/components/tree/style/index.less
index c601b2b216..c32ffea07e 100644
--- a/components/tree/style/index.less
+++ b/components/tree/style/index.less
@@ -21,7 +21,7 @@
user-select: none;
border-top: 2px transparent solid;
border-bottom: 2px transparent solid;
-
+ margin-top: -2px;
/* Required to make elements draggable in old WebKit */
-khtml-user-drag: element;
-webkit-user-drag: element;
@@ -96,23 +96,27 @@
}
&.@{tree-prefix-cls}-switcher {
&.@{tree-prefix-cls}-switcher-noop {
- cursor: auto;
+ cursor: default;
}
&.@{tree-prefix-cls}-roots_open,
&.@{tree-prefix-cls}-center_open,
&.@{tree-prefix-cls}-bottom_open,
&.@{tree-prefix-cls}-noline_open {
- .antTreeSwitcherIcon();
+ .antTreeSwitcherIcon("open");
}
&.@{tree-prefix-cls}-roots_close,
&.@{tree-prefix-cls}-center_close,
&.@{tree-prefix-cls}-bottom_close,
&.@{tree-prefix-cls}-noline_close {
- .antTreeSwitcherIcon();
- .ie-rotate(3);
- &:after {
- transform: rotate(270deg) scale(0.6);
- }
+ .antTreeSwitcherIcon("close");
+ }
+ }
+ }
+ &:last-child > span {
+ &.@{tree-prefix-cls}-switcher,
+ &.@{tree-prefix-cls}-iconEle {
+ &:before {
+ display: none;
}
}
}
@@ -147,4 +151,27 @@
margin-right: 2px;
vertical-align: top;
}
+ // Tree with line
+ &&-show-line {
+ li {
+ position: relative;
+ span {
+ &.@{tree-prefix-cls}-switcher {
+ background: @component-background;
+ &.@{tree-prefix-cls}-switcher-noop {
+ .antTreeSwitcherIcon("doc");
+ }
+ }
+ }
+ }
+ li:not(:last-child):before {
+ content: ' ';
+ width: 1px;
+ border-left: 1px solid @border-color-base;
+ height: 100%;
+ position: absolute;
+ left: 6px;
+ margin: 16px 0;
+ }
+ }
}
diff --git a/components/tree/style/mixin.less b/components/tree/style/mixin.less
index 96d5f9ce60..3b342f69ca 100644
--- a/components/tree/style/mixin.less
+++ b/components/tree/style/mixin.less
@@ -1,16 +1,16 @@
@import "../../style/mixins/index";
-.antTreeSwitcherIcon() {
- position: relative;
+@open: "\e621";
+@close: "\e645";
+@doc: "\e664";
+
+.antTreeSwitcherIcon(@type) {
&:after {
- .iconfont-size-under-12px(7px);
+ .iconfont-size-under-12px(8px);
display: inline-block;
- .iconfont-font("\e606");
+ .iconfont-font(@@type);
font-weight: bold;
- position: absolute;
- top: 0;
- right: 4px;
- color: @text-color;
+ color: @tree-icon-color;
transition: transform .3s ease;
}
}