爱心炫酷动效源码

流动光线爱心

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>爱茜茜</title>
    <link rel="stylesheet" href="css/style.css" />
  </head>
  <style>
    body {
        background-color: #000;
        margin: 0;
        overflow: hidden;
        background-repeat: no-repeat;
    }
  </style>
  <body>
    <!-- 绘画爱心 -->
    <canvas id="canvas" width="1400" height="600"></canvas>
    <!-- js部分 -->
    <script>
      var canvas = document.getElementById("canvas");
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
// Initialize the GL context
var gl = canvas.getContext('webgl');
if (!gl) {
    console.error("Unable to initialize WebGL.");
}
//Time step
var dt = 0.015;
//Time
var time = 0.0;
//************** Shader sources **************
var vertexSource = `
attribute vec2 position;
void main() {
	gl_Position = vec4(position, 0.0, 1.0);
}
`;

var fragmentSource = `
precision highp float;

uniform float width;
uniform float height;
vec2 resolution = vec2(width, height);

uniform float time;

#define POINT_COUNT 8

vec2 points[POINT_COUNT];
const float speed = -0.5;
const float len = 0.25;
float intensity = 0.9;
float radius = 0.015;

//https://www.shadertoy.com/view/MlKcDD
//Signed distance to a quadratic bezier
float sdBezier(vec2 pos, vec2 A, vec2 B, vec2 C){    
	vec2 a = B - A;
	vec2 b = A - 2.0*B + C;
	vec2 c = a * 2.0;
	vec2 d = A - pos;

	float kk = 1.0 / dot(b,b);
	float kx = kk * dot(a,b);
	float ky = kk * (2.0*dot(a,a)+dot(d,b)) / 3.0;
	float kz = kk * dot(d,a);      

	float res = 0.0;

	float p = ky - kx*kx;
	float p3 = p*p*p;
	float q = kx*(2.0*kx*kx - 3.0*ky) + kz;
	float h = q*q + 4.0*p3;

	if(h >= 0.0){ 
		h = sqrt(h);
		vec2 x = (vec2(h, -h) - q) / 2.0;
		vec2 uv = sign(x)*pow(abs(x), vec2(1.0/3.0));
		float t = uv.x + uv.y - kx;
		t = clamp( t, 0.0, 1.0 );

		// 1 root
		vec2 qos = d + (c + b*t)*t;
		res = length(qos);
	}else{
		float z = sqrt(-p);
		float v = acos( q/(p*z*2.0) ) / 3.0;
		float m = cos(v);
		float n = sin(v)*1.732050808;
		vec3 t = vec3(m + m, -n - m, n - m) * z - kx;
		t = clamp( t, 0.0, 1.0 );

		// 3 roots
		vec2 qos = d + (c + b*t.x)*t.x;
		float dis = dot(qos,qos);
        
		res = dis;

		qos = d + (c + b*t.y)*t.y;
		dis = dot(qos,qos);
		res = min(res,dis);
		
		qos = d + (c + b*t.z)*t.z;
		dis = dot(qos,qos);
		res = min(res,dis);

		res = sqrt( res );
	}
    
	return res;
}


//http://mathworld.wolfram.com/HeartCurve.html
vec2 getHeartPosition(float t){
	return vec2(16.0 * sin(t) * sin(t) * sin(t),
							-(13.0 * cos(t) - 5.0 * cos(2.0*t)
							- 2.0 * cos(3.0*t) - cos(4.0*t)));
}

//https://www.shadertoy.com/view/3s3GDn
float getGlow(float dist, float radius, float intensity){
	return pow(radius/dist, intensity);
}

float getSegment(float t, vec2 pos, float offset, float scale){
	for(int i = 0; i < POINT_COUNT; i++){
		points[i] = getHeartPosition(offset + float(i)*len + fract(speed * t) * 6.28);
	}
    
	vec2 c = (points[0] + points[1]) / 2.0;
	vec2 c_prev;
	float dist = 10000.0;
    
	for(int i = 0; i < POINT_COUNT-1; i++){
		//https://tinyurl.com/y2htbwkm
		c_prev = c;
		c = (points[i] + points[i+1]) / 2.0;
		dist = min(dist, sdBezier(pos, scale * c_prev, scale * points[i], scale * c));
	}
	return max(0.0, dist);
}

void main(){
	vec2 uv = gl_FragCoord.xy/resolution.xy;
	float widthHeightRatio = resolution.x/resolution.y;
	vec2 centre = vec2(0.5, 0.5);
	vec2 pos = centre - uv;
	pos.y /= widthHeightRatio;
	//Shift upwards to centre heart
	pos.y += 0.02;
	float scale = 0.000015 * height;
	
	float t = time;
    
	//Get first segment
	float dist = getSegment(t, pos, 0.0, scale);
	float glow = getGlow(dist, radius, intensity);
    
	vec3 col = vec3(0.0);
    
	//White core
	col += 10.0*vec3(smoothstep(0.003, 0.001, dist));
	//Pink glow
	col += glow * vec3(0.94,0.14,0.4);
    
	//Get second segment
	dist = getSegment(t, pos, 3.4, scale);
	glow = getGlow(dist, radius, intensity);
    
	//White core
	col += 10.0*vec3(smoothstep(0.003, 0.001, dist));
	//Blue glow
	col += glow * vec3(0.2,0.6,1.0);
        
	//Tone mapping
	col = 1.0 - exp(-col);

	//Output to screen
 	gl_FragColor = vec4(col,1.0);
}
`;

