jQuery实现响应式瀑布流效果(jQuery+flex)

news2024/9/28 17:29:35

        瀑布流原理:是一种常见的网页布局方式,它的特点是将内容以多列的形式呈现,每一列的内容高度不固定,根据内容的大小自适应调整,从而形成了像瀑布一样的流动效果。

        瀑布流的实现原理涉及到数据加载、布局设计、图片加载和响应式设计等方面,需要综合考虑各个方面的因素,以实现高效、流畅、美观的瀑布流效果。

        目前网上很多技术博文是使用定位完成瀑布流效果的,这里将使用jquery和flex布局来实现响应式瀑布流效果。

        效果如下图:

         以上在不同屏幕尺寸下,自动调整页面布局列的效果,以满足页面内容正常展示;通过计算范围不同屏幕下需要显示几列,当浏览器大小改变时,重新调整页面数据。

        题外话,最近发现很多网站采集CSDN网站内容,未经作者同意照搬照抄,虽然让人心里有点不舒服,但考虑再三,还是继续自己技术分享,希望大家希望。

一、页面搭建

1.1 css样式

        这里就直接贴页面样式代码,如果这块有不清楚的,可以自建demo运行看看即可,CSS仅实现了页面布局和内容样式修饰作用。

        在css目录创建demo_waterfall.css文件,代码如下:

html, body{ margin: 0; padding: 0; font-size: 12px; font-family: Verdana, Geneva, Tahoma, sans-serif; }

/* 瀑布流列flex布局样式 */
.waterfall-flex-container{ position: relative; display: flex; }
.waterfall-flex-container .column-item{ flex: 1; padding: 0 10px; }
.waterfall-flex-container .column-item::after{ display: block; content: ''; clear: both; }

