I somehow never thought about such a thing as a kaleidoscope on the page. Saw them somehow earlier, but did not pay special attention. And then I saw in Lebedev’s portfolio a kaleidoscope on a flash, I twisted it with my mouse, I understood the principle of work and thought “Christmas trees, it's not difficult!”.
<div class = "sc s1" >
<div class = "rl" >
<div class = "rr" >
<div class = "sv" >
</div>
</div>
</div>
</div>
- .scope_container .sc {
- width: 50%;
- height: 50%;
- -webkit-transform-origin: top center;
- -moz-transform-origin: top center;
- -o-transform-origin: top center;
- transform-origin: top center;
- position: absolute;
- top: 50%;
- left: 25%;
- z-index: -1;
- }
- .scope_container .sc div {
- overflow: hidden}
- .scope_container .rl {
- height: 110%;
- width: 60%;
- -webkit-transform: rotate (-15deg);
- -moz-transform: rotate (-15deg);
- -o-transform: rotate (-15deg);
- transform: rotate (-15deg);
- position: relative;
- top: 1.5%;
- left: 4.5%;
- }
- .scope_container .rr {
- height: 100%;
- width: 100%;
- -webkit-transform: rotate (30deg);
- -moz-transform: rotate (30deg);
- -o-transform: rotate (30deg);
- transform: rotate (30deg);
- position: relative;
- top: 7%;
- left: 51%;
- }
- .scope_container .sv {
- width: 105%;
- height: 105%;
- -webkit-transform: rotate (-15deg);
- -moz-transform: rotate (-15deg);
- -o-transform: rotate (-15deg);
- transform: rotate (-15deg);
- position: relative;
- top: -2%;
- left: -29%;
- }
- < div class = "parent" >
- < div class = "scope_container pattern" >
- < div class = "sc s1" > < div class = "rl" > < div class = "rr" > < div class = "sv" > </ div > </ div > </ div > </ div >
- < div class = "sc s2" > < div class = "rl" > < div class = "rr" > < div class = "sv" > </ div > </ div > </ div > </ div >
- < div class = "sc s3" > < div class = "rl" > < div class = "rr" > < div class = "sv" > </ div > </ div > </ div > </ div >
- < div class = "sc s4" > < div class = "rl" > < div class = "rr" > < div class = "sv" > </ div > </ div > </ div > </ div >
- < div class = "sc s5" > < div class = "rl" > < div class = "rr" > < div class = "sv" > </ div > </ div > </ div > </ div >
- < div class = "sc s6" > < div class = "rl" > < div class = "rr" > < div class = "sv" > </ div > </ div > </ div > </ div >
- < div class = "sc s7" > < div class = "rl" > < div class = "rr" > < div class = "sv" > </ div > </ div > </ div > </ div >
- < div class = "sc s8" > < div class = "rl" > < div class = "rr" > < div class = "sv" > </ div > </ div > </ div > </ div >
- < div class = "sc s9" > < div class = "rl" > < div class = "rr" > < div class = "sv" > </ div > </ div > </ div > </ div >
- < div class = "sc s10" > < div class = "rl" > < div class = "rr" > < div class = "sv" > </ div > </ div > </ div > </ div >
- < div class = "sc s11" > < div class = "rl" > < div class = "rr" > < div class = "sv" > </ div > </ div > </ div > </ div >
- < div class = "sc s12" > < div class = "rl" > < div class = "rr" > < div class = "sv" > </ div > </ div > </ div > </ div >
- </ div >
- </ div >
And so on until the 12th in steps of 30 degrees.
- .scope_container .s1 {
- -webkit-transform: rotate (0deg);
- -moz-transform: rotate (0deg);
- -o-transform: rotate (0deg);
- transform: rotate (0deg);
- }
- .scope_container .s2 {
- -webkit-transform: rotate (30deg);
- -moz-transform: rotate (30deg);
- -o-transform: rotate (30deg);
- transform: rotate (30deg);
- }
As shown by experiments, with absolute positioning and the matrix at the IE trouble. Therefore it was necessary to fence such crutches.
- .scope_container .s1 {
- -webkit-transform: rotate (0deg);
- -moz-transform: rotate (0deg);
- -o-transform: rotate (0deg);
- transform: rotate (0deg);
- }
- .scope_container .s2 {
- -webkit-transform: rotate (30deg);
- -moz-transform: rotate (30deg);
- -o-transform: rotate (30deg);
- transform: rotate (30deg);
- }
Etc.
- .s2 {
- filter: progid: DXImageTransform.Microsoft.Matrix (M11 = 0.86602540, M12 = -0.50000000, M21 = 0.50000000, M22 = 0.86602540, SizingMethod = 'auto expand', FilterType = 'nearest neighbor');
- margin: -64.5% 0 0 -25%;
- }
- .s3 {
- filter: progid: DXImageTransform.Microsoft.Matrix (M11 = 0.50000000, M12 = -0.86602540, M21 = 0.86602540, M22 = 0.50000000, SizingMethod = 'auto expand', FilterType = 'nearest neighbor');
- margin: -60.5% 0 0 -32.8%;
- }
- <script type = "text / javascript" >
- // We use classes, but IE does not know how to choose them. We compensate for this disadvantage.
- if ( document .getElementsByClassName) {
- getElementsByClass = function (classList, node) {
- return (node ​​|| document ) .getElementsByClassName (classList)
- }
- } else {
- getElementsByClass = function (classList, node) {
- var node = node || document ,
- list = node.getElementsByTagName ( '*' ),
- length = list.length,
- classArray = classList.split (/ \ s + /),
- classes = classArray.length,
- result = [], i, j
- for (i = 0; i <length; i ++) {
- for (j = 0; j <classes; j ++) {
- if (list [i] .className.search ( '\\ b' + classArray [j] + '\\ b' )! = -1) {
- result.push (list [i])
- break
- }
- }
- }
- return result
- }
- }
- // Get the mouse coordinates
- function mousePageXY (e)
- {
- var x = 0, y = 0;
- if (! e) e = window. event ;
- if (e.pageX || e.pageY)
- {
- x = e.pageX;
- y = e.pageY;
- }
- else if (e.clientX || e.clientY)
- {
- x = e.clientX + ( document .documentElement.scrollLeft || document .body.scrollLeft) - document .documentElement.clientLeft;
- y = e.clientY + ( document .documentElement.scrollTop || document .body.scrollTop) - document .documentElement.clientTop;
- }
- return { "x" : x, "y" : y};
- }
- window.onload = function () {
- var scope_cont = getElementsByClass ( 'scope_container' , document );
- // There can be several kaleidoscopes, consider this.
- for (i = 0; i <scope_cont.length; i ++)
- {
- scope_cont [i] .onmouseover = function () {
- var sect = getElementsByClass ( 'sv' , this );
- var curscope = this ;
- this .onmousemove = function (e) {
- var mCur = mousePageXY (e);
- for (n = 0; n <sect.length; n ++)
- {
- // In even sectors, the background moves in one direction
- if (n% 2) {
- sect [n] .style.backgroundPosition = mCur.x + 'px' + mCur.y + 'px' ;
- }
- // Odd - to another
- else {
- sect [n] .style.backgroundPosition = mCur.x * (- 1) + 'px' + mCur.y + 'px'
- }
- }
- }
- }
- scope_cont [i] .onmouseout = function () {
- // We clean up after ourselves, so as not to overload the browser
- document .onmousemove = null ;
- }
- }
- }
- </ script>
Source: https://habr.com/ru/post/99019/
All Articles