Можно ли отразить содержимое с помощью CSS?

В основном я пытаюсь создать отражение изображения с помощью CSS, как показано ниже (и/или jQuery, но не то, что действительно повлияет на производительность). Это также должно работать отзывчиво.

Идея состоит в том, что будет iMac PNG (с отверстием, вырезанным для скриншотов сайта), а затем, используя систему управления контентом, я загрузил бы скриншот сайта, и он был бы помещен внутри и позади экрана, чтобы показать ... , все это работает нормально, но я хочу, чтобы скриншот экрана и сайта отражался ниже. Я знаю, что это очень тонко, но если это возможно, я хотел бы это сделать.

пример эффекта отражения

Это структура кода, которую я планирую использовать, не стесняйтесь использовать ее в любых примерах :)

ДЕМО: http://codepen.io/anon/pen/gKnry

<div class="screen_contain">
    <img src="imac-image.png" class="imac">
    <img src="website_image.png" class="website">
</div>
.screen_contain {
  display:inline-block;
  position: relative;
  width:33%;
}

.imac {
  width: 100%;
  position: relative;
  z-index: 10;
}

.website {
  position: absolute;
  left: 5.0%;
  top: 5%;
  width: 90%;
  z-index: 5;
}

Примечания:

  • Очевидно, я мог бы объединить образ iMac, чтобы он имел основной iMac И его отражение в одном изображении ... сэкономив на запросах и грязном коде.
  • Это будет заполнено клиентом, поэтому все, что он сможет сделать, это загрузить скриншот веб-сайта.

Спасибо!


person Lighty_46    schedule 27.08.2014    source источник
comment
css-tricks.com/snippets/css/flip-an-image Однако вам понадобятся два изображения. css не может клонировать элемент dom. это не его работа. это просто правила стиля. если вы хотите оригинал и перевернутую версию, вам придется вставить изображение дважды.   -  person Marc B    schedule 27.08.2014
comment
digitalia.be/software/reflectionjs-for-jquery   -  person j08691    schedule 27.08.2014
comment
Ну, это только WebKit, но есть и это: CSS Reflections. По общему признанию, это могло быть удалено из WebKit или стать кросс-браузерным с тех пор, как я последний раз смотрел.   -  person David says reinstate Monica    schedule 27.08.2014
comment
@DavidThomas: я не думаю, что он был удален из WebKit, но Я не думаю, что он стал кроссбраузерным.   -  person Paul D. Waite    schedule 27.08.2014
comment
@Lighty_46: возможно, стоит взглянуть на этот ответ. Это немного неудобно, по общему признанию.   -  person Paul D. Waite    schedule 27.08.2014
comment
Нет, я не предполагал; но я бы хотел, чтобы это было так (это одна из тех неуклюжих в реализации функций, которые периодически были бы очень полезны в CSS).   -  person David says reinstate Monica    schedule 27.08.2014
comment
@DavidThomas: может быть. Видите ли, теперь, когда тренды в дизайне сводились к тому, чтобы все было прямоугольником с одним цветом фона (ваш дизайн так 2007 года, @Lighty_46), кажется немного бессмысленным, что все эти часы разработчиков ушли на создание собственные тени CSS, градиенты, закругленные углы и отражения. Думаю, однажды они вернутся в моду, и мы все будем этому радоваться.   -  person Paul D. Waite    schedule 27.08.2014
comment
Вы можете вывести изображение дважды, но затем использовать css3 в этом ответе, чтобы сделать это выглядит как отражение. Или существует множество js-библиотек, например jqReflect.   -  person Pete    schedule 27.08.2014
comment
@Paul: я подозреваю, что нынешний «плоский» дизайн был ответом на преобладание блестящего / скеоморфного дизайна в раннюю эпоху смартфонов; в этом случае (ИМХО и т. д.) я полагаю, что глянцевый пользовательский интерфейс вернется (хотя и несколько отличается от последнего поколения) в ответ на плоский дизайн.   -  person David says reinstate Monica    schedule 27.08.2014
comment
Есть отзывы об ответах ниже?   -  person im_brian_d    schedule 05.09.2014


Ответы (4)



Вот скрипт, показывающий живые отражения чистого CSS (если вы измените исходный элемент, отражение также изменится): http://jsfiddle.net/scvprc2r/

Это работает только в браузерах Webkit и Gecko (проверено только в Chrome и Firefox). Если вам нужна лучшая поддержка браузера, используйте решение SVG или JS.

Модифицированная структура:

<div class="screen_contain">
    <div class="computer" id="one">
        <img src="http://ferncroft.co.uk/files/2014/08/ethernal-demo-imac.png" class="imac" />
        <img src="http://danzambonini.com/wp-content/uploads/2010/07/stack_overflow_initial.jpg" class="website" id="web1" />
    </div>
    <div class="reflection"></div>
</div>

