Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   фон по диагонали (https://javascript.ru/forum/misc/14420-fon-po-diagonali.html)

DyadkaSashka 15.01.2011 17:39

фон по диагонали
 
Вложений: 1
Как зделать повторяющийся от центра фон по диагонали с помощью однопиксельной картинки. При этом фон должен быть резиновым по высоте.

Вот пример фона :help:

Kolyaj 15.01.2011 17:42

Цитата:

Сообщение от DyadkaSashka
Как зделать повторяющийся от центра фон по диагонали с помощью однопиксельной картинки.

Как из букв О, П, Ж и А составить слово "вечность"?

x-yuri 15.01.2011 18:25

попиксельно рисуем фон на canvas с помощью одного однопиксельного img, который для каждой точки меняем с помощью data: url

var a = ['О', 'П', 'Ж', 'А'];
alert(a[0].replace('О', 'в')+a[1].replace('П', 'е')+a[2].replace('Ж', 'ч')+a[3].replace('А', 'н')+a[0].replace('О', 'о')+a[1].replace('П', 'с')+a[2].replace('Ж', 'т')+a[3].replace('А', 'ь'))


ну как? :)

Logo 15.01.2011 18:26

Из картики 1x1 пиксель не сделать такой фон.

Подобный фон можно сделать векторной графикой - VML/SVG

monolithed 15.01.2011 18:33

Logo, не только, можно даже с градиентом :D

<script type="text/javascript">
window.onload = function(){
    var i = 0;
    (function(){
         for(j=0; j<15; j++){
             if(++i <= document.documentElement.clientHeight){
                 var element = document.createElement('div');
                 element.style.cssText = 'background: #'+0+j+j+j+j+j+'; top:'+i+'px; left:'+i+'px';
                 document.body.appendChild(element);
                 setTimeout(arguments.callee, 10);
             }
         } 
    })();
};
</script>

<style type="text/css">
body {background: red;}
div {
    position: absolute;
    color: white;
    text-align: center;
    width: 50px;
    height: 50px;
}
</style>
<div></div>

monolithed 15.01.2011 19:15

или даже что-то высоко художественное, без всяких canvas :D
<script type="text/javascript">
window.onload = function(){
    var div = document.getElementsByTagName('div')[0], square = document.body.offsetWidth, i = 0;
    (function(){
        if(i++<square){
            for(j=0; j<15; j++){
                var element = document.createElement('div');
                element.style.top = 50+50*Math.sin(20*(i+Math.PI/2)*20)+'px';
                element.style.left = i+'px';
                element.style.background = '#'+i+i+0+j+i+i;
                document.body.appendChild(element);
            }
         }
        window.setTimeout(arguments.callee, 1);
    })();
};
</script>

<style type="text/css">
body {background: #DDD;}

div {
    position: absolute;
    width: 8px;
    height: 8px;
}
</style>

DyadkaSashka 15.01.2011 19:49

Я дико извиняюсь за дачу ложной информации;) Я имел ввиду, что 1px - высота картинки, а ширина 1000px

DyadkaSashka 15.01.2011 19:52

Нужно чтобы эта фоновая картина при каждой прорисовке вниз, меняла позицию на 1px влево

Aetae 15.01.2011 19:59

В таком случае надо вручную(не совсем конечно) сделать изображение в полный цикл и поэксперементировать с pngout. Есть вероятность что результирующий вес будет немногим больше оригинала.

x-yuri 15.01.2011 20:01

а чего, я вот квадратный градиент в вакууме нарисовал (осторожно, браузер может уйти в себя и не вернуться)
<!DOCTYPE HTML>
<html>
  <head>   
  </head>
  <body>   

  <style type="text/css">
    div {
      width: 1px;
      height: 1px;
      overflow: hidden;
      float: left;
    }
  </style>

  <script>

  for( var j=0; j<128; j++ )
    for( var k=j; k<j+128; k++ ){
      var div = document.createElement('div');
      div.style.background = 'rgb('+[0,0,k].join(',')+')';
      if( k == j )
        div.style.clear = 'left';
      document.body.appendChild( div );
    }

  </script>


  </body>