.waterfall-load-more{ text-align: center; font-size: 14px; color: #666; padding: 30px 0; }


/* 追加容器样式 */
.waterfall-container{ padding: 20px; }
.waterfall-container .wf-content{ position: relative; }

.waterfall-container .item{ width: 300px; display: block;  text-decoration: none; color: #333; background-color: #fff; box-shadow: 0 0 6px rgba(0, 0, 0, .1); border-radius: 10px; margin: 10px 0; padding: 12px; box-sizing: border-box; overflow: hidden; float: left; }
.waterfall-container .item img{ max-width: 100%; }

.waterfall-flex-container .column-item .item{ width: 100%; box-sizing: border-box; margin: 20px 0; transition:All 0.4s ease-in-out; border: 1px solid #eee; float: none; }

.waterfall-flex-container .column-item .item:hover{ transform: scale(1.03); }

@media screen and (max-width: 520px) {
    .waterfall-flex-container .column-item{ padding: 0; }
}

1.2 js闭包

        在js目录创建demo_waterfall.js文件,后续插件函数定义和功能均在此完成,代码如下:

/**
 * 闭包 - 定义瀑布流封装函数
 */
(function($, win, doc){
    

})(jQuery, window, document);

1.3 html

        创建html页面,并引入样式文件、jquery和自定义插件js(demo_waterfall.js)文件,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>瀑布流</title>
    <link rel="stylesheet" type="text/css" href="css/demo_waterfall.css" />
    <script type="text/javascript" src="js/jquery-3.6.4.min.js"></script>
    <script type="text/javascript" src="js/demo_waterfall.js"></script>
</head>
<body>
    
</body>
</html>

        这里是基于jquery基础上进行开发的,所以jquery必须要引入。

1.4 页面定义瀑布流div

代码如下:

<!-- waterfall -->
<div class="waterfall-container">
    <div class="wf-content" id="waterfall"></div>
</div>
<!-- /waterfall -->

1.5 渲染内容

        因为只是静态Demo,所以这边需要使用setTimeout来模拟ajax延迟加载效果,然后将渲染元素追加到#waterfall容器中,代码如下:

<!-- waterfall -->
    <div class="waterfall-container">
        <div class="wf-content" id="waterfall"></div>
    </div>
    <!-- /waterfall -->
<script type="text/javascript">
var imagesList = [
    {title: "图片1", description: "这是一张优美的图片!这是一张优美的图片!这是一张优美的图片!这是一张优美的图片!", img: "images/waterfall/photo (1).png"},
    {title: "图片2", description: "这是一张优美的图片!这是一张优美的图片!", img: "images/waterfall/photo (2).png"},
    {title: "图片3", description: "这是一张优美的图片!", img: "images/waterfall/photo (3).png"},
    {title: "图片4", description: "这是一张优美的图片!这是一张优美的图片!这是一张优美的图片!这是一张优美的图片!这是一张优美的图片!", img: "images/waterfall/photo (4).png"},
    {title: "图片5", description: "这是一张优美的图片!这是一张优美的图片!", img: "images/waterfall/photo (5).png"},
    {title: "图片6", description: "这是一张优美的图片!这是一张优美的图片!这是一张优美的图片!这是一张优美的图片!", img: "images/waterfall/photo (6).png"},
    {title: "图片7", description: "这是一张优美的图片!", img: "images/waterfall/photo (7).png"},
    {title: "图片8", description: "这是一张优美的图片!这是一张优美的图片!", img: "images/waterfall/photo (8).png"},
    {title: "图片9", description: "这是一张优美的图片!这是一张优美的图片!这是一张优美的图片!这是一张优美的图片!这是一张优美的图片!", img: "images/waterfall/photo (9).png"},
    {title: "图片10", description: "这是一张优美的图片!这是一张优美的图片!", img: "images/waterfall/photo (10).png"},
    {title: "图片11", description: "这是一张优美的图片!这是一张优美的图片!", img: "images/waterfall/photo (11).png"},
    {title: "图片12", description: "这是一张优美的图片!", img: "images/waterfall/photo (12).png"},
    {title: "图片13", description: "这是一张优美的图片!这是一张优美的图片!这是一张优美的图片!这是一张优美的图片!这是一张优美的图片!", img: "images/waterfall/photo (13).png"},
    {title: "图片14", description: "这是一张优美的图片!这是一张优美的图片!", img: "images/waterfall/photo (14).png"},
    {title: "图片15", description: "这是一张优美的图片!", img: "images/waterfall/photo (15).png"},
    {title: "图片16", description: "这是一张优美的图片!这是一张优美的图片!这是一张优美的图片!", img: "images/waterfall/photo (16).png"},
];

// 将获取的数据填充到dom中,返回拼接后的html
function generateHtml(item){
    return `<a href="javascript:;" class="item">
                <img src="${item.img}" alt="" />
                <div class="txt-box">
                    <h3>${item.title}</h3>
                    <p>${item.description}</p>
                </div>
            </div>`;
}

var loadIndex = 0;

// ajax 加载数据
function ajaxLoadData(){
    // 模拟ajax请求延迟效果
    setTimeout(function(){
        loadIndex++;
                
        for(var i in imagesList){
            $('#waterfall').append(generateHtml(imagesList[i]));
        }
    }, 2000);   // 延迟2秒
}

 $(function(){
    // 请求数据
    ajaxLoadData();

 });  
 </script>

        页面效果如下:

         如上,页面现在还是有点乱,这是因为没添加响应式布局;如果希望在加载瀑布流前页面也能正常展示,大家可以自己修饰下,这较为简单就讲解了,后面则直奔主题让瀑布流实现。

二、功能开发

2.1 定义瀑布流插件

        在闭包中定义瀑布流功能函数,代码如下:

/**
 * 闭包 - 定义瀑布流封装函数
 */
(function($, win, doc){

    /**
     * 定义瀑布流功能
     * @param {*} options 
     */
    $.fn.waterfall = function(options){
        // 定义 和 合并外部参数
        options = $.extend({
            eleItemClassName: "",  //放置每列中的元素选择器
        }, options);
    }

})(jQuery, window, document);

2.2 参数定义

options = $.extend(true, {
	eleItemClassName: "",                    //放置每列中的元素选择器
    // 瀑布流最包层容器选择器名称
	containerListClassName: 'waterfall-flex-container',
	gridClassName: "column-item",   //列选择器   
	gridInnerItemClassName: "grid-inner-item",
	loadClassName: "waterfall-load-more",
	loadingText: "正在加载中...",
	loadOverText: "已经没有数据了",
	loadText: "~ 下拉加载更多 ~",
	diff: 50,           //底部差值,提前执行
	// 布局,不同尺寸下显示不行列元素,尺寸从大到小排序
	grid: {
		2300: 6,
		1920: 5,
		1360: 4,
		980: 3,
		768: 2,
		520: 1
	},
	// 错误回调函数
	errorCallback: function(){},
	// 滑到底部执行函数
	slideToDownCallback: function(){}
}, options);

        如上参数,在此次功能实现中拥有不同作用,如果这里参数还不能满足你们需求,可以在基础上再完善。

1)需要追加元素的类选择器

options.eleItemClassName:用于获取#waterfall容器中所有需要追加的元素

2)这里类定义,是为了方便后期争对不同场景需要,可以定制瀑布流样式,参数说明:

options.containerListClassName:自定义瀑布流外层容器类选择,执行时可不传入该参数。
options.gridClassName:flex容器列的类选择,执行时可不传入
options.gridInnerItemClassName:列内部盛放追加元素的容器,执行时可不传入

3)上拉加载