//************** Utility functions **************

window.addEventListener('resize', onWindowResize, false);

function onWindowResize() {
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    gl.viewport(0, 0, canvas.width, canvas.height);
    gl.uniform1f(widthHandle, window.innerWidth);
    gl.uniform1f(heightHandle, window.innerHeight);
}


//Compile shader and combine with source
function compileShader(shaderSource, shaderType) {
    var shader = gl.createShader(shaderType);
    gl.shaderSource(shader, shaderSource);
    gl.compileShader(shader);
    if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
        throw "Shader compile failed with: " + gl.getShaderInfoLog(shader);
    }
    return shader;
}

//From https://codepen.io/jlfwong/pen/GqmroZ
//Utility to complain loudly if we fail to find the attribute/uniform
function getAttribLocation(program, name) {
    var attributeLocation = gl.getAttribLocation(program, name);
    if (attributeLocation === -1) {
        throw 'Cannot find attribute ' + name + '.';
    }
    return attributeLocation;
}

function getUniformLocation(program, name) {
    var attributeLocation = gl.getUniformLocation(program, name);
    if (attributeLocation === -1) {
        throw 'Cannot find uniform ' + name + '.';
    }
    return attributeLocation;
}

//************** Create shaders **************

//Create vertex and fragment shaders
var vertexShader = compileShader(vertexSource, gl.VERTEX_SHADER);
var fragmentShader = compileShader(fragmentSource, gl.FRAGMENT_SHADER);

//Create shader programs
var program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);

gl.useProgram(program);

//Set up rectangle covering entire canvas 
var vertexData = new Float32Array([-1.0, 1.0, // top left
    -1.0, -1.0, // bottom left
    1.0, 1.0, // top right
    1.0, -1.0, // bottom right
]);

//Create vertex buffer
var vertexDataBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexDataBuffer);
gl.bufferData(gl.ARRAY_BUFFER, vertexData, gl.STATIC_DRAW);

// Layout of our data in the vertex buffer
var positionHandle = getAttribLocation(program, 'position');

gl.enableVertexAttribArray(positionHandle);
gl.vertexAttribPointer(positionHandle,
    2, // position is a vec2 (2 values per component)
    gl.FLOAT, // each component is a float
    false, // don't normalize values
    2 * 4, // two 4 byte float components per vertex (32 bit float is 4 bytes)
    0 // how many bytes inside the buffer to start from
);

//Set uniform handle
var timeHandle = getUniformLocation(program, 'time');
var widthHandle = getUniformLocation(program, 'width');
var heightHandle = getUniformLocation(program, 'height');

gl.uniform1f(widthHandle, window.innerWidth);
gl.uniform1f(heightHandle, window.innerHeight);

function draw() {
    //Update time
    time += dt;

    //Send uniforms to program
    gl.uniform1f(timeHandle, time);
    //Draw a triangle strip connecting vertices 0-4
    gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);

    requestAnimationFrame(draw);
}

draw();
    </script>
  </body>
</html>

弥漫爱心

<!DOCTYPE html>
<html>
<head>
	<title>爱茜茜</title>
