$(function(){ // function rem(){ // !function(n){ // var e=n.document, // t=e.documentElement, // i=1920, // d=i/100, // o="orientationchange"in n?"orientationchange":"resize", // a=function(){ // if($(window).innerWidth() > 1920){ // $('html').removeAttr('style'); // } else { // var n=t.clientWidth||320;n>1920&&(n=1920); // t.style.fontSize=n/d+"px" // } // }; // e.addEventListener&&(n.addEventListener(o,a,!1),e.addEventListener("DOMContentLoaded",a,!1)) // }(window); // } // rem(); // 防抖方法 function AntiShake(fn,wait){ var timer = null; return function(){ if(timer !== null){ clearTimeout(timer); } timer = setTimeout(fn,wait); }; } AntiShake(onResize, 200); $(window).resize(AntiShake(onResize, 100)); AntiShake(onScroll, 200); $(window).scroll(AntiShake(onScroll, 100)); //wow调用 if (typeof WOW != 'undefined') { var wow = new WOW({ boxClass: 'wow', animateClass: 'animated', offset: 0, mobile: true, live: true }); wow.init(); } //弹出视频播放器 $('.videoBtn').on('click',function(){ var url = $(this).attr('rel'); if(url.indexOf('http') == 0){ $('.videoPlayer').html(''); } else { $('.videoPlayer').html(''); } $('.PopupVideoBox').fadeIn(200); }); //关闭弹出播放器 $('.closeVideo').on('click', function(){ $('.PopupVideoBox').fadeOut(200); $('.videoPlayer').html(''); }); //swiper方法调用 if(typeof Swiper != 'undefined') { //首页banner var defaBanner = new Swiper('.defaBanner', { paginationClickable: true, loop:true, autoplay:4500, autoplayDisableOnInteraction : false, nextButton: '.defaBannerNext', prevButton: '.defaBannerPrev', pagination : '.defaBannerdot', onInit: function(swiper){ }, onTransitionEnd: function(swiper){ } }); //二级栏目适应内容区 var defaSecondLevelColumn = new Swiper('.defaSecondLevelColumn', { paginationClickable: true, slidesPerView:"auto", spaceBetween:0, autoplayDisableOnInteraction : false, }); } // 页面监听窗口 function onResize(){ if($(window).innerWidth() > 1259){ $('html').removeClass('hideScroll'); $('.defaSearch span').removeClass('closeSearchbox'); $('.defanav ul li p, .defanav, .defaSearchbox,.defaLanguage p').removeAttr('style'); } } //滚动条监听 function onScroll(){ var scrollTop = $(window).scrollTop(); if(scrollTop > $('.header').height()){ $('.defaheader').addClass('defaheaderbg'); } else { $('.defaheader').removeClass('defaheaderbg'); } } //其他事件 $('.defaheader').hover(function(){ $(this).addClass('defaheaderbg'); },function(){ if($(window).scrollTop() < $('.defaheader').height()){ $(this).removeClass('defaheaderbg'); } }); $('.defanav ul li i').on('click',function(){ if($(this).next().is(':hidden')){ $(this).parent().siblings().find('p').slideUp(200); $(this).parent().siblings().removeClass('cur'); $(this).next().slideDown(200); $(this).parent().addClass('cur'); } else { $(this).next().slideUp(200); $(this).parent().removeClass('cur'); } }); $('.defanavbtn').on('click',function(){ if($('.defanav').is(':hidden')){ $(this).addClass('defacloseNavbtn'); $('.defanav').slideDown(200); $('html').addClass('hideScroll'); $('.defaSearchbox').hide(); $('.defaSearch span').removeClass('closeSearchbox'); $('.defaLanguage p').hide(); } else { $(this).removeClass('defacloseNavbtn'); $('.defanav').slideUp(200); $('html').removeClass('hideScroll'); } }); $('.defaSearch span').on('click', function(){ if(window.innerWidth < 1260){ if($(this).next().is(':hidden')){ $(this).addClass('closeSearchbox'); $(this).next().slideDown(200); $('.defanav').hide(); $('.defanavbtn').removeClass('defacloseNavbtn'); $('.defaLanguage p').hide(); } else { $(this).removeClass('closeSearchbox'); $(this).next().slideUp(200); } } }); $('.defaLanguage span').on('click', function(){ if(window.innerWidth < 1260){ if($(this).next().is(':hidden')){ $(this).addClass('closeSearchbox'); $(this).next().slideDown(200); $('.defanav').hide(); $('.defanavbtn').removeClass('defacloseNavbtn'); $('.defaSearchbox').hide(); $('.defaSearch span').removeClass('closeSearchbox'); } else { $(this).removeClass('closeSearchbox'); $(this).next().slideUp(200); } } }); // //省市区选择器 // if (returnCitySN) { // $('#ThreeLevelLinkage').citys({ // code: returnCitySN['cid'], // crossDomain: true, // province:440000, // city:440300, // area:440304, // }); // $('.ChooseCity').select2({ // language: { // noResults: function(params) { // return "暂无数据"; // } // }, // minimumResultsForSearch: Infinity // }); // } // //单项选择器 // $('.individual').select2({ // language: { // noResults: function(params) { // return "暂无数据"; // } // }, // minimumResultsForSearch: Infinity // }); if ($("#grid").length > 0) { int(); function int(){ new AnimOnScroll(document.getElementById('grid'), { minDuration: 0.4, maxDuration: 0.7, viewportFactor: 0.2 }); } $('.WaterfallFlowMore').on('click',function(){ var html = '
  • 2020.10.13

    1从路人甲到C位咖,完美就要这么“妆”!

    作为社会人,每个人都要与他人往来和接触,总有见一面的时候,总会产生或好或坏的第一印象,就第一印象而言,谁都只有一次机会...

  • 2020.10.13

    2从路人甲到C位咖,完美就要这么“妆”!

    作为社会人,每个人都要与他人往来和接触,总有见一面的时候,总会产生或好或坏的第一印象,就第一印象而言,谁都只有一次机会...

  • '; $('.WaterfallFlow ul').append(html); int(); }); } }); // !function(n){ // var e=n.document, // t=e.documentElement, // i=1920, // d=i/100, // o="orientationchange"in n?"orientationchange":"resize", // a=function(){ // var n = t.clientWidth || 320; // //n < 992 && (n = n * 2); // if(n>=1260){ // t.style.fontSize=n/d+"px"; // }else{ // t.style.fontSize="100px"; // } // $('.main').css({'visibility':'visible'}); // }; // e.addEventListener&&(n.addEventListener(o,a,!1),e.addEventListener("DOMContentLoaded",a,!1)) // }(window); $(function () { //swiper方法调用 if (typeof Swiper != 'undefined') { var index_swiper = new Swiper('.index_swiper', { speed: 600, autoplay: 6000, autoplayDisableOnInteraction: false, paginationClickable: true, pagination: '.insw_pagination', noSwiping: true, loop:true, prevButton: '.index_prev', nextButton: '.index_next', autoHeight: true, onInit: function (swiper) { TVideo(swiper); }, onSlideChangeEnd: function (swiper) { TVideo(swiper); } }); function TVideo(abj) { var Video = $(".index_swiper .swiper-slide-active video").get(0) if ($(".index_swiper .swiper-slide-active").find("video").length > 0) { Video.play(); abj.stopAutoplay(); Video.addEventListener('ended', function () { abj.startAutoplay(); }) } } $(".swiper_off i").click(function () { if ($(this).hasClass("cur")) { $(this).removeClass("cur") index_swiper.startAutoplay(); $(this).addClass("icon_stop").removeClass("icon_bofang2"); } else { $(this).addClass("cur") index_swiper.stopAutoplay(); $(this).addClass("icon_bofang2").removeClass("icon_stop"); } }); var inproduct_swiper = new Swiper('.inproduct_swiper', { speed: 600, // pagination: '.inpro_pagination', scrollbarDraggable: true, paginationType: 'progress', slidesPerView: 2, slidesPerColumn: 2, paginationClickable: true, scrollbar: '.inproduct_scrollbar', scrollbarHide: false, spaceBetween: 60, breakpoints: { 1600:{ spaceBetween: 30, }, 992: { spaceBetween: 20, }, 580: { spaceBetween: 10, slidesPerView: 1, } } }); // var purpose_tabSwiper3; var purpose_swiper; // purpose_tabSwiper3 = new Swiper('.purpose_tabSwiper3', { // slidesPerView:8, // spaceBetween: 30, // breakpoints:{ // 992: { // spaceBetween: 5, // }, // 765: { // slidesPerView: 3, // }, // 465: { // slidesPerView:2, // }, // } // }); // purpose_contswiper = new Swiper('.purpose_contswiper', { // speed: 600, // onSlideChangeStart: function (swiper) { // purpose_swiper.slideTo(swiper.activeIndex, 1000, false); // $(".purpose_tab .swiper-slide").eq(swiper.activeIndex).addClass("active").siblings().removeClass("active"); // purpose_tabSwiper3.slideTo(swiper.activeIndex, 1000, false); // } // }); purpose_swiper = new Swiper('.purpose_swiper', { speed: 600, onSlideChangeStart: function (swiper) { // purpose_contswiper.slideTo(swiper.activeIndex, 1000, false); $(".purpose_tab .item").eq(swiper.activeIndex).addClass("active").siblings().removeClass("active"); // purpose_tabSwiper3.slideTo(swiper.activeIndex, 1000, false); $(".home3TabItem").eq(swiper.activeIndex).show().addClass("active").siblings().hide().removeClass("active"); } }); $(".home3TabItem").eq(0).show(); $(".purpose_tab .item").click(function () { var index = $(this).index(); $(this).addClass("active").siblings().removeClass("active"); $(".home3TabItem").eq(index).show().addClass("active").siblings().hide().removeClass("active"); purpose_swiper.slideTo(index, 1000, false); }); $(".purpose_prev").click(function () { purpose_swiper.slidePrev(); }); $(".purpose_next").click(function () { purpose_swiper.slideNext(); }); var incase_swiper1 = new Swiper('.incase_swiper1', { speed: 600, onSlideChangeStart: function (swiper) { $(".incase_tablist .item").eq(swiper.activeIndex).addClass("active").siblings().removeClass("active"); } }); var incase_swiper2 = new Swiper('.incase_swiper2', { speed: 600, observer:true, observeParents:true, onSlideChangeStart: function (swiper) { $(".incase_tablist .item").eq(swiper.activeIndex).addClass("active").siblings().removeClass("active"); } }); $(".incase_tablist .item").hover(function () { var index = $(this).index(); $(this).addClass("active").siblings().removeClass("active") if ($(".incase_swiper").length > 1) { incase_swiper1.slideTo(index, 1000, false); incase_swiper2.slideTo(index, 1000, false); } }); } $(".hsearch_btn").click(function () { if (!$(this).hasClass("active")) { $(this).addClass("active") $("#search-form").css({ "max-height": "60px" }); } else { $(this).removeClass("active") $("#search-form").css({ "max-height": "0" }); } }); $(window).scroll(function () { scrollEvent(); var TopLi = $(window).scrollTop() + 300 $(".Solution_XQ .box").each(function(){ var num = $(this).index() var _this = $(this).offset().top if(TopLi >= _this){ $(".AnchorLocation .con .li").eq(num).addClass("active").siblings().removeClass("active") } }) }); function scrollEvent() { var scrollT = $(window).scrollTop(); if (scrollT > 600) { $("#ScrollTop").addClass("active") $('.cebian').stop().addClass("active"); } else { $("#ScrollTop").removeClass("active"); $('.cebian').stop().removeClass("active"); } } $(".navmenu_div").click(function () { if (!$(this).hasClass("closeNavbtn")) { $(".head_navlist").stop().slideDown(); $(this).addClass("closeNavbtn"); $(".header").addClass("header_active"); $("body").css({ "overflow": "hidden" }); } else { $(".head_navlist").stop().slideUp(); $(this).removeClass("closeNavbtn"); $("body").css({ "overflow-y": "auto" }); } }); $(".head_navlist ul li>span").click(function () { $(this).parent("li").siblings().find(".sub_zinav").stop().slideUp(); $(this).parent("li").siblings().find("span").removeClass("cur") $(this).siblings(".sub_zinav ").find(".sub_zinav3").stop().slideUp(); $(this).siblings(".sub_zinav ").find("i").removeClass("active"); if (!$(this).hasClass("cur")) { $(this).siblings(".sub_zinav").stop().slideDown(); $(this).addClass("cur"); } else { $(this).siblings(".sub_zinav").stop().slideUp(); $(this).removeClass("cur"); } }) var window_width = $(window).innerWidth(); if (window_width >= 992) { var B ; $(".head_navlist li").on("mouseleave",function(){ var that = $(this) B = setTimeout(function () { that.find(".sub_zinav").hide(); }, 800); }); $(".sub_zinav2").on("mouseleave",function(){ $(this).find("i").removeClass("active"); var that = $(this) B = setTimeout(function () { that.find(".sub_zinav3").hide(); }, 800); }); $(".sub_zinav2").on("mouseenter",function(){ $(this).find("i").addClass("active"); $(this).find(".sub_zinav3").stop().slideDown(); $(".ProductNav").stop().hide() clearTimeout(B); }); $(".head_navlist li a").on("mouseenter",function(){ $(this).siblings(".sub_zinav").stop().slideDown(); $(this).parent("li").siblings().find(".sub_zinav").hide() clearTimeout(B); if($(this).siblings(".ProductNav").length > 0){ $(this).siblings(".Lhide").hide(); }else{ $(this).parent("li").siblings().find(".ProductNav").hide() } }); $(".head_navlist li a").on("mouseleave",function(){ clearTimeout(B); }) }else{ $(".sub_zinav2 .Link2").click(function(){ $(this).siblings("i").toggleClass("active"); $(this).siblings(".sub_zinav3").stop().slideToggle(); $(this).parent().siblings().find("i").removeClass("active").siblings(".sub_zinav3").stop().slideUp() }) } $(".footer_nav .iconfontdown").click(function () { if ($(this).hasClass("active")) { $(this).parent("dl").find("dd").stop().slideUp() $(this).removeClass("active") } else { $(this).parent("dl").find("dd").stop().slideDown() $(this).addClass("active") $(this).parent("dl").siblings().find(".footerNav3").stop().slideUp() $(this).parent("dl").siblings().find("dd").stop().slideUp() $(this).parent("dl").siblings().find("i").removeClass("active") } }) if ($(window).innerWidth() <= 992) { $(".footerNav2").click(function(){ if($(this).find("i").hasClass("active")){ $(this).find("i").removeClass("active") $(this).find(".footerNav3").stop().slideUp() }else{ $(this).find("i").addClass("active") $(this).find(".footerNav3").stop().slideDown() $(this).siblings().find("i").removeClass("active") $(this).siblings().find(".footerNav3").stop().slideUp() } }) } $(".submenu_box .submenu_curtitle").click(function(){ if(!$(this).hasClass("cur")){ $(this).addClass("cur") $(".submenu_box_list").stop().slideDown(); }else{ $(this).removeClass("cur") $(".submenu_box_list").stop().slideUp(); } }); $(".innew_tab .item").click(function(){ var index=$(this).index(); $(this).addClass("active").siblings().removeClass("active") $(".innew_list .innew_item").eq(index).css("display","flex").siblings().css("display","none") }); setHeader() ifwidth(); }); function setHeader() { var initHeight = $(document).scrollTop(); if (initHeight > 0) { $(".header").addClass("header_active"); } $(window).scroll(function () { var b = $(document).scrollTop(); if (b <= 60) { $('.header').removeClass("header_active"); } else { $('.header').addClass("header_active"); } }) } function ifwidth() { var window_width = $(window).innerWidth(); if (window_width >= 768) { $(".index_townlist").addClass("swiper-no-swiping") $(".purpose_swiper").addClass("swiper-no-swiping") $(".incase_swiper").addClass("swiper-no-swiping") } } $(function () { $(".publicLeft .li h5").click(function () { if($(this).parent(".li").hasClass("active2")){ $(this).parent(".li").removeClass("active2") $(this).removeClass("active") $(this).siblings(".li2,.Downul2").stop().slideUp().children("h5").removeClass("active") }else if($(this).parent(".li").hasClass("active")){ $(this).parent(".li").removeClass("active") $(this).removeClass("active") $(this).siblings(".li2,.Downul2").stop().slideUp().children("h5").removeClass("active") }else{ $(this).parent(".li").addClass("active") $(this).addClass("active") $(this).siblings(".li2,.Downul2").stop().slideDown() } }) $(".publicLeft .li .ul2 .li3 .t").click(function () { $(this).toggleClass("active") $(this).parents(".ul2").siblings().find(".t").removeClass("active") $(this).parents(".ul2").siblings().find(".ul3").stop().slideUp() $(this).siblings(".ul3").stop().slideToggle() }) // $(".ProTabCont .tabItem").eq(0).show(); $(".ProTabBar .tabTerm").click(function(){ $(this).addClass('active'); $(this).siblings().removeClass("active"); var num =$(".ProTabBar .tabTerm").index(this); $(".ProTabCont .tabItem").eq(num).addClass("active").siblings().removeClass("active"); var hei = $(".ProTabCont .tabItem").eq(num).height() + 70 $(".ProductNav").height(hei) }) var window_width = $(window).innerWidth(); if (window_width > 992) { var B ; $(".header .ProductNavOff a").on("mouseenter",function(){ $(".ProductNav").stop().slideDown() $("body").addClass("active") clearTimeout(B); }); $(".ProductNav").on("mouseenter",function(){ clearTimeout(B); }) $(".header .ProductNavOff a").on("mouseleave",function(){ clearTimeout(B); }) $(".header .ProductNavOff").on("mouseleave",function(){ B = setTimeout(function () { $(".ProductNav").hide() }, 800); $("body").removeClass("active") }); $(".header .ProductNav i").on("mouseenter",function(){ B = setTimeout(function () { $(".ProductNav").stop().hide() }, 800); $("body").removeClass("active") }); } if (window_width < 768) { // $(".publicLeft .li").removeClass("active") } /*视频播放*/ var myVideo=document.getElementById("Video1"); $('.TopicPageCon2 .off').on('click',function(){ if (myVideo.paused) { setTimeout(() => { myVideo.play(); }, 10 ); $(this).children("img").hide(); }else { setTimeout(() => { myVideo.pause(); }, 10 ); $(this).children("img").show(); } }) /*视频播放*/ var myVideo2=document.getElementById("Video2"); $('.big_video .off').on('click',function(){ if (myVideo2.paused) { setTimeout(() => { myVideo2.play(); }, 10 ); $(this).children("img").hide(); $(this).siblings(".text").hide(); }else { setTimeout(() => { myVideo2.pause(); }, 10 ); $(this).children("img").show(); $(this).siblings(".text").show(); } }) if (typeof BeerSlider != 'undefined') { $('.slider').each(function(){ new BeerSlider(this); }); } new Swiper('.SolutionXQ_swiper', { speed: 600, slidesPerView: 3, spaceBetween: 20, scrollbar:'.SolutionXQ_scrollbar', breakpoints:{ 992: { spaceBetween: 10, }, 765: { spaceBetween: 10, slidesPerView: 2, }, 465: { spaceBetween: 10, slidesPerView: 1, } } }); $('.AnchorLocation .li').click(function() { $(this).addClass("active").siblings().removeClass("active") var num = $(this).index(); $('html,body').animate({ scrollTop: $('.Solution_XQ .box').eq(num).offset().top - 50 }, 500) }); var CXQswiper1 = new Swiper('.classicCase_XQswiper1', { speed: 600, slidesPerView: 1, onSlideChangeEnd: function(swiper){ var num = CXQswiper1.activeIndex; $(".classicCase_XQswiper2 .swiper-slide").eq(num).addClass("active").siblings().removeClass("active") } }); var CXQswiper2 = new Swiper('.classicCase_XQswiper2', { speed: 600, slidesPerView: 6, spaceBetween: 12, breakpoints:{ 992: { slidesPerView: 5, spaceBetween: 8, }, 765: { spaceBetween:5, slidesPerView: 4, }, 465: { spaceBetween:5, slidesPerView: 3, } } }); $(".classicCase_XQswiper2 .swiper-slide").on("click",function(){ var num = $(this).index() CXQswiper1.slideTo(num, 1000, false);//切换到第一个slide,速度为1秒 $(this).addClass("active").siblings().removeClass("active") }) //tab切换 $(".ServiceTabCont .tabItem").eq(0).show(); $(".ServiceTabBar .tabTerm").click(function(){ $(this).addClass('active'); $(this).siblings().removeClass("active"); var num =$(".ServiceTabBar .tabTerm").index(this); $(".ServiceTabCont .tabItem").eq(num).addClass("active").siblings().removeClass("active") }) new Swiper('.News_swiper', { effect : 'fade', speed: 600, autoplay : 4000, pagination: '.News_pagination', paginationClickable :true, breakpoints:{ 765: { autoHeight: true, }, } }); var aboutUsCon6_swiper = new Swiper('.aboutUsCon6_swiper', { slidesPerView:5, // autoplay : 4000, speed:500, // loop:true, prevButton:'.aboutCon6_prev', nextButton:'.aboutCon6_next', breakpoints:{ 992: { slidesPerView: 4, }, 765: { slidesPerView: 3, }, 465: { slidesPerView: 2, } }, onSlideChangeStart: function(swiper){ $(".aboutUsCon6_swiper .swiper-slide").eq(swiper.activeIndex).addClass("active").siblings().removeClass("active") $(".aboutUs .con6 .box .li").eq(swiper.realIndex).addClass("active").siblings().removeClass("active") } }); $(".aboutUs .con6 .aboutUsCon6_swiper .swiper-slide").on('click',function(){ var num =$(this).index(); $(this).addClass("active").siblings().removeClass("active") $(".aboutUs .con6 .box .li").eq(num).addClass("active").siblings().removeClass("active") console.log(num) }) new Swiper('.aboutUsCon7_swiper', { slidesPerView:4, spaceBetween: 20, autoplay : 4000, scrollbar:'.aboutUsCon7_scrollbar', breakpoints:{ 992: { slidesPerView: 3, }, 765: { slidesPerView: 2, }, } }); //tab切换 $(".Case_bigTabBar .tabTerm").click(function(){ $(this).addClass('active'); $(this).siblings().removeClass("active"); var num =$(".Case_bigTabBar .tabTerm").index(this); $(".Case_bigTabCont .tabItem").eq(num).addClass("active").siblings().removeClass("active") }) $(".Z6TopicPage6TabBar .tabTerm").click(function(){ $(this).addClass('active'); $(this).siblings().removeClass("active"); var num =$(".Z6TopicPage6TabBar .tabTerm").index(this); $(".Z6TopicPage6TabCont .tabItem").eq(num).addClass("active").siblings().removeClass("active") }) $(".Case_CCETabBar .tabTerm").click(function(){ $(this).addClass('active'); $(this).siblings().removeClass("active"); var num =$(".Case_CCETabBar .tabTerm").index(this); $(".Case_CCETabCont .tabItem").eq(num).addClass("active").siblings().removeClass("active") }) new Swiper('.PastHighlights_swiper', { slidesPerView:3, spaceBetween: 30, prevButton:'.PastHighlights_prev', nextButton:'.PastHighlights_next', breakpoints:{ 992: { spaceBetween: 10, }, 765: { slidesPerView: 2, }, 465: { slidesPerView: 1, }, } }); // $(".TopicPageCon8").on('click',function(){ // console.log("点击了") // $(".tipsbox").hide(); // }); $(".home4TabBar .tabTerm").click(function(){ $(this).addClass('active'); $(this).siblings().removeClass("active"); var num =$(".home4TabBar .tabTerm").index(this); $(".home4TabCont .tabItem").eq(num).addClass("active").siblings().removeClass("active") }) $(".publicLeft i").on("click",function(){ if($(this).hasClass("active")){ $(this).removeClass("active") $(this).siblings(".li:not(:nth-child(2))").slideUp() // $(this).siblings(".li.active").slideDown() }else{ $(this).addClass("active") $(this).siblings(".li").slideDown() } }) }) $(function(){ $(".TopicPageCon8").click(function(){ console.log('1') $(".tipsbox").hide(); }); if($(".waves").length>0){ class ShaderProgram { constructor( holder, options = {} ) { options = Object.assign( { antialias: false, depthTest: false, mousemove: false, autosize: true, side: 'front', vertex: ` precision highp float; attribute vec4 a_position; attribute vec4 a_color; uniform float u_time; uniform vec2 u_resolution; uniform vec2 u_mousemove; uniform mat4 u_projection; varying vec4 v_color; void main() { gl_Position = u_projection * a_position; gl_PointSize = (10.0 / gl_Position.w) * 100.0; v_color = a_color; }`, fragment: ` precision highp float; uniform sampler2D u_texture; uniform int u_hasTexture; varying vec4 v_color; void main() { if ( u_hasTexture == 1 ) { gl_FragColor = v_color * texture2D(u_texture, gl_PointCoord); } else { gl_FragColor = v_color; } }`, uniforms: {}, buffers: {}, camera: {}, texture: null, onUpdate: ( () => {} ), onResize: ( () => {} ), }, options ) var uniforms = Object.assign( { time: { type: 'float', value: 0 }, hasTexture: { type: 'int', value: 0 }, resolution: { type: 'vec2', value: [ 0, 0 ] }, mousemove: { type: 'vec2', value: [ 0, 0 ] }, projection: { type: 'mat4', value: [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ] }, }, options.uniforms ) var buffers = Object.assign( { position: { size: 3, data: [] }, color: { size: 4, data: [] }, }, options.buffers ) var camera = Object.assign( { fov: 60, near: 1, far: 10000, aspect: 1, z: 100, perspective: true, }, options.camera ) var canvas = document.createElement( 'canvas' ) var gl = canvas.getContext( 'webgl', { antialias: options.antialias } ) if ( ! gl ) return false this.count = 0 this.gl = gl this.canvas = canvas this.camera = camera this.holder = holder this.onUpdate = options.onUpdate this.onResize = options.onResize this.data = {} holder.appendChild( canvas ) this.createProgram( options.vertex, options.fragment ) this.createBuffers( buffers ) this.createUniforms( uniforms ) this.updateBuffers() this.updateUniforms() this.createTexture( options.texture ) gl.enable( gl.BLEND ) gl.enable( gl.CULL_FACE ) gl.blendFunc( gl.SRC_ALPHA, gl.ONE ) gl[ options.depthTest ? 'enable' : 'disable' ]( gl.DEPTH_TEST ) if ( options.autosize ) window.addEventListener( 'resize', e => this.resize( e ), false ) if ( options.mousemove ) window.addEventListener( 'mousemove', e => this.mousemove( e ), false ) this.resize() this.update = this.update.bind( this ) this.time = { start: performance.now(), old: performance.now() } this.update() } mousemove( e ) { var x = e.pageX / this.width * 2 - 1 var y = e.pageY / this.height * 2 - 1 this.uniforms.mousemove = [ x, y ] } resize( e ) { var holder = this.holder var canvas = this.canvas var gl = this.gl var width = this.width = holder.offsetWidth var height = this.height = holder.offsetHeight var aspect = this.aspect = width / height var dpi = this.dpi = devicePixelRatio canvas.width = width * dpi canvas.height = height * dpi canvas.style.width = width + 'px' canvas.style.height = height + 'px' gl.viewport( 0, 0, width * dpi, height * dpi ) gl.clearColor( 0, 0, 0, 0 ) this.uniforms.resolution = [ width, height ] this.uniforms.projection = this.setProjection( aspect ) this.onResize( width, height, dpi ) } setProjection( aspect ) { var camera = this.camera if ( camera.perspective ) { camera.aspect = aspect var fovRad = camera.fov * ( Math.PI / 180 ) var f = Math.tan( Math.PI * 0.5 - 0.5 * fovRad ) var rangeInv = 1.0 / ( camera.near - camera.far ) var matrix = [ f / camera.aspect, 0, 0, 0, 0, f, 0, 0, 0, 0, (camera.near + camera.far) * rangeInv, -1, 0, 0, camera.near * camera.far * rangeInv * 2, 0 ] matrix[ 14 ] += camera.z matrix[ 15 ] += camera.z return matrix } else { return [ 2 / this.width, 0, 0, 0, 0, -2 / this.height, 0, 0, 0, 0, 1, 0, -1, 1, 0, 1, ] } } createShader( type, source ) { var gl = this.gl var shader = gl.createShader( type ) gl.shaderSource( shader, source ) gl.compileShader( shader ) if ( gl.getShaderParameter (shader, gl.COMPILE_STATUS ) ) { return shader } else { console.log( gl.getShaderInfoLog( shader ) ) gl.deleteShader( shader ) } } createProgram( vertex, fragment ) { var gl = this.gl var vertexShader = this.createShader( gl.VERTEX_SHADER, vertex ) var fragmentShader = this.createShader( gl.FRAGMENT_SHADER, fragment ) var program = gl.createProgram() gl.attachShader( program, vertexShader ) gl.attachShader( program, fragmentShader ) gl.linkProgram( program ) if ( gl.getProgramParameter( program, gl.LINK_STATUS ) ) { gl.useProgram( program ) this.program = program } else { console.log( gl.getProgramInfoLog( program ) ) gl.deleteProgram( program ) } } createUniforms( data ) { var gl = this.gl var uniforms = this.data.uniforms = data var values = this.uniforms = {} Object.keys( uniforms ).forEach( name => { var uniform = uniforms[ name ] uniform.location = gl.getUniformLocation( this.program, 'u_' + name ) Object.defineProperty( values, name, { set: value => { uniforms[ name ].value = value this.setUniform( name, value ) }, get: () => uniforms[ name ].value } ) } ) } setUniform( name, value ) { var gl = this.gl var uniform = this.data.uniforms[ name ] uniform.value = value switch ( uniform.type ) { case 'int': { gl.uniform1i( uniform.location, value ) break } case 'float': { gl.uniform1f( uniform.location, value ) break } case 'vec2': { gl.uniform2f( uniform.location, ...value ) break } case 'vec3': { gl.uniform3f( uniform.location, ...value ) break } case 'vec4': { gl.uniform4f( uniform.location, ...value ) break } case 'mat2': { gl.uniformMatrix2fv( uniform.location, false, value ) break } case 'mat3': { gl.uniformMatrix3fv( uniform.location, false, value ) break } case 'mat4': { gl.uniformMatrix4fv( uniform.location, false, value ) break } } // ivec2 : uniform2i, // ivec3 : uniform3i, // ivec4 : uniform4i, // sampler2D : uniform1i, // samplerCube : uniform1i, // bool : uniform1i, // bvec2 : uniform2i, // bvec3 : uniform3i, // bvec4 : uniform4i, } updateUniforms() { var gl = this.gl var uniforms = this.data.uniforms Object.keys( uniforms ).forEach( name => { var uniform = uniforms[ name ] this.uniforms[ name ] = uniform.value } ) } createBuffers( data ) { var gl = this.gl var buffers = this.data.buffers = data var values = this.buffers = {} Object.keys( buffers ).forEach( name => { var buffer = buffers[ name ] buffer.buffer = this.createBuffer( 'a_' + name, buffer.size ) Object.defineProperty( values, name, { set: data => { buffers[ name ].data = data this.setBuffer( name, data ) if ( name == 'position' ) this.count = buffers.position.data.length / 3 }, get: () => buffers[ name ].data } ) } ) } createBuffer( name, size ) { var gl = this.gl var program = this.program var index = gl.getAttribLocation( program, name ) var buffer = gl.createBuffer() gl.bindBuffer( gl.ARRAY_BUFFER, buffer ) gl.enableVertexAttribArray( index ) gl.vertexAttribPointer( index, size, gl.FLOAT, false, 0, 0 ) return buffer } setBuffer( name, data ) { var gl = this.gl var buffers = this.data.buffers if ( name == null && ! gl.bindBuffer( gl.ARRAY_BUFFER, null ) ) return gl.bindBuffer( gl.ARRAY_BUFFER, buffers[ name ].buffer ) gl.bufferData( gl.ARRAY_BUFFER, new Float32Array( data ), gl.STATIC_DRAW ) } updateBuffers() { var gl = this.gl var buffers = this.buffers Object.keys( buffers ).forEach( name => buffers[ name ] = buffer.data ) this.setBuffer( null ) } createTexture( src ) { var gl = this.gl var texture = gl.createTexture() gl.bindTexture( gl.TEXTURE_2D, texture ) gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array( [ 0, 0, 0, 0 ] ) ) this.texture = texture if ( src ) { this.uniforms.hasTexture = 1 this.loadTexture( src ) } } loadTexture( src ) { var gl = this.gl var texture = this.texture var textureImage = new Image() textureImage.onload = () => { gl.bindTexture( gl.TEXTURE_2D, texture ) gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, textureImage ) gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR ) gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR ) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) // gl.generateMipmap( gl.TEXTURE_2D ) } textureImage.src = src } update() { var gl = this.gl var now = performance.now() var elapsed = ( now - this.time.start ) / 5000 var delta = now - this.time.old this.time.old = now this.uniforms.time = elapsed if ( this.count > 0 ) { gl.clear( gl.COLORBUFFERBIT ) gl.drawArrays( gl.POINTS, 0, this.count ) } this.onUpdate( delta ) requestAnimationFrame( this.update ) } } var pointSize = 2.5 var waves = new ShaderProgram( document.querySelector( '.waves' ), { texture: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAb1BMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8v0wLRAAAAJHRSTlMAC/goGvDhmwcExrVjWzrm29TRqqSKenRXVklANSIUE8mRkGpv+HOfAAABCElEQVQ4y4VT13LDMAwLrUHteO+R9f/fWMfO6dLaPeKVEECRxOULWsEGpS9nULDwia2Y+ALqUNbAWeg775zv+sA4/FFRMxt8U2FZFCVWjR/YrH4/H9sarclSKdPMWKzb8VsEeHB3m0shkhVCyNzeXeAQ9Xl4opEieX2QCGnwGbj6GMyjw9t1K0fK9YZunPXeAGsfJtYjwzxaBnozGGorYz0ypK2HzQSYx1y8DgSRo2ewOiyh2QWOEk1Y9OrQV0a8TiBM1a8eMHWYnRMy7CZ4t1CmyRkhSUvP3gRXyHOCLBxNoC3IJv//ZrJ/kxxUHPUB+6jJZZHrpg6GOjnqaOmzp4NDR48OLxn/H27SRQ08S0ZJAAAAAElFTkSuQmCC', uniforms: { size: { type: 'float', value: pointSize }, field: { type: 'vec3', value: [ 0, 0, 0 ] }, speed: { type: 'float', value: 5 }, }, vertex: ` #define M_PI 3.1415926535897932384626433832795 precision highp float; attribute vec4 a_position; attribute vec4 a_color; uniform float u_time; uniform float u_size; uniform float u_speed; uniform vec3 u_field; uniform mat4 u_projection; varying vec4 v_color; void main() { vec3 pos = a_position.xyz; pos.y += ( cos(pos.x / u_field.x * M_PI * 8.0 + u_time * u_speed) + sin(pos.z / u_field.z * M_PI * 8.0 + u_time * u_speed) ) * u_field.y; gl_Position = u_projection * vec4( pos.xyz, a_position.w ); gl_PointSize = ( u_size / gl_Position.w ) * 100.0; v_color = a_color; }`, fragment: ` precision highp float; uniform sampler2D u_texture; varying vec4 v_color; void main() { gl_FragColor = v_color * texture2D(u_texture, gl_PointCoord); }`, onResize( w, h, dpi ) { var position = [], color = [] var width = 400 * ( w / h ) var depth = 400 var height = 3 var distance = 5 for ( var x = 0; x < width; x += distance ) { for ( var z = 0; z < depth; z+= distance ) { position.push( - width / 2 + x, -30, -depth / 2 + z ) color.push( 0, 1 - ( x / width ) * 1, 0.5 + x / width * 0.5, z / depth ) } } this.uniforms.field = [ width, height, depth ] this.buffers.position = position this.buffers.color = color this.uniforms.size = ( h / 400) * pointSize * dpi }, } ) } }); $body = (window.opera) ? (document.compatMode == "CSS1Compat" ? $("html") : $("body")) : $("html,body"); $("#ScrollTop").click(function () { $body.animate({ scrollTop: 0 }, 400) });