options.loadClassName:上拉加载容器类选择器,执行时可不传入
options.loadingText:正在加载是显示的内容
options.loadOverText:数据加载完显示的内容
options.loadText:未加载时显示内容

4)不同屏幕显示列数

options.grid::定义在不屏幕尺寸下显示的列数

5)上拉加载

options.diff:拉到底部前,提前50像素执行回调函数
options.slideToDownCallback:拉到底部时,执行的回调函数

2.3 实现响应式列

        首先在$.fn.waterfall函数外定义getGridColumn()函数,获取当前屏幕尺寸下,根据options.grid定义来判断需要显示几列数据,代码如下:

/**
 * 获取列数
 * @param {*} gridList 
 * @returns 
 */
function getGridColumn(gridList){
	var winWidth = win.innerWidth;
	// 循环判断当前宽度范围
	for(var i = 0; i < gridList.length; i++){
		if(winWidth>gridList[i].min&&winWidth<=gridList[i].max){
			return gridList[i].value;
		}
	}
	// 否则返回最大值列数
	return gridList[0].value;
}

        $.fn.waterfall功能代码如下:

/**
 * 定义瀑布流功能
 * @param {*} options 
 */
$.fn.waterfall = function(options){
	options = $.extend(true, {
		// 瀑布流最包层容器选择器名称
		containerListClassName: 'waterfall-flex-container',
		eleItemClassName: "",                    //放置每列中的元素选择器
		gridClassName: "column-item",   //列选择器   
		gridInnerItemClassName: "grid-inner-item",
		loadClassName: "waterfall-load-more",
		loadingText: "正在加载中...",
		loadOverText: "已经没有数据了",
		loadText: "~ 下拉加载更多 ~",
		diff: 50,           //底部差值,提前执行
		// 布局,不同尺寸下显示不行列元素,尺寸从大到小排序
		grid: {
			2300: 6,
			1920: 5,
			1360: 4,
			980: 3,
			768: 2,
			520: 1
		},
		// 错误回调函数
		errorCallback: function(){},
		// 滑到底部执行函数
		slideToDownCallback: function(){}
	}, options);

	// 定义容器和DOM
	var containerListObj = $('<div />').addClass(options.containerListClassName),           
        //容器DOM对象
		domObj = $(this),
        // 获取所有需要追加的元素DOM对象
		elementItems = domObj.find('.' + options.eleItemClassName),
        // 定义上拉加载DOM对象,后面会使用到
		loadObj = $('<div />').addClass(options.loadClassName).text(options.loadText);

	// 定义变量
	var that = this;

	// 获取容器显示列范围
	this.grid = (function(grid){
			var list = [],
				keys = Object.keys(grid).map(item => parseInt(item)).sort((a, b) => b - a);
			
			keys.forEach((key, i) => {
				if(i == keys.length - 1){
					list.push({ min: 0, max: key, value: grid[key] })
				}else{
					list.push({ min: keys[i+1], max: key, value: grid[key] })
				}
			});
				
			return list;
		})(options.grid);

	// 获取当前显示列数
	this.columns = getGridColumn(this.grid);

	$(this).before(containerListObj);   // 添加响应式容器
	$(this).before(loadObj);
	$(this).hide();                     // 影响原容器


}

2.4 调用waterfall

  代码在html代码中调用waterfall功能函数,传入需要读取元素的类选择器,代码如下:

$(function(){
    var waterfall = $('#waterfall').waterfall({
        eleItemClassName: "item"
    });

    // 请求数据
    ajaxLoadData();
});  

        此时页面结构则发生变化,后续显示的列将追加到.waterfall-flex-container类选择器中,代码效果如下:

         options.grid通过匿名函数修改数据结构,以方便后期判断当前屏幕尺寸时,自动调用显示列数。

        通过getGridColumn()函数,获取当前屏幕下可显示几列数据。

        以上代码执行后,重构后的this.grid和this.columns列数如下:

2.5 自动调用列数

        在$.fn.waterfall函数外定义generateGrid()函数,用于调用当前屏幕尺寸下,可以显示几列数据,并作出列数调用。代码如下:

/**
 * 生成对应的列
 * @param {*} that 
 * @param {*} options 
 * @returns 
 */
function generateGrid(that, options){
	var itemList = [];
	for(var i = 0, tmpSubElement; i < that.columns; i++){
		tmpSubElement = $('<div />').addClass(options.gridClassName + "-" + (i+1)).addClass(options.gridInnerItemClassName);
		itemList[i] = $('<div />').addClass(options.gridClassName);
		itemList[i].append(tmpSubElement);
		that.container.append(itemList[i]);
	}
	return itemList;
}

        在$.fn.waterfall功能函数中,通过this.grid和this.columns列数,重新渲染页面显示的列数,代码如下:

// 略...

$(this).before(containerListObj);   // 添加响应式容器
$(this).before(loadObj);
$(this).hide();                     // 影响原容器

//将创建DOM对象赋值到this当前对象上
this.container = containerListObj;    //放置列容器DOM对象
this.items = elementItems;            //瀑布流所有元素DOM对象集
this.loading = loadObj;               //上拉加载盒子DOM对象

// 生成结果
this.grids = generateGrid(this, options);

        以上代码执行后,容器.waterfall-flex-container中生生成对应列元素,效果如下:

         这时我们要放浏览器大小改变后,列数也跟着调用,则需要使用jquery添加resize监听事件,代码如下:

 // 监听屏幕大小变化
$(win).resize(function(){
	that.container.empty();
	// 获取当前显示列数
	that.columns = getGridColumn(that.grid);
	// 生成结果
	that.grids = generateGrid(that, options);
});

         此时拖放浏览器修改浏览器窗口大小时,会发现DOM中列数在不同尺寸下,会增加或减少。

2.6 追加数据

        在$.fn.waterfall功能函数外,再定义getMinItem()和jigsawPhoto()函数,分另用来获取当前哪列高度是小和将元素追加到对应列中(一直追加列高度最小的容器中),代码如下:

/**
 * 获取每列中高度最小值元素
 * @param {*} that 
 * @param {*} options 
 * @returns 
 */
function getMinItem(that, options, cha){
	return that.grids.sort((first, second) => {
		return first.find('.' + options.gridInnerItemClassName).height() - second.find('.' + options.gridInnerItemClassName).height();
	})[0];
}

// 拼图,将元素追加到对应容器中
function jigsawPhoto(that, options){
	var minHeightElement;
	// 循环处理
	that.items.each((i, item) => {
		minHeightElement = getMinItem(that, options);
		minHeightElement.find('.' + options.gridInnerItemClassName).append(item);
	});
}

        这里我们需要在2.6中代码位置,添加jigsawPhoto()函数,代码如下:

//将创建DOM对象赋值到this当前对象上
this.container = containerListObj;    //放置列容器DOM对象
this.items = elementItems;            //瀑布流所有元素DOM对象集
this.loading = loadObj;               //上拉加载盒子DOM对象

// 生成结果
this.grids = generateGrid(this, options);
// 拼图堆加
jigsawPhoto(this, options);

// 监听屏幕大小变化
$(win).resize(function(){
	that.container.empty();
	// 获取当前显示列数
	that.columns = getGridColumn(that.grid);
	// 生成结果
	that.grids = generateGrid(that, options);
	// 拼图堆加
	jigsawPhoto(that, options);
});

        但此时继续执行刷新页面,发现每个列容器中,还是空空如也,什么DOM节点也追加进去;这里我们输出 下that.items则会发现,该属性下元素为0,未读取到任何元素节点;这里因为我们在执行$.fn.waterfall时,ajaxLoadData()函数还未执行,并且内部数据追加也是2秒之后 ,所以当$.fn.waterfall执行完,未读到任何元素是正常的。

        这个问题需要带下2.7中再解决。