</html>

monolithed 15.01.2011 20:03

DyadkaSashka, мой первый пример делает примерно тоже самое:
x-yuri, после запуска вашего примера мой сафари лапки поднял, так и не показав задуманное
<script type="text/javascript">
window.onload = function(){
    var i = 0;
    (function(){
         if(++i <= document.documentElement.clientHeight){
             var element = document.createElement('div');
             element.style.cssText = 'top:'+i+'px; left:'+i+'px';
             document.body.appendChild(element);
             setTimeout(arguments.callee, 10);
         }
    })();
};
</script>

<style type="text/css">
body {background: red;}
div {
    background: blue;
    position: absolute;
    color: white;
    text-align: center;
    width: 1000px;
    height: 50px;
}
</style>
<div></div>

x-yuri 15.01.2011 20:15

monolithed, под windows? Странно, мой подумал, но решил не поднимать, сорри

monolithed 15.01.2011 20:30

Цитата:

Сообщение от x-yuri
под windows?

ага

x-yuri 15.01.2011 20:38

ну вот уменьшенный в два раза (осторожно, браузер может уйти в себя и не вернуться)
<!DOCTYPE HTML>
<html>
  <head>   
  </head>
  <body>   

  <style type="text/css">
    div {
      width: 1px;
      height: 1px;
      overflow: hidden;
      float: left;
    }
  </style>

  <script>

  for( var j=0; j<128; j+=2 )
    for( var k=j; k<j+128; k+=2 ){
      var div = document.createElement('div');
      div.style.background = 'rgb('+[0,0,k].join(',')+')';
      if( k == j )
        div.style.clear = 'left';
      document.body.appendChild( div );
    }

  </script>


  </body>
</html>

Aetae 15.01.2011 21:52

Мне ff четырежды предложил остановить скрипт, но цуко не останавливал)

monolithed 15.01.2011 22:12

ага, даже при уменьшенном размере, думаю, что можно без вложенных циклов обойтись, только одним: -?
мой предпоследний пример с художествами и то не грузит так проц..

Aetae 15.01.2011 22:16

Зато изображение отрисованное таким образом хорошо жмётся в пнг.)
Говорю по личному опыту: когда-то в молодости, когда о canvas и слыхом не слыхивал понадобилось отрисовать мне хитрую генерировану картинку. 256*256px(дивов)=)

x-yuri 15.01.2011 22:25

Вложений: 1
ну извините
Цитата:

Сообщение от monolithed
даже при уменьшенном размере, думаю, что можно без вложенных циклов обойтись,

как? Да и толку, если ты все так же собираешься нарисовать 128x128 дивов

прикрепил, результат во вложении

p.s. а может в опере запуститься?

monolithed 15.01.2011 23:00

Цитата:

Сообщение от x-yuri
p.s. а может в опере запуститься

я в сафари посмотрел после 5 попытки ))

x-yuri 16.01.2011 05:07

Вложений: 2
а вот градиент, нарисованный с помощью canvas и однопиксельного изображения
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>
    <canvas id="canvas" width="64" height="64"></canvas>
    <script type="text/javascript">
        var tmpCtx = document.getElementById('canvas').getContext('2d');
        var img = new Image();
        img.onload = function(){
            for( var i=0; i<64; i++ )
                for( var j=i; j<i+64; j++ )
                    tmpCtx.drawImage(this, j, 0, 1, 1, j-i, i, 1, 1);
        };
        img.src = 'http://javascript.ru/forum/attachment.php?attachmentid=645&stc=1&d=1295143633';
    </script>
</body>
</html>


Цитата:

Сообщение от x-yuri
под windows?

Цитата:

Сообщение от monolithed
ага

ну они за safari под windows меньше следят

и, наконец... сферический градиент в вакууме :)
промежуточный вариант:
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>
    <canvas id="canvas" width="128" height="128"></canvas>
    <script type="text/javascript">
        var ctx = document.getElementById('canvas').getContext('2d');
        var img = new Image();
        img.onload = function(){
            for( var r=0; r<img.width; r++ )
                for( var phi=0; phi<2*Math.PI; phi++ )
                    ctx.drawImage(this, r, 0, 1, 1, 64+r*Math.cos(phi), 64+r*Math.sin(phi), 1, 1);
        };
        img.src = 'http://javascript.ru/forum/attachment.php?attachmentid=647&stc=1&d=1295146484';
    </script>