Я добавил дополнительный div-обертку вокруг изображений, добавил уникальные идентификаторы к изображению сайта и к div-оболочке. Я также добавил еще один div для отражения в Firefox и эффекта затухания градиента в обоих браузерах.

CSS:

.computer {
    -webkit-box-reflect: below 0px linear-gradient(to top, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%);
}

Это создает отражение элемента под элементом, используя -webkit-box-reflect. Градиент добавляется для получения более плавного эффекта.

.reflection {
    transform: scaleY(-1);
}

Наш базовый стиль отражения. Переворачиваем его так, чтобы фон mozilla element() был в правильной ориентации

#one + .reflection {
        background: linear-gradient(to bottom, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 1) 32%, rgba(255, 255, 255, 0) 100%) 100% 100%,
                    -moz-element(#web1) no-repeat 50% -5%,
                    -moz-element(#one) no-repeat 100% 100%;
}

Вот как делается отражение в Firefox. При этом используется функция element(), которая создает живое изображение элемента. Фоны элементов устанавливаются как второй и третий фоны в div.

Затем этот код повторяется для каждого дополнительного повторяющегося элемента div.

В Firefox размер и положение отраженного фона зависят от высоты div, в котором он размещен. Вот некоторый jQuery для динамического изменения размера отражения до размера исходного элемента:

function resizeReflection() {
    $('.reflection').each(function () {
        $(this).height($(this).prev().height());
    });
}

resizeReflection();

$(window).resize(function () {
    resizeReflection();
});

В этом не было бы необходимости, если бы ваши изображения были фиксированного размера.

Как это выглядит:

Firefox FirefoxChrome Хром

Если вам нужно решение SVG вместо решения CSS, взгляните на это (намного проще и лучше поддерживается браузером): http://jsfiddle.net/JeremiePat/bGD3J/

person quw    schedule 27.08.2014

отражение css

Пример jsFiddle

CSS

.reflection {
    transform: rotate(180deg); 
    width: 100%;
}

.gradient {
    position: absolute;
    top: 0;
    left: 0;
    height: 100%;
    width: 100%;
    z-index: 999;
    background: -webkit-gradient(linear, left bottom, left top,
       color-stop(0%,rgba(255,255,255,.5)), 
       color-stop(60%,rgba(255,255,255,1)));
}

Чтобы избежать jquery: просто продублируйте HTML, чтобы избежать jquery

<div class="screen_contain">
    <img src="http://ferncroft.co.uk/files/2014/08/ethernal-demo-imac.png" class="imac" />
    <img src="http://danzambonini.com/wp-content/uploads/2010/07/stack_overflow_initial.jpg" class="website" />
    <div class="screen_contain reflection">
        <img src="http://ferncroft.co.uk/files/2014/08/ethernal-demo-imac.png" class="imac" />
        <img src="http://danzambonini.com/wp-content/uploads/2010/07/stack_overflow_initial.jpg" class="website" />
        <div class="gradient"></div>
    </div>
</div>

С Jquery пример jsFiddle

  var screen_captain = $('.screen_contain');

  $.each(screen_captain, function(){
     $(this).append($(this).clone().addClass('reflection').append('<div class="gradient"></div>'));
  })
person im_brian_d    schedule 27.08.2014

Это повторяющийся вопрос, на который был дан ответ в теме StackOverflow:

Совместимость свойства CSS box-reflect?

Возможно не только с webkit (последний хром или сафари), но и с последним фаерфоксом.

Вот пример: http://codepen.io/jonathan/pen/pgioE

Тут спасибо Дэвиду по адресу:

http://satreth.blogspot.com/2012/05/css3-reflection.html

HTML:

<div id="someid">
   <img src="image url" />
<div/>

CSS (вебкит):

#someid {
        /* need some space for the reflection */
        margin-bottom: 120px;
        /* the gradient makes the reflection fade out */
        -webkit-box-reflect: below 0px -webkit-linear-gradient(bottom, rgba(255,255,255,0.3) 0%, transparent 40%, transparent 100%);
}

CSS (Firefox-Gecko):

#someid {
        position: relative;
        /* need some space for the reflection */
        margin-bottom: 120px;
}

#someid:before {
        content:""; /* needed or nothing will be shown */
        background: -moz-linear-gradient(top, white, white 30%, rgba(255,255,255,0.9) 65%, rgba(255,255,255,0.7)) 0px 0px, -moz-element(#someid) 0px -127px no-repeat;
        -moz-transform: scaleY(-1); /* flip the image vertically */
        position:relative;
        height:140px;
        width: 360px; /* should be > image width + margin + shadow */
        top: 247px;
        left:0px;
 }

Firefox использует -moz-element для отражения (https://developer.mozilla.org/en-US/docs/CSS/element), тогда как webkit использует собственный префикс поставщика для отражений.

Другой пример:

http://lea.verou.me/2011/06/css-reflections-for-firefox-with-moz-element-and-svg-masks/

Ваше здоровье!

person Jonathan Marzullo    schedule 12.09.2014