</head>
<style>
  *{
    padding: 0;
    margin: 0;
  }
  html, body {
    height: 100%;
    padding: 0;
    margin: 0;
    background: #000;
  }
  canvas {
    position: absolute;
    width: 100%;
    height: 100%;
  }
  .aa{
    position: fixed;
    left: 50%;
    bottom: 10px;
    color: #ccc
  }
</style>
<body>
    <canvas id="pinkboard"></canvas>
 
    <script> 
    /*
    * Settings
    */
    var settings = {
      particles: {
        length:   500, // maximum amount of particles
        duration:   2, // particle duration in sec
        velocity: 100, // particle velocity in pixels/sec
        effect: -0.75, // play with this for a nice effect
        size:      30, // particle size in pixels
      },
    };
    
    /*
    * RequestAnimationFrame polyfill by Erik M?ller
    */
    (function(){var b=0;var c=["ms","moz","webkit","o"];for(var a=0;a<c.length&&!window.requestAnimationFrame;++a){window.requestAnimationFrame=window[c[a]+"RequestAnimationFrame"];window.cancelAnimationFrame=window[c[a]+"CancelAnimationFrame"]||window[c[a]+"CancelRequestAnimationFrame"]}if(!window.requestAnimationFrame){window.requestAnimationFrame=function(h,e){var d=new Date().getTime();var f=Math.max(0,16-(d-b));var g=window.setTimeout(function(){h(d+f)},f);b=d+f;return g}}if(!window.cancelAnimationFrame){window.cancelAnimationFrame=function(d){clearTimeout(d)}}}());
    
    /*
    * Point class
    */
    var Point = (function() {
      function Point(x, y) {
        this.x = (typeof x !== 'undefined') ? x : 0;
        this.y = (typeof y !== 'undefined') ? y : 0;
      }
      Point.prototype.clone = function() {
        return new Point(this.x, this.y);
      };
      Point.prototype.length = function(length) {
        if (typeof length == 'undefined')
          return Math.sqrt(this.x * this.x + this.y * this.y);
        this.normalize();
        this.x *= length;
        this.y *= length;
        return this;
      };
      Point.prototype.normalize = function() {
        var length = this.length();
        this.x /= length;
        this.y /= length;
        return this;
      };
      return Point;
    })();
    
    /*
    * Particle class
    */
    var Particle = (function() {
      function Particle() {
        this.position = new Point();
        this.velocity = new Point();
        this.acceleration = new Point();
        this.age = 0;
      }
      Particle.prototype.initialize = function(x, y, dx, dy) {
        this.position.x = x;
        this.position.y = y;
        this.velocity.x = dx;
        this.velocity.y = dy;
        this.acceleration.x = dx * settings.particles.effect;
        this.acceleration.y = dy * settings.particles.effect;
        this.age = 0;
      };
      Particle.prototype.update = function(deltaTime) {
        this.position.x += this.velocity.x * deltaTime;
        this.position.y += this.velocity.y * deltaTime;
        this.velocity.x += this.acceleration.x * deltaTime;
        this.velocity.y += this.acceleration.y * deltaTime;
        this.age += deltaTime;
      };
      Particle.prototype.draw = function(context, image) {
        function ease(t) {
          return (--t) * t * t + 1;
        }
        var size = image.width * ease(this.age / settings.particles.duration);
        context.globalAlpha = 1 - this.age / settings.particles.duration;
        context.drawImage(image, this.position.x - size / 2, this.position.y - size / 2, size, size);
      };
      return Particle;
    })();
    
    /*
    * ParticlePool class
    */
    var ParticlePool = (function() {
      var particles,
          firstActive = 0,
          firstFree   = 0,
          duration    = settings.particles.duration;
      
      function ParticlePool(length) {
        // create and populate particle pool
        particles = new Array(length);
        for (var i = 0; i < particles.length; i++)
          particles[i] = new Particle();
      }
      ParticlePool.prototype.add = function(x, y, dx, dy) {
        particles[firstFree].initialize(x, y, dx, dy);
        
        // handle circular queue
        firstFree++;
        if (firstFree   == particles.length) firstFree   = 0;
        if (firstActive == firstFree       ) firstActive++;
        if (firstActive == particles.length) firstActive = 0;
      };
      ParticlePool.prototype.update = function(deltaTime) {
        var i;
        
        // update active particles
        if (firstActive < firstFree) {
          for (i = firstActive; i < firstFree; i++)
            particles[i].update(deltaTime);
        }
        if (firstFree < firstActive) {
          for (i = firstActive; i < particles.length; i++)
            particles[i].update(deltaTime);
          for (i = 0; i < firstFree; i++)
            particles[i].update(deltaTime);
        }
        
        // remove inactive particles
        while (particles[firstActive].age >= duration && firstActive != firstFree) {
          firstActive++;
          if (firstActive == particles.length) firstActive = 0;
        }
        
        
      };
      ParticlePool.prototype.draw = function(context, image) {
        // draw active particles
        if (firstActive < firstFree) {
          for (i = firstActive; i < firstFree; i++)
            particles[i].draw(context, image);
        }
        if (firstFree < firstActive) {
          for (i = firstActive; i < particles.length; i++)
            particles[i].draw(context, image);
          for (i = 0; i < firstFree; i++)
            particles[i].draw(context, image);
        }
      };
      return ParticlePool;
    })();
    
    /*
    * Putting it all together
    */
    (function(canvas) {
      var context = canvas.getContext('2d'),
          particles = new ParticlePool(settings.particles.length),
          particleRate = settings.particles.length / settings.particles.duration, // particles/sec
          time;
      
      // get point on heart with -PI <= t <= PI
      function pointOnHeart(t) {
        return new Point(
          160 * Math.pow(Math.sin(t), 3),
          130 * Math.cos(t) - 50 * Math.cos(2 * t) - 20 * Math.cos(3 * t) - 10 * Math.cos(4 * t) + 25
        );
      }
      
      // creating the particle image using a dummy canvas
      var image = (function() {
        var canvas  = document.createElement('canvas'),
            context = canvas.getContext('2d');
        canvas.width  = settings.particles.size;
        canvas.height = settings.particles.size;
        // helper function to create the path
        function to(t) {
          var point = pointOnHeart(t);
          point.x = settings.particles.size / 2 + point.x * settings.particles.size / 350;
          point.y = settings.particles.size / 2 - point.y * settings.particles.size / 350;
          return point;
        }
        // create the path
        context.beginPath();
        var t = -Math.PI;
        var point = to(t);
        context.moveTo(point.x, point.y);
        while (t < Math.PI) {
          t += 0.01; // baby steps!
          point = to(t);
          context.lineTo(point.x, point.y);
        }
        context.closePath();
        // create the fill
        context.fillStyle = '#ea80b0';
        context.fill();
        // create the image
        var image = new Image();
        image.src = canvas.toDataURL();
        return image;
      })();
      
      // render that thing!
      function render() {
        // next animation frame
        requestAnimationFrame(render);
        
        // update time
        var newTime   = new Date().getTime() / 1000,
            deltaTime = newTime - (time || newTime);
        time = newTime;
        
        // clear canvas
        context.clearRect(0, 0, canvas.width, canvas.height);
        
        // create new particles
        var amount = particleRate * deltaTime;
        for (var i = 0; i < amount; i++) {
          var pos = pointOnHeart(Math.PI - 2 * Math.PI * Math.random());
          var dir = pos.clone().length(settings.particles.velocity);
          particles.add(canvas.width / 2 + pos.x, canvas.height / 2 - pos.y, dir.x, -dir.y);
        }
        
        // update and draw particles
        particles.update(deltaTime);
        particles.draw(context, image);
      }
      
      // handle (re-)sizing of the canvas
      function onResize() {
        canvas.width  = canvas.clientWidth;
        canvas.height = canvas.clientHeight;
      }
      window.onresize = onResize;
      
      // delay rendering bootstrap
      setTimeout(function() {
        onResize();
        render();
      }, 10);
    })(document.getElementById('pinkboard'));
  </script>
