平面地图标注点线条连接效果。常用于公司的子公司或办事处在地图上标注点的效果,线条由总公司的标注点动态发散至各子公司或公事处,实现关联性的效果。
HTML代码:
<section id="global"> <div class="box" data-aos="fade-up"> <article class="item"> <div class="dot"></div> <div class="info"> <!--弹窗信息--> </div> <div class="svgs"> <div class="line"> <svg viewBox="0 0 147 28"> <path d="M1.221,27.592 C1.221,27.592 93.172,-30.117 146.627,24.334 "/> </svg> </div> <div class="line"> <svg viewBox="0 0 11 128"> <path d="M7.221,128.592 C7.221,128.592 18.777,28.450 0.711,1.526 "/> </svg> </div> <div class="line"> <svg viewBox="0 0 332 63"> <path d="M332.221,63.678 C332.221,63.678 199.326,-23.181 1.262,9.376 "/> </svg> </div> <div class="line"> <svg viewBox="0 0 503 190"> <path d="M503.306,190.505 C503.306,190.505 320.289,-69.237 0.899,19.998"/> </svg> </div> <div class="line"> <svg viewBox="0 0 794 166"> <path d="M794.136,166.850 C794.136,166.850 610.325,-100.723 0.918,46.300 "/> </svg> </div> <div class="line"> <svg viewBox="0 0 735 141"> <path d="M736.306,140.592 C736.306,140.592 453.864,-111.599 1.684,62.397 "/> </svg> </div> <div class="line"> <svg viewBox="0 0 667 99"> <path d="M667.306,99.678 C667.306,99.678 366.469,-98.539 1.047,70.354 "/> </svg> </div> <div class="line"> <svg viewBox="0 0 758 125"> <path d="M759.221,121.678 C759.221,121.678 398.503,-151.382 1.812,126.021 "/> </svg> </div> <div class="line"> <svg viewBox="0 0 592 223"> <path d="M593.306,16.592 C593.306,16.592 233.827,-79.580 1.919,224.024 "/> </svg> </div> <div class="line"> <svg viewBox="0 0 597 305"> <path d="M598.392,4.505 C598.392,4.505 324.592,-46.590 1.579,306.423 "/> </svg> </div> <div class="line"> <svg viewBox="0 0 267 172"> <path d="M268.221,1.592 C268.221,1.592 60.274,7.618 2.369,173.185 "/> </svg> </div> </div> </article> <article class="item"> <div class="dot"></div> <div class="info"> </div> </article> <article class="item"> <div class="dot"></div> <div class="info"> </div> </article> <article class="item"> <div class="dot"></div> <div class="info"> </div> </article> <article class="item"> <div class="dot"></div> <div class="info"> </div> </article> <article class="item"> <div class="dot"></div> <div class="info"> </div> </article> <article class="item"> <div class="dot"></div> <div class="info"> </div> </article> <article class="item"> <div class="dot"></div> <div class="info"> </div> </article> <article class="item"> <div class="dot"></div> <div class="info"> </div> </article> <article class="item"> <div class="dot"></div> <div class="info"> </div> </article> <article class="item"> <div class="dot"></div> <div class="info"> </div> </article> <article class="item"> <div class="dot"></div> <div class="info"> </div> </article> </div> </section>
CSS代码:
/*global*/ html { font-size:100px; } #global { width:14.4rem; margin:0 auto; .box { width: 13rem; margin:0.6rem auto 0; max-width: 100%; background: url(../images/global.svg) no-repeat center center; //global.svg是背景地图,自行准备 background-size: contain; position: relative; &:after { display: block; content: ''; padding-bottom:(597/1300*100%); } } .dot { width: 0.16rem; background: url(../images/point_blue.svg) no-repeat center center; //point_blue.svg是蓝色的标注点,自行准备 background-size: contain; &:after { display: block; content: ''; padding-bottom:(21/16*100%); } } /*弹窗样式*/ .info { position: absolute; left:(-15em/16); top:~'calc(100% + 1.0625em)'; background-color: #fff; border-radius: (10em/16); padding:(35em/16) (40em/16) (40em/16); width:(335em/16); box-shadow: 0 (4em/16) (32em/16) rgba(0,51,153,0.12); display: none; &:before { .after; left:(20em/16); bottom:100%; border-bottom: (15em/16) solid #fff; border-right: (15em/16) solid transparent; border-left: (6em/16) solid transparent; } } /*弹窗样式*/ .item { position: absolute; transform: translate(-50%,-50%); cursor: pointer; z-index: 2; &:nth-child(1) { left:(977/1300*100%); top:(193.5/597*100%); .dot { background-image: url(../images/point_red.svg);//point_red.svg是色色的标注点,区别总部,自行准备 width: 0.2rem; } } &:nth-child(2) { left:(1123/1300*100%); top:(197.5/597*100%); } &:nth-child(3) { left:(646/1300*100%); top:(141/597*100%); } &:nth-child(4) { left:(968/1300*100%); top:(62.5/597*100%); } &:nth-child(5) { left:(475/1300*100%); top:(29/597*100%); } &:nth-child(6) { left:(183/1300*100%); top:(82/597*100%); } &:nth-child(7) { left:(243/1300*100%); top:(121/597*100%); } &:nth-child(8) { left:(310/1300*100%); top:(170/597*100%); } &:nth-child(9) { left:(221/1300*100%); top:(205/597*100%); } &:nth-child(10) { left:(386/1300*100%); top:(407/597*100%); } &:nth-child(11) { left:(384/1300*100%); top:(501/597*100%); } &:nth-child(12) { left:(712/1300*100%); top:(370/597*100%); } &:nth-child(n+10){ .info { top:auto; bottom:~'calc(100% + 1.0625em)'; &:before { bottom:auto; top:100%; border-bottom:none; border-top: (15em/16) solid #fff; } } } &.active { z-index: 5; } } .svgs { svg { position: absolute; left:0; top:0; width: 100%; height: 100%; transition: all 3s; } path { fill: none; stroke-width: 0.01rem; stroke: var(--main-color); stroke-linejoin:miter; stroke-linecap:butt; fill-rule:evenodd; } .line { position: absolute; pointer-events: none; &:after { display: block; content: ''; } &:nth-child(1){ width: 1.47rem; left:(11/20*100%); top:(-13/25*100%); transform-origin: left center; &:after { padding-bottom:(28/147*100%); } svg { stroke-dasharray:155; stroke-dashoffset:147; } } &:nth-child(2){ width: 0.11rem; bottom:(16/25*100%); left:(5/20*100%); transform-origin: right bottom; &:after { padding-bottom:(128/11*100%); } svg { stroke-dasharray:128; stroke-dashoffset:128; } } &:nth-child(3){ width: 3.32rem; bottom:(10/25*100%); right:(10/20*100%); transform-origin: right bottom; &:after { padding-bottom:(63/332*100%); } svg { stroke-dasharray:335; stroke-dashoffset:335; } } &:nth-child(4){ width: 5.03rem; bottom:(14/25*100%); right:(5/20*100%); transform-origin: 98% bottom; &:after { padding-bottom:(190/503*100%); } svg { stroke-dasharray:575; stroke-dashoffset:575; } } &:nth-child(5){ width: 7.94rem; bottom:(6/25*100%); right:(7/20*100%); transform-origin: 99% 92%; &:after { padding-bottom:(166/794*100%); } svg { stroke-dasharray:840; stroke-dashoffset:840; } } &:nth-child(6){ width: 7.35rem; bottom:(6/25*100%); right:(7/20*100%); transform-origin: 99% 92%; &:after { padding-bottom:(141/735*100%); } svg { stroke-dasharray:780; stroke-dashoffset:780; } } &:nth-child(7){ width: 6.67rem; bottom:(6/25*100%); right:(7/20*100%); transform-origin: 99% 92%; &:after { padding-bottom:(99/667*100%); } svg { stroke-dasharray:690; stroke-dashoffset:690; } } &:nth-child(8){ width: 7.58rem; bottom:(4/25*100%); right:(8/20*100%); transform-origin: 99% 92%; &:after { padding-bottom:(125/758*100%); } svg { stroke-dasharray:805; stroke-dashoffset:805; } } &:nth-child(9){ width: 5.92rem; top:(4/25*100%); right:(8/20*100%); transform-origin: 99% 1%; &:after { padding-bottom:(223/592*100%); } svg { stroke-dasharray:665; stroke-dashoffset:665; } } &:nth-child(10){ width: 5.97rem; top:(14/25*100%); right:(8/20*100%); transform-origin: 98% -1%; &:after { padding-bottom:(305/597*100%); } svg { stroke-dasharray:683; stroke-dashoffset:683; } } &:nth-child(11){ width: 2.67rem; top:(14/25*100%); right:(8/20*100%); transform-origin: 99% 1%; &:after { padding-bottom:(172/267*100%); } svg { stroke-dasharray:335; stroke-dashoffset:335; } } } } .current { .svgs { .line { &:nth-child(n+1){ svg { stroke-dashoffset:0; } } } } } } @media only screen and (max-width:1024px) { #global { .item { &:nth-child(-n+3) { .info { left:auto; right: (-15em/16); &:before { left:auto; right: (20em/16); border-left-width: (15em/16); border-right-width: (6em/16); } } } } .svgs { .line { transform: scale(0.82); } } } } @media only screen and (max-width:750px) { #global { .info { font-size: 0.14rem; padding:1.5em 2em 2em; } .svgs { .line { transform: scale(0.35); } } } }
jQuery代码:
/**/ var $global = $('#global'); var $globalTop = $global.offset().top - $(window).height()/2; $(window).scroll(function(){ if($(this).scrollTop() > $globalTop){ $global.find('.box').addClass('current'); }else{ $global.find('.box').removeClass('current'); } }).trigger('scroll'); $(window).resize(function(){ if($(this).width() > 1024){ $global.find('.item').on('mouseenter mouseleave'); $global.find('.item').mouseenter(function(){ $(this).addClass('active').find('.info').stop().fadeIn('fast'); }).mouseleave(function(){ $(this).removeClass('active').find('.info').stop().hide(); }); }else{ $global.find('.item').off('mouseenter mouseleave'); $global.find('.item').off('click').click(function(){ $(this).toggleClass('active').find('.info').stop().fadeToggle('fast'); $(this).siblings('.item').removeClass('active').find('.info').hide(); }); } }).trigger('resize');
注:以上代码只适合固定标注点的效果,如果是动态添加的,则不太适合。