2.7 上拉加载更多

        在2.2中定义了很多接口参数,这里我们需要将接口参数options.slideToDownCallback赋值到this对象的slideToDownCallback上,以方便后期使用。

        另外定义this.refresh用来刷新数据,这里直接追加#waterfall中容器数据到this.items中,有些人会担心是否会将之前数据重叠,这大可不必,在jigsawPhoto()函数执行后,#waterfall容器中元素就全部追加到瀑布流列中,#waterfall等同被清空了,后期追加进来数据都为新数据。

        还有this.startLoading()函数和this.loadEnd函数分另在“正在加载数据时”和“数据加载完时”执行。

        代码如下:

// 定义变量判断是否正在获取追加内容
var isLoading = false;
// 执行回调函数位置滚动条高度
this.scrollTop = 0;
// 滑到底部执行函数
this.slideToDownCallback = options.slideToDownCallback;

// 重新执行获取数据,刷新数据
this.refresh = function(){
	// 追加获取元素
	domObj.find('.' + options.eleItemClassName ).each((i, item) => {
		that.items.push(item);
	});
	// 拼图堆加
	jigsawPhoto(that, options);

	isLoading = false;
	loadObj.text(options.loadText);
}
// 开始加载 时执行
this.startLoading = function(){
	isLoading = true;
	loadObj.text(options.loadingText);
}
// 加载完毕后 执行
this.loadEnd = function(){
	isLoading = true;
	loadObj.text(options.loadOverText);
}

        在上拉加载的相应功能添加完成后,另忘了修改html页面定义位置还需调整,这里loadIndex只是记录当前上拉加载几次,用于判断何时结果上拉加载事件,代码如下:

// ajax 加载数据
function ajaxLoadData(that){
    that.startLoading();

    // 模拟ajax请求延迟效果
    setTimeout(function(){
        loadIndex++;
                
        for(var i in imagesList){
            $('#waterfall').append(generateHtml(imagesList[i]));
        }
        
        that.refresh();

        if(loadIndex>3){
            that.loadEnd();     //加载没有数据后执行,后续拉到底部则不会触发slideToDownCallback回调函数
        } 
    }, 2000);   // 延迟2秒
}

 $(function(){
    var waterfall = $('#waterfall').waterfall({
        eleItemClassName: "item",
        loadingText: "正在加载数据中...",
        loadOverText: "没有更多数据了",
        loadText: "~ 下拉加载更多数据 ~",
        // 滑到底部执行函数
        slideToDownCallback: function(){
            ajaxLoadData(this);
        }
    });

    // 请求数据
    ajaxLoadData(waterfall);

 });  
 </script>

        这时再刷新页面,会发现数据可以正常加载出来了。但会发现只会执行一次,并且是ajaxLoadData(waterfall)执行时渲染的数据,optoins.slideToDownCallback定义的回调函数还未执行,这是因为此函数只有拉到底部时才会触发;那怎样判断滚动条拉到底部了,这里我们需要使用jquery监听scroll()滚动条事件,代码如下:

// 略...

// 开始加载 时执行
this.startLoading = function(){
	isLoading = true;
	loadObj.text(options.loadingText);
}
// 加载完毕后 执行
this.loadEnd = function(){
	isLoading = true;
	loadObj.text(options.loadOverText);
}
		
// 监听滑动事件
$(win).scroll(function(e){
	// 判断是否已滑到底部
	if($(doc).height() - $(win).height() - options.diff <= $(doc).scrollTop() && !isLoading){
		that.slideToDownCallback();
	}
});

        到这里,瀑布流上拉加载功能则已完成了,上拉加载3次后,则停止加载数据;并且不断修改浏览器大小时,页面列数会不断修改。

三、问题

 3.1 最小高度计算

        在完成该demo后,大家会发现底部图片还是存在此小瑕疵的,如下图某些图片位置稍作调整,可以会更美观些。该瀑布流实现方式是通过getMinItem()不断获取高度最小的列进行追加,大家可以在这里作些调用,返回更为合适列进行追加数数。

 