</body>
</html>

окончательный:
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>
    <canvas id="canvas" width="128" height="128"></canvas>
    <script type="text/javascript">
        var ctx = document.getElementById('canvas').getContext('2d');
        var img = new Image();
        img.onload = function(){
            for( var y=0; y<128; y++ )
                for( var x=0; x<128; x++ ){
                    var r = Math.round(
                        Math.sqrt(Math.pow(x-64, 2) + Math.pow(y-64, 2))
                    );
                    if( r < 64 )
                        ctx.drawImage(this, r, 0, 1, 1, x, y, 1, 1);
                }
        };
        img.src = 'http://javascript.ru/forum/attachment.php?attachmentid=647&stc=1&d=1295146484';
    </script>
</body>
</html>

Vulkan 16.01.2011 07:23

x-yuri, у меня первый твой градиент где-то за 0.5 секунды отлично отработался, а второй уменьшенный вообще моментально. (Opera 11, Windows Vista Ultimate).

x-yuri 16.01.2011 08:59

это хорошо, конечно. Только вот monolithed и Aetae от этого не легче...

Aetae 16.01.2011 18:24

Вложений: 1
По теме - вот пнг-шка 1024 на 5120, всего 15.6Кб.(можно и меньший размер получить)
<div style="width:1000px;height:2048px;background:0 -1300px url('http://ajitae.no-ip.org/bg.png')">d</div>


//Пришлось архивировать и делать ссылку вовне, ибо загружать можно не более 620х280.(что за бред кстати, на jpg вон лимита по разрешению нет)

Askhsiv_1 16.01.2011 19:32

DyadkaSashka,

объясни пожалуйста:
"повторяющийся от центра" - центра рабочей области браузера или документа

"фон должен быть резиновым по высоте" опять же уголки всегда статичны на экране и фон меняется и при изменении экрана браузера или они бэкграунд документа и фон меняется в зависимости от количество контента

и размер уголков определённый или берётся в отношении к чему-то

пардон за непонятливость. но кажется я знаю как реализовать такое при помощи GD (PHP) и AJAX (JS)

DyadkaSashka 17.01.2011 19:24

1. от центра браузера
2. бг и фон меняется в зависимости количества контента
3. Размера уголков нету. Есть определенный размер серой плашки.Уголки это основной бэкграунд

x-yuri 17.01.2011 21:13

если эта плашка одна и находится по середине клиентской области браузера, то как может влиять контент?

Askhsiv_1 18.01.2011 17:28

а я сделал!:)

как и говорил, Javascript + PHP + школьный курс геометрии за 8-ой класс

вот: прошу любоваться

работает без багов во всех браузерах

слева можно забить:
-высоту документа
-ширину серой полосы
-угол наклона (0-90)

вес генерируемой картинки даже при размере 1650х1000 не привышает 5 KB

JS код в исходнике по ссылке а PHP вот он:
<?
	$v = explode("|", substr($_GET['z'], 0, -1));
	echo $n = mt_rand();

	$h = opendir(".");
	while (false !== ($f = readdir($h)))
	{
		if (preg_match("/bg/", $f)) { unlink($f); }
	}
	closedir($h);

	$i = imagecreatetruecolor($_GET['w'], $_GET['h']);
	$c = imagecolorallocate($i, 255, 120, 0);
	$b = imagecolorallocate($i, 240, 240, 240);

	imagefilledrectangle($i, 0, 0, $_GET['w'], $_GET['h'], $c);
	imagefilledpolygon($i, $v, $_GET['p'], $b);
	imagegif($i, 'bg_'.$n.'.gif');
	imagedestroy($i);
?>


всем успехов:dance:

x-yuri 18.01.2011 18:14

сферический велосипед для сферической задачи в вакууме...


Часовой пояс GMT +3, время: 03:23.