</body>
</html>

流星散落爱心

<!DOCTYPE html>
<html lang="en" >
<head>
  <meta charset="UTF-8">
  <title>爱茜茜</title>
</head>
<style>
   html,body{
    border: 0;
    padding: 0;
    margin: 0;
    overflow: hidden;
    background: #000;
  }
  .info{
    z-index:999;
    position : absolute;
    left:0;
    top:0;
    padding:10px;
    color:#fff;
    background: rgba(0,0,0,0.5);
    text-transform:capitalize;
  }
</style>
<body>
  <canvas width="300" height="300" style="width:100%;height:100vh;" id="c"></canvas>

  <script>
    var canvas = document.getElementById('c');
    var ctx = canvas.getContext("2d");
    var height = void 0,width = void 0,innerpoints = [],outerpoints = [],particles = [];

    var noofpoints = 200,trashold = 10;
    var x = void 0,y = void 0,p = void 0,n = void 0,point = void 0,dx = void 0,dy = void 0,color = void 0;
    deltaangle = Math.PI * 2 / noofpoints,
    r = Math.min(height, width) * 0.5;

    var distance = function distance(x1, y1, x2, y2) {
      return Math.sqrt(Math.pow(y2 - y1, 2) + Math.pow(x2 - x1, 2));
    };
    var mapVal = function mapVal(num, in_min, in_max, out_min, out_max) {
      return (num - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
    };
    var resize = function resize() {
      height = ctx.canvas.clientHeight;
      width = ctx.canvas.clientWidth;

      if (ctx.canvas.clientWidth !== canvas.width ||
      ctx.canvas.clientHeight !== canvas.height)
      {
        console.log("resized");
        canvas.width = width;
        canvas.height = height;
        ctx.translate(canvas.width / 2, canvas.height / 2);
        ctx.rotate(-Math.PI);
        innerpoints = [];
        r = 10;
        for (var i = deltaangle; i <= Math.PI * 2; i += deltaangle) {
          x = r * 16 * Math.pow(Math.sin(i), 3);
          y = r * (13 * Math.cos(i) - 5 * Math.cos(2 * i) - 2 * Math.cos(3 * i) - Math.cos(4 * i));
          innerpoints.push({
            x: x,
            y: y });


          x = 10 * r * 16 * Math.pow(Math.sin(i), 3);
          y = 10 * r * (13 * Math.cos(i) - 5 * Math.cos(2 * i) - 2 * Math.cos(3 * i) - Math.cos(4 * i));
          outerpoints.push({
            x: x,
            y: y });


          var step = random(0.001, 0.003, true);
          particles.push({
            step: step,
            x: x,
            y: y });

        }
      }
    };
    var random = function random(min, max, isFloat) {
      if (isFloat) {
        return Math.random() * (max - min) + min;
      }
      return ~~(Math.random() * (max - min) + min);
    };

    resize();

    //particles = [...outerpoints];
    ctx.globalAlpha = 0.5;
    ctx.globalCompositeOperation = 'source-over';
    var draw = function draw() {
      ctx.fillStyle = "rgba(0,0,0,0.03)";
      ctx.fillRect(-width, -height, width * 2, height * 2);
      ctx.beginPath();

      for (var i = 0; i < innerpoints.length; i++) {
        s = outerpoints[i];
        d = innerpoints[i];
        point = particles[i];

        if (distance(point.x, point.y, d.x, d.y) > 10) {
          dx = d.x - s.x;
          dy = d.y - s.y;

          point.x += dx * point.step;
          point.y += dy * point.step;
          color = distance(0, 0, point.x, point.y);
          ctx.beginPath();
          ctx.fillStyle = "hsl(" + color % 360 + ",100%,50%)";
          ctx.arc(point.x, point.y, 2, 0, Math.PI * 2, false);
          ctx.closePath();
          ctx.fill();
        } else {
          point.x = d.x;
          point.y = d.y;
          ctx.beginPath();
          ctx.arc(point.x, point.y, 2, 0, Math.PI * 2, false);
          ctx.closePath();
          ctx.fill();
          particles[i].x = s.x;
          particles[i].y = s.y;
          particles[i].step = random(0.001, 0.003, true);
        }
      }

    };


    var render = function render() {
      resize();
      draw();
      requestAnimationFrame(render);
    };

    requestAnimationFrame(render);

  </script>
</body>
</html>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: HTML炫酷相册源码是一种用HTML语言编写的相册展示页面,可以通过实现各种视觉效果和交互特效来提升用户在浏览相册时的体验。 在编写HTML炫酷相册源码时,可以运用一些常见的技术手段来实现炫酷效果,比如: 1. 使用CSS3动画效果:通过CSS3的animation、transition等特性,实现元素的渐变、旋转、缩放、平移等动画效果,使相册页面更加生动,吸引用户的眼球。 2. 加载页面过渡效果:通过设置页面的加载过渡效果,如淡入淡出、渐显渐隐等效果,使用户在浏览相册时流畅切换页面,增加页面的时尚感和动感。 3. 编写自定义的图片切换特效:可以用JavaScript来编写自定义的图片轮播特效,实现图片的无缝切换、淡入淡出、平滑滑动等效果。 4. 特殊的布局和排列方式:对相册页面的布局进行创新,展示独特的相片排列方式,如瀑布流式布局、圆形布局等,增加页面的独特性和吸引力。 5. 页面的交互特效:通过使用JavaScript库如jQuery等来实现一些用户与页面的交互特效,如点击图片放大、翻转、拖拽等,提升用户的体验感。 总而言之,HTML炫酷相册源码通过运用CSS3JavaScript等技术手段,实现了图片展示的动感、时尚和互动效果,使用户在浏览相册时享受到更好的视觉和交互体验。这种源码的编写涉及到对HTML、CSS和JavaScript等相关知识的掌握和灵活运用。 ### 回答2: HTML炫酷相册源码是一种可以在网页中展示图片集合的代码。这个相册可以通过HTML、CSS和JavaScript来实现。 首先,我们需要在HTML中创建一个容器,用来承载我们的相册。可以使用`<div>`标签来创建一个具有唯一ID的容器,例如`<div id="gallery-container"></div>`。 接下来,我们需要编写一些CSS样式来定义相册容器的外观,例如背景颜色、边框等。使用CSS选择器来选择容器,然后设置相应的样式。例如可以使用`#gallery-container`来选择容器,并设置`background-color: #f2f2f2; border: 1px solid #ccc;`等样式。 然后,我们需要使用JavaScript来为相册添加交互效果。我们可以使用`<img>`标签来加载图片,然后使用JavaScript动态地向相册中添加图片。例如可以使用以下代码来添加一张图片: ``` var galleryContainer = document.querySelector('#gallery-container'); var img = document.createElement('img'); img.src = 'path/to/image.jpg'; galleryContainer.appendChild(img); ``` 由于我们想要实现炫酷的效果,可以使用一些JavaScript库或框架来增强我们的相册。例如,可以使用jQuery来实现图片的轮播效果,或者使用Lightbox库来实现点击图片后弹出大图浏览的效果。 最后,为了使相册能够在网页上展示出来,我们需要将HTML、CSS和JavaScript代码整合在一起,并将其嵌入到网页中,可以在`<head>`标签中引入CSS样式,在`<body>`标签中引入JavaScript代码,并在一个`<script>`标签中初始化相册。 总之,HTML炫酷相册源码可以通过HTML、CSS和JavaScript来实现,可以使用`<div>`创建容器,用CSS样式定义外观,使用JavaScript动态地添加图片,使用其他库或框架增强交互效果,最后整合在网页中展示。 ### 回答3: HTML 炫酷相册源码是一种可以展示图片并给用户提供交互体验的网页代码。以下是一个简单的示例: ```html <!DOCTYPE html> <html> <head> <style> /* 定义相册容器样式 */ .gallery { display: grid; grid-template-columns: repeat(3, 1fr); grid-gap: 10px; } /* 定义图片样式 */ .gallery img { max-width: 100%; display: block; } </style> </head> <body> <div class="gallery"> <img src="image1.jpg" alt="图片1"> <img src="image2.jpg" alt="图片2"> <img src="image3.jpg" alt="图片3"> <img src="image4.jpg" alt="图片4"> <img src="image5.jpg" alt="图片5"> <img src="image6.jpg" alt="图片6"> </div> </body> </html> ``` 上面的示例展示了一个简单的相册效果,相册容器使用了网格布局(grid),将图片按照设定的列数展示出来。图片使用了`img`标签,并采用了响应式设计,使其在不同设备上以合适的宽度显示(`max-width: 100%`)。每张图片还设定了一个`alt`属性,用于在图片加载失败时显示替代文本。 你可以根据实际需要进一步修改和优化这段代码,例如添加过渡效果、放大功能或者使用JavaScript实现更复杂的交互效果。最终的炫酷相册效果取决于你对HTML、CSS和JavaScript的理解和运用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值