Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.08.2011, 21:23
Аватар для kuzroman
Кандидат Javascript-наук
Отправить личное сообщение для kuzroman Посмотреть профиль Найти все сообщения от kuzroman
 
Регистрация: 26.11.2010
Сообщений: 124

работа с контентом в jquery
Доброго времени суток, подскажите пожалуйста какой нибудь вариант решения или метод, задача в следующем:

Е нас есть блок <div id='тянучка'> он тянущийся
(допустим начальное его значение width:800px,

в нем лежат <div class='блок'> блоки (например их 10шт
с max-width:200px;
и float:left; )

т.е. что то вроде:

<div id='тянучка'>
   <div class='блок'>1</div>
   <div class='блок'>2</div>
   <div class='блок'>3</div>
   <div class='блок'>4</div>
   <div class='блок'>5</div>
   <div class='блок'>6</div>
   <div class='блок'>7</div>
   <div class='блок'>8</div>
   <div class='блок'>9</div>
   <div class='блок'>0</div>
</div>


т.е. сейчас блоки лепятся друг к другу слева и переносятся вниз как только им не хватает места.

Вопрос такой, необходимо, чтобы эти блоки при начальном значении в 800px у id='тянучка' располагались так:
1 4 7 0
2 5 8
3 6 9

т.е. в 4 в столбца,

а при уменьшении до 600 так:

1 5 9
2 6 0
3 7
4 8

думаю логика понятна, соответственно чем меньше, id='тянучка', тем меньше столбцов, чем больше, тем столбцов больше.

Решения я не от кого не прошу(хотя если кто напишет буду вовсе не против), подскажите какими манипуляциями или наборами необходимо аперировать при работе в jqueri с контентом, ведь по сути здесь нужно будет добавлять дивы, а потом их переставлять в другое место.

Заранее спасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 10.08.2011, 01:48
Профессор
Отправить личное сообщение для ваый Посмотреть профиль Найти все сообщения от ваый
 
Регистрация: 29.06.2011
Сообщений: 445

Нет, это я ерунду посоветовал. Достаточно просто написать плагинчик который будет переставлять блоки в нужном порядке. Набросал примерную реализацию.
<style>
.parent {
    width: 200px;
    background-color: #dcdcdc;
    border: 1px #deb887 solid;
}
.child {
    width: 55px;
    display: inline-block;
    border: 1px dotted #8fbc8f;
}
</style>
<div class="parent">
    <div class="child">1 child</div>
    <div class="child">2 child</div>
    <div class="child">3 child</div>
    <div class="child">4 child</div>
    <div class="child">5 child</div>
    <div class="child">6 child</div>
    <div class="child">7 child</div>
    <div class="child">8 child</div>
    <div class="child">9 child</div>
    <div class="child">10 child</div>
</div>

<button>200px</button>
<button>250px</button>
<button>150px</button>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script type="text/javascript">
    $.fn.columns = function(options) {
		var settings = $.extend({
			restoreOrder: false,
			empty: '<div style="clear: both;" class="not-child"></div>'
		}, options);

		return this.each(function() {
			var items = Array.prototype.slice.call($(this).children(':not(.not-child)'));

			if (settings.restoreOrder) {
				var toArray = function(obj) {
					var arr = [];
					var tmp = [];
					var add = [];
					var ndx;
					if (!obj.constructor.toString().match('Object')) {
						return obj;
					}
					for (ndx in obj) {
						if (isNaN(ndx)) {
							tmp.push(obj[ndx]);
							continue;
						}
						if (ndx - arr.length > 0) {
							add = new Array(ndx - arr.length);
							add.push(obj[ndx]);
							arr = arr.concat(add);
						}
						else {
							arr[ndx] = obj[ndx];
						}
					}
					for (ndx in tmp) {
						arr.push(tmp[ndx]);
					}
					return arr;
				}

				var order = $(this).data['order'].split(',');
				var obj = {};
				for (var i in order) {
					obj[order[i]] = items[i];
				}
				items = toArray(obj);
			}

			var cols = Math.floor($(this).width() / $(this).find(':first').outerWidth());
			var rows = Math.floor($(this).height() / $(this).find(':first').outerHeight());

			var size = items.length;
			var count = 0;
			var order = [];
			$(this).empty();

			for (var i = 0; i < rows; i++) {
				for (var j = 0; j < cols; j++) {
					if (count <= size) {
						var index = i + rows * j;
						var item = items[index];
						if (!item) {
							item = settings.empty;
						}
						else {
							order.push(index);
						}
						$(this).append(item);
						count++;
					}
					else {
						break;
					}
				}
			}

			$(this).data['order'] = order.join(',');
		});
	};

    $('.parent').columns();

    $('button').click(function() {
        $('.parent').css('width', $(this).text()).columns({restoreOrder: true});
    });

</script>

Последний раз редактировалось ваый, 10.08.2011 в 02:26.
Ответить с цитированием
  #3 (permalink)  
Старый 10.08.2011, 12:33
Аватар для kuzroman
Кандидат Javascript-наук
Отправить личное сообщение для kuzroman Посмотреть профиль Найти все сообщения от kuzroman
 
Регистрация: 26.11.2010
Сообщений: 124

Спасибо большое!
Осталось только разобраться во всем этом.
Я то думал что все будет значительно короче.
Ответить с цитированием
  #4 (permalink)  
Старый 11.08.2011, 20:06
Аватар для kuzroman
Кандидат Javascript-наук
Отправить личное сообщение для kuzroman Посмотреть профиль Найти все сообщения от kuzroman
 
Регистрация: 26.11.2010
Сообщений: 124

[quote=ваый;119313]Достаточно просто написать плагинчик который будет переставлять блоки в нужном порядке. Набросал примерную реализацию...


Доброго вам времени. С вашим скриптом что то так и не разобрался, по нажатию он работает, а вот когда его креплю на resize то неработает.

В итоге сделал вот что:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<!-- Следующие три строки необходимы для определинея плагина Resizable jquery -->
<link type="text/css" href="http://www.trueski.ru/cms2/css/start/jquery.custom.css" rel="stylesheet" />
<script src="http://www.trueski.ru/cms2/script/jqueryMin.js" type="text/javascript"></script>
<script src="http://www.trueski.ru/cms2/script/jquery-ui.custom.min.js" type="text/javascript"></script>
 <style>
	.parent2{
	width:100px; 
	float:left;
	/*border: 1px #f00 solid;*/
	}
	
	.child2{ 
	width:100px; 
	clear: both;
	border: 1px #deb887 solid; 
	}
	
	.content{
	width:331px;
	border: 5px #f00 solid;
	overflow:hidden;
	}
</style>
<div class='content' id='content' class="ui-widget-content" >
		<div class="child2" id='1'>1 child2</div>
		<div class="child2" id='2'>2 child2</div>
		<div class="child2" id='3'>3 child2</div>
		<div class="child2" id='4'>4 child2</div>
		<div class="child2" id='5'>5 child2</div>
		<div class="child2" id='6'>6 child2</div>
		<div class="child2" id='7'>7 child2</div>
		<div class="child2" id='8'>8 child2</div>
		<div class="child2" id='9'>9 child2</div>
		<div class="child2" id='10'>10 child2</div>
</div>




<script type="text/javascript">

	var cont = $('#content').children(); // сохраняем наш первоначальный контент
	
	$(document).ready(function(){
		stretch()
	});

	$(function(){ // тянучка
		$("#content").resizable({
			minWidth:100,
			maxWidth:1100,
			resize:  function(event, ui) { stretch() }	
			});
			
	});	



	function stretch()
	{
		var parentW =  document.getElementById('content').clientWidth;  
		
		var kolDiv = 10; // 10 элементов div
		var column = Math.floor( parentW / 100 ); // кол столбцов окр. в меньшую сторону
		var step = Math.ceil( kolDiv / column); // шаг округ. в большую сторону
		var from = 0; // от 
		var to ; // до 
		
		// и выводим их в новом DOMe
		for(var i=0; i<=column-1 ; i++)
		{
			$('#content').append("<div class='parent2' id='collumn"+i+"'></div>");
			to = step * (i+1);
			$('#collumn'+i).append(cont.slice(from,to));
			from = to;
		}
	}


</script>


Не совсем понял как вы вставляете готовый пример на сайт, очень интересно узнать.
Но если скопировать код и запустить его локально то можно будет увидеть блок, который можно растягивать по ширине и высоте, а внутри будет меняться так как я описывал.

Проблема в том что это происходит только с одним блоком
т.е. если в моем контенте нужно добавить еще один блок, то понадобиться так же добавлять ему id? а так же добавлять JS в скрипт, а это неудобно.

Не могли бы вы помоч, довести мой пример до ума, например вставив ваш код в мою тянучку.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамически загружаемая jQuery и jQuery-функции в одном файле 67bytes Общие вопросы Javascript 6 06.03.2013 09:01
Работа со свойства, при использовании fn.extend в jQuery Greck jQuery 1 27.07.2011 21:28
Работа jquery с браузерами ОС symbian 9 Uljan jQuery 2 21.07.2010 18:14
jQuery jTreeMenu plugin Seafnox jQuery 9 12.01.2010 21:55
JQuery + FireFox NOOB jQuery 4 02.11.2009 18:16