react实现svg钢笔路径编辑调整效果代码
代码语言:html
所属分类:其他
代码描述:react实现svg钢笔路径编辑调整效果代码
代码标签: react 实现 svg 钢笔 路径 编辑 调整
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style> @import url(https://fonts.googleapis.com/css?family=Open+Sans:400,600); :root { --ad-Color-prim: #111; --ad-Color-sec: #00E676; --ad-Color-del: #E53935; } html { font-size: 16px; font-family: "Open Sans", sans-serif; } html, body { height: 100%; } .ad-App { height: 100%; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; } /* main layout */ .ad-Container { height: 100%; width: 100%; display: -webkit-box; display: -ms-flexbox; display: flex; background: #fff; } .ad-Container-main { height: 100%; -webkit-box-flex: 1; -ms-flex: 1; flex: 1; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; } .ad-Container-svg { height: 100%; -webkit-box-flex: 1; -ms-flex: 1; flex: 1; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; background: #f3f3f3; } .ad-Container-controls { overflow: hidden; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; height: 100%; width: 20rem; background: #111; background: var(--ad-Color-prim); } .ad-Container-controls ::-webkit-scrollbar { width: 6px; } .ad-Container-controls ::-webkit-scrollbar-thumb { border-radius: 30px; background: rgba(255, 255, 255, .3); } .ad-Foot { padding: 1.5rem 2rem; display: -webkit-box; display: -ms-flexbox; display: flex; background: #fff; border-top: 2px solid #eee; } .ad-Foot-list { -webkit-box-flex: 1; -ms-flex: 1; flex: 1; } .ad-Foot-item { text-transform: uppercase; font-size: .7rem; color: #111; color: var(--ad-Color-prim); } .ad-Foot-item + .ad-Foot-item { margin-top: .5rem; } .ad-Foot-highlight { padding-bottom: .04rem; border-bottom: 2px solid #00E676; border-bottom: 2px solid var(--ad-Color-sec); font-weight: bold; } .ad-Foot-meta { margin-left: 2rem; text-align: right; line-height: 1.4; font-size: .7rem; color: #111; color: var(--ad-Color-prim); } .ad-Foot-meta a { text-decoration: underline; color: #111; color: var(--ad-Color-prim); } .ad-SVG { display: block; background: #fff; border-radius: 4px; } .ad-Grid { fill: none; stroke: #eee; stroke-width: 1px; } .ad-Grid.is-hidden { opacity: 0; } .ad-Path { fill: none; stroke: #555; stroke-width: 4px; stroke-linecap: round; } .ad-Point { cursor: pointer; fill: #fff; stroke: #555; stroke-width: 5px; -webkit-transition: fill .2s; -o-transition: fill .2s; transition: fill .2s; } .ad-Point:hover, .ad-PointGroup.is-active .ad-Point { fill: #00E676; fill: var(--ad-Color-sec); } .ad-PointGroup--first .ad-Point { stroke: #00E676; stroke: var(--ad-Color-sec); } .ad-Anchor { opacity: .5; } .ad-PointGroup.is-active .ad-Anchor { opacity: 1; } .ad-Anchor-point { cursor: pointer; fill: #fff; stroke: #888; stroke-width: 5px; } .ad-Anchor-line { stroke: #888; stroke-width: 1px; stroke-dasharray: 5 5; } /* controls on the right */ .ad-Controls { overflow: auto; -webkit-box-flex: 1; -ms-flex: 1; flex: 1; padding: 2rem; } .ad-Controls :first-child { margin-top: 0; } .ad-Controls-title { margin: 3rem 0 1.5rem; font-size: .8rem; font-weight: bold; color: #fff; } .ad-Controls-container { display: -webkit-box; display: -ms-flexbox; display: flex; } .ad-Controls-container + .ad-Controls-container { margin-top: 1.5rem; } .ad-Control { -webkit-box-flex: 1; -ms-flex: 1; flex: 1; } .ad-Control-label { display: block; margin-bottom: .5rem; text-transform: uppercase; font-size: .6rem; font-weight: bold; color: color(#111 l(+75%)); color: color(var(--ad-Color-prim) l(+75%)); } .ad-Result { height: 5rem; padding: 1.4rem 1.6rem; background: #111; background: var(--ad-Color-prim); -webkit-box-shadow: 0 -5px 10px rgba(0, 0, 0, .4); box-shadow: 0 -5px 10px rgba(0, 0, 0, .4); } .ad-Result-textarea { height: 100%; width: 100%; resize: none; border: none; background: none; text-transform: uppercase; font-family: "Open Sans", sans-serif; font-size: .7rem; font-weight: bold; line-height: 1.8; color: #fff; } .ad-Result-textarea:focus { outline: 0; } /* control elements */ .ad-Button { padding: .8rem 1.4rem; background: #00E676; background: var(--ad-Color-sec); border: none; border-radius: 50px; cursor: pointer; -webkit-transition: background .2s; -o-transition: background .2s; transition: background .2s; text-transform: uppercase; font-family: "Open Sans", sans-serif; font-weight: bold; font-size: .6rem; letter-spacing: .08rem; color: #fff; } .ad-Button:focus, .ad-Button:hover { outline: 0; background: color(#00E676 l(+5%)); background: color(var(--ad-Color-sec) l(+5%)); } .ad-Button--delete { background: #E53935; background: var(--ad-Color-del); } .ad-Button--delete:focus, .ad-Button--delete:hover { background: color(#E53935 l(+5%)); background: color(var(--ad-Color-del) l(+5%)); } .ad-Button--reset { background: color(#111 l(+10%)); background: color(var(--ad-Color-prim) l(+10%)); } .ad-Button--reset:focus, .ad-Button--reset:hover { background: color(#111 l(+15%)); background: color(var(--ad-Color-prim) l(+15%)); } .ad-Text { height: 18px; width: 2rem; background: color(#111 l(+10%)); background: color(var(--ad-Color-prim) l(+10%)); border: none; border-radius: 4px; text-align: center; font-family: "Open Sans", sans-serif; font-size: .6rem; color: #fff; } .ad-Text:focus { outline: 0; background: color(#111 l(+20%)); background: color(var(--ad-Color-prim) l(+20%)); } .ad-Checkbox-input { display: none; } .ad-Checkbox-fake { position: relative; height: 14px; width: 2rem; background: color(#111 l(+10%)); background: color(var(--ad-Color-prim) l(+10%)); border-radius: 30px; } .ad-Checkbox-fake::after { content: ""; -webkit-box-sizing: border-box; box-sizing: border-box; display: block; position: absolute; top: -2px; left: 0; height: 18px; width: 18px; cursor: pointer; border: 4px solid #fff; background: color(#111 l(+10%)); background: color(var(--ad-Color-prim) l(+10%)); border-radius: 50%; } .ad-Checkbox-input:checked + .ad-Checkbox-fake::after { left: auto; right: 0; border-color: #00E676; border-color: var(--ad-Color-sec); } .ad-Choices { display: -webkit-box; display: -ms-flexbox; display: flex; width: 12rem; } .ad-Choice { -webkit-box-flex: 1; -ms-flex: 1; flex: 1; } .ad-Choice-input { display: none; } .ad-Choice-fake { padding: .6rem; background: color(#111 l(+10%)); background: color(var(--ad-Color-prim) l(+10%)); border: 4px solid transparent; -webkit-transition: border .2s; -o-transition: border .2s; transition: border .2s; cursor: pointer; text-align: center; text-transform: uppercase; font-family: "Open Sans", sans-serif; font-size: .8rem; font-weight: bold; color: #fff; } .ad-Choice:first-child .ad-Choice-fake { border-radius: 4px 0 0 4px; } .ad-Choice:last-child .ad-Choice-fake { border-radius: 0 4px 4px 0; } .ad-Choice-input:checked + .ad-Choice-fake { border-color: #00E676; border-color: var(--ad-Color-sec); } .ad-Range { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; } .ad-Range-text { margin-left: .5rem; } .ad-Range-input { width: 100%; height: 14px; -webkit-appearance: none; -moz-appearance: none; appearance: none; border-radius: 30px; background: color(#111 l(+10%)); background: color(var(--ad-Color-prim) l(+10%)); } .ad-Range-input:focus { outline: 0; background: color(#111 l(+20%)); background: color(var(--ad-Color-prim) l(+20%)); } /* thumb */ .ad-Range-input::-webkit-slider-thumb { -webkit-appearance: none; width: 18px; height: 18px; border: 4px solid #fff; background: color(#111 l(+10%)); background: color(var(--ad-Color-prim) l(+10%)); border-radius: 50%; cursor: pointer; -webkit-transition: border .2s; transition: border .2s; } .ad-Range-input::-moz-range-thumb { -webkit-appearance: none; width: 18px; height: 18px; border: 4px solid #fff; background: color(#111 l(+10%)); background: color(var(--ad-Color-prim) l(+10%)); border-radius: 50%; cursor: pointer; -moz-transition: border .2s; transition: border .2s; } .ad-Range-input:hover::-webkit-slider-thumb, .ad-Range-input:focus::-webkit-slider-thumb { border-color: #00E676; border-color: var(--ad-Color-sec); } .ad-Range-input:hover::-moz-range-thumb, .ad-Range-input:focus::-moz-range-thumb { border-color: #00E676; border-color: var(--ad-Color-sec); } </style> </head> <body> <!-- partial:index.partial.html --> <div id="app" class="ad-App"> </div> <!-- partial --> <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/react.15.4.2.js"></script> <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/react-dom.15.4.2.js"></script> <script> function _extends() {_extends = Object.assign || function (target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i];for (var key in source) {if (Object.prototype.hasOwnProperty.call(source, key)) {target[key] = source[key];}}}return target;};return _extends.apply(this, arguments);}function _defineProperty(obj, key, value) {if (key in obj) {Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true });} else {obj[key] = value;}return obj;}const Component = React.Component; const render = ReactDOM.render; class Container extends Component {constructor(...args) {super(...args);_defineProperty(this, "state", { w: 800, h: 600, grid: { show: true, snap: true, size: 50 }, ctrl: false, points: [ { x: 100, y: 300 }, { x: 200, y: 300, q: { x: 150, y: 50 } }, { x: 300, y: 300, q: { x: 250, y: 550 } }, { x: 400, y: 300, q: { x: 350, y: 50 } }, { x: 500, y: 300, c: [{ x: 450, y: 550 }, { x: 450, y: 50 }] }, { x: 600, y: 300, c: [{ x: 550, y: 50 }, { x: 550, y: 550 }] }, { x: 700, y: 300, a: { rx: 50, ry: 50, rot: 0, laf: 1, sf: 1 } }], activePoint: 2, draggedPoint: false, draggedQuadratic: false, draggedCubic: false, closePath: false });_defineProperty(this, "setWidth", e => { let v = this.positiveNumber(e.target.value),min = 1; if (v < min) v = min; this.setState({ w: v }); });_defineProperty(this, "setHeight", e => { let v = this.positiveNumber(e.target.value),min = 1; if (v < min) v = min; this.setState({ h: v }); });_defineProperty(this, "setGridSize", e => { let .........完整代码请登录后点击上方下载按钮下载查看
网友评论0