3.2 图片问题

        另外,当上拉加载执行完成后,细心朋友会发现之前加载图片都变换了位置,这里因为jigsawPhoto()函数都是从that.items开始位置重新渲染,导致追加过程中某些元素错误后,后续追加都不将在原位置上。

        解决方法:jigsawPhoto(that, items, options)执行时,将that.items通过形参items传入,增加形参items进行items.each()循环。

        以上问题就留给大家自己去实现解决了,有问题欢迎在CSDN上留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/586862.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ML算法——KNN随笔【全国科技工作者日创作】【机器学习】

9、K-Nearest Neighbors (KNN) 9.1、理论部分 K最邻近算法 把一个物体表示成向量【特征工程】,且 KNN 需要考虑 【特征缩放】。标记每个物体的标签计算两个物体之间的距离/相似度选择合适的 K 未知点的判断基于已知点的距离&#xff0c;选出最近的K个点&#xff0c;投票选出…

pyjail初了解

前言 最近在各种比赛Misc方向都能多多小小看到Python jail题&#xff0c;通过eval或者exec等函数执行Python的代码获取shell&#xff0c;实现Python逃逸&#xff0c;但是我不是太会&#xff0c;因此找点题目做一下&#xff0c;总结一下。 常用Python的魔术方法 _init_:用于P…

chatgpt赋能python:Python中小数点保留的几种方法

Python中小数点保留的几种方法 作为一名Python工程师&#xff0c;我们经常需要对数字进行处理。在处理时&#xff0c;我们需要将数字进行格式化&#xff0c;例如保留小数点后几位或添加千位分隔符等。其中&#xff0c;保留小数点后几位是比较常见的需求。本文将介绍Python中小…

chatgpt赋能Python-python中怎么安装aip

概述 在现代的SEO中&#xff0c;使用机器学习和自然语言处理的API来分析关键字和网页内容已经成为一个普遍的实践。Google API是其中最受欢迎的一个&#xff0c;因为它可以提供多种功能&#xff0c;包括分析关键字、分析文本和图像识别等。 Python作为一种优秀的脚本语言&…

Linux Apache 配置与应用 【虚拟主机 连接保持 日志分割 分析系统 优化网页】

--------构建虚拟 Web 主机-------- 虚拟Web主机指的是在同一台服务器中运行多个Web站点&#xff0c;其中每一个站点实际上并不独立占用整个服务器&#xff0c;因此被称为“虚拟”Web 主机。通过虚拟 Web 主机服务可以充分利用服务器的硬件资源&#xff0c;从而大大降低网站构建…

《深入理解计算机系统(CSAPP)》第8章 异常控制流 - 学习笔记

写在前面的话&#xff1a;此系列文章为笔者学习CSAPP时的个人笔记&#xff0c;分享出来与大家学习交流&#xff0c;目录大体与《深入理解计算机系统》书本一致。因是初次预习时写的笔记&#xff0c;在复习回看时发现部分内容存在一些小问题&#xff0c;因时间紧张来不及再次整理…

chatgpt赋能python:Python合并函数:一个简单但有用的工具

Python合并函数&#xff1a;一个简单但有用的工具 Python是一种优雅而强大的编程语言&#xff0c;拥有许多内置的函数和库&#xff0c;可以让编程变得更加简单和高效。其中&#xff0c;合并函数是一个非常有用的工具&#xff0c;它可以让我们快速而灵活地合并和处理数据。 什…

5月30日第壹简报,星期二,农历四月十二

5月30日第壹简报&#xff0c;星期二&#xff0c;农历四月十二坚持阅读&#xff0c;静待花开1. 比亚迪&#xff1a;自主研发了常压油箱的燃油蒸汽排放控制技术&#xff0c;能符合蒸发排放法规标准&#xff0c; 愿与所有同行共享核心技术专利。2. 中国计划2030年前实现首次登月&a…

chatgpt赋能python:Python中升序和降序排序:什么是升序和降序以及如何使用Python进行排序

Python中升序和降序排序&#xff1a;什么是升序和降序以及如何使用Python进行排序 介绍 Python是一种强大的编程语言&#xff0c;可以用来处理各种类型的数据。其中包括对数据进行排序&#xff0c;Python具有方便且易于使用的排序功能。在Python中&#xff0c;可以使用升序和…

chatgpt赋能python:Python中可迭代对象的介绍

Python中可迭代对象的介绍 Python是一种高级编程语言&#xff0c;它具有简单易学、可读性强、功能强大等特点&#xff0c;成为了数据科学、机器学习、Web开发等领域的热门选择。Python中有很多重要的概念和功能&#xff0c;其中之一就是支持可迭代对象的概念。 在Python中&am…

chatgpt赋能python:Python中如何生成表格

Python中如何生成表格 在数据分析和处理中&#xff0c;表格是一种常见的数据格式&#xff0c;并且在不同的场景下都有着不同的用途。Python作为一种高效的编程语言&#xff0c;可以帮助我们轻松地生成和操作表格数据。在本文中&#xff0c;我们将介绍Python中生成表格的方法&a…

IDEA控制台tomcat 乱码

问题 IDEA控制台tomcat 乱码 详细问题 项目部署至tomcat上&#xff0c;启动tomcat&#xff0c;IDEA控制台终端Server日志&#xff0c;Tomcat Localhost日志&#xff0c;Tomcat Catalina日志乱码 Server日志 D:\tomcat9\bin\catalina.bat run [2023-05-29 11:20:24,521] Art…

【Linux】在Ubuntu中卸载、下载mysql以及如何检查mysql是否卸载成功

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

5.30黄金空头能否延续?今日多空如何布局?

近期有哪些消息面影响黄金走势&#xff1f;今日黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周一(5月29日)进入欧市盘中&#xff0c;对美国周末达成债务上限协议的乐观情绪推动风险情绪回升&#xff0c;与此同时&#xff0c;上周公布的美国PCE数据让美联储难…

ChatGPT Sorry, you have been blocked(抱歉,您已被屏蔽)的解决方法

最近在使用 ChatGPT 时大家遇到的最多的问题就是 Sorry, you have been blocked&#xff08;抱歉&#xff0c;您已被屏蔽&#xff09;了&#xff0c;之前的 Access denied 似乎都不常见了&#xff0c;今天老王就分享下这个问题的原因和解决方法。 一、ChatGPT 被屏蔽 blocked …

汇编调试及学习

汇编调试 打印寄存器的值 打印内存地址 打印8字节&#xff0c;就是64位 打印格式 是从低位取过来的 b 字节 h 双字节 w四字节 g八字节 前变基 后变基 。 后变基这个变基会发生变化的。前变基变基不会发生变化需要用&#xff01;号。 前变基 &#xff0c; 加了&#xff0…

【Springcloud】RabbitMQ入门

文章目录 一、同步通讯与异步通讯1、同步调用的优缺点2、异步调用的优缺点 二、RabbitMQ1、MQ消息队列2、RabbitMQ的安装3、RabbitMQ的结构和概念4、RabbitMQ的消息模型5、入门案例 一、同步通讯与异步通讯 同步通讯就像打视频&#xff0c;两边可以实时得到相关信息。异步通讯…

打开复制过去的virtualbox文件之后,在打开时出现只有logs文件的解决方法

文章目录 前言 问题一 打开方式 注意事项 问题二 解决方法 总结 前言 打开复制过去的virtualbox文件之后&#xff0c;在打开时出现只有logs文件的解决方法 问题一 virtualbox虚拟机拷贝到其他电脑上面如何打开&#xff1f; 打开方式 将 VirtualBox 虚拟机拷贝到其他…

第三章 JVM内存概述

附录&#xff1a;精选面试题 Q&#xff1a;为什么虚拟机必须保证一个类的Clinit( )方法在多线程的情况下被同步加锁 &#xff1f; A: 因为虚拟机在加载完一个类之后直接把这个类放到本地内存的方法区&#xff08;也叫原空间&#xff09;中了&#xff0c;当其他程序再来调这个类…

vue2.0中使用summernote富文本编辑器, 并实现上传图片至七牛

vue2.0中使用summernote富文本编辑器, 并实现上传图片至七牛 ackage.json 文件中添加所需的依赖库,然后执行 npm install 安装这些库 2. 在 src / main.js 文件中导入下列库文件 3. 由于summernote 使用 jQuery 库, 我们在组件里需要导入 jQuery才能使用, 为了方便起见,我们在 …